Stack Exchange证券交易所〜修订[关闭]


35

背景

你们都是一家信誉稍差的股票公司的交易员。你们都是一群只关注一只特定股票的交易员的一部分。

每个交易员每个小时都有机会买入X股或卖出X股。每回合有50小时,每场比赛有3个回合。在所有回合结束时,具有最高平均价值的商人将赢得前往牙买加的旅行!

游戏玩法

有3轮,每轮50圈。

每个交易者以$ 5000和20到30之间的随机数开始这一轮交易。股票的价格从10到150之间的随机数开始。

每个交易者每回合可以购买其负担得起的任何数量的股票或出售其当前持有的任何数量的股票,每种股票的价格为当前每股价格。

每股价格对所购买的每股价格增加1到5之间的一个随机数,对每股所销售的股票降低2到6之间的一个随机值。最低价格为1美元。

重要的是要注意,所有交易者都同时处理他们的交易,这意味着任何交易者买卖股票都不会影响价格,直到下一回合。

在三回合结束时具有最高平均值的玩家获胜。价值是通过计算一轮结束时剩余的金额并加上交易者拥有的股票数量*收盘价来确定的。

争论

您的程序将在每个回合开始时重新运行,并接收当前的市场价格,交易者的当前金额以及该交易者拥有的股票数量。

例如:

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

附加规则

继续吧,向自己射击Imo的EmoWolf。

不要乱搞BotNameFolder目录之外的任何内容,尽管可以在其中始终创建持久性信息,但也可以在其中创建文件。

不要故意创建会使仿真崩溃的程序。

我将接受每个用户的多个条目,只要条目充当单独的实体即可(不进行内部交易)。

排行榜

[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

第一个数字是回合数,第二个数字是每回合转数,其次是运行每个玩家的命令。

用“&”号代替空格!('&')

〜让我知道我是否可以改善这篇文章的措辞,并祝交易愉快!


4
在繁忙的市场中,长期趋势似乎将使该份额产生负值。
彼得·泰勒

6
您能否将您的控制器程序放在Github之类的文件上,并提供一个链接,以便我们在家进行测试?
彼得·泰勒

6
从排行榜来看,我认为游戏目前存在缺陷。例如,从$ 14 / sh起,买入357(自己的357,$ 0存入银行)。选择随机数(3)。价格上涨3 * 357至$ 1085 / sh。下回合 卖出所有357股(拥有0,银行387,345美元)。选择随机数(3)。价格下降3 * 357至$ 14 / sh。下回合 经过两轮后,价格没有变化,您的银行增加了77倍(使用其他起始随机变量可以得到类似但不太明显的结果)。我建议更改为每个交易而不是每个份额,以获取更合理的价值。

4
或者只是建立一个真实的订单簿。
o0'。

3
为什么要从随机数开始?
Averroes 2014年

Answers:


18

我呈现“白日梦者”,他总是睡着了,却忘了买卖任何东西。他希望其他玩家能够净亏损。Python代码:

if __name__ == "__main__":
    print "W"

运行与python daydreamer\daydreamer.py 120 5000 0您想要的任何值。

我将在稍后发布一个更严肃的答案,这只是为了使事情顺利进行:)


3
我认为这不会运行-您需要缩进打印。
isaacg 2014年

6
考虑到股票价格从长远来看将趋于下降,因此交易不是一个很好的策略。

5
一个奇怪的游戏:唯一的制胜法宝是不玩。一个好的国际象棋游戏怎么样?
Tim S.

13

即日交易者

已于2014年8月21日更新规则更改,现在玩家以20-30股开始。

尽可能多地购买,然后尽可能多地出售。

哲学

我们希望以下模式会不断重复。请注意,通过坚持这种模式,我们也为之做出了贡献。

  • 每个人只能购买或持有第一轮。价值只能增加,所以我们购买。
  • 每个人都可以在第二轮买入,持有或出售。我们预计第二轮不会有很多玩家购买,因此我们出售。

