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 |//+------------------------------------------------------------------+intOnInit()
{
//---
tradeManager.Init(magicNr);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
if(IsNewBar(_Period))
{
tradeManager.Tick();
}
}
bool IsNewBar(ENUM_TIMEFRAMES timeFrame)
{
//----staticdatetime old_Times[21];// an array for old time valuesbool res=false; // variable for the resultint i=0; // index of old_Times[] arraydatetime new_Time[1]; // time of a new barswitch(timeFrame)
{
casePERIOD_M1: i= 0; break;
casePERIOD_M2: i= 1; break;
casePERIOD_M3: i= 2; break;
casePERIOD_M4: i= 3; break;
casePERIOD_M5: i= 4; break;
casePERIOD_M6: i= 5; break;
casePERIOD_M10: i= 6; break;
casePERIOD_M12: i= 7; break;
casePERIOD_M15: i= 8; break;
casePERIOD_M20: i= 9; break;
casePERIOD_M30: i=10; break;
casePERIOD_H1: i=11; break;
casePERIOD_H2: i=12; break;
casePERIOD_H3: i=13; break;
casePERIOD_H4: i=14; break;
casePERIOD_H6: i=15; break;
casePERIOD_H8: i=16; break;
casePERIOD_H12: i=17; break;
casePERIOD_D1: i=18; break;
casePERIOD_W1: i=19; break;
casePERIOD_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:
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.
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... :(
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.
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()).
Standardbibliothek / Handelsklassen / CTrade / ResultRetcode - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
So, hier mal das um die EURUSD Einträge bereinigte- und die OnTradeTransaction() ergänzte Log:
MO010:41:54.881Testerinitial deposit 10000.00 EUR, leverage 1:100 LJ010:41:54.889Testersuccessfully initialized OO010:41:54.889Network143 Kb of total initialization data received IE010:41:54.889TesterIntel Core i5-4258U @ 2.40GHz, 2047 MB NM010:41:56.516SymbolsWMT.US-d: symbol to be synchronized KF010:41:56.522SymbolsWMT.US-d: symbol synchronized, 3464 bytes of symbol info received EL010:41:56.523HistoryWMT.US-d: history synchronization started DK010:41:56.529HistoryWMT.US-d: load 31 bytes of history data to synchronize in 0:00:00.000NE010:41:56.529HistoryWMT.US-d: history synchronized from 2017.03.02 to 2018.08.27 HP010:41:56.628HistoryWMT.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 IN010:41:56.628HistoryWMT.US-d,H4: history begins from 2017.03.02 12:00 IO010:41:56.629TesterWMT.US-d,H4 (ActivTrades-Server): every tick generating PF010:41:56.629TesterWMT.US-d,H4: testing of Experts\Advisors\TestAdvisor\TestAdvisor.ex5 from 2018.01.01 00:00 to 2018.01.31 00:00 started FI010:41:56.929HistoryWMT.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 HH010:41:56.929HistoryWMT.US-d,Daily: history begins from 2017.03.02 00:00 NG010:41:57.064SymbolsEURUSD: symbol to be synchronized GL010:41:57.064SymbolsEURUSD: symbol synchronized, 3544 bytes of symbol info received DE010:41:57.064HistoryEURUSD: history synchronization started QR010:41:57.066HistoryEURUSD: load 27 bytes of history data to synchronize in 0:00:00.016 FF010:41:57.066HistoryEURUSD: history synchronized from 2018.06.01 to 2018.06.25
IO010:41:57.066Trade2018.01.02 20:00:00 market buy 1.00 WMT.US-d (98.960 / 98.970 / 98.960) CD010:41:57.066Trades2018.01.02 20:00:00 deal #2 buy 1.00 WMT.US-d at 98.970 done (based on order #2) FI210:41:57.066Symbols2018.01.02 20:00:00 no prices for symbol EURUSD (1970.01.01 00:00:00 0.00000, 0.00000) PR010:41:57.066Trade2018.01.02 20:00:00 deal performed [#2 buy 1.00 WMT.US-d at 98.970] CL010:41:57.066Trade2018.01.02 20:00:00 order performed buy 1.00 at 98.970 [#2 buy 1.00 WMT.US-d at 98.970] LQ210:41:57.066Symbols2018.01.02 20:00:00 no prices for symbol EURUSD (1970.01.01 00:00:00 0.00000, 0.00000)
MD010:41:58.916Trade2018.01.11 15:45:00 market sell 1.00 WMT.US-d, close #2 (99.610 / 99.630 / 99.610) DR010:41:58.916Trades2018.01.11 15:45:00 deal #3 sell 1.00 WMT.US-d at 99.610 done (based on order #3) IQ010:41:58.916Trade2018.01.11 15:45:00 deal performed [#3 sell 1.00 WMT.US-d at 99.610] OG010:41:58.916Trade2018.01.11 15:45:00 order performed sell 1.00 at 99.610 [#3 sell 1.00 WMT.US-d at 99.610] LE010:41:58.916TestAdvisor (WMT.US-d,H4)2018.01.11 15:45:00 1. OnTradeTransaction FJ010:41:58.916TestAdvisor (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 DK010:41:58.916TestAdvisor (WMT.US-d,H4)2018.01.11 15:45:00 2. OnTradeTransaction HO010:41:58.916TestAdvisor (WMT.US-d,H4)2018.01.11 15:45:00 MqlTradeTransaction: TRADE_TRANSACTION_ORDER_DELETE order #3 ORDER_TYPE_SELL ORDER_STATE_FILLED PI010:41:58.916TestAdvisor (WMT.US-d,H4)2018.01.11 15:45:00 3. OnTradeTransaction PM010:41:58.916TestAdvisor (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 MF010:41:58.916TestAdvisor (WMT.US-d,H4)2018.01.11 15:45:00 4. OnTradeTransaction MO010:41:58.916TestAdvisor (WMT.US-d,H4)2018.01.11 15:45:00 MqlTradeTransaction: TRADE_TRANSACTION_REQUEST LR010:41:58.916TestAdvisor (WMT.US-d,H4)2018.01.11 15:45:00 MqlTradeResult: order #3 retcode=TRADE_RETCODE_DONE
ES010:41:59.791Testerfinal balance 10000.00 EUR ED010:41:59.807TesterWMT.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). IR010:41:59.807TesterWMT.US-d,H4: total time from login to stop testing 0:00:05.172 (including 0:00:01.501 for history data synchronization) IN010:41:59.807Tester4469 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...
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
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:
Die Funktion IsNewBar() habe ich von der MQL5 Seite. Diese habe ich also nicht selber geschrieben.
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()).
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.
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
Zitate oder Code fügst du hiermit ein
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.
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);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...
bringt erst mal keine Veränderung.
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.
Also für mich sieht das nach einem BUG im MT5 aus
Andere Meinungen aus dem Forum ?