Hintergrund
Sie sind alle Händler für eine etwas weniger als seriöse Aktiengesellschaft. Sie alle gehören zu einer Gruppe von Händlern, die sich nur auf eine bestimmte Aktie konzentrieren.
Jeder Händler hat stündlich die Möglichkeit, X Aktien zu kaufen oder X Aktien zu verkaufen. Es gibt 50 Stunden pro Runde und 3 Runden pro Wettbewerb. Am Ende aller Runden gewinnt der Trader mit dem höchsten Durchschnittswert eine Reise nach Jamaika!
Gameplay
Es gibt 3 Runden à 50 Runden.
Jeder Händler beginnt die Runde mit 5000 $ und einer zufälligen Anzahl von Aktien zwischen 20 und 30 Aktien. Der Kurs der Aktien beginnt bei einer Zufallszahl zwischen 10 und 150.
In jeder Runde kann jeder Händler eine beliebige Anzahl von Aktien kaufen, die er sich leisten kann, oder eine beliebige Anzahl von Aktien verkaufen, die er derzeit hält, jeweils zum aktuellen Preis pro Aktie.
Der Preis pro Aktie erhöht sich um eine Zufallszahl zwischen 1 und 5 für jede gekaufte Aktie und verringert sich um einen Zufallswert zwischen 2 und 6 für jede verkaufte Aktie. Der Mindestpreis beträgt 1 US-Dollar.
Es ist wichtig zu beachten, dass alle Händler ihre Transaktionen zur gleichen Zeit abwickeln, was bedeutet, dass jeder Händler, der Aktien kauft / verkauft, den Preis erst in der nächsten Runde beeinflusst.
Der Spieler mit dem höchsten Durchschnittswert am Ende der 3 Runden gewinnt. Der Wert wird bestimmt, indem der am Ende der Runde verbleibende Geldbetrag addiert wird und die Anzahl der Aktien addiert wird, die sich im Besitz des Händlers befinden.
Argumente
Ihr Programm wird zu Beginn jeder Runde erneut ausgeführt und erhält den aktuellen Marktpreis, den aktuellen Geldbetrag des Händlers und die Anzahl der Aktien, die dieser Händler besitzt.
Ex:
120 5000 0
Ausgabe
Ihr Händlerprogramm muss einen Brief ausgeben, der der Aktion entspricht, die es ausführen möchte, gefolgt von der Menge.
Ex:
B10 //Buy 10 shares
oder
S3 //Sell 3 shares
Der Händler hat auch die Möglichkeit, in dieser Runde nichts zu tun. Dies kann erreicht werden, indem ein W oder ein anderer Befehl ausgegeben wird, der nicht 'B> amnt <' oder 'S> amnt <' ist.
Einreichungen
Ihr Programm befindet sich in einem Verzeichnis "players /> your program name <":
+-- players
| +-- BotNameFolder
| +-- BotProgram
Bitte geben Sie Ihren Code zusammen mit einem Befehlszeilenargument an, um ihn im Verzeichnis "players" auszuführen. Zum Beispiel könnte der Test1-Händler mit ausgeführt werdenjava -cp "Test1" Test1
Zusätzliche Regeln
Mach weiter, erschieß dich selbst EmoWolf, Idc.
Sie dürfen nichts außerhalb Ihres BotNameFolder-Verzeichnisses ändern. Sie können jedoch auch Dateien darin erstellen, um über Runden / Runden hinweg beständige Informationen zu erhalten.
Erstellen Sie keine Programme, um die Simulation zum Absturz zu bringen.
Ich akzeptiere mehrere Einträge pro Benutzer, solange die Einträge als separate Einheiten fungieren (kein Insiderhandel).
Bestenliste
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Ich werde versuchen, die Bestenliste mindestens einmal am Tag zu aktualisieren
Regler
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;
}
}
Kompilieren Sie dies mit java Controller.java
und führen Sie es aus einem Verzeichnis aus, das ein Verzeichnis wie das folgende enthält:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
Die Datei config
sollte ungefähr so aussehen:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
Die erste Zahl ist die Anzahl der Runden, die zweite Zahl ist die Anzahl der Runden, gefolgt von den Befehlen zum Ausführen der einzelnen Spieler.
Ersetzen Sie Leerzeichen durch Et-Zeichen! ('&')
~ Lass es mich wissen, wenn ich den Wortlaut dieses Beitrags überhaupt verbessern kann und viel Spaß beim Handeln!
quelle
Antworten:
Ich präsentiere 'Tagträumer', der immer schläft und vergisst, etwas zu kaufen oder zu verkaufen. Er hofft, dass andere Spieler einen Nettoverlust haben werden. Python-Code:
Laufen Sie mit
python daydreamer\daydreamer.py 120 5000 0
oder mit beliebigen Werten.Ich werde später eine ernstere Antwort posten, dies ist nur, um den Ball ins Rollen zu bringen :)
quelle
Day-Trader
Aktualisiert für die Regeländerung am 21.08.2014, bei der Spieler jetzt mit 20 bis 30 Anteilen beginnen.
Kauft so viel wie möglich und verkauft dann so viel wie möglich.
Philosophie
Wir hoffen, dass sich das folgende Muster immer wieder wiederholt. Beachten Sie, dass wir durch die Einhaltung dieses Musters auch dazu beitragen.
Das Muster ist am Anfang kristallklar. Wert wird nach Runde eins erhöhen. Es sollte nach Runde zwei abnehmen. Darüber hinaus verschwimmen die Projektionen. Ich gehe davon aus, dass ich mich in den ersten Runden gut behaupten kann, bevor sich der Markt stabilisiert.
Kompilieren mit
javac DayTrader.java
. Laufen Sie mitjava -cp "DayTrader" DayTrader
.quelle
Walt Disney - Python 3
Walt wartet, bis die Aktien den Tiefpunkt erreicht haben, und kauft dann so viel, wie sein Geld erlaubt. Dann, wenn der Preis steigt, verkauft er sie alle.
Basierend auf Disneys Strategie, als er den Wall Street Crash überlebt hat. Leider kann mein Programm keine Themenparks bauen ... Wenn nur ...
Lauf:
Code:
quelle
Tommy
weiß nur, was er hat, ist aber entschlossen, alles auf dem Markt zu riskieren. Wenn er kaufen kann, wird er. Wenn er nicht kann, verkauft er alles, was er hat, damit er weiter machen kann. (Dies funktioniert gut mit extremen wie DayTrader, korrigiert sich jedoch automatisch, wenn der Wert sinkt, wenn er glaubt, dass er wachsen wird.)
Golfscript
Dies ist derselbe Code, aber falls gewünscht. Ich schrieb das Java danach, falls das BigInteger-Ding benötigt wurde. Verwenden Sie, was einfacher ist.
quelle
BuyAndHold - C
Kompilieren Sie mit: gcc buyandhold.c -o buyandhold
Führen Sie es mit ./buyandhold PRICE MONEY SHARES aus
quelle
Alfred Pennyworth - Python 2
Während ich eines Nachts auf Patrouille war, versuchte Alfred ohne mein Wissen ein Aktienhandelsprogramm zu erstellen. Er dachte, er könnte es vor mir verstecken, aber ich fand es und fand heraus, was es tat. Weil ich Batman bin. Jetzt habe ich beschlossen, an einem Wettbewerb teilzunehmen, um ihm eine Lektion zu erteilen.
Geld ist Alfred egal, denn ich bin WIRKLICH reich, aber er ist immer noch schlau in Bezug auf seinen Handel. Wenn er keine Aktien mehr hat, kauft er so viele, wie er sich leisten kann, unabhängig vom Marktpreis. Dann verkauft er 10 (oder alle verbleibenden) Aktien jedes Mal, wenn der Marktpreis höher ist als der Preis, zu dem er gekauft wurde.
Laufen mit:
python GoAwayMasterBruce.py <args>
quelle
AttributeError: 'ArgumentParser' object has no attribute 'parseargs'
Welche Version von Python braucht es?parse_args()
NaiveBot
NaiveBot ist neu für all diesen "Börsen" -Rummel. Er geht einfach davon aus, dass er kaufen sollte, wenn der Preis steigt, und verkaufen sollte, wenn der Preis fällt. Aber er ist kein Trottel, er hat einen Trick im Ärmel! Er kauft immer nur die Hälfte von dem, was er sich leisten kann, und verkauft immer nur die Hälfte von dem, was er hat.
Kein Leben mehr in einer Kiste unter der Autobahn für NaiveBot!
Ausführen mit
php Naivebot.php $1 $2 $3
, macht eincache.json
in seinem aktuellen Ordner.quelle
Gewinn - Haskell
Kompiliere mit
ghc profit.hs
und starte mit./profit price money stock
.Wenn es nicht effizient genug ist, füge
-O3
flag hinzu, obwohl es wahrscheinlich zu viel ist: DBearbeiten:
"optimiert" verkauft jetzt alles, wenn der Preis gleich ist
Integer.MAX_VALUE
.quelle
main = putStrLn . trade . map read =<< getArgs
? Weniger lautcabal install pointfree
, jetzt wird jeder denken, Sie essen Monaden zum Frühstück.WaitForCrash
EDIT: Fehler im Konzept behoben
EDIT: jetzt mit long long int
Dies ist mein erster Versuch. Es verhält sich sehr einfach und behält einen Anteil, um zu unterscheiden, ob es die erste Runde oder eine spätere ist. In der ersten Runde kann nichts verloren gehen, es werden also Aktien gekauft. Wenn es Aktien hat, verkauft es sie. Wenn der Aktienkurs irgendwann auf 10 fällt, kauft er wieder.
kompilieren mit:
gcc waitforcrash.c -o waitforcrash
lass es laufen als
./waitforcrash PRICE MONEY SHARES
quelle
Erdbeben
Wechselt zwischen Kauf und Verkauf von allem (außer einem). Es zielt nicht wirklich darauf ab, so viel zu gewinnen, wie es alle anderen stört.
Kompilieren mit
csc Earthquaker.cs
. Laufen Sie mitEarthquaker
.quelle
System.IO.File.ReadAllText
undWriteAllText
, so dass Sie Ihre Verlaufsverfolgung leicht vereinfachen können.brain.txt
Datei nicht gefunden wird.MonkeyTrader (in Java)
Es gibt ein Sprichwort, dass Affen gute Händler sind. Ich mache den Beweis. Entscheidungen zwischen "Kaufen" und "Verkaufen" sind völlig zufällig.
quelle
IntelliTrader
In der ersten Runde wird er seine Aktien verkaufen, wenn sie einen guten Preis haben: 80 USD oder mehr. Dann wird er verkaufen, wenn der Preis gleich oder besser ist als der letzte Preis, zu dem er verkauft hat, und kaufen, wenn der Preis gleich oder niedriger ist als der letzte Preis, zu dem er gekauft hat.
IntelliTrader.java
Kompilieren Sie mit javac IntelliTrader . Führen Sie mit Java-CP "IntelliTrader" IntelliTrader
quelle
theAnswerOfLifeIs42.py
Mein Programm liebt die Nummer 42
Die Regel ist einfach: Ich kann entweder 42 Aktien kaufen oder 42 Aktien verkaufen.
quelle
LeesonLearnt v1.1 (Java, konservativ)
Da die Regeländerung bedeutet, dass wir jetzt mit einigen Aktien beginnen, gibt es keinen garantierten besten ersten Zug mehr. Deshalb habe ich dies vereinfacht, indem ich den Sonderfall für die erste Runde entferne.
Aufrufen als
quelle
Dollar Cost Averager - Python 3
Bei dieser Strategie wird versucht, die Durchschnittskosten in US-Dollar zu berechnen, indem in jeder Runde ein fester Geldbetrag (willkürlich auf 150 festgelegt) gekauft wird.
quelle
Cash Is King - Python 2 oder 3
Dieser Typ sieht die Börse sehr pessimistisch. Er möchte sein Geld lieber in bar aufbewahren, wo er es sicher unter seiner Matratze aufbewahren kann.
quelle
Langsam und stetig
Solange es Geld hat, kauft es Aktien im Wert von 165 USD. Andernfalls verkauft es alle seine Aktien, um mehr Geld zu verdienen und mehr Aktien zu kaufen. In der 50. Runde wird sichergestellt, dass alle Aktien verkauft werden, weil wir am Ende Bargeld wollen.
Kompilieren Sie mit javac SlowAndSteady.java. Führen Sie mit Java -cp "SlowAndSteady" SlowAndSteady. Der Zähler sollte zwischen den Runden zurückgesetzt werden, aber wenn die Datei gelöscht wird, funktioniert dies auch.
quelle
BuyHighSellLow
Verfolgt die Marktgeschichte und kauft, wenn der Preis niedrig ist und verkauft, wenn er hoch ist.
Laufen mit:
quelle
Die Zeit ist reif - Python 3
Mir wurde langweilig und ich schrieb einen anderen Teilnehmer ...
Dieser junge Unternehmer lebt sein Leben nach der Uhr. Wenn die Zeit reif ist, trifft er eine Entscheidung. Er benutzt auch ärgerlicherweise Französisch außerhalb des Kontexts ...;)
Lauf:
Code:
quelle
Alter Timer - Fortran 77
Dieser alte Mann wird seine Rente verschwenden, nachdem er sechzig Jahre als Bürokaufmann gearbeitet hat. Im Alter wurde er jedoch ziemlich blind, sodass er nur die erste Nummer jedes Arguments sehen kann und den Preis schätzt. Seine Methode ähnelt der von Walt, nur dass Ol 'Timer ein wenig nachlässiger ist.
Wegen der Probleme mit dem Fortran-Druck habe ich ein Python-Programm geschrieben, das helfen wird. Das Programm übernimmt die angegebenen Argumente und leitet sie an das Fortran-Programm weiter. Anschließend formatiert das Python-Programm die Ausgabe in das erwartete Format um.
Kompilieren:
Lauf:
Python-Assistentencode:
FORTRAN-Hauptcode:
quelle
Test1 Trader
Kompiliere mit
javac Test1.java
run withjava -cp "Test1" Test1
quelle
Igel - Python2.7
Dies dient hauptsächlich der Namensreservierung
Rennen wie
quelle
BuyAndSell - C
Ähnlich, aber kein Duplikat von Tommy. Wechselt zwischen Panik, wenn man so viel wie möglich kauft und alles verkauft. Fast ein Duplikat von Earthquaker, das eine Aktie behält, während BuyAndSell alle Aktien verkauft. BuyAndSell ergreift keine Maßnahmen, wenn es keine Aktien zum Verkauf hat, aber nicht genug Geld hat, um eine Aktie zu kaufen.
Kompiliere mit "gcc buyandsell.c -o buyandsell"
Führen Sie den Befehl "./buyandsell PRICE MONEY SHARES" aus
quelle
Schlucht Soros
Kauft langsam und verkauft dann alles, um den Markt zum Absturz zu bringen.
Laufen mit:
Soros.rb price money stock
quelle
Do not intentionally create programs to crash the simulation.