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!
fonte
Respostas:
Apresento 'sonhador', que está sempre dormindo e esquece de comprar ou vender qualquer coisa. Ele espera que outros jogadores tenham uma perda líquida. Código Python:
executar com
python daydreamer\daydreamer.py 120 5000 0
ou quaisquer valores que você desejar.Vou postar uma resposta mais séria mais tarde, isso é apenas para fazer a bola rolar :)
fonte
DayTrader
Atualizado para alteração de regra feita em 21/08/2014, onde os jogadores agora começam com 20 a 30 compartilhamentos.
Compra o máximo possível e depois vende o máximo possível.
Filosofia
Esperamos que o padrão abaixo se repita repetidamente. Observe que, aderindo a esse padrão, também contribuímos para ele.
O padrão é claro no começo. Valor vai aumentar após uma rodada. Deve diminuir após a segunda rodada. Além disso, as projeções ficam confusas. Espero me sair bem nas primeiras rodadas, antes que o mercado se estabilize.
Compile com
javac DayTrader.java
. Corra comjava -cp "DayTrader" DayTrader
.fonte
Walt Disney - Python 3
Walt espera até que as ações cheguem ao fundo do poço e depois compre o quanto o dinheiro permitir. Então, quando o preço sobe, ele vende todos eles.
Baseado na estratégia da Disney quando ele 'sobreviveu' ao acidente de Wall Street. Infelizmente, meu programa não pode construir parques temáticos ... Se apenas ...
Corre:
Código:
fonte
Tommy
só sabe o que tem, mas está determinado a arriscar tudo no mercado. Se ele puder comprar, ele fará. Se ele não puder, ele vende tudo o que tem para poder no próximo turno. (Isso funcionará bem com situações extremas como o DayTrader, mas será corrigido automaticamente se o valor cair quando ele achar que vai aumentar.)
Golfscript
Este é o mesmo código, mas se preferir isso. Eu escrevi o java depois, caso a coisa do BigInteger fosse necessária. Use o que for mais fácil.
fonte
BuyAndHold - C
Compilar com: gcc buyandhold.c -o buyandhold
Execute-o com ./buyandhold AÇÕES DE PREÇO EM DINHEIRO
fonte
Alfred Pennyworth - Python 2
Enquanto eu estava em patrulha uma noite, Alfred tentou criar um programa de negociação de ações sem o meu conhecimento. Ele pensou que poderia esconder de mim, mas eu encontrei e descobri o que fazia. Porque eu sou o Batman. Agora eu decidi participar de uma competição para ensinar uma lição a ele.
Dinheiro não é problema para Alfred, porque eu sou REALMENTE rico, mas ele ainda é esperto em suas negociações. Quando ele está sem ações, ele compra o máximo que pode pagar, independentemente do preço de mercado. Em seguida, ele vende 10 (ou todas as demais) ações toda vez que o preço de mercado for superior ao preço pelo qual foi comprado.
Correr com:
python GoAwayMasterBruce.py <args>
fonte
AttributeError: 'ArgumentParser' object has no attribute 'parseargs'
Qual versão do Python é necessária?parse_args()
NaiveBot
O NaiveBot é novo em toda essa brincadeira de "mercado de ações". Ele apenas supõe que quando o preço está subindo, ele deve comprar e quando o preço cai, ele deve vender. Mas ele não é idiota, ele tem um truque na manga! Ele só compra metade do que pode pagar e só vende metade do que tem.
Não há mais morar em uma caixa sob a rodovia para o NaiveBot!
Executar com
php Naivebot.php $1 $2 $3
, cria umcache.json
em sua pasta atual.fonte
Lucro - Haskell
Compilar
ghc profit.hs
e executar com./profit price money stock
.Se não for suficientemente eficiente, adicione
-O3
sinalizador, embora provavelmente seja um exagero: DEditar:
"otimizado", agora vende tudo quando o preço é igual a
Integer.MAX_VALUE
.fonte
main = putStrLn . trade . map read =<< getArgs
? Menos barulhentocabal install pointfree
, agora todos pensam que você come mônadas no café da manhã.WaitForCrash
EDIT: falha corrigida no conceito
EDIT: agora usando long long int
Esta é a minha primeira tentativa. Comporta-se realmente simples e mantém uma ação para distinguir se é a primeira rodada ou a posterior. No primeiro turno, nada pode ser perdido, por isso compra ações. Se tem ações, as vende. Se, eventualmente, os preços das ações caírem para 10, será comprado novamente.
ajuntar com:
gcc waitforcrash.c -o waitforcrash
executá-lo como
./waitforcrash PRICE MONEY SHARES
fonte
Terremoto
Alterna entre comprar e vender tudo (menos um). Realmente não pretende ganhar tanto, como atrapalha todos os outros.
Compile com
csc Earthquaker.cs
. Corra comEarthquaker
.fonte
System.IO.File.ReadAllText
eWriteAllText
, portanto, você pode simplificar um pouco o rastreamento do histórico.brain.txt
arquivo.MonkeyTrader (em JAVA)
Há um ditado que diz que os macacos são bons comerciantes. Eu faço a prova. As decisões entre "comprar" e "vender" são totalmente aleatórias.
fonte
IntelliTrader
Na primeira rodada, ele venderá suas ações se tiverem um bom preço: US $ 80 ou mais. Então ele venderá se o preço for igual ou melhor que o último preço vendido, comprará se o preço for igual ou inferior ao último preço comprado.
IntelliTrader.java
Compile com o javac IntelliTrader . Execute com java -cp "IntelliTrader" IntelliTrader
fonte
theAnswerOfLifeIs42.py
Meu programa ama o número 42
A regra é simples: posso comprar 42 ações ou vender 42 ações.
fonte
LeesonLearnt v1.1 (Java, conservador)
Como a mudança de regra significa que agora começamos com alguns compartilhamentos, não há mais o melhor primeiro movimento garantido, então simplifiquei isso removendo o caso especial do primeiro turno.
Invocar como
fonte
Avaliador de Custos em Dólares - Python 3
Essa estratégia tenta usar a média dos custos em dólares comprando (o mais próximo possível) uma quantia fixa de dinheiro (arbitrariamente estabelecida em 150, de modo que provavelmente gastará a maior parte do seu dinheiro no final) a cada turno.
fonte
Cash Is King - Python 2 ou 3
Esse cara é muito pessimista em relação ao mercado de ações. Ele prefere manter o dinheiro em dinheiro, onde pode mantê-lo seguro debaixo do colchão.
fonte
Lento e estável
Contanto que tenha dinheiro, compra 165 dólares em ações. Caso contrário, vende todas as suas ações para obter mais dinheiro e comprar mais ações. Na 50ª rodada, ele garante a venda de todas as ações, porque no final queremos dinheiro.
Compile com javac SlowAndSteady.java. Execute com java -cp "SlowAndSteady" SlowAndSteady. O contador deve ser redefinido entre as rodadas, mas se o arquivo for excluído, ele também funcionará.
fonte
BuyHighSellLow
Rastreia o histórico do mercado e compra quando o preço baixo e vende quando está alto.
Correr com:
fonte
O tempo está certo - Python 3
Fiquei entediado, então escrevi outro participante ...
Este jovem empresário vive sua vida 24 horas por dia. Quando é a hora certa, ele toma uma decisão. Ele também irrita o francês fora de contexto ...;)
Corre:
Código:
fonte
Ol 'Timer - Fortran 77
Este velho vai gastar sua pensão após sessenta anos de trabalho como balconista de escritório. Durante a velhice, no entanto, ele ficou bastante cego, para poder ver apenas o primeiro número de cada argumento e estimar o preço. Seu método é semelhante ao de Walt, exceto que o Ol 'Timer é um pouco mais descuidado.
Por causa dos problemas com a impressão do Fortran, escrevi um programa Python que ajudará. O programa pega os argumentos fornecidos e os canaliza para o programa Fortran. Em seguida, o programa Python reformata a saída no formato esperado.
Compilar:
Corre:
Código do assistente Python:
Código principal FORTRAN:
fonte
Test1 Trader
Compilar com
javac Test1.java
executar comjava -cp "Test1" Test1
fonte
Ouriço - python2.7
Isso é principalmente para reservar o nome
Correr como
fonte
BuyAndSell - C
Semelhante, mas não uma duplicata de Tommy. Alterna entre comprar pânico o máximo possível e vender tudo. Quase uma duplicata do Earthquaker, que retém uma ação enquanto a BuyAndSell vende todas as ações. BuyAndSell não toma nenhuma ação quando não possui ações para vender, mas não tem dinheiro suficiente para comprar uma ação.
Compile com "gcc buyandsell.c -o buyandsell"
Executar como "./buyandsell AÇÕES DE PREÇO EM DINHEIRO
fonte
Gorge Soros
Compra devagar, do que vende tudo, na tentativa de quebrar o mercado.
Correr com:
Soros.rb price money stock
fonte
Do not intentionally create programs to crash the simulation.