neues Problem: Nach Hinzufügen des Parabolic SAR Indikators kein Livetrading möglich - obwohl in der Simulation alles sauber läuft
arbeitest Du auf Hedge oder auf Netting Konto?
dein Programmierstil ist definitiv für Netting, und ganz ehrlich, auf einem Netting Konto, wenn Du die Position nicht umdrehen willst, ist es egal ob du eine Long oder Short hat.
if(PositionSelect(_Symbol)==true) // we have an opened position { if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) { Buy_opened=true; // Es ist ein Kauf } else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) { Sell_opened=true; // Es ist ein Verkauf } } // Ende if PositionSelect
da reicht eigentlich zu fragen, ob PositionSelect(_Symbol) auf true ist
bei Normalize Double, da kannst Du auf _Digits runden, dann passt das für alle Symbole, nicht nur für die 5 Stelligen.
wenn Du SL und TP in Points gleich von anfang an verwendest, und nicht in Pips, dann brauchst
if(_Digits==5 || _Digits==3) { SL = SL*10; TP = TP*10; }
den Teil gar nicht. Ich mach das schon so, seit es nur noch 5 Stellige Broker gibt, weil das ist einfach nur mühsam. Wenn Du den in Points eingibst, dann passt der auch auf allen Instrumenten
ich nehm an, das soll dir eine neue Bar anzeigen
// Kopieren der letzten Barzeit auf das Element New_Time[0] int copied=CopyTime(_Symbol,_Period,0,1,New_Time); if(copied>0) // ok, die Daten wurden erfolgreich kopiert { if(Old_Time!=New_Time[0]) // wenn die alte Zeit nicht gleich der neuen Barzeit ist { IsNewBar=true; // wenn es sich nicht um einen ersten Aufruf handelt, ist die neue Bar erschienen if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have new bar here ",New_Time[0]," old time was ",Old_Time); Old_Time=New_Time[0]; // Speicherung der Barzeit } } else { Alert("Error in copying historical times data, error =",GetLastError()); ResetLastError(); return; }
schau dir mal das an dazu
https://www.mql5.com/de/search#!keyword=isnewbar&module=mql5_module_codebase
was nicht immer Funktioniert ist NULL beim Symbol reinschreiben, es gibt Funktionen, da verweigert das MQL5
wenn Du stattdessen _Symbol reinschreibst, dann passt es immer
genauso bei der Periode, aktuelle Periode = 0, kannst Du auch PERIOD_CURRENT verwenden, macht den Code auch übersichtlicher
das hier
if(Buy_opened) { // Alert("We already have a Buy Position!!!"); nervt wenn es andauernd aufpoppt. return; // Don't open a new Buy Position } // Ende Buy_opened trade.Buy(myLotSize,NULL,Ask,(Ask-SL*_Point),(Ask+TP*_Point),NULL); // Comment ("The current ADX signal is: ",ADXWert); } // Ende if Buy Condition
fängst Du besser so ab
if(!Buy_opened) trade.Buy(myLotSize,NULL,Ask,(Ask-SL*_Point),(Ask+TP*_Point),NULL);
- www.mql5.com
und wenn Du die Kommentare aus dem flow nach rechts rüber schiebst, dann ist der code besser lesbar ;-)
Hallo armando,
danke für Deine schnelle Antwort. Ich werde den Code versuchen entsprechend Deiner Tipps anzupassen und melde mich dann wieder ob alles
geklappt hat.
Das Konto ist ein Hedging Konto.
Danke und viele Grüße
Paul
Hallo armando,
danke für Deine schnelle Antwort. Ich werde den Code versuchen entsprechend Deiner Tipps anzupassen und melde mich dann wieder ob alles geklappt hat.
Das Konto ist ein Hedging Konto.
Danke und viele Grüße
Paul
da hast 3 Funktionen um zu überprüfen ob du eine Position offen hast, deine Version inkludiert alle Positionen und nicht die des Experten
bool CheckPositionLong(const string sym, const int magic) { bool Positions=false; ulong ticket=0; int i=PositionsTotal(); while(i-->0) { ticket=PositionGetTicket(i); PositionSelectByTicket(ticket); if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY && PositionGetString(POSITION_SYMBOL) == sym && PositionGetInteger(POSITION_MAGIC) == magic) { Positions=true; break; } } //Print("Long Positions: ", Positions); return(Positions); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool CheckPositionShort(const string sym, const int magic) { bool Positions=false; ulong ticket=0; int i=PositionsTotal(); while(i-->0) { ticket=PositionGetTicket(i); PositionSelectByTicket(ticket); if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL && PositionGetString(POSITION_SYMBOL) == sym && PositionGetInteger(POSITION_MAGIC) == magic) { Positions=true; break; } } return(Positions); }
da hast 3 Funktionen um zu überprüfen ob du eine Position offen hast, deine Version inkludiert alle Positionen und nicht die des Experten
Hallo amando,
ich habe wieder mal dank Deiner Hilfe den Code vereinfachen können, aber zudem festgestellt, das leider keine Trades im Livekonto eröffnet werden und ich vermute, das es an der neuen Kerzenprüffunktion IsNewBar liegen könnte. In der Simulation klappt wieder mal alles fehlerfrei....;)
if(PositionSelect(_Symbol)==true) // we have an opened position { if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) { Buy_opened=true; // Es ist ein Kauf } else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) { Sell_opened=true; // Es ist ein Verkauf } } // Ende if PositionSelect
Den obigen Code habe ich komplett rausgeschmissen, da nach meinem Verständnis sowieso nur einmal ein buy Trade geöffnet wird, wenn eine neue Kerze erscheint und die Bedingung der If-Anweisung erfüllt ist. Darüber hinaus habe ich alle Normalize Double auf _Digits gerundet und den Wert NULL durch _Symbol ersetzt.
Weiterhin habe ich wie von Dir vorgeschlagen, die SL und TP Werte in Points angegeben damit ich auch auf diesen Teil verzichten kann:
if(_Digits==5 || _Digits==3) { SL = SL*10; TP = TP*10; }
Dann bin ich für die Erkennung einer neuen Bar Deinem Link gefolgt, und habe die IsNewBar Funktion nun eingebaut und die alte Funktion:
/ Kopieren der letzten Barzeit auf das Element New_Time[0] int copied=CopyTime(_Symbol,_Period,0,1,New_Time); if(copied>0) // ok, die Daten wurden erfolgreich kopiert { if(Old_Time!=New_Time[0]) usw....
ebenfalls rausgenommen, da sie an dieser Stelle in der onTick Funktion eigentlich, sofern ich das richtig verstehe, keinen Sinn gemacht hat.
Zu guter Letzt, habe ich die trade.buy Funktion ebenfalls optimiert.
Ich bin leider kein Programmierprofi und hoffe wie immer auf Deine / Eure Hilfe. Vielleicht seht Ihr ja auf den ersten Blick, woran es liegen könnte, das keine Trades im Livekonto eröffnet werden. ;)
Der aktuelle Quellcode sieht nach all den Optimierungen nun folgendermaßen aus: (Den Parabolic Indikator habe ich erstmal wieder entfernt, weil ich möchte, das der EA erstmal mit einem Handelssignal "sauber" funktioniert.)
//+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" // Benötigte Librarys #include <IsNewBar.mqh> #include<Trade\Trade.mqh> // Create an instance of Ctrade called CTrade trade; // Eingaben und Array- und Variablendefinitionen // Stop Loss in Points input int SL=30; // Take Profit in Points input int TP=20; // ADX Setting for Crossing between D+ and D- input int setADX = 10; // Lotsize input double myLotSize = 0.01; // für ADX-Wert double ArrayADX[]; // für D+-Wert double ArrayDpl[]; // für D- -Wert double ArrayDmi[]; // handle for our ADX indicator int adx; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Get handle for ADX indicator adx=iADX(Symbol(),_Period,14); //--- What if handle returns Invalid Handle if(adx<0) { Alert("Error Creating Handles for indicators - error: ",GetLastError(),"!!"); return(-1); } // sortiere die Preise abwärts von der aktuellen Kerze ArraySetAsSeries(ArrayADX,true); ArraySetAsSeries(ArrayDpl,true); ArraySetAsSeries(ArrayDmi,true); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Release our indicator handles IndicatorRelease(adx); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // Before we can open our buytrade - we need to know the ask price double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); //Ask Price, is the price when we want to buy something, _Digits variable stores the number of digits after the decimal point // Neue Kerze aufgetaucht - static CIsNewBar NB1; // Definierter EA, erste Indikatorlinie (ADX) = (erste 0) die 1 liefert den Wert für die zweite Indikatorlinie D+ usw., aktuelle Kerze (zweite Index 0), 3 Kerzen (Kopieren der Daten für 3 Kerzen), speichere Resultat in meinPreisArray // Mit der Funktion Copybuffer füllen wir unser Preisarray aufgrund der ADX Definition CopyBuffer(adx,0,0,3,ArrayADX); // ADX-Wert CopyBuffer(adx,1,0,3,ArrayDpl); // Dplus CopyBuffer(adx,2,0,3,ArrayDmi); // D-Minus // Kann für die Anzeige der Indikatorwerte in Verbindung mit der comment Funktion verwendet werden // Berechne den EA für für die aktuelle Kerze (ADX) double ADXWert=NormalizeDouble(ArrayADX[0],_Digits); // ADX double DplWert=NormalizeDouble(ArrayDpl[0],_Digits); // D+ double DminWert=NormalizeDouble(ArrayDmi[0],_Digits); // D- // Ende der ADX-Handelsstrategie Umsetzung if(NB1.IsNewBar(Symbol(),PERIOD_CURRENT)) // Prüfung auf neuen Balken { // Anfang isnewbar if( (ADXWert>=setADX) && ((ArrayDpl[0] > ArrayDmi[0]) && (ArrayDpl[1] < ArrayDmi[1]))) //Crossing for D+ and D- ((ArrayDpl[0] > ArrayDmi[0]) && (ArrayDpl[1] < ArrayDmi[1]) { trade.Buy(myLotSize,_Symbol,Ask,(Ask-SL*_Point),(Ask+TP*_Point),_Symbol); // Parameter: myLotsize = Positionsgröße, _Symbol= akt. Chartsymbol, Ask = Ask Preis, SL, TP, letzte Parameter = für Kommentare } // Ende if Buy Condition } // Ende isnewbar } // Ende on Tick // Ab hier Funktionen einfügen // Neue Kerze aufgetaucht - Funktion bool IsNewBar(string symbol, // Währungssymbol ENUM_TIMEFRAMES TimeFrame); // Berechnung des TimeFrame
Nach weiteren Simulationen habe ich auch festgestellt, das der EA keine anderen Timeframes außer den 1 min Chart tradet. Woran kann das liegen?
Viele Grüße und einen sonnigen Tag
Paul
Hallo,
also der handelt, auch auf allen Timeframens,
ich habe dir hier noch die Magic Number eingefügt,
ACHTUNG: Immer eine Magic verwenden, einen Text kann der Broker verändern, da steht dann auch TP und SL drin wenn er mal gezogen ist, kann aber theoretisch in der Position auch verändert werden.
Anhand der Magic Number und des Symbols kannst Du dir deine offenen Positionen und Orders immer suchen.
//+------------------------------------------------------------------+ //| ProjectName | //| Copyright 2018, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" // Benötigte Librarys #include <IsNewBar.mqh> #include<Trade\Trade.mqh> // Create an instance of Ctrade called CTrade trade; CIsNewBar NB1; // Eingaben und Array- und Variablendefinitionen input int SL=30; // Stop Loss in Points input int TP=20; // Take Profit in Points input int setADX = 10; // ADX Setting for Crossing between D+ and D- input double myLotSize = 0.01; // Lotsize input int MN = 1232314123; // IMMER EINE MAGIC NUMBER VERWENDEN BEI EINEM EA; NIEMALS OHNE input string Text = "myOwnText"; // Diesen kannst Du verwenden um den Komment in der Position anzuzeigen double ArrayADX[];// für ADX-Wert double ArrayDpl[];// für D+-Wert double ArrayDmi[];// für D- -Wert int adx;// handle for our ADX indicator //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { adx=iADX(Symbol(),_Period,14); if(adx<0) //--- What if handle returns Invalid Handle { Alert("Error Creating Handles for indicators - error: ",GetLastError(),"!!"); return(-1); } // sortiere die Preise abwärts von der aktuellen Kerze ArraySetAsSeries(ArrayADX,true); ArraySetAsSeries(ArrayDpl,true); ArraySetAsSeries(ArrayDmi,true); trade.SetExpertMagicNumber(MN); // Immer die Magic Number verwenden um Trades zu sortieren, den kommentar kann der Broker verändern return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Release our indicator handles IndicatorRelease(adx); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { // Before we can open our buytrade - we need to know the ask price double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); //Ask Price, is the price when we want to buy something, _Digits variable stores the number of digits after the decimal point // Definierter EA, erste Indikatorlinie (ADX) = (erste 0) die 1 liefert den Wert für die zweite Indikatorlinie D+ usw., aktuelle Kerze (zweite Index 0), 3 Kerzen (Kopieren der Daten für 3 Kerzen), speichere Resultat in meinPreisArray // Mit der Funktion Copybuffer füllen wir unser Preisarray aufgrund der ADX Definition CopyBuffer(adx,0,0,3,ArrayADX); // ADX-Wert CopyBuffer(adx,1,0,3,ArrayDpl); // Dplus CopyBuffer(adx,2,0,3,ArrayDmi); // D-Minus // Kann für die Anzeige der Indikatorwerte in Verbindung mit der comment Funktion verwendet werden // Berechne den EA für für die aktuelle Kerze (ADX) double ADXWert=NormalizeDouble(ArrayADX[0],_Digits); // ADX double DplWert=NormalizeDouble(ArrayDpl[0],_Digits); // D+ double DminWert=NormalizeDouble(ArrayDmi[0],_Digits); // D- // Ende der ADX-Handelsstrategie Umsetzung if(NB1.IsNewBar(Symbol(),PERIOD_CURRENT)) // Prüfung auf neuen Balken { // Anfang isnewbar if( ADXWert >= setADX && ArrayDpl[0] > ArrayDmi[0] && ArrayDpl[1] < ArrayDmi[1] ) //Crossing for D+ and D- ((ArrayDpl[0] > ArrayDmi[0]) && (ArrayDpl[1] < ArrayDmi[1]) { trade.Buy(myLotSize,_Symbol,Ask,Ask-SL*_Point,Ask+TP*_Point,Text); // Parameter: myLotsize = Positionsgröße, _Symbol= akt. Chartsymbol, Ask = Ask Preis, SL, TP, letzte Parameter = für Kommentare } // Ende if Buy Condition } // Ende isnewbar } // Ende on Tick // Ab hier Funktionen einfügen
btw, Rechnen kann MQL mittlerweile, Du hast viele Klammern drin die du nicht brauchst, hab dir die mal rausgegeben.
hast du Demo und Live beim gleichen broker?
Was steht im Symbol drin bei Filling Mode?
es gibt broker, da steht der nicht drin, dann musst du diesen selber ausfüllen.
Hallo,
also der handelt, auch auf allen Timeframens,
ich habe dir hier noch die Magic Number eingefügt,
ACHTUNG: Immer eine Magic verwenden, einen Text kann der Broker verändern, da steht dann auch TP und SL drin wenn er mal gezogen ist, kann aber theoretisch in der Position auch verändert werden.
Anhand der Magic Number und des Symbols kannst Du dir deine offenen Positionen und Orders immer suchen.
btw, Rechnen kann MQL mittlerweile, Du hast viele Klammern drin die du nicht brauchst, hab dir die mal rausgegeben.
hast du Demo und Live beim gleichen broker?
Was steht im Symbol drin bei Filling Mode?
es gibt broker, da steht der nicht drin, dann musst du diesen selber ausfüllen.
Hi,
also ich habe den obigen Code genommen und bei mir geht damit nur die Simulation im 1 min Timeframe beim EUR/USD. Bei den anderen Timeframes bspw. 30 min zeigt er keine Operationen an.
Mein Demo und Livekonto ist beim selben Broker (Roboforex)
Anbei ein Screenshot...
also ich habs am 1h Timeframe robiert, da waren in einem Jahr aber auch nur 5 Trades, als auf höheren Timeframes sind die Bedingungen nicht wirklich oft erfüllt.
Hast Du den im Strategy Tester laufen oder am Demokonto?
da muss es was mit den Einstellungen haben. Ist der EA auch wirklich aktiviert am Livekonto? (grünes Symbol rechts oben)
also ich habs am 1h Timeframe robiert, da waren in einem Jahr aber auch nur 5 Trades, als auf höheren Timeframes sind die Bedingungen nicht wirklich oft erfüllt.
Hast Du den im Strategy Tester laufen oder am Demokonto?
da muss es was mit den Einstellungen haben. Ist der EA auch wirklich aktiviert am Livekonto? (grünes Symbol rechts oben)
Ich bin im Livekonto eingeloggt und verwende dort den Strategytester.
Bei dieser eigentlich älteren Version tradet er jeden Timeframe. Da passt komischerweise alles, aber ich sehe den Unterschied nicht.....woran kann das liegen?
Meine Vermutung ist ja, das es an der IsNewBar Funktion liegen könnte. ich hatte noch mal eine andere Art der Candle Erkennung drin und da hatte ich genau dasselbe Ergebnis. Das war der nachfolgende Code zur Erkennung einer neuen Kerze....
void OnTick() { MqlRates priceData[]; ArraySetAsSeries(priceData,true); //Copy candle prices for 3 candles into array CopyRates(_Symbol,_Period,0,3,priceData); // create a counter for the candle static int candlecounter; // create datetime variable for the last time stamp static datetime timestamplastcheck; // create datetime variable for current candle datetime timestampcurrentcandle; // read time stamp for current candle in array timestampcurrentcandle=priceData[0].time; //if the current time stamp is different from last time if (timestampcurrentcandle!=timestamplastcheck) { //remember current timestamp for next time timestamplastcheck=timestampcurrentcandle; // add 1 to the candlecounter candlecounter=candlecounter+1; // Chart output Comment("Counted candles since start:",candlecounter); } } // Ende onTick
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Hallo zusammen,
ich hoffe Ihr könnt mir wieder weiterhelfen, denn ich habe ein neues Problem. Meine Idee ist, immer dann eine Buy Order zu eröffnen, wenn der ADX Wert größer als ein voreingestellter ADX Wert ist und weiterhin beim ADX der D+ Wert den D- Wert kreuzt.Jetzt habe ich dazu noch den SAR Parabolic Indikator integriert und er wird mir in den Simulationen einwandfrei angezeigt. Es gibt keine Fehler oder Warnungen beim Kompilieren. Selbst einige Testkommentare die ich mal probeweise in die IF-Bedingung eingefügt habe, ob mein buy-Signal durch den Indikator funktioniert, klappt einwandfrei in der Simulation.
Also es geht in der Simulation alles einwandfrei, jedoch wieder nicht im Livekonto (ohne den neu hinzugefügten Parabolic SAR Indikator funktioniert alles auch im Livekonto).
Wo liegt das Problem?
Ich poste mal den modifizierten Quellcode:
Ich würde mich sehr freuen, wenn Ihr mir wieder weiterhelfen könntet.
Viele Grüße und bleibt gesund!
Paul