Задний план
Вы все трейдеры для немного менее уважаемой фондовой фирмы. Вы все являетесь частью группы трейдеров, которые сосредоточены только на одной конкретной акции.
Каждый час у каждого трейдера есть шанс купить X акций или продать X акций. Есть 50 часов на раунд и 3 раунда на соревнование. В конце всех раундов трейдер с самым высоким средним значением выигрывает поездку на Ямайку!
Игровой процесс
Есть 3 раунда по 50 ходов каждый.
Каждый трейдер начинает раунд с $ 5000 и случайным количеством акций от 20 до 30 акций. Цена акций начинается с случайного числа от 10 до 150.
Каждый ход каждый трейдер может купить любое количество акций, которые он может себе позволить, или продать любое количество акций, которыми он владеет в настоящее время, по текущей цене за акцию.
Цена за акцию увеличивается на случайное число от 1 до 5 для каждой купленной акции и уменьшается на случайное значение от 2 до 6 для каждой проданной акции. Минимальная цена составляет 1 доллар.
Важно отметить, что все трейдеры обрабатывают свои транзакции одновременно, а это означает, что любой трейдер, покупающий / продающий акции, не повлияет на цену до следующего хода.
Игрок с самым высоким средним значением в конце 3 раундов выигрывает. Стоимость определяется путем взятия суммы денег, оставшейся в конце раунда, и добавления количества акций, принадлежащих трейдеру * рыночная цена закрытия.
аргументы
Ваша программа будет перезапускаться в начале каждого хода, получая текущую рыночную цену, текущую сумму денег трейдера и количество акций, принадлежащих этому трейдеру.
Пример:
120 5000 0
Выход
Ваша программа трейдера должна вывести букву, соответствующую действию, которое она хотела бы предпринять, а затем количество.
Пример:
B10 //Buy 10 shares
или
S3 //Sell 3 shares
Трейдер также имеет возможность не делать ничего, что делает ход. Это может быть достигнуто путем вывода W или любой другой команды, которая не является 'B> amnt <' или 'S> amnt <'
Материалы
Ваша программа будет находиться в каталоге «Players /> Ваше имя программы <»:
+-- players
| +-- BotNameFolder
| +-- BotProgram
Пожалуйста, предоставьте свой код вместе с аргументом командной строки, чтобы запустить его из каталога 'Players'. Например, трейдер Test1 может работать сjava -cp "Test1" Test1
Дополнительные правила
Давай, стреляй в себя EmoWolf, Idc.
Не связывайтесь ни с чем вне вашей директории BotNameFolder, не стесняйтесь создавать файлы там, хотя для постоянной информации в течение раундов / ходов.
Не создавайте намеренно программы для сбоя симуляции.
Я приму несколько записей на пользователя, если записи действуют как отдельные объекты (без инсайдерской торговли).
Leaderboard
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Я постараюсь обновлять таблицу лидеров, по крайней мере, один раз в день
контроллер
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;
}
}
Скомпилируйте это java Controller.java
и запустите из каталога, содержащего каталог, как показано ниже:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
Файл config
должен выглядеть примерно так:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
Первое число - это количество раундов, второе число - количество ходов за раунд, за которыми следуют команды для запуска каждого игрока.
Замените пробелы амперсандами! ( '&')
~ Дайте мне знать, если я смогу улучшить формулировку этого поста, и счастливой торговли!
источник
Ответы:
Я представляю «мечтателя», который всегда спит и забывает купить или продать что-нибудь. Он надеется, что у других игроков будет чистый убыток. Код Python:
работать с
python daydreamer\daydreamer.py 120 5000 0
или какими-либо значениями, которые вы хотите.Позже я опубликую более серьезный ответ, это просто для того, чтобы начать игру :)
источник
DayTrader
Обновлено для изменения правила, сделанного 21.08.2014, где игроки теперь начинают с 20-30 долями.
Покупает как можно больше, затем продает как можно больше.
философия
Мы надеемся, что приведенная ниже схема будет повторяться снова и снова. Обратите внимание, что придерживаясь этого паттерна, мы также вносим в него свой вклад
Шаблон кристально чистый в начале. Значение будет увеличиваться после первого раунда. Это должно уменьшиться после второго раунда. Помимо этого, прогнозы становятся нечеткими. Я ожидаю, что преуспею в первых раундах, пока рынок не стабилизируется.
Компилировать с
javac DayTrader.java
. Беги сjava -cp "DayTrader" DayTrader
.источник
Уолт Дисней - Питон 3
Уолт ждет, пока акции не достигнут дна, а затем покупает столько, сколько позволяют его деньги. Затем, когда цена взлетает, он продает их все.
Основано на стратегии Диснея, когда он «выжил» после аварии на Уолл-стрит. К сожалению, моя программа не может создавать тематические парки ... Если только ...
Бег:
Код:
источник
Томми
знает только то, что у него есть, но полон решимости рисковать всем на рынке. Если он может купить, он сделает. Если он не может, он продает все, что у него есть, чтобы он мог следующий ход. (Это будет хорошо работать с экстремальными, такими как DayTrader, но будет автоматически корректироваться, если значение падает, когда он думает, что оно будет расти.)
Golfscript
Это тот же код, но если это предпочтительнее. Я написал Java после того, как вещь BigInteger была необходима. Используйте то, что проще.
источник
BuyAndHold - C
Компилировать с: gcc buyandhold.c -o buyandhold
Запустите его с ./buyandhold АКЦИИ ЦЕНА ДЕНЬГИ
источник
Альфред Пенниворт - Питон 2
Однажды ночью, когда я патрулировал, Альфред пытался создать программу торговли акциями без моего ведома. Он думал, что может скрыть это от меня, но я нашел это и выяснил, что он сделал. Потому что я Бэтмен. Теперь я решил принять участие в конкурсе, чтобы преподать ему урок.
Деньги не являются объектом для Альфреда, потому что я ДЕЙСТВИТЕЛЬНО богат, но он по-прежнему умел торговать Когда у него нет акций, он покупает столько, сколько может себе позволить, независимо от рыночной цены. Затем он продает 10 (или все оставшиеся) акции каждый раз, когда рыночная цена превышает цену, по которой они были куплены.
Бежать с:
python GoAwayMasterBruce.py <args>
источник
AttributeError: 'ArgumentParser' object has no attribute 'parseargs'
Какая версия Python ему нужна?parse_args()
NaiveBot
NaiveBot является новым для всей этой шумихи "фондового рынка". Он просто предполагает, что, когда цена повышается, он должен покупать, а когда цена снижается, он должен продавать. Но он не сока, у него трюк в рукаве! Он покупает только половину того, что может себе позволить, и продает только половину того, что имеет.
Больше не нужно жить в коробке под автострадой для NaiveBot!
Запустить с
php Naivebot.php $1 $2 $3
, делаетcache.json
в своей текущей папке.источник
Прибыль - Хаскелл
Скомпилировать
ghc profit.hs
и запустить с./profit price money stock
.Если это недостаточно эффективно, добавьте
-O3
флаг, хотя это, вероятно, излишне: DРедактировать:
«оптимизированный», теперь продает все, когда цена равна
Integer.MAX_VALUE
.источник
main = putStrLn . trade . map read =<< getArgs
? Менее шумноcabal install pointfree
, теперь все будут думать, что вы едите монады на завтрак.WaitForCrash
РЕДАКТИРОВАТЬ: исправлена ошибка в концепции
РЕДАКТИРОВАТЬ: теперь, используя long long int
Это моя первая попытка. Он ведет себя очень просто и сохраняет одну акцию, чтобы различить, первый это раунд или более поздний. В первом раунде ничего нельзя потерять, поэтому он покупает акции. Если у него есть акции, он продает их. Если в конечном итоге цены на акции упадут до 10, он будет покупать снова.
компилировать с:
gcc waitforcrash.c -o waitforcrash
запустить как
./waitforcrash PRICE MONEY SHARES
источник
Earthquaker
Чередуется между покупкой и продажей всего (кроме одного). На самом деле цель не в том, чтобы побеждать, а в том, что она мешает другим.
Компилировать с
csc Earthquaker.cs
. Беги сEarthquaker
.источник
System.IO.File.ReadAllText
andWriteAllText
, so you can simplify your history tracking slightly.brain.txt
файл.MonkeyTrader (in JAVA)
Есть поговорка, что обезьяны - хорошие торговцы. Я делаю доказательства. Решения между «купить» и «продать» абсолютно случайны.
источник
IntelliTrader
В 1-м раунде он продаст свои акции, если они по хорошей цене: 80 долларов или больше. Затем он продаст, если цена будет такой же или лучше, чем последняя цена, по которой он продал, купит, если цена будет такой же или ниже, чем последняя цена, по которой он купил.
IntelliTrader.java
Компилировать с помощью Javac IntelliTrader . Запустить с помощью Java-CP "IntelliTrader" IntelliTrader
источник
theAnswerOfLifeIs42.py
My program loves the number 42
The rule is simple: I can either buy 42 stock or sell 42 stock.
источник
LeesonLearnt v1.1 (Java, conservative)
Since the rule change means that we now start with some shares, there's no longer a guaranteed best first move, so I've simplified this by removing the special case for the first turn.
Invoke as
источник
Dollar Cost Averager - Python 3
This strategy attempts to use dollar cost averaging by buying (as close as it can to) a fixed amount of money (arbitrarily set at 150 so that it'll probably use up most of its money by the end) each turn.
источник
Cash Is King - Python 2 or 3
This guy is very pessimistic about the stock market. He'd rather keep his money in cash where he can keep it safe under his mattress.
источник
Slow and Steady
As long as it has money, it buys $165 worth of shares. Otherwise it sells all of its shares to get more money, to buy more shares. On the 50th round it makes sure to sell all shares, because in the end we want cash.
Compile with javac SlowAndSteady.java. Run with java -cp "SlowAndSteady" SlowAndSteady. Counter should reset between rounds, but if the file is deleted, it will also work.
источник
BuyHighSellLow
Tracks the market history and buys when the price low and sells when it's high.
Run with:
источник
Time is Right - Python 3
I got bored so I wrote another entrant...
This young entrepeneur lives his life by the clock. When the time is right, he makes a decision. He also annoyingly uses French out of context... ;)
Run:
Code:
источник
Ol' Timer - Fortran 77
This old man is going to waste away his pension after sixty years of working as an office clerk. During his old age, however, he became quite blind, so he can only see he first number of each argument, so he estimates the price. His method is similar to that of Walt's, except Ol' Timer is a little more careless.
Because of the problems with the Fortran printing, I've written a Python program which will help. The program takes the arguments supplied and pipes them through to the Fortran program. Then, the Python program reformats the output to the expected format.
Compile:
Run:
Python Assistant Code:
FORTRAN Main Code:
источник
Test1 Trader
Compile with
javac Test1.java
run withjava -cp "Test1" Test1
источник
Hedgehog - python2.7
This is mostly to reserve the name
Run as
источник
BuyAndSell - C
Similar but not a duplicate of Tommy. Alternates between panic buying as much as possible and selling everything. Almost a duplicate of Earthquaker which retains one share while BuyAndSell sells all shares. BuyAndSell takes no action when it has no shares to sell but hasn't got enough money to buy one share.
Compile with "gcc buyandsell.c -o buyandsell"
Run as "./buyandsell PRICE MONEY SHARES
источник
Gorge Soros
Buys slowly, than sells everything in an attempt to crash the market.
Run with:
Soros.rb price money stock
источник
Do not intentionally create programs to crash the simulation.