พื้นหลัง
คุณเป็นผู้ค้าทั้งหมดสำหรับ บริษัท หลักทรัพย์ที่มีชื่อเสียงน้อยกว่าเล็กน้อย คุณทุกคนเป็นส่วนหนึ่งของกลุ่มผู้ค้าที่มุ่งเน้นเฉพาะหุ้นหนึ่ง ๆ
ทุก ๆ ชั่วโมงผู้ซื้อขายแต่ละรายมีโอกาสที่จะซื้อหุ้น X หรือขายหุ้น X มี 50 ชั่วโมงต่อรอบและ 3 รอบต่อการแข่งขัน ในตอนท้ายของทุกรอบผู้ซื้อขายที่มีค่าเฉลี่ยสูงสุดชนะการเดินทางไปจาเมกา!
เพลย์
แต่ละรอบมี 3 รอบ 50 รอบ
ผู้ค้าแต่ละคนจะเริ่มรอบด้วย $ 5,000 และสุ่มจำนวนหุ้นระหว่าง 20 และ 30หุ้น ราคาของหุ้นเริ่มต้นที่ตัวเลขสุ่มระหว่าง 10 และ 150
แต่ละครั้งที่ผู้ซื้อขายแต่ละรายสามารถซื้อจำนวนหุ้นใดก็ได้ที่พวกเขาสามารถจ่ายได้หรือขายจำนวนหุ้นใด ๆ ที่พวกเขาถืออยู่ในปัจจุบันสำหรับแต่ละราคาปัจจุบันต่อหุ้น
ราคาต่อหุ้นจะเพิ่มขึ้นเป็นตัวเลขสุ่มระหว่าง 1 ถึง 5 สำหรับแต่ละหุ้นที่ซื้อและลดลงด้วยมูลค่าสุ่มระหว่าง 2 และ 6 สำหรับแต่ละหุ้นที่ขาย ราคาขั้นต่ำคือ $ 1
สิ่งสำคัญคือให้สังเกตว่าผู้ค้าทุกคนทำธุรกรรมของพวกเขาในเวลาเดียวกันหมายความว่าผู้ค้าที่ซื้อหรือขายหุ้นจะไม่ส่งผลกระทบต่อราคาจนกว่าจะถึงเทิร์นถัดไป
ผู้เล่นที่มีค่าเฉลี่ยสูงสุดในตอนท้ายของ 3 รอบชนะ มูลค่าถูกกำหนดโดยนำจำนวนเงินที่เหลืออยู่ในตอนท้ายของรอบและเพิ่มจำนวนหุ้นที่เป็นเจ้าของโดยราคาตลาดปิดของผู้ค้า *
ข้อโต้แย้ง
โปรแกรมของคุณจะถูกเรียกใช้ซ้ำในตอนเริ่มต้นของแต่ละรอบที่ได้รับราคาตลาดปัจจุบันจำนวนเงินปัจจุบันของผู้ซื้อขายและจำนวนหุ้นที่เป็นของผู้ซื้อขายรายนั้น
Ex:
120 5000 0
เอาท์พุต
โปรแกรมผู้ประกอบการค้าของคุณจะต้องส่งออกจดหมายที่สอดคล้องกับการกระทำที่ต้องการดำเนินการตามปริมาณ
Ex:
B10 //Buy 10 shares
หรือ
S3 //Sell 3 shares
ผู้ค้ายังมีตัวเลือกที่จะไม่ทำอะไรเลย ที่สามารถทำได้โดยการส่งออก W หรือคำสั่งอื่น ๆ ที่ไม่ใช่ 'B> amnt <' หรือ 'S> amnt <'
การส่ง
โปรแกรมของคุณจะอยู่ในไดเรกทอรี 'players /> ชื่อโปรแกรมของคุณ <':
+-- players
| +-- BotNameFolder
| +-- BotProgram
โปรดระบุรหัสของคุณพร้อมกับอาร์กิวเมนต์บรรทัดคำสั่งเพื่อเรียกใช้จากในไดเรกทอรี 'เครื่องเล่น' ตัวอย่างเช่นผู้ค้า Test1 สามารถใช้งานได้java -cp "Test1" Test1
กฎเพิ่มเติม
เอาเลยยิงเอง EmoWolf, Idc
ไม่ยุ่งกับสิ่งใดนอกจากไดเรกทอรี 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
หมายเลขแรกคือจำนวนรอบจำนวนที่สองจะหมุนต่อรอบตามด้วยคำสั่งเพื่อเรียกใช้ผู้เล่นแต่ละคน
แทนที่ช่องว่างด้วยเครื่องหมายแอมเปอร์แซนด์! ( '&')
~ แจ้งให้เราทราบหากฉันสามารถปรับปรุงถ้อยคำของโพสต์นี้และการซื้อขายที่มีความสุข!