图案一开始就非常清晰。价值在第一轮之后增加。第二轮后应该减少。除此之外,预测变得模糊。我希望在市场稳定之前的早期回合中表现良好。

import java.math.BigInteger;

/**
 * Submission for http://codegolf.stackexchange.com/q/36515/18487
 * @author Rainbolt
 */
public class DayTrader {

    /**
     * @param args the command line arguments containing the current 
     * market value, our current money, and our current shares
     */
    public static void main(String[] args) {
        BigInteger marketValue = new BigInteger(args[0]);
        BigInteger myMoney = new BigInteger(args[1]);
        BigInteger myShares = new BigInteger(args[2]);

        // If we have less than or equal to 30 shares, buy as much as possible
        if (myShares.compareTo(new BigInteger("30")) <= 0) {
            System.out.println("B" + myMoney.divide(marketValue).toString());
        // Otherwise, sell as much as possible
        } else {
            System.out.println("S" + myShares.toString());
        }
    }

}

用编译javac DayTrader.java。用运行java -cp "DayTrader" DayTrader


1
是的,java!使我更容易跑步。
spocot

6
您的机器人制造市场超出了整数的最大数,因此我在代码中实现了BigIntegers。由于每个人的代码都使用整数,因此它几乎使每个人的白日梦机器人僵尸崩溃
spocot

@spocot我编辑了实现以使用BigInteger。希望有帮助。
Rainbolt 2014年

5
我认为这是规则中固有的问题。如果一个交易者得到140股,他可以自己控制市场。在两回合中,他可以以10股的价格购买股票,以140股的价格出售,从而获得1300%的获胜率(假设没有人相反)。这将升级为5000 * 13 ^ 25,这是很大的方法。
Optokopper 2014年

2
@spocot我只是想对您执行ping操作,因为在您最近更改规则后,我修改了提交内容。
2014年

9

Walt迪士尼-Python 3

沃尔特等到股票跌至谷底,然后买进他所能承受的数量。然后,当价格飞涨时,他将它们全部卖掉。

基于迪士尼在华尔街大崩盘中“幸存”时的策略。不幸的是,我的程序无法建立主题公园...

跑:

python3 waltdisney.py

码:

from sys import argv
import os

price=int(argv[1])
money=int(argv[2])
share=int(argv[3])

if os.path.exists('./buyingprice.txt'):
    f = open('buyingprice.txt', 'r')
    buyingprice=int(f.read())
    f.close()
else:
    buyingprice=0

if share > 0:
    if price > buyingprice*10:
        print('S'+str(share))
    else:
        print('W')
elif money > 0:
    if buyingprice==0:
        print('B10')
        m=open('buyingprice.txt', 'w')
        m.write(str(price))
        m.close()
    elif price <= buyingprice:
        print('B'+str(int(money/price)))
        g=open('buyingprice.txt', 'w')
        g.write(str(price))
        g.close()
    else:
        print('W')

您在第一个打印行上缺少右括号。
supersam654 2014年

@ supersam654哦,是的,谢谢
Beta Decay

您能指出一个说法吗?迪斯尼实际上使用了这种策略。鉴于在证券交易所有一家名为Walt Disney Co的公司,很难搜寻,而Walt的Wikipedia页面也没有提及。
迈克尔


@Michael我最初是从我的历史老师那里得到的信息,如果消息来源有点薄弱,请抱歉。
Beta Decay

8

汤米

只知道他拥有什么,但决心冒险在市场上冒险。如果他能买,他会的。如果他做不到,就卖掉他所有的东西,以便下一轮转。(这对于DayTrader这样的极端工具将非常有效,但是如果该值在他认为会增长时下降,则将自动更正。)

import java.math.BigInteger;

public class Tommy {
    public static void main(String[] args) {
        BigInteger Value = new BigInteger(args[0]);
        BigInteger Money = new BigInteger(args[1]);
        BigInteger Shares = new BigInteger(args[2]);

       if (Money.compareTo(Value)<1) {
           System.out.print("S" + Shares.toString());
       } else {
           System.out.print("B" + Money.divide(Value).toString());
       }
    }

}

