fundo
Vocês são todos comerciantes de uma firma de ações um pouco menos que respeitável. Vocês todos fazem parte de um grupo de traders que se concentram apenas em uma ação específica.
A cada hora, cada operador tem a chance de comprar ações X ou vender ações X. Existem 50 horas por rodada e 3 rodadas por competição. No final de todas as rodadas, o profissional com o maior valor médio ganha uma viagem à Jamaica!
Jogabilidade
Existem 3 rodadas de 50 turnos cada.
Cada trader começa a rodada com $ 5000 e um número aleatório de ações entre 20 e 30 ações. O preço das ações começa em um número aleatório entre 10 e 150.
A cada turno, cada operador pode comprar qualquer número de ações que puderem comprar ou vender qualquer número de ações que possua atualmente, cada uma pelo preço atual por ação.
O preço por ação aumenta em um número aleatório entre 1 e 5 para cada ação comprada e diminui em um valor aleatório entre 2 e 6 para cada ação vendida. O preço mínimo é de US $ 1.
É importante observar que todos os traders processam suas transações ao mesmo tempo, o que significa que qualquer trader que compre / venda ações não afetará o preço até o próximo turno.
O jogador com o maior valor médio no final das 3 rodadas vence. O valor é determinado pegando a quantia restante em dinheiro no final da rodada e adicionando o número de ações de propriedade do trader * no preço de mercado.
Argumentos
Seu programa será executado novamente no início de cada turno, recebendo o preço atual de mercado, a quantidade atual de dinheiro do trader e o número de ações pertencentes a esse trader.
Ex:
120 5000 0
Saída
Seu programa de trader deve emitir uma letra correspondente à ação que você deseja executar, seguida pela quantidade.
Ex:
B10 //Buy 10 shares
ou
S3 //Sell 3 shares
O comerciante também tem a opção de não fazer nada que vire. Isso pode ser realizado com a saída de um W ou de qualquer outro comando que não seja 'B> amnt <' ou 'S> amnt <'
Submissões
Seu programa estará dentro de um diretório 'players /> nome do seu programa <':
+-- players
| +-- BotNameFolder
| +-- BotProgram
Forneça seu código junto com um argumento de linha de comando para executá-lo dentro do diretório 'players'. Por exemplo, o comerciante Test1 pode ser executado comjava -cp "Test1" Test1
Regras adicionais
Vá em frente, atire em si mesmo EmoWolf, Idc.
Não mexa com nada fora do diretório BotNameFolder, sinta-se à vontade para criar arquivos lá para informações persistentes durante as rodadas / turnos.
Não crie intencionalmente programas para travar a simulação.
Aceitarei várias entradas por usuário, desde que as entradas atuem como entidades separadas (sem informações privilegiadas).
Entre os melhores
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Vou tentar atualizar a tabela de classificação pelo menos uma vez por dia
Controlador
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;
}
}
Compile java Controller.java
e execute a partir de um diretório que contém um diretório como abaixo:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
O arquivo config
deve se parecer com isso:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
O primeiro número é o número de rodadas, o segundo número é o turno por rodada, seguido pelos comandos para executar cada jogador.
Substitua espaços por e comercial! ('E')
~ Deixe-me saber se eu posso melhorar a redação deste post e uma negociação feliz!