Sàn giao dịch chứng khoán Stack ~ Sửa đổi [đóng]


35

Lý lịch

Bạn là tất cả các thương nhân cho một công ty chứng khoán ít uy tín hơn một chút. Tất cả các bạn là một phần của một nhóm các nhà giao dịch chỉ tập trung vào một cổ phiếu cụ thể.

Mỗi giờ mỗi nhà giao dịch có cơ hội Mua cổ phiếu X hoặc Bán cổ phiếu X. Có 50 giờ mỗi vòng và 3 vòng mỗi cuộc thi. Kết thúc tất cả các vòng, nhà giao dịch có giá trị trung bình cao nhất sẽ thắng một chuyến đi đến Jamaica!

Trò chơi

Có 3 vòng 50 lượt mỗi lượt.

Mỗi nhà giao dịch bắt đầu vòng đàm phán với 5000 đô la và Một số lượng cổ phiếu ngẫu nhiên từ 20 đến 30 cổ phiếu. Giá của các cổ phiếu bắt đầu ở một số ngẫu nhiên giữa 10 và 150.

Mỗi lượt, mỗi nhà giao dịch có thể Mua bất kỳ số lượng cổ phiếu nào họ có thể đủ khả năng hoặc Bán bất kỳ số lượng cổ phiếu nào họ đang nắm giữ, mỗi cổ phiếu với giá hiện tại trên mỗi cổ phiếu.

Giá mỗi cổ phiếu tăng thêm một số ngẫu nhiên từ 1 đến 5 cho mỗi cổ phiếu được mua và giảm theo giá trị ngẫu nhiên từ 2 đến 6 cho mỗi cổ phiếu được bán. Giá tối thiểu là $ 1.

Điều quan trọng cần lưu ý là tất cả các nhà giao dịch xử lý các giao dịch của họ cùng một lúc, có nghĩa là bất kỳ nhà giao dịch mua / bán cổ phiếu nào sẽ không ảnh hưởng đến giá cho đến lượt tiếp theo.

Người chơi có giá trị trung bình cao nhất khi kết thúc 3 vòng đấu sẽ thắng. Giá trị được xác định bằng cách lấy số tiền còn lại vào cuối vòng và thêm số lượng cổ phiếu thuộc sở hữu của thương nhân * đóng cửa thị trường.

Lập luận

Chương trình của bạn sẽ được chạy lại vào đầu mỗi lượt nhận giá thị trường hiện tại, số tiền hiện tại của nhà giao dịch và số cổ phần mà thương nhân đó sở hữu.

Vd

120 5000 0

Đầu ra

Chương trình giao dịch viên của bạn phải xuất một chữ cái tương ứng với hành động mà nó muốn thực hiện theo số lượng.

Vd

B10 //Buy 10 shares

hoặc là

S3 //Sell 3 shares

Người giao dịch cũng có tùy chọn không làm gì cả. Điều đó có thể được thực hiện bằng cách xuất W hoặc bất kỳ lệnh nào khác không phải là 'B> amnt <' hoặc 'S> amnt <'

Đệ trình

Chương trình của bạn sẽ nằm trong thư mục 'người chơi /> tên chương trình của bạn <':

+-- players
|   +-- BotNameFolder
|       +-- BotProgram   

Vui lòng cung cấp mã của bạn cùng với một đối số dòng lệnh để chạy mã từ bên trong thư mục 'người chơi'. Ví dụ: người giao dịch Test1 có thể được chạy vớijava -cp "Test1" Test1

Quy tắc bổ sung

Hãy tiếp tục, tự bắn EmoWolf, Idc.

Không làm phiền với bất cứ điều gì bên ngoài thư mục BotNameFolder của bạn, vui lòng tạo các tệp trong đó mặc dù để có thông tin liên tục trong suốt vòng / lượt.

Không cố ý tạo chương trình để phá vỡ mô phỏng.

Tôi sẽ chấp nhận nhiều mục nhập cho mỗi người dùng, miễn là các mục đó đóng vai trò là các thực thể riêng biệt (Không có giao dịch nội gián).

Bảng xếp hạng

[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453

Tôi sẽ cố gắng cập nhật bảng xếp hạng ít nhất một lần một ngày

Bộ điều khiển

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;
    }
}

