sfondo
Siete tutti commercianti per una società per azioni poco meno che rispettabile. Siete tutti parte di un gruppo di operatori che si concentrano solo su uno stock specifico.
Ogni ora ogni operatore ha la possibilità di acquistare azioni X o vendere azioni X. Ci sono 50 ore per round e 3 round per competizione. Alla fine di tutti i round il commerciante con il valore medio più alto vince un viaggio in Giamaica!
gameplay
Ci sono 3 round da 50 turni ciascuno.
Ogni operatore inizia il round con $ 5000 e un numero casuale di azioni tra 20 e 30 azioni. Il prezzo delle azioni inizia con un numero casuale compreso tra 10 e 150.
Ogni turno ogni operatore può acquistare un numero qualsiasi di azioni che possono permettersi o vendere un numero qualsiasi di azioni che attualmente detengono, ciascuna per il prezzo corrente per azione.
Il prezzo per azione aumenta di un numero casuale compreso tra 1 e 5 per ciascuna azione acquistata e diminuisce di un valore casuale tra 2 e 6 per ogni azione venduta. Il prezzo minimo è di $ 1.
È importante notare che tutti i trader elaborano le loro transazioni contemporaneamente, il che significa che qualsiasi operatore che acquista / vende azioni non influenzerà il prezzo fino al turno successivo.
Vince il giocatore con il valore medio più alto alla fine dei 3 round. Il valore viene determinato prendendo la quantità di denaro rimasta alla fine del round e aggiungendo il numero di azioni possedute dal trader * che chiude il prezzo di mercato.
argomenti
Il tuo programma verrà rieseguito all'inizio di ogni turno ricevendo l'attuale prezzo di mercato, la quantità di denaro corrente del trader e il numero di azioni possedute da quel trader.
Ex:
120 5000 0
Produzione
Il programma del trader deve emettere una lettera corrispondente all'azione che vorrebbe intraprendere seguita dalla quantità.
Ex:
B10 //Buy 10 shares
o
S3 //Sell 3 shares
Il trader ha anche la possibilità di non fare nulla in quel turno. Ciò può essere realizzato emettendo una W o qualsiasi altro comando che non sia 'B> amnt <' o 'S> amnt <'
Inseriti
Il tuo programma sarà all'interno di una directory 'players /> nome del tuo programma <':
+-- players
| +-- BotNameFolder
| +-- BotProgram
Fornisci il tuo codice insieme a un argomento della riga di comando per eseguirlo dall'interno della directory "players". Ad esempio, è possibile eseguire il trader Test1java -cp "Test1" Test1
Regole aggiuntive
Vai avanti, sparati a EmoWolf, Idc.
Non scherzare con nulla al di fuori della tua directory BotNameFolder, sentiti libero di creare file lì dentro per informazioni persistenti durante round / giri.
Non creare intenzionalmente programmi per interrompere la simulazione.
Accetterò più voci per utente, purché le voci fungano da entità separate (nessun insider trading).
Classifica
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Proverò ad aggiornare la classifica almeno una volta al giorno
controllore
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;
}
}
Compilalo con java Controller.java
ed eseguilo da una directory contenente una directory come di seguito:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
Il file config
dovrebbe essere simile al seguente:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
Il primo numero è il numero di round, il secondo numero è il turno per round, seguito dai comandi per eseguire ciascun giocatore.
Sostituisci gli spazi con e commerciali! ( '&')
~ Fammi sapere se posso migliorare la formulazione di questo post e buon trading!