高尔夫脚本

这是相同的代码,但是如果愿意的话。万一需要BigInteger东西,我就写了Java。使用更简单的方法。

2$2$>{@@;;"S"\}{;\/"B"\} if

供将来参考,GS中的所有数字均为大整数。
彼得·泰勒

我想我可以发布原始照片而不必担心!好消息。
kaine 2014年

我最初评论说,我认为这是DayTrader的副本,但是后来我意识到,由于情况的不同,其行为是相同的,并且在其他情况下它们可能会有所不同。对不起,如果我得罪了任何人。让我们一起致富吧!
Rainbolt 2014年

@Rainbolt我将其编写为GolfScript,在提交之前先阅读您的文章以查找重复内容,并实际上使用了一些或您的代码来编写Java版本。核心部分不是重复部分(或者我不会提交),但最终在这些动荡的市场中成为类似的。我并不感到冒犯,但是如果您觉得它太接近了,我将要求取消它的资格(但是代码仍然存在,我从中学到了一些东西可以写出来)。由于您拥有优先权,即使在那种情况下,我也不会受到冒犯。注意地震几乎与您相同,但是做得不同(保存到文件中)。
kaine 2014年

@kaine否否请勿删除。就像我说的那样,我以为它们是重复的,但绝对不是。它们的行为仅因情况而异。在我完全理解您的行为之前,我发表评论声称它们是重复项是错误的。
Rainbolt 2014年

6

BuyAndHold-C

#include <stdio.h>
#include <stdlib.h>

/* BuyAndHold
 * Code revised from OptoKopper's WaitForCrash.c
 */
int main(int argc, char *argv[]) {
    long long int share_price = strtoll(argv[1], NULL, 0);
    long long int money = strtoll(argv[2], NULL, 0);

    if (money >= share_price) {
        printf("B%lld\n", money / share_price);
    } else {
        printf("W\n");
    }

    return 0;
}

编译:gcc buyandhold.c -o buyandhold

使用./buyandhold价格货币股份运行


1
哈哈,我希望有人能够通过BuyAndHold来补充DayTrader。做得好!
Rainbolt 2014年

6

Alfred Pennyworth -Python 2

一天晚上我在巡逻时,阿尔弗雷德(Alfred)试图在不知情的情况下创建股票交易程序。他以为可以对我隐藏它,但是我找到了它,并弄清楚了它的作用。因为我是蝙蝠侠。现在,我决定参加比赛来教他一堂课。

钱对阿尔弗雷德没有异议,因为我确实很富有,但他仍然对自己的交易很聪明。售罄时,无论市场价格如何,他都会买得起。然后,每当市场价格高于其购买价格时,他就出售10(或所有剩余)股票。

import argparse

parser = argparse.ArgumentParser(description="This is a private matter, Master Bruce. Learn how to make your own bed and I will tell you.")
parser.add_argument("Stuff", type=int, nargs='+', help="You don't need to know, Master Bruce.")

args=parser.parse_args()
vals=[]
for x in args:
    vals.append(x)

a=vals[0]
b=vals[1]
c=vals[2]

if c==0:
    x=1
    while x*a<b:
        x+=1
    print "B"+str(x)
    with open("lastval.txt", w) as f:
        f.write(a)

else:
    lastval=next(open("lastval.txt"))
    if a>lastval:print "S10" if c>10 else "S"+str(c)
    else:print 'W'

运行: python GoAwayMasterBruce.py <args>


AttributeError: 'ArgumentParser' object has no attribute 'parseargs'需要哪个版本的Python?
彼得·泰勒

我的错,有一个下划线。parse_args()
RageCage 2014年

5

朴素的

NaiveBot对于所有这种“股票市场”大腕都是新手。他只是假设价格上涨时应该买入,价格下跌时应该卖出。但是他没有汁液,袖子上有个把戏!他只买一半的钱,也只卖一半的钱。

NaiveBot不再在高速公路下的盒子里生活!

