BTC Maximizer Betriebsanleitung

Dokumentation

Inhalte

PHP

Neustart

Vor jedem Neustart sollten alle .json Dateien im data-Ordner gelöscht werden.

Verschiedene Konfigurationen gleichzeitig laufen lassen

Für verschiedene Konfigurationen werden verschiedene BitMex Accounts empfohlen. Da öfter ein "cancelAllOrders" aufgerufen wird, beeinflussen sich die gleichzeitigen Skripte gegenseitig. Außerdem funktioniert das Abfragen der Echtzeit Position auf BitMex dann natürlich nicht mehr. Da 2 Skripte die Position auf BitMex verändern.

  1. Auf dem Tradingserver werden 2 Ordner mit dem vollen Script benötigt. D.h. zum Beispiel den Ordner 2020-06-24 kopieren, sodass er zwei mal vorhanden ist mit allen Dateien:

     2020-06-24_1/
       main_BTC.php
       vendor/
       data/
       ...
     2020-06-24_2/
       main_BTC.php
       vendor/
       data/
       ...
    
  2. Die data-Ordner sollten immer geleert sein. Alle .json Files im data-Ordner löschen

  3. In jedem Ordner sollte in der config.php ein anderer BitMex API Key und Secret eingetragen sein für verschiedene BitMex Accounts.

  4. Da zwei Skripte ausgeführt werden sollen, müssen auf dem Tradingserver zwei Requests abgesetzt werden. In dem Fall wäre es an 2020-06-241/mainBTC.php und 2020-06-242/mainBTC.php.
    Auf dem Calculationserver muss die Datei callorderscript.py (http://mein_Server:9999/edit/tree/calculations/callorderscript.py) angepasst werden.

Oben kann man die Skripte einstellen (man könnte auch ein drittes hinzufügen analog dazu):

    btc_order_script = Tradingserver_url + '2020-06-24_1/main_BTC.php'
    btc_order_script_2 = Tradingserver_url + '2020-06-24_2/main_BTC.php'

Unten in callbtcorder_script() muss nun noch ein zweiter Aufruf rein:

    r2 = requests.get(btc_order_script_2, auth=(auth_user, auth_pw))

Analog könnte man auch ein drittes, viertes Skript hinzufügen. Einfach eine neue Variable oben anlegen, z.B. btcorderscript3 und in der Funktion callbtcorderscript() noch einen weiteren Request r3 = requests.get(btcorderscript3, auth=(authuser, auth_pw)).

Trading Modus umschalten

In mainBTC.php und mainETH.php kann man den Trading Modus einstellen.

$bitmex_trader->set_mode(MODES::MODE_G5_G6_30_MIN);

Mögliche Modi sind:

    - MODE_G1_G4_1_MIN        Trade with G1-G4 signals from 1 minute
    - MODE_G1_G4_30_MIN       Trade with G1-G4 signals from 30 minutes
    - MODE_G5_G6_30_MIN       Trade with G5-G6 signals from 30 minutes
    - MODE_S1_S2              Trade with S1-S2 signals
    - MODE_G5_G6_30_MIN_TIME_TO_SHOOT Trade with G5-G6 signals from 30 minutes and time-to-shoot function
    - MODE_G5_TO_G10_30_MIN_TIME_TO_SHOOT Trade with G5-10 signals from 30 minutes and time-to-shoot function

Orderbook Modus ein/ausschalten

In mainBTC.php und mainETH.php kann man die Orders für den Orderbook Modus ausschalten, indem man die letzte Zeile auskommentiert:

OrderBook\process($mode, 'BITCOIN');

Wenn man die normalen Modi für G-Signale gar nicht verwenden will, dann die Zeile 68

$bitmex_trader->process_action($action, $current_price);

auskommentieren und nur die Zeile "OrderBook\process($mode, 'BITCOIN');" drin lassen.

Orderbook Modus Quantities einstellen

Die Quantities für das Orderbook können in orderbook-trades.php eingestellt werden.
Dort gibt es die Quantities 2-mal: einmal für BTC und einmal für ETH.
Die Quantities für BTC können in den Zeilen 50-82 gesetzt werden.
Die Quantitities für ETH können in den Zeilen 97-128 eingestellt werden.

Initiale theoretische Position setzen

In mainBTC.php oder mainETH.php kann eine initiale theoretische Position eingestellt werden.

    $bitmex_trader->set_initial_theoretical_position(100);

Delta einstellen für Order Editing

Es kann eingestellt werden, dass die Orders nur bei einem bestimmten Delta zwischen aktuellem Tick Price und Order Price editiert werden. Standardmäßig sind 60 Dollar eingestellt. Das Delta kann aber beliebig eingestellt werden in main_BTC.php. Beispiel für 40 Dollar:

    $bitmex_trader->set_minimum_delta_for_amend(40);

Trackingfunktion aktivieren und einstellen

In der mainBTC.php kann die Korrekturfunktion aktiviert werden für die Modi MODEG5G630MINTIMETOSHOOT und MODEG5TOG1030MINTIMETOSHOOT.
Zum Aktivieren muss folgendes aufgerufen werden:

$bitmex_trader->enable_correction_function(true);

Das Intervall in Minuten, wann die Trackingfunktion ausgeführt werden soll, kann man danach über die Funktion einstellen. Beispiel für 200 Minuten:

$bitmex_trader->set_intervall_correction_function(200);

Falls es eine Differenz zwischen theoretischer Position und wirklicher Position auf BitMex gibt, werden alle offenen Orders gecanceled und eine Korrekturorder abgesetzt.
Die gekauften Summen und theoretisch gekauften Summen im TTS-Modus werden dabei gemerkt.

Quantities für Orders einstellen

Davor konnte man in order_actions.php die Quantities einstellen. Da mehr Modi dazugekommen sind, wurde das unübersichtlich.

Nun kann man für die verschiedenen Modi die Quantities in separaten Dateien einstellen.

Will man z.B. im MODEG5G630MINTIMETOSHOOT die Quantities einstellen, dann in der Datei "class-mode-G5-G6-TTS.php". Für MODEG5TOG1030MINTIMETOSHOOT wäre es die Datei "class-mode-G5-G12.php". Hier sieht man Funktionen, z.B. G5initialorder oder GXBuyorder oder timetoshootperiodicG9action.
In der gewünschten Funktion kann die Quantitiy eingestellt werden. Beispiel:

public function GX_Buy_order($current_price, $bitmex)
{
    $quantity = 100;
    $ret = $bitmex->createOrder("Limit", "Buy", $current_price - 1, $quantity, $maker = false); // Buy Order
    $this->open_initial_orders[] = $ret;
}

Für die periodischen Orders für DPO >/< DPO_MA kann man die Quantities nun auch separat einstellen, z.B. für Modus G5-G10 in der Datei "class-mode-G5-G10.php". Will man die Vorzeichen tauschen, muss man "Buy" zu "Sell" ändern bzw. in die andere Richtung genauso. Das Vorzeichen von $contract ist immer positiv. Über "Buy" oder "Sell" wird Kauf/Verkauf eingestellt.

// is executed every X minutes after initial order and only if dpo > dpo_ma
function time_to_shoot_periodic_buy_dpo($current_price, $bitmex)
{
    $contract = 25; // quantity in USD
    $ret = $bitmex->createOrder("Limit", "Buy", $current_price - 1, $contract, $maker = false); // Buy Order
    $this->open_periodic_orders[] = $ret;
}

// is executed every X minutes after initial order and only if dpo < dpo_ma
function time_to_shoot_periodic_sell_dpo($current_price, $bitmex)
{
    $contract = 25; // quantity in USD
    $ret = $bitmex->createOrder("Limit", "Sell", $current_price + 1, $contract, $maker = false); // Sell Order
    $this->open_periodic_orders[] = $ret;
}

Für die periodischen DPO > DPO_ma (bzw. kleiner) Orders können die Quantities in der gleichen Datei eingestellt werden.
Hier können die Quantities mit beliebigem Vorzeichen eingestellt werden, können also vertauscht werden:

// return the quantity that should be bought for periodic dpo > dpo_ma
public function time_to_shoot_periodic_dpo_ma_buy()
{
    return 20;
}

// return the quantity that should be bought for periodic dpo < dpo_ma
public function time_to_shoot_periodic_dpo_dpo_ma_sell()
{
    return -20;
}

Für G5 bis G10

Wenn mit den drei Kaufzonen G5 bis G10 gearbeitet werden soll, muss der Modus auf MODEG5TOG1030MINTIMETOSHOOT eingestellt werden.

Time To Shoot abschalten

Im Modus G5 bis G10 kann TTS auch abgeschaltet werden in der mainBTC.php oder mainETH.php mit dieser Zeile:

    $bitmex_trader->switch_off_time_to_shoot_for_G5_G10();

Verschiedene Kombinationen für GXB und GXS einstellen

Im Modus G5 bis G10 können verschiedene beliebige Kombinationen definiert werden für GXB und GXS.
Beispiel:

    $bitmex_trader->set_GXB_signal_combinations([['G5', 'G6'], ['G5', 'G6', 'G7']]);

In dem Fall wird GXB ausgelöst, wenn G5 und G6 gleichzeitig auftreten, oder wenn G5, G6 und G7 gleichzeitig auftreten.
Man kann auch noch mehr Kombinationen definieren, z.B. eine dritte Kombination G5,G6,G10:

    $bitmex_trader->set_GXB_signal_combinations([['G5', 'G6'], ['G5', 'G6', 'G7'], ['G5', 'G6', 'G10']]);

Time To Shoot Intervall ändern

Das Time-To-Shoot-Intervall in Minuten kann in der main_BTC.php gesetzt werden:

$bitmex_trader->set_time_to_shoot_interval(30);

Zusätzlicher periodischer DPO Einkauf/Verkauf

Es gibt die zusätzliche Option, dass alle x Minuten (je nach Einstellung), zusätzlich zu der normalen Time-To-Shoot Funktion gekauft oder verkauft wird. Folgendermaßen kann es in main_BTC.php Zeile 30 aktiviert werden:

$bitmex_trader->enable_additional_periodic_time_to_shoot_dpo_order(true); 

Wenn x Minuten verstrichen sind, wird zusätzlich geprüft, ob das DPO30min > DPOma30min oder DPO30min < DPOma30min ist.
Falls ja, wird die zusätzliche Buy-Order bzw. Sell-Order ausgeführt.

Maximale Anzahl der TTS Order einstellen

Die Anzahl der TTS Order nach einem initialen Kauf / Verkauf kann begrenzt werden.
Dazu in der main_BTC.php folgendes einstellen:

$bitmex_trader->set_maximum_tts_orders_number(2);

Nach einem G5 wird dann z.B. nur 2 mal die periodische Order ausgeführt. Die periodischen Orders danach werden nicht ausgeführt. Auch die theoretische Position wird dadurch nicht mehr beeinflusst. Beim nächsten G5/G6 wird es wieder zurückgesetzt und wieder 2-mal die periodischen Order ausgeführt.
Will man die Funktion deaktivieren, dann die Zeile auskommentieren mit //.
Oder man setzt den Wert sehr hoch z.B. auf 1000000. Dadurch hat man praktisch die Funktion deaktiviert, da in der Praxis nie 1 Million TTS Orders hintereinander auftreten.

G5 und G6 (bzw. G7,G8 und G9,G10) initiale Orders Buy und Sell vertauschen

Möchte man anstatt G5 als initiale Buy-Order als initiale Sell Order verwenden, und dafür G6 als initiale Buy-Order verwenden, müssen die Signale vertauscht werden.

Die Quantities für die initialen Orders müssen mit positivem Vorzeichen eingestellt bleiben! Für die periodischen Orders kann einfach Buy und Sell vertauscht werden, indem man das Vorzeichen bei den periodischen Quantities ändert. Dies ist bei den periodischen Quantities möglich, da diese am Ende sowieso zu einer periodischen Order zusammengefasst werden.

Möchte man z.B. G5 und G6 vertauschen, muss man den Code in class-mode-G5-G12.php ändern von:

    $this->key_buy_active = 'G5_active';
    $this->key_sell_active = 'G6_active';
    $this->key_buy = 'G5';
    $this->key_sell = 'G6';
    $this->initial_buy_function = array($this, 'G5_initial_order');
    $this->initial_sell_function = array($this, 'G6_initial_order');
    $this->periodic_buy_function = array($this, 'time_to_shoot_periodic_G5_action');
    $this->periodic_sell_function = array($this, 'time_to_shoot_periodic_G6_action');

zu:

    $this->key_buy_active = 'G6_active';
    $this->key_sell_active = 'G5_active';
    $this->key_buy = 'G6';
    $this->key_sell = 'G5';
    $this->initial_buy_function = array($this, 'G6_initial_order');
    $this->initial_sell_function = array($this, 'G5_initial_order');
    $this->periodic_buy_function = array($this, 'time_to_shoot_periodic_G6_action');
    $this->periodic_sell_function = array($this, 'time_to_shoot_periodic_G5_action');

Also alle G5 die auf der rechten Seite des = auftauchen zu G6 ändern. Genauso alle G6 zu G5 ändern.
Dadurch wird dann die initiale Buy-Order beim G6 ausgeführt. Die initiale Sell Order wird beim G5 ausgeführt.

Für G7/G8, G9/G10 kann es analog geändert werden.

Python

Verschiedene Parameter für BTC und ETH

In der trackvision_calculations.py können zu Beginn jeder Funktion die Berechnungsparameter für BTC und ETH separat gesetzt werden. Dadurch sind verschiedene Konfigurationen für verschiedene Kryptowährungen möglich.

Logarithmische Änderung des Schwellwerts anpassen

In trackvision_calculations.py können die vier Werte eingestellt werden ab Zeile 188 (separat für BTC und ETH):

if is_bitcoin:  # values for bitcoin
    threshold_I_higher_bound = 50
    threshold_I_lower_bound = 20
    time_I_between_thresholds = 4000  # in minutes
    offset_beginning = 5
else:  # values for ethereum
    threshold_I_higher_bound = 50
    threshold_I_lower_bound = 20
    time_I_between_thresholds = 4000  # in minutes
    offset_beginning = 5

Erklärung: Der Schwellwert für den ausgewählten Input startet bei 50. Wird ein G6 Signal ausgelöst, bewegt sich der Schwellwert logarithmisch innerhalb von 4000 Minuten in Richtung 20. Tritt während des Verlaufs ein G5 Signal auf z.B. bei aktuellem Schwellwert von 35, verläuft der Schwellwert wieder logarithmisch in Richtung von 50 innerhalb von 4000 Minuten.
Der Wert offset_beginning gibt den Offset an, der zusätzlich addiert (bei G6) bzw. subtrahiert (bei G5) wird. Ist der Schwellwert z.B. gerade bei 35 und es tritt ein G6 auf, startet der Schwellwert im nächsten Zyklus (nächste Minute) bei 35 + 5 = 40.

Beispiel_Log.png

Um die Funktion zu resetten, sodass der Schwellwert wieder bei der oberen Schwellenvariable anfängt, müssen einfach die Json - Dateien in /trackvision/logs gelöscht werden:

z.b: /trackvision/storage_log_threshold_BTC.json
für ETH: /trackvision/storage_log_threshold_ETH.json

Um wieder auf den statischen Schwellwert umzuschalten, in update_values.py Zeile 116+117 ändern zu:

# df = trackvision_calculations.calculate_dpo_features_30min_logarithmic(df, crypto_is_bitcoin)
df = calculate_dpo_features_30min_static(df, crypto_is_bitcoin)

Droplet

MySQL Server Neustart

Status des MySQL Servers:

mysqladmin -u trackvision -p status

PW für die Datenbank eingeben

Falls abgestürzt -> Neustart:

service mysql start

Identity:

User

PW:

definiertes PW eingeben

Jupyter Notebook Neustart

Damit das Jupyter Notebook weiterhin läuft, wenn man sich ausloggt und dadurch nicht geschlossen wird, muss es in einem eigenen Linux Screen laufen.

Die aktuell laufenden Screens kann man sich auflisten mit:

screen -ls

Beispiel:

There are screens on:
    29692.pts-1.ubuntu-s-1vcpu-1gb-fra1-01  (05/01/20 11:31:34)     (Detached)
    18386.pts-1.ubuntu-s-1vcpu-1gb-fra1-01  (04/19/20 17:02:37)     (Attached)

Das Jupyter Notebook läuft hier schon im Screen 29692.
Um sich an den Screen zu attachen, nutzt man "screen -r screenid". Beispiel:

screen -r 29692.pts-1.ubuntu-s-1vcpu-1gb-fra1-01

Um das laufende Notebook zu killen:

Strg+C

Um das Notebook neu zu starten, im Ordner "trackvision" ausführen:

python3 -m jupyter notebook --no-browser --port 9999

Nachdem das Notebook gestartet ist, muss man sich vom Screen wieder detachen, damit der Screen und das Notebook weiterhin im Hintergrund läuft, nachdem man sich ausloggt:

STRG + A + D gleichzeitig drücken

Nun ist man wieder im Haupt-Screen und man kann sich ausloggen. Man kann vorher nochmal überprüfen, ob der Screen weiterhin läuft mit:

screen -ls

Der Output sollte so ähnlich aussehen (1 Screen Detached und 1 Screen Attached):

There are screens on:
    29692.pts-1.ubuntu-s-1vcpu-1gb-fra1-01  (05/01/20 11:31:34)     (Detached)
    18386.pts-1.ubuntu-s-1vcpu-1gb-fra1-01  (04/19/20 17:02:37)     (Attached)

Falls beim ersten Schritt noch gar kein Screen existiert (z.B. nach komplettem Neustart des Droplets), dann muss erst ein Screen erzeugt werden.
Das geht mit:

screen
STRG + A + C (erzeugt neuen Screen)
cd trackvision (in trackvision wechseln)
python3 -m jupyter notebook --no-browser --port 9999 (Notebook starten)
STRG + A + D (vom Screen detachen)
screen -ls (Screens auflisten zur Überprüfung)