Biên dịch cái này với java Controller.javavà chạy từ một thư mục chứa một thư mục như dưới đây:

+-- resources
|   +-- config
|   +-- players
|       +-- Player1Folder
|           +-- Player1Program
|       +-- Player2Folder
|           +-- Player2Program

Các tập tin configsẽ trông giống như thế này:

3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader

Số thứ nhất là số vòng, số thứ hai là lượt trên mỗi vòng, tiếp theo là các lệnh để chạy từng người chơi.

Thay thế không gian bằng ký hiệu! ('&')

~ Hãy cho tôi biết nếu tôi có thể cải thiện từ ngữ của bài đăng này, và giao dịch hạnh phúc!


4
Có vẻ như xu hướng dài hạn trong một thị trường bận rộn sẽ thấy cổ phiếu có giá trị âm.
Peter Taylor

6
Bạn có thể đặt chương trình điều khiển của mình lên một cái gì đó như Github và bao gồm một liên kết để chúng tôi có thể kiểm tra tại nhà không?
Peter Taylor

6
Nhìn vào bảng xếp hạng, tôi nghĩ rằng trò chơi hiện đang thiếu sót. Ví dụ: bắt đầu ở mức 14 đô la / sh, mua 357 (sở hữu 357, 0 đô la trong ngân hàng). Chọn số ngẫu nhiên (3). Giá tăng 3 * 357 lên $ 1085 / sh. Vòng tiếp theo. Bán tất cả 357 cổ phiếu (sở hữu 0, $ 387.345 trong ngân hàng). Chọn số ngẫu nhiên (3). Giá giảm 3 * 357 xuống $ 14 / sh. Vòng tiếp theo. Sau hai vòng, giá không thay đổi và ngân hàng của bạn đã tăng 77 lần (có thể có kết quả tương tự nhưng ít kịch tính hơn với các biến ngẫu nhiên bắt đầu khác). Tôi đề xuất thay đổi cho từng giao dịch thay vì cho mỗi chia sẻ để có giá trị hợp lý hơn.

4
Hoặc chỉ cần xây dựng một cuốn sách đặt hàng thực sự.
o0 '.

3
Tại sao bắt đầu với một số cổ phiếu ngẫu nhiên?
Averroes

Câu trả lời:


18

Tôi trình bày 'người mơ mộng', người luôn ngủ và quên mua hoặc bán bất cứ thứ gì. Ông hy vọng rằng những người chơi khác sẽ thua lỗ. Mã Python:

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

chạy với python daydreamer\daydreamer.py 120 5000 0hoặc bất cứ giá trị nào bạn muốn

Tôi sẽ đăng một câu trả lời nghiêm túc hơn sau, đây chỉ là để bóng lăn :)


3
Tôi không nghĩ rằng nó sẽ chạy - bạn cần thụt lề in.
isaacg

6
Cho rằng giá cổ phiếu sẽ có xu hướng giảm trong dài hạn, không giao dịch có thể là một chiến lược tuyệt vời.

5
Một trò chơi lạ: động thái chiến thắng duy nhất là không chơi. Làm thế nào về một trò chơi cờ vua tốt đẹp?
Tim S.

13

DayTrader

Cập nhật thay đổi quy tắc được thực hiện vào ngày 21/8/2014, nơi người chơi bắt đầu với 20-30 lượt chia sẻ.

Mua càng nhiều càng tốt, sau đó bán càng nhiều càng tốt.

Triết học

Chúng tôi hy vọng rằng mô hình dưới đây sẽ lặp đi lặp lại nhiều lần. Lưu ý rằng bằng cách tuân thủ mô hình này, chúng tôi cũng đóng góp cho nó.

  • Mọi người chỉ có thể mua hoặc giữ trên vòng một. Giá trị chỉ có thể tăng, vì vậy chúng tôi mua.
  • Mọi người đều có thể mua thêm, giữ hoặc bán ở vòng hai. Chúng tôi không mong đợi nhiều người chơi sẽ mua vào vòng hai, vì vậy chúng tôi bán.

Các mô hình là tinh thể rõ ràng ở đầu. Giá trị sẽ tăng sau vòng một. Nó sẽ giảm sau vòng hai. Ngoài ra, các dự đoán trở nên mờ nhạt. Tôi hy vọng sẽ làm tốt trong các vòng đầu, trước khi thị trường ổn định.

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());
        }
    }

}