<?php
$cur = array('price' => $argv[1], 'funds' => $argv[2], 'shares' => $argv[3]);

$cachefile = 'cache.json';
if( ! file_exists($cachefile) ) { $cache = array(); }
else { $cache = json_decode(file_get_contents($cachefile), true); }

// determine action
if( empty($cache) ) {
    $action = 'buy'; // always buy on first turn
} else if( $cur['price'] > $cache[count($cache)-1]['price'] ) {
    $action = 'buy';
} else if( $cur['price'] < $cache[count($cache)-1]['price'] ) {
    $action = 'sell';
} else {
    $action = 'hold';
}

// determine volume
if( $action == 'hold' ) {
    $volume = 0;
} else if( $action == 'buy' ) {
    // spend half my money on shares!
    $volume = floor(($cur['funds']/2)/$cur['price']);
} else if( $action == 'sell' ) {
    // sell half my shares!
    $volume = floor($cur['shares']/2);
}

// do a thing!
if( $action == 'hold' ) { echo 'W'; }
else if( $action == 'buy' ) { echo "B $volume"; }
else { echo "S $volume"; }
echo "\n";

$cache[] = $cur;
if( count($cache) == 50 ) { unlink($cachefile); } // wipe cache on last turn
else { file_put_contents($cachefile,json_encode($cache)); } // write cache

使用运行php Naivebot.php $1 $2 $3cache.json在其当前文件夹中创建一个。


5

利润-Haskell

  1. 等到价格为1 / maxValue
  2. 买/卖一切
  3. ????
  4. 利润!!!

import System.Environment (getArgs)

main = putStrLn . trade . map read =<< getArgs

trade :: [Integer] -> String
trade [p,m,s] -- not intended
  | p == 1 = "B" ++ (show m)
  | p == (fromIntegral $ (maxBound::Int) - 1) = "S" ++ (show s)
  | otherwise = "W"

用编译ghc profit.hs并运行./profit price money stock

如果效率不够高,请添加-O3标志,尽管它可能会过大:D


编辑:

“优化”,现在在价格等于时出售所有商品Integer.MAX_VALUE


为什么不main = putStrLn . trade . map read =<< getArgs呢?噪音更小
recursion.ninja

@awashburn因为我对单子不是很了解;)
ThreeFx

希望我的评论对您有所帮助!
recursion.ninja 2014年

@ThreeFx有一个程序可以执行此操作,cabal install pointfree现在每个人都认为您在早餐时会吃单子。
肖恩D

@SeanD谢谢,我来看一下
ThreeFx

4

等待崩溃

编辑:修复了概念上的缺陷

编辑:现在使用long long int

这是我的第一次尝试。它的行为非常简单,并且可以区分出是第一轮还是下一轮。在第一轮中,什么都不会丢失,所以它购买股票。如果有股份,它将出售它们。如果最终股价跌至10,它将再次购买。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    long long int share_price = strtoll(argv[1], NULL, 0);
    long long int money = strtoll(argv[2], NULL, 0);
    long long int shares_owned = strtoll(argv[3], NULL, 0);

    if(shares_owned > 1) {
        printf("S%lld\n", shares_owned - 1);
    } else if (shares_owned == 0 || share_price == 10) {
        printf("B%lld\n", money / share_price);
    } else {
        printf("W\n");
    }

    return 0;
}

编译: gcc waitforcrash.c -o waitforcrash

运行为 ./waitforcrash PRICE MONEY SHARES


希望您不要介意我将您的代码用作BuyAndHold解决方案的基础。顺便说一句,整数很长,%d必须为%Ld以避免警告(或者是%lld?都不会给我警告)。
2014年

没关系。是的,我在代码中包含%lld,必须在更新中忘记了它们,ty。
Optokopper 2014年

3

地震

在购买所有商品和出售所有商品之间(除了一个)交替进行。它真正的目的不是赢得胜利,而是破坏他人。

using System;
using System.IO;

