Contexte
Vous êtes tous des commerçants pour une société d’achat peu réputée. Vous faites tous partie d'un groupe de commerçants qui se concentrent uniquement sur un stock spécifique.
Chaque heure, chaque opérateur a la possibilité d'acheter X actions ou de vendre X actions. Il y a 50 heures par tour et 3 tours par compétition. À la fin de tous les tours, le commerçant avec la valeur moyenne la plus élevée gagne un voyage en Jamaïque!
Gameplay
Il y a 3 tours de 50 tours chacun.
Chaque opérateur commence le tour avec 5000 $ et un nombre aléatoire d’actions entre 20 et 30 actions. Le prix des actions commence à un nombre aléatoire compris entre 10 et 150.
Chaque tour, chaque opérateur peut acheter n'importe quel nombre d'actions qu'il peut se permettre ou vendre n'importe quel nombre d'actions qu'il détient actuellement, chacun pour le prix actuel par action.
Le prix par action augmente d'un nombre aléatoire entre 1 et 5 pour chaque action achetée et diminue d'une valeur aléatoire entre 2 et 6 pour chaque action vendue. Le prix minimum est de 1 $.
Il est important de noter que tous les traders traitent leurs transactions en même temps, ce qui signifie que tout trader achetant / vendant des actions n'aura aucune incidence sur le prix jusqu'au prochain tour.
Le joueur avec la valeur moyenne la plus élevée à la fin des 3 tours gagne. La valeur est déterminée en prenant le montant restant à la fin du tour et en ajoutant le nombre d’actions possédées par le trader *.
Arguments
Votre programme sera relancé au début de chaque tour et recevra le prix du marché actuel, le montant actuel de l'argent du trader et le nombre d'actions qu'il possède.
Ex:
120 5000 0
Sortie
Votre programme de commerçant doit générer une lettre correspondant à l'action qu'il souhaite entreprendre, suivie de la quantité.
Ex:
B10 //Buy 10 shares
ou
S3 //Sell 3 shares
Le commerçant a également la possibilité de ne rien faire à son tour. Cela peut être accompli en émettant un W ou toute autre commande qui n'est pas 'B> amnt <' ou 'S> amnt <'
Les soumissions
Votre programme sera dans un répertoire 'players /> votre nom de programme <':
+-- players
| +-- BotNameFolder
| +-- BotProgram
Veuillez fournir votre code avec un argument de ligne de commande pour l'exécuter à partir du répertoire "players". Par exemple, le commerçant Test1 pourrait être exécuté avecjava -cp "Test1" Test1
Règles additionnelles
Allez-y, tirez vous-même EmoWolf, Idc.
Pas de problème avec quoi que ce soit en dehors de votre répertoire BotNameFolder, n'hésitez pas à créer des fichiers là-bas pour des informations persistantes tout au long des tours.
Ne créez pas intentionnellement de programmes pour bloquer la simulation.
J'accepterai plusieurs entrées par utilisateur, à condition qu'elles agissent comme des entités distinctes (pas de délit d'initié).
Classement
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Je vais essayer de mettre à jour le classement au moins une fois par jour
Manette
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;
}
}
Compilez ceci avec java Controller.java
et lancez-le depuis un répertoire contenant un répertoire comme ci-dessous:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
Le fichier config
devrait ressembler à ceci:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
Le premier nombre est le nombre de tours, le second nombre est le nombre de tours par tour, suivi des commandes pour exécuter chaque joueur.
Remplacez les espaces par des esperluettes! ('&')
~ Faites-moi savoir si je peux améliorer la formulation de ce post du tout, et bon négoce!
la source
Réponses:
Je vous présente 'rêveur', qui est toujours endormi et oublie d'acheter ou de vendre n'importe quoi. Il espère que les autres joueurs auront une perte nette. Code python:
courir avec
python daydreamer\daydreamer.py 120 5000 0
ou quelles que soient les valeurs que vous voulez.Je posterai une réponse plus sérieuse plus tard, ceci est juste pour faire avancer les choses :)
la source
DayTrader
Mise à jour pour le changement de règle effectué le 21/08/2014, où les joueurs commencent maintenant avec 20-30 actions.
Achète autant que possible, puis vend autant que possible.
Philosophie
Nous espérons que le schéma ci-dessous se répète encore et encore. Notez qu'en adhérant à ce modèle, nous y contribuons également.
Le motif est limpide au début. Valeur va augmenter après un tour. Il devrait diminuer après le deuxième tour. Au-delà, les projections deviennent floues. Je m'attends à bien réussir au début, avant que le marché ne se stabilise.
Compiler avec
javac DayTrader.java
. Courez avecjava -cp "DayTrader" DayTrader
.la source
Walt Disney - Python 3
Walt attend que les actions atteignent le fond, puis achète autant que son argent le permet. Puis, lorsque le prix augmente, il les vend tous.
Basé sur la stratégie de Disney lorsqu'il a "survécu" au crash de Wall Street. Malheureusement, mon programme ne peut pas construire de parcs à thème ... Si seulement ...
Courir:
Code:
la source
Tommy
sait seulement ce qu’il a mais est déterminé à tout risquer sur le marché. S'il peut acheter, il le fera. S'il ne peut pas, il vend tout ce qu'il a afin de pouvoir tourner. (Cela fonctionnera bien avec des extrêmes tels que DayTrader, mais se corrigera automatiquement si la valeur chute quand il pense que cela va augmenter.)
Golfscript
C'est le même code mais si préféré ceci. J'ai écrit le java après au cas où la chose BigInteger serait nécessaire. Utilisez ce qui est plus facile.
la source
BuyAndHold - C
Compiler avec: gcc buyandhold.c -o buyandhold
Exécutez-le avec ./ ACHETER ET ACHETER DES ACTIONS
la source
Alfred Pennyworth - Python 2
Alors que je partais en patrouille un soir, Alfred a essayé de créer un programme de négociation d'actions à mon insu. Il pensait qu'il pourrait me le cacher, mais je l'ai trouvé et j'ai compris ce qu'il en était. Car je suis batman. Maintenant, j'ai décidé de participer à un concours pour lui donner une leçon.
Alfred n’a aucun mal à gagner de l’argent parce que je suis VRAIMENT riche, mais il est toujours intelligent dans ses échanges commerciaux. Lorsqu'il n'a plus d'actions, il en achète autant qu'il peut se permettre, quel que soit le prix du marché. Ensuite, il vend 10 (ou toutes les actions restantes) chaque fois que le prix du marché est supérieur au prix auquel il a été acheté.
Courir avec:
python GoAwayMasterBruce.py <args>
la source
AttributeError: 'ArgumentParser' object has no attribute 'parseargs'
De quelle version de Python a-t-il besoin?parse_args()
NaiveBot
NaiveBot est nouveau pour tous ces hooplah "boursiers". Il suppose simplement que, lorsque le prix augmente, il devrait acheter et que, lorsque le prix baisse, il devrait vendre. Mais ce n'est pas une sève, il a un tour dans son sac! Il n'achète jamais que la moitié de ce qu'il peut se permettre et ne vend jamais que la moitié de ce qu'il a.
Plus besoin de vivre dans une boîte sous l'autoroute pour NaiveBot!
Exécuter avec
php Naivebot.php $1 $2 $3
, crée uncache.json
dans son dossier actuel.la source
Bénéfice - Haskell
Compiler avec
ghc profit.hs
et courir avec./profit price money stock
.Si cela n’est pas assez efficace, ajoutez
-O3
flag, bien que ce soit probablement excessif: DModifier:
"optimisé", vend maintenant tout lorsque le prix est égal à
Integer.MAX_VALUE
.la source
main = putStrLn . trade . map read =<< getArgs
? Moins bruyantcabal install pointfree
, maintenant tout le monde va penser que vous mangez des monades pour le petit déjeuner.WaitForCrash
EDIT: défaut de concept corrigé
EDIT: utilise maintenant long long int
Ceci est mon premier essai. Il se comporte très simplement et conserve une action pour distinguer s'il s'agit du premier tour ou d'un tour suivant. Au premier tour, rien ne peut être perdu, donc il achète des actions. S'il a des actions, il les vend. Si les prix des actions tombent finalement à 10, il achètera à nouveau.
compiler avec:
gcc waitforcrash.c -o waitforcrash
l'exécuter comme
./waitforcrash PRICE MONEY SHARES
la source
Earthquaker
Alternes entre tout acheter et tout vendre (sauf un). Il ne s'agit pas vraiment de gagner autant que de déranger tout le monde.
Compiler avec
csc Earthquaker.cs
. Courez avecEarthquaker
.la source
System.IO.File.ReadAllText
etWriteAllText
, vous pouvez donc simplifier légèrement le suivi de votre historique.brain.txt
fichier.MonkeyTrader (en JAVA)
Il y a un dicton qui dit que les singes sont de bons commerçants. Je fais la preuve. Les décisions entre "acheter" et "vendre" sont totalement aléatoires.
la source
IntelliTrader
1er tour, il vendra ses actions si elles sont à un bon prix: 80 $ ou plus. Ensuite, il vendra si le prix est égal ou supérieur au dernier prix auquel il a vendu, achetez si le prix est identique ou inférieur au dernier prix auquel il a acheté.
IntelliTrader.java
Compiler avec javac IntelliTrader . Exécuter avec java-cp "IntelliTrader" IntelliTrader
la source
theAnswerOfLifeIs42.py
Mon programme aime le nombre 42
La règle est simple: je peux acheter 42 actions ou en vendre 42 actions.
la source
LeesonLearnt v1.1 (Java, conservateur)
Étant donné que le changement de règle signifie que nous commençons avec certaines actions, il n'y a plus de garantie de meilleur premier mouvement, c'est pourquoi j'ai simplifié cela en supprimant le cas spécial du premier tour.
Invoquer comme
la source
Dollar Averager - Python 3
Cette stratégie tente d’utiliser une moyenne monétaire en achetant (le plus près possible) un montant fixe (fixé arbitrairement à 150 afin qu’il utilise probablement la plus grande partie de son argent d’ici la fin) à chaque tour.
la source
L'argent est roi - Python 2 ou 3
Ce gars est très pessimiste à propos du marché boursier. Il préfère garder son argent en espèces où il peut le garder en sécurité sous son matelas.
la source
Lente et régulière
Tant qu'il a de l'argent, il achète des actions pour une valeur de 165 $. Sinon, il vend toutes ses actions pour obtenir plus d’argent, pour acheter plus d’actions. Au 50ème tour, il s'assure de vendre toutes les actions, car au final nous voulons de l'argent.
Compilez avec javac SlowAndSteady.java. Exécutez avec java -cp "SlowAndSteady" SlowAndSteady. Le compteur doit être réinitialisé entre les tours, mais si le fichier est supprimé, cela fonctionnera également.
la source
BuyHighSellLow
Suit l'historique du marché et achète lorsque le prix est bas et vend quand il est élevé.
Courir avec:
la source
Le temps est propice - Python 3
Je me suis ennuyé alors j'ai écrit un autre participant ...
Ce jeune entrepreneur vit sa vie à l'horloge. Quand le moment est venu, il prend une décision. Il utilise aussi le français hors contexte de manière agaçante ...;)
Courir:
Code:
la source
Ol 'Timer - Fortran 77
Ce vieil homme va perdre sa pension après soixante ans de travail de commis de bureau. Au cours de sa vieillesse, cependant, il est devenu tout à fait aveugle. Il ne peut donc voir que le premier chiffre de chaque argument, il estime donc le prix. Sa méthode est similaire à celle de Walt, sauf qu'Ol 'Timer est un peu plus insouciant.
En raison des problèmes d'impression Fortran, j'ai écrit un programme Python qui aidera. Le programme prend les arguments fournis et les transmet au programme Fortran. Ensuite, le programme Python reformate la sortie au format attendu.
Compiler:
Courir:
Code assistant python:
Code principal FORTRAN:
la source
Test1 Trader
Compiler avec
javac Test1.java
run avecjava -cp "Test1" Test1
la source
Hérisson - Python2.7
C'est surtout pour réserver le nom
Courir comme
la source
BuyAndSell - C
Semblable mais pas une copie de Tommy. Alterne entre la panique d'achat autant que possible et tout vendre. Presque un duplicata de Earthquaker qui conserve une action alors que BuyAndSell vend toutes ses actions. BuyAndSell ne prend aucune mesure lorsqu'il n'a pas d'actions à vendre mais qu'il ne dispose pas d'assez d'argent pour en acheter une.
Compiler avec "gcc buyandsell.c -o buyandsell"
Courir en tant que "./achatsetell PRIX ACTIONS D'ARGENT
la source
Gorge Soros
Achète lentement, que vend tout pour tenter de faire planter le marché.
Courir avec:
Soros.rb price money stock
la source
Do not intentionally create programs to crash the simulation.