Biên dịch với javac DayTrader.java. Chạy với java -cp "DayTrader" DayTrader.


1
Yay java! Làm cho nó dễ dàng hơn để chạy.
spocot

6
Bot của bạn đã tạo ra thị trường vượt quá số lượng tối đa cho các số nguyên, vì vậy tôi đã triển khai BigIntegers vào mã. Vì mã của mọi người đã sử dụng ints, nó đã bị sập khá nhiều bot của mọi người cho người mơ mộng
spocot

@spocot Tôi đã chỉnh sửa triển khai của mình để sử dụng BigInteger. Hy vọng rằng sẽ giúp.
Rainbolt

5
Tôi nghĩ rằng đây là một vấn đề cố hữu trong các quy tắc. Nếu một nhà giao dịch nhận được 140 cổ phiếu, anh ta có thể tự mình kiểm soát thị trường. Trong hai vòng, anh ta có thể mua 10 cổ phiếu cho mỗi nhóm và bán chúng với giá 140 mỗi cái, dẫn đến chiến thắng 1300% (giả sử không ai làm điều ngược lại). Điều này sẽ leo thang đến một cái gì đó như 5000 * 13 ^ 25, đó là cách lớn.
Optokopper

2
@spocot Tôi chỉ muốn ping bạn vì tôi đã sửa đổi bài đăng của mình sau khi bạn thay đổi quy tắc gần đây.
Rainbolt

9

Walt Disney - Python 3

Walt chờ đợi cho đến khi cổ phiếu chạm đáy và sau đó mua bao nhiêu tiền mà anh ta cho phép. Sau đó, khi giá tăng vọt, anh bán tất cả.

Dựa trên chiến lược của Disney khi anh 'sống sót' qua vụ tai nạn ở Phố Wall. Thật không may, chương trình của tôi không thể xây dựng các công viên chủ đề ... Nếu chỉ ...

Chạy:

python3 waltdisney.py

Mã số:

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')

Bạn đang thiếu dấu ngoặc đơn đóng trên dòng in đầu tiên của bạn.
supersam654

@ supersam654 Oh yeah, cảm ơn
Beta Decay

Bạn có thể chỉ ra một nguồn để khẳng định rằng Walt Disney thực sự đã sử dụng chiến lược này. Do có một công ty tên Walt Disney Co trên sàn giao dịch chứng khoán, rất khó để tìm kiếm và trang wikipedia của Walt không đề cập đến nó.
Michael

@Michael Investopedia.com/articles/fin finance
Beta Decay

@Michael Tôi đã nhận được thông tin ban đầu từ giáo viên lịch sử của mình, rất tiếc nếu nguồn hơi yếu.
Beta Decay

8

Tommy

chỉ biết những gì anh ta có nhưng quyết tâm mạo hiểm mọi thứ trên thị trường. Nếu anh ta có thể mua, anh ta sẽ. Nếu anh ta không thể, anh ta bán mọi thứ anh ta có để anh ta có thể tiếp theo. (Điều này sẽ hoạt động tốt với những người cực đoan như DayTrader nhưng sẽ tự động sửa nếu giá trị giảm khi anh ta nghĩ rằng nó sẽ tăng lên.)

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());
       }
    }

}

Golf

Đây là cùng một mã nhưng nếu thích điều này. Tôi đã viết java sau khi trong trường hợp điều BigInteger là cần thiết. Sử dụng bất cứ điều gì dễ dàng hơn.

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

Để tham khảo trong tương lai, tất cả các số trong GS là số nguyên lớn.
Peter Taylor

Tôi đoán tôi có thể chỉ cần đăng bản gốc mà không phải lo lắng về nó sau đó! Tin tốt.
kaine

Ban đầu tôi nhận xét rằng tôi nghĩ đây là bản sao của DayTrader, nhưng sau đó tôi nhận ra rằng hành vi đó chỉ giống nhau do hoàn cảnh và họ có thể chuyển hướng trong các trường hợp khác. Xin lỗi nếu tôi xúc phạm bất cứ ai. Hãy cùng nhau làm giàu!
Rainbolt