namespace Earthquaker
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length < 3)
                return;

            int stockPrice = int.Parse(args[0]);
            int money = int.Parse(args[1]);
            int stocks = int.Parse(args[2]);

            bool shouldBuy = true;

            if (stocks != 0)
            {
                StreamReader sr = new StreamReader("brain.txt");
                if (sr.ReadLine() == "B")
                    shouldBuy = false;
                else
                    shouldBuy = true;
                sr.Close();
            }

            if (shouldBuy)
                Console.Write("B" + (money / stockPrice));
            else
                Console.Write("S" + (stocks - 1));

            StreamWriter sw = new StreamWriter("brain.txt", false);
            sw.Write(shouldBuy ? 'B' : 'S');
            sw.Close();
        }
    }
}

用编译csc Earthquaker.cs。用运行Earthquaker


.Net具有System.IO.File.ReadAllTextWriteAllText,因此您可以稍微简化历史记录跟踪。
彼得·泰勒

如果找不到其brain.txt文件,则会崩溃。
彼得·泰勒

3

MonkeyTrader(在JAVA中)

俗话说猴子是好商人。我做证明。“购买”和“出售”之间的决定完全是随机的。

import java.math.BigInteger;
import java.util.Random;

public class MonkeyTrader {
    /**
     * @param args the command line arguments containing the current 
     * market value, our current money, and our current shares
     */
    public static void main(String[] args) {
        BigInteger marketValue = new BigInteger(args[0]);
        BigInteger myMoney = new BigInteger(args[1]);
        BigInteger myShares = new BigInteger(args[2]);
        Random random=new Random();

        switch (random.nextInt(2)) {
        case 0:
            System.out.println("B" + myMoney.divide(marketValue));
            break;
        case 1:
            System.out.println("S" + myShares);
            break;
        }
    }
}

3

IntelliTrader

在第一轮交易中,如果价格合理:80美元或更高,他将出售自己的股票。然后,如果价格等于或高于其最后一次卖出的价格,他将卖出;如果价格等于或低于其最后一次购买的价格,则买入。

IntelliTrader.java

import java.io.*;
import java.math.BigInteger;
import java.util.Properties;

public class IntelliTrader {

    private static final String ROUND_NUM = "roundNum";
    private static final String LAST_BUY = "lastBuy";
    private static final String LAST_SELL = "lastSell";
    private static final String FILE = "IntelliTrader/memory.txt";

    private Properties memory;
    private int roundNum;

    private IntelliTrader(Properties memory) {
        this.memory = memory;
        roundNum = new Integer(memory.getProperty(ROUND_NUM, "0"));
    }

    public String evaluate(BigInteger market, BigInteger money, BigInteger shares) {
        String command = "W";
        if (roundNum == 0) {
            if (market.intValue() > 80) {
                command = sell(market, shares);
            } else {
                command = buy(market, money);
            }
        } else {
            if (market.compareTo(new BigInteger(memory.getProperty(LAST_SELL, "0"))) >= 0) {
                command = sell(market, shares);
            } else if (market.compareTo(new BigInteger(memory.getProperty(LAST_BUY, "999999999"))) <= 0) {
                command = buy(market, money);
            }
        }
        return command;
    }

    private String buy(BigInteger cost, BigInteger money) {
        memory.setProperty(LAST_BUY, cost.toString());
        return "B" + money.divide(cost).toString();
    }

    private String sell(BigInteger cost, BigInteger shares) {
        memory.setProperty(LAST_SELL, cost.toString());
        return "S"+shares.toString();
    }


