Arka fon
Hepiniz saygın bir hisse senedi şirketine göre biraz daha düşük bir süre için yatırımcılarsınız. Hepiniz sadece belirli bir hisse senedine odaklanan bir grup yatırımcının parçasısınız.
Her tüccarın her saatinde X hisse senedi alma veya X hisse senedi satma şansı vardır. Tur başına 50 saat ve yarışma başına 3 tur vardır. Tüm turların sonunda, en yüksek ortalama değere sahip olan trader, Jamaika'ya bir gezi kazandı!
Oynanış
Her biri 50 tur olan 3 tur vardır.
Her tüccar raund 5000 $ ile başlar ve 20 ile 30 hisse arasında rastgele sayıda hisse. Hisselerin fiyatı 10 ile 150 arasında rastgele bir sayıyla başlar.
Her yatırımcı, her bir hisse başına mevcut fiyat karşılığında, alabilecekleri herhangi bir hisse satın alabilir veya satın alabilecekleri hisse sayısını satabilir.
Hisse başına fiyat, satın alınan her hisse için 1 ile 5 arasında rasgele bir sayı artar ve satılan her hisse için 2 ile 6 arasında rasgele bir değerle azalır. Minimum fiyat 1 $.
Tüm trader'ların işlemlerini aynı anda işleme koyduğunu belirtmek önemlidir; bu, herhangi bir trader alım / satım hissesinin bir sonraki döneme kadar fiyatı etkilemeyeceği anlamına gelir.
3 turun sonunda ortalama değeri en yüksek olan oyuncu kazanır. Değer, turun sonunda kalan para miktarı alınarak ve işlemcinin * kapanış piyasa fiyatına ait hisse sayısı eklenerek belirlenir.
Argümanlar
Programınız, mevcut piyasa fiyatını, işlemcinin mevcut para miktarını ve bu işlemcinin sahip olduğu hisse sayısını alan her bir dönüşte yeniden başlatılacaktır.
Ör:
120 5000 0
Çıktı
Yatırımcı programınız, takip etmek istediği harekete karşılık gelen ve ardından miktarın yazdığı bir harf vermelidir.
Ör:
B10 //Buy 10 shares
veya
S3 //Sell 3 shares
Tüccar ayrıca dönüşen hiçbir şey yapmama seçeneğine de sahiptir. Bu, bir W veya 'B> amnt <' veya 'S> amnt <' olmayan başka bir komutun çıkarılmasıyla gerçekleştirilebilir.
gönderimler
Programınız bir 'oynatıcılar /> program adınızın <' dizini içinde olacak:
+-- players
| +-- BotNameFolder
| +-- BotProgram
Lütfen kodunuzu 'oyuncular' dizini içinden çalıştırmak için bir komut satırı argümanı ile birlikte sağlayın. Örneğin Test1 tüccar ile çalıştırılabilirjava -cp "Test1" Test1
Ek Kurallar
Devam et, kendini vur EmoWolf, Idc.
BotNameFolder dizininizin dışındaki hiçbir şeyle uğraşmak yok, ancak tur / dönüşlerde sürekli bilgi almak için dosya oluşturmaktan çekinmeyin.
Kasıtlı olarak simülasyonu çökertecek programlar oluşturmayın.
Girişler ayrı varlıklar gibi davrandığı sürece kullanıcı başına birden fazla giriş kabul edeceğim (İçeriden bilgi alışverişi yok).
Liderler Sıralaması
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Afiş günde en az bir kez güncellemeye çalışacağım
kontrolör
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;
}
}
Bunu ile derleyin java Controller.java
ve aşağıdaki gibi bir dizini içeren bir dizinden çalıştırın:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
Dosya config
şunun gibi görünmelidir:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
İlk sayı tur sayısı, ikinci sayı tur başına tur ve ardından her oyuncuyu çalıştırmak için verilen komutlar.
Boşlukları ve işaretleriyle değiştirin! ( '&')
~ Bu yazının anlatımını hiç geliştirebilirsem ve mutlu bir ticaret yapabilir miyim?