@Rainbolt Tôi đã viết nó GolfScript, đọc của bạn tìm kiếm các bản sao trước khi gửi và thực sự đã sử dụng một số hoặc mã của bạn để viết phiên bản Java. Phần cốt lõi không phải là một bản sao (hoặc tôi sẽ không gửi nó) nhưng cuối cùng lại trở thành mô phỏng trong các thị trường dễ bay hơi này. Tôi không bị xúc phạm nhưng nếu bạn cảm thấy nó quá gần, tôi sẽ yêu cầu nó bị loại (nhưng mã vẫn còn, tôi đã học được một cái gì đó viết nó là toàn bộ vấn đề). Vì bạn có quyền ưu tiên nên tôi sẽ không bị xúc phạm ngay cả trong trường hợp đó. Lưu ý Earthquakers gần như giống hệt bạn nhưng lại khác (lưu vào tệp).
kaine

@kaine Không không không xóa nó. Như tôi đã nói, tôi nghĩ rằng chúng là bản sao, nhưng chúng chắc chắn không . Họ giống nhau trong hành vi chỉ vì hoàn cảnh. Tôi đã sai khi đăng một bình luận cho rằng chúng là bản sao trước khi tôi hoàn toàn hiểu những gì bạn đang làm.
Rainbolt

6

MuaAndHold - 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;
}

Biên dịch với: gcc buyandkeep.c -o buyandhold

Chạy nó với ./buyandkeep GIÁ CHIA SẺ TIỀN


1
Haha Tôi đã hy vọng ai đó sẽ bổ sung DayTrader bằng BuyAndHold. Làm tốt!
Rainbolt

6

Alfred Pennyworth - Python 2

Trong khi tôi ra ngoài tuần tra vào một đêm, Alfred đã cố gắng tạo ra một chương trình giao dịch chứng khoán mà tôi không biết. Anh ta nghĩ rằng anh ta có thể che giấu nó khỏi tôi, nhưng tôi đã tìm thấy nó và tìm ra những gì nó đã làm. Bởi vì tôi là người dơi. Bây giờ tôi đã quyết định tham gia một cuộc thi để dạy cho anh ta một bài học.

Tiền không phải là đối tượng của Alfred vì tôi THỰC SỰ giàu có, nhưng anh ấy vẫn thông minh về giao dịch của mình. Khi hết cổ phiếu, anh ta mua càng nhiều càng tốt, bất kể giá thị trường. Sau đó, ông bán 10 (hoặc tất cả các cổ phiếu còn lại) mỗi khi giá thị trường cao hơn giá mua.

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'

Chạy với: python GoAwayMasterBruce.py <args>


AttributeError: 'ArgumentParser' object has no attribute 'parseargs'Phiên bản Python nào cần?
Peter Taylor

Sai lầm của tôi, có một dấu gạch dưới. parse_args()
RageCage

5

NaiveBot

NaiveBot là mới đối với tất cả các "thị trường chứng khoán" hoopmus này. Anh ta chỉ cho rằng khi giá tăng thì anh ta nên mua, và khi giá giảm thì anh ta nên bán. Nhưng anh ta không có nhựa, anh ta có một mánh khóe! Anh ta chỉ mua một nửa những gì anh ta có thể đủ khả năng, và chỉ bán một nửa những gì anh ta có.

Không còn sống trong một chiếc hộp dưới xa lộ cho 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

Chạy với php Naivebot.php $1 $2 $3, làm cho một cache.jsontrong thư mục hiện tại của nó.


5

Lợi nhuận - Haskell

  1. Đợi cho đến khi giá là 1 / maxValue
  2. Mua / bán mọi thứ
  3. ????
  4. LỢI NHUẬN!!!

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"

Biên dịch với ghc profit.hsvà chạy với ./profit price money stock.

Nếu nó không đủ hiệu quả, hãy thêm -O3cờ, mặc dù có thể nó quá mức cần thiết: D


Chỉnh sửa:

"Tối ưu hóa", bây giờ bán mọi thứ khi giá bằng Integer.MAX_VALUE.


Tại sao không main = putStrLn . trade . map read =<< getArgs? Ít ồn ào hơn
đệ

@awashburn Bởi vì tôi không đọc nhiều về các đơn vị;)
ThreeFx

Tôi hy vọng bình luận của tôi đã giúp bạn học được điều gì đó mới!
đệ

