tło
Wszyscy jesteście traderami dla nieco mniej renomowanej firmy giełdowej. Wszyscy jesteście częścią grupy traderów, którzy koncentrują się tylko na jednym konkretnym akcie.
Co godzinę każdy trader ma szansę na zakup X akcji lub sprzedaż X akcji. Istnieje 50 godzin na rundę i 3 rundy na zawody. Pod koniec wszystkich rund handlowiec o najwyższej średniej wartości wygrywa wycieczkę na Jamajkę!
Rozgrywka
Istnieją 3 rundy po 50 tur każda.
Każdy inwestor rozpoczyna rundę z 5000 $ i losową liczbą akcji od 20 do 30 akcji. Cena akcji zaczyna się od przypadkowej liczby od 10 do 150.
W każdej turze każdy handlowiec może kupić dowolną liczbę akcji, na jaką może sobie pozwolić, lub sprzedać dowolną liczbę aktualnie posiadanych akcji, każdą za bieżącą cenę za akcję.
Cena za akcję wzrasta o losową liczbę od 1 do 5 za każdy zakupiony udział i maleje o losową wartość od 2 do 6 za każdy sprzedany udział. Cena minimalna to 1 USD.
Ważne jest, aby pamiętać, że wszyscy handlowcy przetwarzają swoje transakcje w tym samym czasie, co oznacza, że każdy handlowiec kupujący / sprzedający akcje nie wpłynie na cenę do następnej tury.
Gracz z najwyższą średnią wartością na koniec 3 rund wygrywa. Wartość jest ustalana na podstawie ilości pieniędzy pozostałych na koniec rundy i dodanej liczby akcji posiadanych przez zamykającą cenę rynkową tradera *.
Argumenty
Twój program zostanie uruchomiony ponownie na początku każdej tury, otrzymując aktualną cenę rynkową, bieżącą kwotę pieniężną tradera i liczbę akcji posiadanych przez tego tradera.
Dawny:
120 5000 0
Wydajność
Twój program tradera musi wypisać literę odpowiadającą akcji, którą chciałby podjąć, a następnie ilość.
Dawny:
B10 //Buy 10 shares
lub
S3 //Sell 3 shares
Inwestor ma również opcję, aby nie robić nic, co się zmieni. Można tego dokonać, wysyłając W lub dowolne inne polecenie, które nie jest „B> amnt <” lub „S> amnt <”
Zgłoszenia
Twój program będzie w katalogu „odtwarzacze /> nazwa twojego programu <”:
+-- players
| +-- BotNameFolder
| +-- BotProgram
Podaj swój kod wraz z argumentem wiersza poleceń, aby uruchomić go z katalogu „odtwarzaczy”. Na przykład można uruchomić tradera Test1java -cp "Test1" Test1
Dodatkowe zasady
Śmiało, zastrzel się EmoWolf, Idc.
Bez bałaganu z niczym poza katalogiem BotNameFolder, możesz tworzyć tam pliki, aby uzyskać trwałe informacje podczas rund / tur.
Nie twórz celowo programów, które mogą zawiesić symulację.
Przyjmę wiele wpisów na użytkownika, o ile będą one działały jako osobne podmioty (bez wykorzystywania informacji poufnych).
Tabela liderów
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Spróbuję zaktualizować tabelę wyników przynajmniej raz dziennie
Kontroler
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;
}
}
Skompiluj to java Controller.java
i uruchom z katalogu zawierającego katalog taki jak poniżej:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
Plik config
powinien wyglądać mniej więcej tak:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
Pierwsza liczba to liczba rund, druga to liczba rund na rundę, a następnie polecenia uruchomienia każdego gracza.
Zastąp spacje znakami ampersands! („&”)
~ Daj mi znać, czy w ogóle mogę poprawić treść tego postu i życzę szczęśliwego handlu!