    public static void main(String[] args) {    
        BigInteger marketValue = new BigInteger(args[0]);
        BigInteger myMoney = new BigInteger(args[1]);
        BigInteger myShares = new BigInteger(args[2]);

        Properties memory = new Properties();
        try {
            memory.load(new FileReader(FILE));
        } catch (IOException e) {
            //ignore, file probably doesn't exist yet
        }

        int roundNum = new Integer(memory.getProperty(ROUND_NUM, "0"));
        if (roundNum > 49) {
            roundNum = 0;
            memory.setProperty(ROUND_NUM, "0");
            memory.setProperty(LAST_BUY, "0");
            memory.setProperty(LAST_SELL, "0");
        }

        IntelliTrader it = new IntelliTrader(memory);
        String command = it.evaluate(marketValue, myMoney, myShares);
        System.out.println(command);

        roundNum++;
        memory.setProperty(ROUND_NUM, ""+roundNum);
        try {
            memory.store(new FileWriter(FILE), "IntelliTrader memory properties");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

javac IntelliTrader编译。使用java -cp“ IntelliTrader” IntelliTrader运行


在我的测试中,这似乎是第二好的交易者。
彼得·泰勒

2

theAnswerOfLifeIs42.py

我的程序喜欢数字42

规则很简单:我可以买入42只股票,也可以卖出42只股票。

import sys
price, money, shares = [int(arg) for arg in sys.argv[1:]]

if money>42*price:
 print "B 42"
else:
 print "S 42"

2

LeesonLearnt v1.1(Java,保守)

由于规则的更改意味着我们现在要从一些股份开始,因此不再有保证最佳的先举手法,因此我通过删除首个转弯的特殊情况来简化此操作。

import java.math.BigInteger;

public class LeesonLearnt {
    private static final BigInteger THRESHOLD = new BigInteger("100");

    public static void main(String[] args){
        BigInteger price = new BigInteger(args[0]);
        BigInteger capital = new BigInteger(args[1]);
        BigInteger shareholding = new BigInteger(args[2]);

        BigInteger affordable = capital.divide(price);

        // In the long run, the shares will probably lose all their value.
        // But if they're cheap, buying them will pump them and they can be sold at a profit.
        // The target amount of our value held in shares varies exponentially with their price.
        BigInteger targetShareholding = price.compareTo(THRESHOLD) > 0
            ? BigInteger.ZERO
            : affordable.add(shareholding).shiftRight(price.intValue() - 1);
        if (targetShareholding.compareTo(shareholding) <= 0) {
            System.out.println("S" + shareholding.subtract(targetShareholding));
        }
        else {
            BigInteger diff = targetShareholding.subtract(shareholding);
            System.out.println("B" + diff.min(affordable));
        }
    }
}

调用为

java -cp LeesonLearnt LeesonLearnt <price> <capital> <shareholding>

1

美元成本平均-Python 3

该策略尝试通过每轮购买(尽可能接近)固定数量的货币(任意设置为150,这样到最后它可能会用尽大部分货币)来使用平均成本成本。

import sys
price, money, shares = [int(arg) for arg in sys.argv[1:]]
target_per_day = 150
buy = round(min(target_per_day, money) / price)
if buy * price > money:
    buy -= 1
if buy > 0:
    print("B" + str(buy))
else:
    print("W")

1

现金为王-Python 2或3

这个家伙对股市非常悲观。他宁愿把现金保留在可以安全存放在床垫下的地方。

import sys
shares = int(sys.argv[3])
if shares > 0:
    print("S" + str(shares))
else:
    print("W")

1

缓慢而稳定

只要有钱,它就会购买价值165美元的股票。否则,它会出售其所有股票以获得更多资金,购买更多股票。在第50轮,它确保出售所有股票,因为最终我们要现金。

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Paths;

public class SlowAndSteady{
    public static void main(String[] args) {
        BigInteger price = new BigInteger(args[0]);
        BigInteger cash= new BigInteger(args[1]);
        long shares= Long.parseLong(args[2]);
        BigInteger number = new BigInteger("165");
        String count = "0";


        try {
            count = new String(Files.readAllBytes(Paths.get("counter.txt")));
        } catch (IOException e) {

        }

        int c = Integer.parseInt(count)+1;

        if (c >= 50)
        {
            System.out.println("S" + shares);
            c=0;
        }

        else if(cash.compareTo(number) > 0)     System.out.println("B" + (number.divide(price)));

        else System.out.println("S" + shares);


        try {
            Writer wr = new FileWriter("counter.txt");
            wr.write(Integer.toString(c));
            wr.close();
        } catch (IOException e) {
        }
   }
}

使用javac SlowAndSteady.java进行编译。使用java -cp“ SlowAndSteady” SlowAndSteady运行。计数器应在两轮之间重置,但是如果删除文件,它也将起作用。


1

低买入

跟踪市场历史并在低价时买入,在高价时卖出。

import sys

storage = 'BuyHighSellLow'
turn = 0
turns = 50
max_start_price = 150
limit = 0.25

price = int(sys.argv[1])
money = int(sys.argv[2])
shares = int(sys.argv[3])

# Calculate average price
with open(storage+'/history', mode='a') as f:
            pass # Create file if it doesn't exist
with open(storage+'/history', mode='r') as f:
    values = list((int(line) for line in f))
    turn = len(values) + 1
    if turn > turns: turn = 1
    if turn == 1:
            average = max_start_price + 1
            turn = 1
    else:
            average = sum((value / turn for value in values))

# Buy low and sell high
if price < average:
    print('B' + str(int(limit * money / price)))
elif price > average:
    print('S' + str(int(limit * shares)))
else:
    print('W')

# Save history
if turn == 1: mode='w'
else: mode = 'a'
with open(storage+'/history', mode=mode) as f:
    print(price, file=f)

运行:

python3 BuyHighSellLow/buyhighselllow.py

1

时间是对的-Python 3

我很无聊,所以我写了另一个参赛者。

这个年轻的企业家日以继夜地生活。在适当的时候,他做出决定。他也很讨厌在上下文之外使用法语...;)

跑:

python3 timeisright.py [arg1] [arg2] [arg3]

码:

import sys, time

price = int(sys.argv[1])
money = int(sys.argv[2])
shares = int(sys.argv[3])

lheure = int(time.time())

if lheure % 3 == 0:
    print('S'+str(int(shares/4)))
elif lheure % 3 == 1:
    print('B'+str(int(money/4*price)))
else:
    print('W')

1

奥尔计时器-Fortran 77

这位老人担任办公室文员六十年后,将浪费他的退休金。但是,在他晚年的时候,他变得非常盲目,因此他只能看到每个参数的第一个数字,因此他可以估算价格。他的方法类似于Walt的方法,除了Ol'Timer更粗心。

由于Fortran打印存在问题,因此我编写了一个Python程序来提供帮助。该程序采用提供的参数并将它们通过管道传递到Fortran程序。然后,Python程序将输出重新格式化为期望的格式。

编译:

gfortran oltimer.for -o oltimer.exe

跑:

python3 assistant.py [arg1] [arg2] [arg3]

Python助手代码:

from subprocess import Popen, PIPE
import sys, re

ret = Popen('./oltimer.exe '+sys.argv[1]+' '+sys.argv[2]+' '+sys.argv[3], stdout=PIPE, shell=True).communicate()[0].decode('utf-8')
value=re.findall(r'\d+',ret)

if 'W' in ret:
     print('W')

elif 'B' in ret:
     print('B'+str(value[0]))

elif 'S' in ret:
     print('S'+str(value[0]))

FORTRAN主要代码:

      PROGRAM OLTIMER
C DEFINE VARIABLES
          INTEGER :: PRICE
          INTEGER :: STOCK
          INTEGER :: MONEY
          INTEGER :: INTBUFFER
          CHARACTER :: BUFFER
C GET CMD ARGUMENTS & CONVERT TO INT
          CALL getarg(1, BUFFER)
          READ (BUFFER, '(i10)') PRICE
          CALL getarg(2, BUFFER)
          READ (BUFFER, '(i10)') MONEY
          CALL getarg(3, BUFFER)
          READ (BUFFER, '(i10)') STOCK
C EVALUATE SITUTATION AND MAKE DECISION
          IF (PRICE.LT.5) THEN
            IF (MONEY.GT.0) THEN
                INTBUFFER=(MONEY*50)/(5-PRICE)
                PRINT*,'B',INTBUFFER
            ELSE
                PRINT*,'W'
            END IF
          ELSE
            IF (PRICE.GT.9) THEN
                IF (STOCK.GT.0) THEN
                    INTBUFFER=STOCK/(PRICE-9)
                    PRINT*,'S',INTBUFFER
                ELSE
                    PRINT*,'W'
                END IF
            ELSE
                PRINT*,'W'
            END IF
          END IF      
      END PROGRAM

1
既然您仍然需要Python,并且Python中还有其他答案,而Fortran中没有答案,那么您认为在Python中实现整个功能并减轻OP必须安装的编译器负担是否有意义?
彼得·泰勒

@Peter我愿意,但是我认为拥有完全不同的语言并查看其性能会很有趣。
Beta Decay

0

Test1交易者

public class Test1 {

    public static void main(String[] args){
        int marketValue = Integer.parseInt(args[0]);
        int myMoney = Integer.parseInt(args[1]);
        int myShares = Integer.parseInt(args[2]);

        //Buy 10 if we don't have any.
        if(myShares <= 0){
            System.out.println("B10");
        }else{
            System.out.println("S1");
        }
    }
}

编译javac Test1.java运行java -cp "Test1" Test1


0

刺猬-python2.7

这主要是为了保留名称

from __future__ import print_function
from sys import argv

storage = 'prices.txt'
price,cash,shares = map(long, argv[1:])
turn = 1
buy = lambda x: print('B%d' % long(x))
sell = lambda x: print('S%d' % long(x))
cashtoshares = lambda c: long(c/price)
TURN,PRICE,CASH,SHARES=range(4)

try:   
    data = [map(long, line.split()) for line in open(storage)]
    if data:
        turn = data[-1][TURN] + 1
except IOError:
    pass
with open(storage, 'a') as pricelist:
    pricelist.write('%d %d %d %d\n' % (turn, price, cash, shares))

if turn == 1:
    buy(cashtoshares(cash)) # convert all cash into shares
elif price == 1:
    buy(cashtoshares(cash)) # cannot buy at a better deal
elif price < 10:
    buy(cashtoshares(cash/2))
elif shares < 10:
    buy(cashtoshares(cash/2))
else:
    sell(shares/2)

运行为

python hedgehog.py PRICE CASH SHARES

0

BuyAndSell-C

与汤米类似,但不是副本。在尽可能多的恐慌购买和出售一切之间交替。几乎复制了Earthquaker,保留了一股股票,而BuyAndSell出售了所有股票。当没有要出售的股票但没有足够的钱购买一股股票时,BuyAndSell不采取任何行动。

/* BuyAndSell
 * Code revised from OptoKopper's WaitForCrash.c and my BuyAndHold.c
 * Alternates between buying as many shares as possible and selling everything
 * Run it as ./buyandsell PRICE MONEY SHARES
 */
int main(int argc, char *argv[]) {
    long long int share_price = strtoll(argv[1], NULL, 0);
    long long int money = strtoll(argv[2], NULL, 0);
    long long int shares = strtoll(argv[3], NULL, 0);

    if (money >= share_price) {
        printf("B%lld\n", money / share_price);
    } else {
        if (money == 0) {
            printf("S%lld\n", shares);
        } else {
            printf("W\n");
        }
    }

    return 0;
}

编译为“ gcc buyandsell.c -o buyandsell”

以“ ./buyandsell价格货币份额运行


0

索罗斯峡谷

price = ARGV.shift
money = ARGV.shift
stock = ARGV.shift
if price*10<money
  puts "B10"
else
  puts "S#{stock}"
end

买得慢,而不是卖出一切,以试图破坏市场。

运行:Soros.rb price money stock


1
它在问题文本中明确指出Do not intentionally create programs to crash the simulation.
Beta Decay 2014年

@BetaDecay我的意思是不要尝试使控制器崩溃。试图使市场崩溃是游戏的一部分。
spocot

@spocot哦,我认为您的意思不是要创建使市场崩溃的程序。您应该用不同的措词来防止更多的混乱。
Beta Decay's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.