@ThreeFx có một chương trình để làm điều đó cabal install pointfree, bây giờ mọi người sẽ nghĩ bạn ăn monad cho bữa sáng.
Sean D

@SeanD Cảm ơn, tôi sẽ xem thử
ThreeFx

4

Chờ đợi

EDIT: lỗ hổng cố định trong khái niệm

EDIT: hiện đang sử dụng int dài dài

Đây là lần thử đầu tiên của tôi. Nó hoạt động thực sự đơn giản và giữ một chia sẻ để phân biệt nếu đó là vòng đầu tiên hay vòng sau. Trong vòng đầu tiên không có gì có thể bị mất, vì vậy nó mua cổ phiếu. Nếu nó có cổ phiếu, nó bán chúng. Nếu cuối cùng giá cổ phiếu giảm xuống 10, nó sẽ mua lại.

#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;
}

biên dịch với: gcc waitforcrash.c -o waitforcrash

chạy nó như ./waitforcrash PRICE MONEY SHARES


Hy vọng bạn không phiền tôi đã vuốt mã của bạn để sử dụng làm cơ sở cho giải pháp MuaAndHold. BTW với số nguyên dài,% d cần phải là% Ld để tránh cảnh báo (hoặc là% lld? Không cho tôi cảnh báo).
Glenn Randers-Pehrson

Không sao đâu. Vâng, tôi đã có% lld trong mã của mình, phải quên chúng trong bản cập nhật, ty.
Optokopper

3

Động đất

Thay thế giữa mua mọi thứ và bán mọi thứ (nhưng một). Nó không thực sự nhằm mục đích giành được nhiều như nó làm gián đoạn những người khác.

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();
        }
    }
}

Biên dịch với csc Earthquaker.cs. Chạy với Earthquaker.


.Net có System.IO.File.ReadAllTextWriteAllText, vì vậy bạn có thể đơn giản hóa việc theo dõi lịch sử của mình một chút.
Peter Taylor

Điều này sụp đổ nếu nó không tìm thấy brain.txttập tin của nó .
Peter Taylor

3

MonkeyTrader (trong JAVA)

Có một câu nói rằng khỉ là những người giao dịch tốt. Tôi làm bằng chứng. Quyết định giữa "mua" và "bán" là hoàn toàn ngẫu nhiên.

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

Vòng 1 anh ta sẽ bán cổ phần của mình nếu chúng có giá tốt: $ 80 trở lên. Sau đó, anh ta sẽ bán giảm giá nếu giá bằng hoặc tốt hơn giá cuối cùng anh ta bán, mua nếu giá bằng hoặc thấp hơn giá cuối cùng anh ta mua.

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();
        }
    }
}

Biên dịch với javac IntelliTrader . Chạy với java -cp "IntelliTrader" IntelliTrader


Trong các thử nghiệm của tôi, đây dường như là nhà giao dịch tốt thứ hai.
Peter Taylor

2

theAnswerOfLifeIs42.py

Chương trình của tôi thích số 42

Quy tắc rất đơn giản: Tôi có thể mua 42 cổ phiếu hoặc bán 42 cổ phiếu.

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, bảo thủ)

Vì thay đổi quy tắc có nghĩa là bây giờ chúng tôi bắt đầu với một số cổ phần, nên không còn bước đầu tiên được đảm bảo tốt nhất, vì vậy tôi đã đơn giản hóa điều này bằng cách loại bỏ trường hợp đặc biệt cho lượt đầu tiên.

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));
        }
    }
}

Gọi như

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

1

Trung bình chi phí đô la - Python 3

Chiến lược này cố gắng sử dụng trung bình chi phí bằng đô la bằng cách mua (càng gần càng tốt) một lượng tiền cố định (được đặt tùy ý ở mức 150 để cuối cùng có thể sẽ sử dụng hết phần lớn số tiền của mình).

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

Tiền mặt là vua - Python 2 hoặc 3

Anh chàng này rất bi quan về thị trường chứng khoán. Anh ta thà giữ tiền của mình bằng tiền mặt, nơi anh ta có thể giữ nó an toàn dưới nệm của mình.

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

1

Chậm mà chắc

