Fondo
Todos ustedes son comerciantes de una empresa de acciones un poco menos confiable. Todos ustedes son parte de un grupo de comerciantes que se enfocan solo en una acción específica.
Cada hora, cada operador tiene la oportunidad de comprar acciones X o vender acciones X. Hay 50 horas por ronda y 3 rondas por competencia. ¡Al final de todas las rondas, el operador con el valor promedio más alto gana un viaje a Jamaica!
Jugabilidad
Hay 3 rondas de 50 turnos cada una.
Cada operador comienza la ronda con $ 5000 y un número aleatorio de acciones entre 20 y 30 acciones. El precio de las acciones comienza en un número aleatorio entre 10 y 150.
Cada turno, cada operador puede comprar cualquier cantidad de acciones que pueda pagar o vender cualquier cantidad de acciones que posea actualmente, cada una por el precio actual por acción.
El precio por acción aumenta en un número aleatorio entre 1 y 5 por cada acción comprada y disminuye en un valor aleatorio entre 2 y 6 por cada acción vendida. El precio mínimo es de $ 1.
Es importante tener en cuenta que todos los comerciantes procesan sus transacciones al mismo tiempo, lo que significa que cualquier comerciante que compre / venda acciones no afectará el precio hasta el próximo turno.
El jugador con el valor promedio más alto al final de las 3 rondas gana. El valor se determina tomando la cantidad de dinero sobrante al final de la ronda y sumando el número de acciones que posee el comerciante * precio de mercado de cierre.
Argumentos
Su programa se volverá a ejecutar al comienzo de cada turno, recibiendo el precio de mercado actual, la cantidad actual de dinero del comerciante y la cantidad de acciones que posee ese comerciante.
Ex:
120 5000 0
Salida
Su programa de operador debe generar una carta correspondiente a la acción que le gustaría realizar, seguida de la cantidad.
Ex:
B10 //Buy 10 shares
o
S3 //Sell 3 shares
El comerciante también tiene la opción de no hacer nada en ese turno. Eso se puede lograr generando una W o cualquier otro comando que no sea 'B> amnt <' o 'S> amnt <'
Envíos
Su programa estará dentro de un directorio 'players /> su nombre de programa <':
+-- players
| +-- BotNameFolder
| +-- BotProgram
Proporcione su código junto con un argumento de línea de comando para ejecutarlo desde dentro del directorio 'players'. Por ejemplo, el trader Test1 podría ejecutarse conjava -cp "Test1" Test1
Reglas Adicionales
Adelante, disparate EmoWolf, Idc.
No te metas con nada fuera de tu directorio BotNameFolder, siéntete libre de crear archivos allí para obtener información persistente durante rondas / turnos.
No cree programas intencionalmente para bloquear la simulación.
Aceptaré múltiples entradas por usuario, siempre que las entradas actúen como entidades separadas (sin información privilegiada).
Tabla de clasificación
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Intentaré actualizar la tabla de clasificación al menos una vez al día
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 esto java Controller.java
y ejecútelo desde un directorio que contenga un directorio como el siguiente:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
El archivo config
debería verse así:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
El primer número es el número de rondas, el segundo número es turnos por ronda, seguido de los comandos para ejecutar a cada jugador.
Reemplazar espacios con símbolos! ('Y')
~ Avísame si puedo mejorar la redacción de esta publicación, ¡y feliz negociación!
fuente
Respuestas:
Les presento 'soñador', que siempre está dormido y se olvida de comprar o vender cualquier cosa. Espera que otros jugadores tengan una pérdida neta. Código de Python:
ejecutar con
python daydreamer\daydreamer.py 120 5000 0
o cualquier valor que desee.Publicaré una respuesta más seria más tarde, esto es solo para que la pelota ruede :)
fuente
Comerciante del día
Actualizado para el cambio de reglas realizado el 21/08/2014, donde los jugadores ahora comienzan con 20-30 acciones.
Compra tanto como sea posible, luego vende tanto como sea posible.
Filosofía
Esperamos que el siguiente patrón se repita una y otra vez. Tenga en cuenta que al cumplir con este patrón, también contribuimos a él.
El patrón es cristalino al principio. Valor se aumenta después de una ronda. Debería disminuir después de la segunda ronda. Más allá de eso, las proyecciones se vuelven borrosas. Espero hacerlo bien en las primeras rondas, antes de que el mercado se estabilice.
Compilar con
javac DayTrader.java
. Corre conjava -cp "DayTrader" DayTrader
.fuente
Walt Disney - Python 3
Walt espera hasta que las acciones toquen fondo y luego compra tanto como su dinero lo permite. Luego, cuando el precio se dispara, los vende a todos.
Basado en la estrategia de Disney cuando "sobrevivió" a través del accidente de Wall Street. Desafortunadamente, mi programa no puede construir parques temáticos ... Si solo ...
Correr:
Código:
fuente
Tommy
solo sabe lo que tiene pero está decidido a arriesgarlo todo en el mercado. Si él puede comprar, lo hará. Si no puede, vende todo lo que tiene para poder pasar el próximo turno. (Esto funcionará bien con los extremos como DayTrader, pero se autocorregirá si el valor cae cuando cree que crecerá).
Golfscript
Este es el mismo código pero si lo prefiere. Escribí el java después en caso de que se necesitara lo de BigInteger. Usa lo que sea más fácil.
fuente
BuyAndHold - C
Compilar con: gcc buyandhold.c -o buyandhold
Ejecútelo con ./buyandhold PRECIO ACCIONES DINERO
fuente
Alfred Pennyworth - Python 2
Mientras estaba de patrulla una noche, Alfred intentó crear un programa de comercio de acciones sin que yo lo supiera. Pensó que podía ocultarlo, pero lo encontré y descubrí lo que hacía. Porque soy Batman. Ahora he decidido participar en una competencia para darle una lección.
El dinero no es un problema para Alfred porque soy REALMENTE rico, pero él todavía es inteligente con respecto a su comercio. Cuando se queda sin acciones, compra todas las que puede pagar, independientemente del precio de mercado. Luego vende 10 (o todas las acciones restantes) cada vez que el precio de mercado es más alto que el precio al que fue comprado.
Corre con:
python GoAwayMasterBruce.py <args>
fuente
AttributeError: 'ArgumentParser' object has no attribute 'parseargs'
¿Qué versión de Python necesita?parse_args()
NaiveBot
NaiveBot es nuevo en todo este alboroto del "mercado de valores". Simplemente asume que cuando el precio sube, debe comprar, y cuando baja el precio, debe vender. Pero él no es savia, ¡tiene un truco bajo la manga! Solo compra la mitad de lo que puede pagar, y solo vende la mitad de lo que tiene.
¡No más vivir en una caja debajo de la autopista para NaiveBot!
Ejecutar con
php Naivebot.php $1 $2 $3
, hace uncache.json
en su carpeta actual.fuente
Beneficio - Haskell
Compilar
ghc profit.hs
y ejecutar con./profit price money stock
.Si no es lo suficientemente eficiente, agregue una
-O3
marca, aunque probablemente sea exagerado: DEditar:
"optimizado", ahora vende todo cuando el precio es igual a
Integer.MAX_VALUE
.fuente
main = putStrLn . trade . map read =<< getArgs
? Menos ruidosocabal install pointfree
, ahora todos pensarán que comes mónadas para el desayuno.WaitForCrash
EDITAR: error fijo en el concepto
EDITAR: ahora usando long long int
Este es mi primer intento. Se comporta de manera muy simple y mantiene un recurso compartido para distinguir si es la primera ronda o una posterior. En la primera ronda no se puede perder nada, por lo que compra acciones. Si tiene acciones, las vende. Si finalmente los precios de las acciones caen a 10, comprará nuevamente.
compilar con:
gcc waitforcrash.c -o waitforcrash
ejecutarlo como
./waitforcrash PRICE MONEY SHARES
fuente
Earthquaker
Alterna entre comprar todo y vender todo (excepto uno). Realmente no pretende ganar tanto como perturba a todos los demás.
Compilar con
csc Earthquaker.cs
. Corre conEarthquaker
.fuente
System.IO.File.ReadAllText
yWriteAllText
, por lo que puede simplificar un poco el seguimiento de su historial.brain.txt
archivo.MonkeyTrader (en JAVA)
Hay un dicho que dice que los monos son buenos comerciantes. Yo hago la prueba. Las decisiones entre "comprar" y "vender" son totalmente aleatorias.
fuente
IntelliTrader
En la primera ronda, venderá sus acciones si son un buen precio: $ 80 o más. Luego venderá si el precio es igual o mejor que el último precio al que vendió, comprará si el precio es igual o inferior al último precio que compró.
IntelliTrader.java
Compile con javac IntelliTrader . Ejecutar con java -cp "IntelliTrader" IntelliTrader
fuente
theAnswerOfLifeIs42.py
Mi programa ama el numero 42
La regla es simple: puedo comprar 42 acciones o vender 42 acciones.
fuente
LeesonLearnt v1.1 (Java, conservador)
Dado que el cambio de regla significa que ahora comenzamos con algunas acciones, ya no hay un mejor primer movimiento garantizado, por lo que he simplificado esto eliminando el caso especial para el primer turno.
Invocar como
fuente
Promedio del costo en dólares: Python 3
Esta estrategia intenta usar el promedio del costo en dólares comprando (lo más cerca posible) una cantidad fija de dinero (arbitrariamente establecida en 150 para que probablemente use la mayor parte de su dinero al final) cada turno.
fuente
Cash Is King - Python 2 o 3
Este tipo es muy pesimista sobre el mercado de valores. Prefiere guardar su dinero en efectivo donde pueda mantenerlo seguro debajo de su colchón.
fuente
Lento pero seguro
Mientras tenga dinero, compra acciones por valor de $ 165. De lo contrario, vende todas sus acciones para obtener más dinero, para comprar más acciones. En la ronda 50 se asegura de vender todas las acciones, porque al final queremos efectivo.
Compile con javac SlowAndSteady.java. Ejecute con java -cp "SlowAndSteady" SlowAndSteady. El contador debe reiniciarse entre rondas, pero si se elimina el archivo, también funcionará.
fuente
Comprar alto vender
Rastrea la historia del mercado y compra cuando el precio es bajo y se vende cuando es alto.
Corre con:
fuente
El tiempo es correcto - Python 3
Me aburrí, así que escribí otro participante ...
Este joven empresario vive su vida por el reloj. Cuando es el momento adecuado, toma una decisión. También usa molestamente el francés fuera de contexto ...;)
Correr:
Código:
fuente
Ol 'Timer - Fortran 77
Este viejo va a desperdiciar su pensión después de sesenta años de trabajo como empleado de oficina. Sin embargo, durante su vejez se quedó bastante ciego, por lo que solo puede ver el primer número de cada argumento, por lo que estima el precio. Su método es similar al de Walt, excepto que Ol 'Timer es un poco más descuidado.
Debido a los problemas con la impresión de Fortran, he escrito un programa Python que ayudará. El programa toma los argumentos suministrados y los canaliza al programa Fortran. Luego, el programa Python reformatea la salida al formato esperado.
Compilar:
Correr:
Código de asistente de Python:
Código principal de FORTRAN:
fuente
Test1 Trader
Compilar con
javac Test1.java
ejecutar conjava -cp "Test1" Test1
fuente
Erizo - python2.7
Esto es principalmente para reservar el nombre
Correr como
fuente
BuyAndSell - C
Similar pero no un duplicado de Tommy. Alterna entre el pánico comprando tanto como sea posible y vendiendo todo. Casi un duplicado de Earthquaker que retiene una acción mientras BuyAndSell vende todas las acciones. BuyAndSell no toma medidas cuando no tiene acciones para vender pero no tiene suficiente dinero para comprar una acción.
Compilar con "gcc buyandsell.c -o buyandsell"
Ejecutar como "./buyandsell PRECIO ACCIONES DINERO
fuente
Garganta Soros
Compra lentamente, que vende todo en un intento de colapsar el mercado.
Corre con:
Soros.rb price money stock
fuente
Do not intentionally create programs to crash the simulation.