Order werden im Strategietester nicht ausgeführt - Mir gehen die Ideen aus. - Seite 2

Einloggen oder registrieren, um einen Kommentar zu schreiben
Spronk
50
Spronk  

Hallo,

erst mal vielen Dank für Deine schnelle Reaktion.

Bevor ich Deine Anmerkungen umsetze, möchte ich kurz ein paar Dinge aufgreifen, damit es nicht zu Missverständnissen kommt (Wie fügt man hier Zitate ein...?):

Ps: Schön wäre der komplette Code  damit ich selber das nachvollziehen könnte.

Im grunde genommen ist das der komplette Code. Du musst nur einen EA erstellen, als globale Variable eine Instanz von TradeManager erstellen und in der OnTick() Funktion Deiner EAs die Tick() Funktion der TradeManager Instanz aufrufen:

TradeManager tradeManager;
int magicNr = 100;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---   
   tradeManager.Init(magicNr);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{ 
  if(IsNewBar(_Period))
  {      
      tradeManager.Tick();
  }
}

bool IsNewBar(ENUM_TIMEFRAMES timeFrame)
  {
//----
   static datetime old_Times[21];// an array for old time values
   bool res=false;               // variable for the result
   int  i=0;                     // index of old_Times[] array
   datetime new_Time[1];         // time of a new bar

   switch(timeFrame)
     {
      case PERIOD_M1:  i= 0; break;
      case PERIOD_M2:  i= 1; break;
      case PERIOD_M3:  i= 2; break;
      case PERIOD_M4:  i= 3; break;
      case PERIOD_M5:  i= 4; break;
      case PERIOD_M6:  i= 5; break;
      case PERIOD_M10: i= 6; break;
      case PERIOD_M12: i= 7; break;
      case PERIOD_M15: i= 8; break;
      case PERIOD_M20: i= 9; break;
      case PERIOD_M30: i=10; break;
      case PERIOD_H1:  i=11; break;
      case PERIOD_H2:  i=12; break;
      case PERIOD_H3:  i=13; break;
      case PERIOD_H4:  i=14; break;
      case PERIOD_H6:  i=15; break;
      case PERIOD_H8:  i=16; break;
      case PERIOD_H12: i=17; break;
      case PERIOD_D1:  i=18; break;
      case PERIOD_W1:  i=19; break;
      case PERIOD_MN1: i=20; break;
     }
   // copying the last bar time to the element new_Time[0]
   int copied=CopyTime(_Symbol,timeFrame,0,1,new_Time);
   
   if(copied>0) // ok, the data has been copied successfully
      {
      if(old_Times[i]!=new_Time[0])       // if old time isn't equal to new bar time
         {
         if(old_Times[i]!=0) res=true;    // if it isn't a first call, the new bar has appeared
         old_Times[i]=new_Time[0];        // saving bar time
         }
      }
//----
   return(res);
  }
  

Die Funktion IsNewBar() habe ich von der MQL5 Seite. Diese habe ich also nicht selber geschrieben.

Mein Konstrukt macht etwas anderes, als Du beschreibst:

 if(count == 1)
   {
      this.tradeHandler.Buy(1,_Symbol);
      count++;
   }
   else if(count == 20)
   {
      this.CloseOpenPositions();
      count++;
   }
   else
      count++;

Die Variable count zählt einfach nur die Aufrufe der Tick() Funktion. Ich mache nur eine Position auf und zwar, wenn count == 1 ist (beim zweiten Aufruf von Tick()).
Dann zählt count einfach nur hoch, ohne eine Aktion zu machen und zwar bis count == 20 ist. Dann schließe ich die eine Position wieder und zähle count auf 21 hoch.
Ab diesem Moment wird in OnTick() einfach nur noch count++ ausgeführt, aber keine weiteren Aktionen. Ist, wie gesagt, nur ein Test, in dem Nur 1 Position geöffnet und später wieder geschlossen werden soll.

