পটভূমি
আপনি নামী স্টক ফার্মের চেয়ে কিছুটা কম দামের জন্য সমস্ত ব্যবসায়ী। আপনারা সবাই ব্যবসায়ীদের একটি গ্রুপের অংশ যারা কেবলমাত্র একটি নির্দিষ্ট স্টককে কেন্দ্র করে।
প্রতি ঘন্টা প্রতিটি ট্রেডারের এক্স স্টক বা এক্স স্টক বিক্রয় করার সুযোগ রয়েছে। প্রতি রাউন্ডে 50 ঘন্টা এবং প্রতিযোগিতায় 3 রাউন্ড রয়েছে। রাউন্ডগুলির শেষে সর্বমোট গড় মূল্য সহ ব্যবসায়ী জামাইকা ভ্রমণে জয়ী হয়!
গেমপ্লের
প্রতিটিতে 50 টি করে 3 রাউন্ড রয়েছে।
প্রতিটি ব্যবসায়ী $ 5000 সঙ্গে বৃত্তাকার এবং শুরু 20 থেকে 30 জনের মতো শেয়ারের একটি র্যান্ডম সংখ্যা ভাগ করে। শেয়ারের দাম 10 থেকে 150 এর মধ্যে একটি এলোমেলো সংখ্যায় শুরু হয়।
প্রতিটি টার্ন প্রতিটি ব্যবসায়ী তাদের সামর্থ্যযুক্ত যে কোনও সংখ্যক শেয়ার কিনতে বা বর্তমানে তাদের কাছে থাকা যে কোনও শেয়ার বিক্রয় করতে পারে, প্রতিটি শেয়ারের বর্তমান দামের জন্য।
শেয়ার প্রতি মূল্য ক্রয়কৃত প্রতিটি শেয়ারের জন্য 1 এবং 5 এর মধ্যে একটি এলোমেলো সংখ্যায় বৃদ্ধি পায় এবং বিক্রি হওয়া প্রতিটি শেয়ারের জন্য 2 এবং 6 এর মধ্যে এলোমেলো মূল্য হ্রাস পায়। সর্বনিম্ন দাম $ 1।
এটি লক্ষণীয় গুরুত্বপূর্ণ যে সমস্ত ব্যবসায়ী একই সাথে তাদের লেনদেন প্রক্রিয়া করে, যার অর্থ যে কোনও ব্যবসায়ী শেয়ার কেনা / বেচার পরের মোড় পর্যন্ত দামকে প্রভাবিত করবে না।
3 রাউন্ডের শেষে সর্বোচ্চ গড় মানের খেলোয়াড় জিতল। রাউন্ড শেষে অবশিষ্ট অর্থের পরিমাণ নিয়ে এবং ব্যবসায়ীর মালিকানাধীন শেয়ারের সংখ্যা * বাজারের দাম বন্ধ করে মূল্য নির্ধারণ করা হয়।
আর্গুমেন্ট
আপনার প্রোগ্রামটি প্রতিটি বাজারের বর্তমান বাজারমূল্য, ব্যবসায়ীর বর্তমান অর্থের পরিমাণ এবং সেই ব্যবসায়ীর মালিকানাধীন শেয়ারের সংখ্যার শুরুতে পুনরায় চালু হবে।
উদা:
120 5000 0
আউটপুট
আপনার ট্রেডার প্রোগ্রামটি অবশ্যই পরিমাণটি অনুসরণ করতে চায় এমন ক্রিয়াটির সাথে সম্পর্কিত একটি চিঠি আউটপুট করতে হবে।
উদা:
B10 //Buy 10 shares
অথবা
S3 //Sell 3 shares
ব্যবসায়ীর মোড় ঘুরিয়ে এমন কিছু না করার বিকল্পও রয়েছে। এটি ডাব্লু বা অন্য কোনও কমান্ড আউটপুট দ্বারা অর্জন করা যেতে পারে যা 'বি> অ্যামেন্ট <' বা 'এস> অ্যামেন্ট <' নয়
জমা
আপনার প্রোগ্রামটি একটি 'প্লেয়ার /> আপনার প্রোগ্রামের নাম <' ডিরেক্টরিতে থাকবে:
+-- players
| +-- BotNameFolder
| +-- BotProgram
আপনার কোডটি 'প্লেয়ার্স' ডিরেক্টরিটির ভিতরে থেকে চালানোর জন্য কমান্ড লাইন যুক্তির পাশাপাশি সরবরাহ করুন। উদাহরণস্বরূপ, টেস্ট 1 ব্যবসায়ী দিয়ে চালানো যেতে পারেjava -cp "Test1" Test1
অতিরিক্ত বিধি
এগিয়ে যান, নিজেকে ইমোওয়াল্ফ, আইডিসি অঙ্কুর করুন।
আপনার বটনেমফোল্ডার ডিরেক্টরিটির বাইরের কোনও কিছুর সাথে গোলযোগ নেই, রাউন্ড / টার্নগুলি জুড়ে অবিরাম তথ্যের জন্য সেখানে ফাইল তৈরি করতে দ্বিধা বোধ করবেন না।
সিমুলেশন ক্র্যাশ করার জন্য ইচ্ছাকৃতভাবে প্রোগ্রামগুলি তৈরি করবেন না।
আমি ব্যবহারকারী হিসাবে একাধিক এন্ট্রি গ্রহণ করব, যতক্ষণ না এন্ট্রিগুলি পৃথক সত্তা হিসাবে কাজ করে (কোনও অভ্যন্তরীণ ট্রেডিং নেই)।
লিডারবোর্ড
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
আমি প্রতিদিন অন্তত একবার লিডারবোর্ড আপডেট করার চেষ্টা করব
নিয়ামক
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Random;
public class Controller {
public static BigInteger marketValue = BigInteger.valueOf(100);
public static BigInteger newValue = BigInteger.valueOf(100);
public static final char BUY = 'B';
public static final char SELL = 'S';
public static final int MARKET_INDEX = 1;
public static final int MONEY_INDEX = 2;
public static final int SHARE_INDEX = 3;
public static int numRunning = 0;
public static final int MAX_RUNNING = 10;
public static void main(String[] args){
try {
BufferedReader br1 = new BufferedReader(new InputStreamReader(new FileInputStream("resources/config")));
int numRounds = Integer.parseInt(br1.readLine());
int turnsPerRound = Integer.parseInt(br1.readLine());
//Create the array of players
List<String> players = new LinkedList<String>();
String line1 = null;
while((line1 = br1.readLine()) != null){
players.add(line1);
}
BigInteger[] totalVals = new BigInteger[players.size()];
for(int i = 0; i < totalVals.length; i++){
totalVals[i] = BigInteger.valueOf(0);
}
br1.close();
//Begin processing
for(int round = 0; round < numRounds; round++){
//Create players' shares and currency array
Map<String,BigInteger[]> vals = new HashMap<String, BigInteger[]>();
for(int i = 0; i < players.size(); i++){
vals.put(players.get(i), new BigInteger[]{BigInteger.valueOf(5000), BigInteger.valueOf(getRandInt(20,30))});
}
marketValue = BigInteger.valueOf(getRandInt(10,150));
newValue = marketValue;
for(int turn = 0; turn < turnsPerRound; turn++){
marketValue = newValue;
Queue<Object[]> processQueue = new LinkedList<Object[]>();
for(String playerKey : vals.keySet()){
BigInteger[] valSet = vals.get(playerKey);
String[] pkParts = playerKey.split("&");
String[] parts = new String[pkParts.length + 3];
for(int i = 0; i < pkParts.length; i++){
parts[i] = pkParts[i];
}
parts[pkParts.length] = marketValue + "";
parts[pkParts.length + 1] = valSet[0] + "";
parts[pkParts.length + 2] = valSet[1] + "";
processQueue.add(new Object[]{playerKey, parts});
}
while(!processQueue.isEmpty() || numRunning > 0){
if(numRunning < MAX_RUNNING && !processQueue.isEmpty()){
numRunning++;
Object[] o = processQueue.poll();
String pKey = (String)(o[0]);
String[] p = (String[])(o[1]);
try {
Process proc = new ProcessBuilder(p).directory(new File("resources/players").getAbsoluteFile()).start();
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = br.readLine();
br.close();
switch(line.charAt(0)){
case BUY :
BigInteger numShares = new BigInteger(line.substring(1).trim());
if(numShares.multiply(marketValue).compareTo(vals.get(pKey)[0]) <= 0){
BigInteger[] tempVals = vals.get(pKey);
tempVals[0] = tempVals[0].subtract(numShares.multiply(marketValue));
tempVals[1] = tempVals[1].add(numShares);
vals.put(pKey, tempVals);
newValue = newValue.add(numShares.multiply(BigInteger.valueOf(getRandInt(0,2))));
if(newValue.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) >= 1){
newValue = BigInteger.valueOf(Integer.MAX_VALUE - 1);
}
}
break;
case SELL:
BigInteger shares = new BigInteger(line.substring(1).trim());
if(shares.compareTo(vals.get(pKey)[1]) <= 0){
BigInteger[] tempVals = vals.get(pKey);
tempVals[0] = tempVals[0].add(shares.multiply(marketValue));
tempVals[1] = tempVals[1].subtract(shares);
vals.put(pKey, tempVals);
newValue = newValue.subtract(shares.multiply(BigInteger.valueOf(getRandInt(5,10))));
if(newValue.compareTo(BigInteger.valueOf(1)) <= -1){
newValue = BigInteger.valueOf(1);
}
}
break;
}
} catch (Exception e) {
System.err.println("[" + pKey + "] threw error:");
e.printStackTrace();
} finally{
numRunning--;
}
}else{
try{
Thread.sleep(50);
continue;
}catch(InterruptedException e){
continue;
}
}
}
System.out.println("Turn " + turn + " over: " + marketValue);
}
System.out.println("End of round market value is: " + marketValue);
int count = 0;
for(String player : vals.keySet()){
totalVals[count] = totalVals[count].add(vals.get(player)[0].add(vals.get(player)[1].multiply(marketValue)));
count++;
}
newValue = BigInteger.valueOf(100);
}
for(int i = 0; i < players.size(); i++){
System.out.println("[" + players.get(i) + "]:$" + (totalVals[i].divide(BigInteger.valueOf(numRounds))));
}
} catch (Exception e) {
System.err.println("An exception occured while running the controller.");
e.printStackTrace();
}
}
public static Random r = new Random(new Date().getTime());
public static int getRandInt(int min, int max){
return r.nextInt(max - min) + min;
}
}
এটি সংকলন করুন java Controller.java
এবং নীচের মতো ডিরেক্টরি সহ একটি ডিরেক্টরি থেকে চালান:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
ফাইলটি এর config
মতো দেখতে হবে:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
প্রথম সংখ্যাটি রাউন্ডের সংখ্যা, দ্বিতীয় সংখ্যাটি প্রতি রাউন্ডে ঘুরানো হয় এবং তারপরে প্রতিটি খেলোয়াড়কে চালানোর আদেশ দেয়।
এম্পারস্যান্ডগুলির সাথে স্পেসগুলি প্রতিস্থাপন করুন! ( '&')
I আমি কি এই পোস্টের শব্দটি আদৌ উন্নত করতে পারি এবং আমাকে খুশি ট্রেডিংয়ে তা জানতে দিন!