30.06.22
|
Neues Mitglied
|
|
Registriert seit: Sep 2021
Beiträge: 7
|
|
Hallo liebes Forum,
vorerst habe ich folgende Idee:
Jede geöffnete Order bekommt als Kommentar die virtuelle Lotsize, sollte der Ema_Kontostand unterschritten werden, wird mit kleinstmöglicher Lotsize gehandelt, die Simulation geht über die Lotsize die Im Orderkommentar abgespeichert wird. Alle geschlossenen Orders werden in einem Pool, absteigend sortiert, ein Array arr_orderticket soll das Orderticket aus dem Pool abspeichern sofern es in arr_ordericket noch nicht enthalten ist. Wenn das passiert weiß der EA er muss den EMA_Kontostand und die virtuelle Balance neu berechnen, soweit die Theorie.
Aber arr_ordeticket hat immer den Anfangswert -3, es wird also bis jetzt in das arr_orderticket kein Orderticket aus dem Pool gespeichert
PHP-Code:
#property strict //https://www.forexfactory.com/thread/230203-how-do-i-stop-trading-for-half-hour #include <MQL4OrderPool.mqh>
//Virtuelle AccountBalance double v_Balance=AccountBalance(); input int ema_period_acccount=20;
//https://tradistats.com/exponentieller-gleitender-durchschnitt/ double sf=2/(ema_period_acccount +1); double ema_acccount= AccountBalance();
int arr_orderticket[1]={-3}; //-3 um zu sehen falls nicht gespeichert wurde MQL4OrderPool pool;
int OnInit() { pool.Init(Symbol(),magic_number,MODE_HISTORY,ORDERS_FILLED,SORT_CLOSE_TIME_DESCENDING); return(INIT_SUCCEEDED); } void OnTick(){ pool.Init(_Symbol,MAGIC,MODE_HISTORY,ORDERS_FILLED,SORT_CLOSE_TIME_DESCENDING); //Geschlossen Order sind absteigend sortiert pool.Refresh();
for(int i=0;i<pool.Total();i++){ Print("Array pool_",i ," ", pool[i].OrderTicket() );
//arr_orderticket sortieren ArraySort(arr_orderticket ,WHOLE_ARRAY,0,MODE_ASCEND); for(int i=0;i<ArraySize(arr_orderticket);i++) printf("arr_orderticket[%d] = %d",i,arr_orderticket[i]); // Wenn Orderticket aus Pool nicht in arr_orderticket ist, dann speichere es dort ab if( ArrayBsearch(arr_orderticket, pool[i].OrderTicket(),WHOLE_ARRAY,0,MODE_DESCEND) < -1 ){ // Falls arr_orderticket nur einen Inhalt hat, also die -3 speicheere Ticket aus Pool in arr_orderticket[0] //Muss so gemacht werden, da Ema_Kontostand als ersten Wert die AccountBalance() bekommt, danach wird Ema_Kontostand nach Formel berechnet if(ArraySize(arr_orderticket) == 1){ arr_orderticket[0]= pool[i].OrderTicket(); //v_Balance updaten // jede geöffnete Order hat im Kommentar die simulierte Ordersie if(pool[i].OrderLots() == StringToDouble( pool[i].OrderComment() ) ){ v_Balance=v_Balance + pool[i].OrderProfit(); //ema_acccount updaten ema_acccount= sf*v_Balance +(1-sf)* ema_acccount; } //Balance ist unter Ema_Kontostand gefallen, //Die Simulation erfolgt über die Lotsize aus dem Kommentar //tatsächliche Lotszie die real gehandelt wird ist die kleinstmögliche Lotsize if(pool[i].OrderLots() != StringToDouble( pool[i].OrderComment() ) ) //dann ist reale Lotgröße 0.1 if(pool[i].OrderLots() == 0.1 ){ v_Balance=v_Balance + pool[i].OrderProfit() *( StringToDouble( pool[i].OrderComment() )/pool[i].OrderLots() ); //ema_acccount updaten ema_acccount= sf*v_Balance +(1-sf)* ema_acccount; } // Vergrößere arr_orderticket um einen Wert arrayPush( arr_orderticket, -6 ); } // arr_orderticket enthält min. ein OrderTicket aus dem Pool if(ArraySize(arr_orderticket) > 1){ // speichere an Letzte Stelle das Orderticket aus dem Pool, das in arr_orderticket noch nicht enthalten ist arr_orderticket[ArraySize(arr_orderticket)-1]= pool[i].OrderTicket(); // vergrößere arr_orderticket um eins arrayPush( arr_orderticket, -9 ); //v_Balance updaten // jede geöffnete Order hat im Kommentar die simulierte Ordersie if(pool[i].OrderLots() == StringToDouble( pool[i].OrderComment() ) ){ v_Balance=v_Balance + pool[i].OrderProfit(); //ema_acccount updaten ema_acccount= sf*v_Balance +(1-sf)* ema_acccount; } if(pool[i].OrderLots() != StringToDouble( pool[i].OrderComment() ) ) //dann ist reale Lotgröße 0.1 if(pool[i].OrderLots() == 0.1 ){ v_Balance= v_Balance + pool[i].OrderProfit() *( StringToDouble( pool[i].OrderComment() )/pool[i].OrderLots() ); //ema_acccount updaten ema_acccount= sf*v_Balance +(1-sf)* ema_acccount; } } }// if( ArrayBsearch(arr_orderticket, pool[i].OrderTicket(),WHOLE_ARRAY,0,MODE_DESCEND) < -1 ){ }//for(int i=0;i<pool.Total();i++){ }//OnTick()
// Helper function to "push" to array void arrayPush(int & array[] , int dataToPush){ int count = ArrayResize(array, ArraySize(array) + 1); array[ArraySize(array) - 1] = dataToPush; }
Habe nun schon Stunden investiert, aber komme einfach nicht weiter. Vielleicht weiß ja einer warum das noch nicht richtig funktiniert. Um Hilfe bin ich dankbar.
Liebe Grüße smilemore
Geändert von smilemore (30.06.22 um 11:40 Uhr)
|