Miễn là có tiền, nó mua cổ phiếu trị giá $ 165. Nếu không, nó bán tất cả cổ phần của mình để có thêm tiền, để mua thêm cổ phiếu. Vào vòng thứ 50, nó đảm bảo bán hết cổ phần, vì cuối cùng chúng tôi muốn có tiền mặt.

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) {
        }
   }
}

Biên dịch với javac SlowAndSteady.java. Chạy với java -cp "SlowAndSteady" SlowAndSteady. Bộ đếm nên đặt lại giữa các vòng, nhưng nếu tệp bị xóa, nó cũng sẽ hoạt động.


1

MuaHighSellLow

Theo dõi lịch sử thị trường và mua khi giá thấp và bán khi giá cao.

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)

Chạy với:

python3 BuyHighSellLow/buyhighselllow.py

1

Thời gian là đúng - Python 3

Tôi đã chán nên tôi đã viết một người khác ...

Chàng thanh niên trẻ tuổi này sống cuộc sống của mình bằng đồng hồ. Khi thời điểm thích hợp, anh ấy đưa ra quyết định. Anh ta cũng khó chịu sử dụng tiếng Pháp ra khỏi bối cảnh ...;)

Chạy:

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

Mã số:

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

Đồng hồ bấm giờ Ol '- Fortran 77

Ông già này sẽ lãng phí tiền lương hưu sau sáu mươi năm làm nhân viên văn phòng. Tuy nhiên, trong tuổi già, anh ta trở nên khá mù quáng, vì vậy anh ta chỉ có thể nhìn thấy anh ta số đầu tiên của mỗi đối số, vì vậy anh ta ước tính giá cả. Phương pháp của anh ta tương tự như của Walt, ngoại trừ Ol 'Timer thì bất cẩn hơn một chút.

Do các vấn đề với việc in Fortran, tôi đã viết một chương trình Python sẽ giúp ích. Chương trình lấy các đối số được cung cấp và đưa chúng đến chương trình Fortran. Sau đó, chương trình Python định dạng lại đầu ra thành định dạng mong đợi.

Biên dịch:

gfortran oltimer.for -o oltimer.exe

Chạy:

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

Mã trợ lý 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]))

Mã chính của 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
Cho rằng dù sao bạn cũng cần Python và có câu trả lời khác trong Python nhưng không có câu trả lời nào trong Fortran, bạn có nghĩ rằng việc triển khai toàn bộ trong Python và giảm gánh nặng cho trình biên dịch mà OP phải cài đặt không?
Peter Taylor

@Peter Tôi sẽ nhưng tôi nghĩ thật vui khi có một ngôn ngữ hoàn toàn khác và xem nó hoạt động như thế nào.
Beta Decay

0

Người giao dịch 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");
        }
    }
}

Biên dịch với javac Test1.javachạy vớijava -cp "Test1" Test1


0

Nhím - python2.7

Điều này chủ yếu là để đặt tên

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)

Chạy như

python hedgehog.py PRICE CASH SHARES

0

MuaAndSell - C

Tương tự nhưng không phải là bản sao của Tommy. Thay thế giữa hoảng loạn mua càng nhiều càng tốt và bán tất cả mọi thứ. Gần như một bản sao của Earthquaker giữ lại một cổ phần trong khi BuyAndSell bán tất cả cổ phần. MuaAndSell không có hành động khi không có cổ phiếu để bán nhưng không có đủ tiền để mua một cổ phiếu.

/* 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;
}

Biên dịch với "gcc buyandsell.c -o buyandsell"

Chạy dưới dạng "./buyandsell CHIA SẺ TIỀN


0

Hẻm núi Soros

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

Mua chậm, hơn bán tất cả mọi thứ trong một nỗ lực để đánh sập thị trường.

Chạy với:Soros.rb price money stock


1
Nó nói rõ ràng trong văn bản câu hỏiDo not intentionally create programs to crash the simulation.
Beta Decay

@BetaDecay Ý tôi là đừng cố làm hỏng bộ điều khiển. Cố gắng để đánh sập thị trường là một phần của trò chơi.
spocot

@spocot Ồ, tôi nghĩ rằng bạn có nghĩa là không tạo ra các chương trình để đánh sập thị trường. Bạn nên cụm từ đó khác nhau để tránh nhầm lẫn nhiều hơn.
Beta Decay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.