deal performed [#2 buy 513.00 WMT.US-d at 99.494]

Die 513 aus dem obigen Log bezog sich auf eine andere Programmversion. Ich habe mittlerweile alles runtergedampft, damit ich den Fehler finden kann.
In diesem Fall ist richtig, was auf dem Screenshot der Historie zu sehen ist. ich kaufe 1 Volumen und verkaufe wieder 1 Volumen.

Ich setze jetzt mal Deine Anmerkungen um und berichte dann.

Danke für Deine Mühe.

Spronk
50
Spronk  
P.S.: Ich weiß nicht warum, aber im Strategietester wird auch immer EURUSD als Symbol geöffnet und dann flutet der tester mein Log mit meldungen, dass er für EURUSD keine Tickdaten hat. Das macht die Auswertung meines Logs kompliziert, da es am Ende 1,5 GB groß ist. Wie bekomme ich EURUSD raus? Ich weiß nicht mal, warum er das Symbol verwendet... :(
Spronk
50
Spronk  

Update:

Wenn ich einfach nur, wie du angemerkt hast, eine Buy Position eröffne und den Tester diese einfach beim beenden schließen lasse, verrechnet er diese in meinem Account.

Es scheint also etwas beim schließen meiner Position schief zu gehen. Ist PositionClose() denn die richtige Funktion?

Ich schaue mit jetzt mal das OnTradeTransaction() Event an und werde die Transaktion auswerten. 
Mal schauen was dabei raus kommt.

Grüße

Christian
2096
Christian  

Zitate oder Code fügst du hiermit ein



Christian
2096
Christian  

Mein Konstrukt macht etwas anderes, als Du beschreibst:

Die Variable count zählt einfach nur die Aufrufe der Tick() Funktion. Ich mache nur eine Position auf und zwar, wenn count == 1 ist (beim zweiten Aufruf von Tick()).

Verstehe , es sollte eine bar_count sein.

Christian
2096
Christian  

Ich schaue mit jetzt mal das OnTradeTransaction() Event an und werde die Transaktion auswerten. 
Mal schauen was dabei raus kommt.

Grüße

PositionClose ist schon richtig. Bleib dabei

Aber : du musst den Resturn Code ausweten.

https://www.mql5.com/de/docs/standardlibrary/tradeclasses/ctrade/ctraderesultretcode

Erst dann weist du ob die Position wirklich geschlossen wurde.


OnTadeTransaction ist für den Anfang unwichtig.Ist sehr komplex die Auswertung.


Einfach Ordersend nutzen ohne async ->

 this.tradeHandler.SetAsyncMode(false);
Und dann berichten.
Dokumentation zu MQL5: Standardbibliothek / Handelsklassen / CTrade / ResultRetcode
Dokumentation zu MQL5: Standardbibliothek / Handelsklassen / CTrade / ResultRetcode
  • www.mql5.com
Standardbibliothek / Handelsklassen / CTrade / ResultRetcode - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
Spronk
50
Spronk  

Verstehe , es sollte eine bar_count sein.

Yo.


So, hier mal das um die EURUSD Einträge bereinigte- und die OnTradeTransaction() ergänzte Log:

MO 0 10:41:54.881 Tester initial deposit 10000.00 EUR, leverage 1:100
LJ 0 10:41:54.889 Tester successfully initialized
OO 0 10:41:54.889 Network 143 Kb of total initialization data received
IE 0 10:41:54.889 Tester Intel Core i5-4258U  @ 2.40GHz, 2047 MB
NM 0 10:41:56.516 Symbols WMT.US-d: symbol to be synchronized
KF 0 10:41:56.522 Symbols WMT.US-d: symbol synchronized, 3464 bytes of symbol info received
EL 0 10:41:56.523 History WMT.US-d: history synchronization started
DK 0 10:41:56.529 History WMT.US-d: load 31 bytes of history data to synchronize in 0:00:00.000NE 0 10:41:56.529 History WMT.US-d: history synchronized from 2017.03.02 to 2018.08.27
HP 0 10:41:56.628 History WMT.US-d,H4: history cache allocated for 1692 bars and contains 548 bars from 2017.03.02 12:00 to 2017.12.29 20:00
IN 0 10:41:56.628 History WMT.US-d,H4: history begins from 2017.03.02 12:00
IO 0 10:41:56.629 Tester WMT.US-d,H4 (ActivTrades-Server): every tick generating
PF 0 10:41:56.629 Tester WMT.US-d,H4: testing of Experts\Advisors\TestAdvisor\TestAdvisor.ex5 from 2018.01.01 00:00 to 2018.01.31 00:00 started
FI 0 10:41:56.929 History WMT.US-d,Daily: history cache allocated for 282 bars and contains 184 bars from 2017.03.02 00:00 to 2017.12.29 00:00
HH 0 10:41:56.929 History WMT.US-d,Daily: history begins from 2017.03.02 00:00
NG 0 10:41:57.064 Symbols EURUSD: symbol to be synchronized
GL 0 10:41:57.064 Symbols EURUSD: symbol synchronized, 3544 bytes of symbol info received
DE 0 10:41:57.064 History EURUSD: history synchronization started
QR 0 10:41:57.066 History EURUSD: load 27 bytes of history data to synchronize in 0:00:00.016
FF 0 10:41:57.066 History EURUSD: history synchronized from 2018.06.01 to 2018.06.25


IO 0 10:41:57.066 Trade 2018.01.02 20:00:00   market buy 1.00 WMT.US-d (98.960 / 98.970 / 98.960)
CD 0 10:41:57.066 Trades 2018.01.02 20:00:00   deal #2 buy 1.00 WMT.US-d at 98.970 done (based on order #2)
FI 2 10:41:57.066 Symbols 2018.01.02 20:00:00  no prices for symbol EURUSD (1970.01.01 00:00:00 0.00000, 0.00000)
PR 0 10:41:57.066 Trade 2018.01.02 20:00:00   deal performed [#2 buy 1.00 WMT.US-d at 98.970]
CL 0 10:41:57.066 Trade 2018.01.02 20:00:00   order performed buy 1.00 at 98.970 [#2 buy 1.00 WMT.US-d at 98.970]
LQ 2 10:41:57.066 Symbols 2018.01.02 20:00:00  no prices for symbol EURUSD (1970.01.01 00:00:00 0.00000, 0.00000)


DR 0 10:41:57.071 TestAdvisor (WMT.US-d,H4) 2018.01.02 20:00:00   1. OnTradeTransaction
NF 0 10:41:57.071 TestAdvisor (WMT.US-d,H4) 2018.01.02 20:00:00   MqlTradeTransaction: TRADE_TRANSACTION_DEAL_ADD deal #2 DEAL_TYPE_BUY WMT.US-d 1.00 lot   
EF 0 10:41:57.071 TestAdvisor (WMT.US-d,H4) 2018.01.02 20:00:00   2. OnTradeTransaction
FI 0 10:41:57.071 TestAdvisor (WMT.US-d,H4) 2018.01.02 20:00:00   MqlTradeTransaction: TRADE_TRANSACTION_ORDER_DELETE order #2 ORDER_TYPE_BUY ORDER_STATE_FILLED   
KD 0 10:41:57.071 TestAdvisor (WMT.US-d,H4) 2018.01.02 20:00:00   3. OnTradeTransaction
GG 0 10:41:57.071 TestAdvisor (WMT.US-d,H4) 2018.01.02 20:00:00   MqlTradeTransaction: TRADE_TRANSACTION_HISTORY_ADD order #2 ORDER_TYPE_BUY WMT.US-d ORDER_STATE_FILLED   
HE 0 10:41:57.071 TestAdvisor (WMT.US-d,H4) 2018.01.02 20:00:00   4. OnTradeTransaction
MJ 0 10:41:57.071 TestAdvisor (WMT.US-d,H4) 2018.01.02 20:00:00   MqlTradeTransaction: TRADE_TRANSACTION_REQUEST
CD 0 10:41:57.071 TestAdvisor (WMT.US-d,H4) 2018.01.02 20:00:00   MqlTradeResult: order #2 retcode=TRADE_RETCODE_DONE 


MD 0 10:41:58.916 Trade 2018.01.11 15:45:00   market sell 1.00 WMT.US-d, close #2 (99.610 / 99.630 / 99.610)
DR 0 10:41:58.916 Trades 2018.01.11 15:45:00   deal #3 sell 1.00 WMT.US-d at 99.610 done (based on order #3)
IQ 0 10:41:58.916 Trade 2018.01.11 15:45:00   deal performed [#3 sell 1.00 WMT.US-d at 99.610]
OG 0 10:41:58.916 Trade 2018.01.11 15:45:00   order performed sell 1.00 at 99.610 [#3 sell 1.00 WMT.US-d at 99.610]
LE 0 10:41:58.916 TestAdvisor (WMT.US-d,H4) 2018.01.11 15:45:00   1. OnTradeTransaction
FJ 0 10:41:58.916 TestAdvisor (WMT.US-d,H4) 2018.01.11 15:45:00   MqlTradeTransaction: TRADE_TRANSACTION_DEAL_ADD deal #3 DEAL_TYPE_SELL WMT.US-d 1.00 lot   
DK 0 10:41:58.916 TestAdvisor (WMT.US-d,H4) 2018.01.11 15:45:00   2. OnTradeTransaction
HO 0 10:41:58.916 TestAdvisor (WMT.US-d,H4) 2018.01.11 15:45:00   MqlTradeTransaction: TRADE_TRANSACTION_ORDER_DELETE order #3 ORDER_TYPE_SELL ORDER_STATE_FILLED   
PI 0 10:41:58.916 TestAdvisor (WMT.US-d,H4) 2018.01.11 15:45:00   3. OnTradeTransaction
PM 0 10:41:58.916 TestAdvisor (WMT.US-d,H4) 2018.01.11 15:45:00   MqlTradeTransaction: TRADE_TRANSACTION_HISTORY_ADD order #3 ORDER_TYPE_SELL WMT.US-d ORDER_STATE_FILLED   
MF 0 10:41:58.916 TestAdvisor (WMT.US-d,H4) 2018.01.11 15:45:00   4. OnTradeTransaction
MO 0 10:41:58.916 TestAdvisor (WMT.US-d,H4) 2018.01.11 15:45:00   MqlTradeTransaction: TRADE_TRANSACTION_REQUEST
LR 0 10:41:58.916 TestAdvisor (WMT.US-d,H4) 2018.01.11 15:45:00   MqlTradeResult: order #3 retcode=TRADE_RETCODE_DONE 


ES 0 10:41:59.791 Tester final balance 10000.00 EUR
ED 0 10:41:59.807 Tester WMT.US-d,H4: 446603 ticks, 60 bars generated. Environment synchronized in 0:00:01.485. Test passed in 0:00:03.687 (including ticks preprocessing 0:00:00.047).
IR 0 10:41:59.807 Tester WMT.US-d,H4: total time from login to stop testing 0:00:05.172 (including 0:00:01.501 for history data synchronization)
IN 0 10:41:59.807 Tester 4469 Mb memory used including 0.94 Mb of history data, 64 Mb of tick data


Sehe jetzt erst mal nichts auffälliges, würde aber auch lügen, wenn ich behaupten würde, dass ich wüsste, worauf ich achten muss...

Spronk
50
Spronk  
this.tradeHandler.SetAsyncMode(false);

bringt erst mal keine Veränderung.

Spronk
50
Spronk  

Hm... ich nehme an, dass ich diesen RetCode bekommen müsste "TRADE_RETCODE_POSITION_CLOSED"?

Den sehe ich oben erst mal nicht. Er added nur den Sell Deal, richtig?
Danach kommt nichts mehr.

Christian
2096
Christian  

Also für mich sieht das nach einem BUG im MT5 aus


Andere Meinungen aus dem Forum ?


123
Einloggen oder registrieren, um einen Kommentar zu schreiben