- Wenn ein Programm nicht tut, was es soll, ist der Debugger das Instrument der Wahl. Damit können die Variablenwerte kontrolliert werden, die zum Fehlverhalten führen.
- Vielleicht fehlt eine boolesche Variable, die abhängig von der Zeitspanne (Kursabstand,...?) der letzten Eröffnung, eione neue Eröffnung zulässt oder nicht.
Hallo.
Anscheinend hats irgendwas mit den eigenen Zählern zu tun. Das Öffnen der 1. Sell- und der 1. Buy-Order läuft anscheinend korrekt.
Aber irgendwann danach scheinen die eigenen Zähler komplett rum zu spinnen. Die haben mal im Backtest mit Print Werte angezeigt, die einfach absolut nicht stimmen können. Ein opened-Zähler war irgendwie bei 130, dabei wurden bis dahin 2, maximal 6 Orders geöffnet. Das muss nen großer Bug in MQL4 sein, oder der Fehler ist so merkwürdig, dass er nicht zu finden ist.
Kompletter Code ist im Anhang.
Irgendwo ab hier scheinen die eigenen Zähler überhaupt nicht mehr funktionieren. Hab bestimmt Alles 20mal komplett umgeschrieben, der Fehler, dass er irgendwo ab diesem Code viel zu viele Orders öffnet, tritt immer wieder auf, egal wie man den ganzen Kram schreibt.//============================================================================================================= // ( O S ) O P E N N E X T O R D E R S //============================================================================================================= // Wenn nach OS FirstSel und FirstBuy offen sind... if( fiLO==true && fiSH==true ){ //============================================================================================================= // O P E N N E X T S E L //============================================================================================================= //...wenn nach OS noch kein NextBuy offen ist... if( neLO==false ){// ? // ...OOP für NextSel-by-FirstBuy berechnen: if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){ if(OrderType()==OP_BUY){ if(OrderSymbol()==Symbol()){ OOP_Sel_FiBuy = NormalizeDouble( OrderOpenPrice() - D_ONO *Point,Digits); if( OOP_Sel_FiBuy > OrderStopLoss() ){ for( Need_Sel ; Need_Sel>0 ; Need_Sel-- ){// ? if(IsTradeAllowed()==true)TI_NeSel = OrderSend(Symbol(),OP_SELLSTOP,Lots,OOP_Sel_FiBuy,Slippage,SL_FiSel,TP_FiSel,NULL,MN_NeSel,NULL,Blue); while(IsTradeContextBusy()==true)Sleep(slMS); if( TI_NeSel != -1 )Opened_Sel++; } } } } } }// Nach OS kein NextBuy offen. //-----------------------------------------------------------------------------------------------------------*/ //...wenn nach OS doch NextBuy offen ist... if( neLO==true ){ // ...OOP für NextSel-by-NextBuy berechnen: if(OrderSelect(TI_NeBuy,SELECT_BY_TICKET)){ if(OrderType()==OP_BUY){ if(OrderSymbol()==Symbol()){ OOP_Sel_NeBuy = NormalizeDouble( OrderOpenPrice() - D_ONO *Point,Digits); if( OOP_Sel_NeBuy > OrderStopLoss() ){ Need_Sel = Opened_Buy * OrdersNeed_Multi; for( Need_Sel ; Need_Sel>0 ; Need_Sel-- ){// ? if(IsTradeAllowed()==true)TI_NeSel = OrderSend(Symbol(),OP_SELLSTOP,Lots,OOP_Sel_NeBuy,Slippage,SL_FiSel,TP_FiSel,NULL,MN_NeSel,NULL,Blue); while(IsTradeContextBusy()==true)Sleep(slMS); if( TI_NeSel != -1 )Opened_Sel++; } } } } } }// Nach OS doch NextBuy offen. //============================================================================================================= // O P E N N E X T B U Y //============================================================================================================= //Wenn nach OS noch kein NextSel offen ist... if( neSH==false ){ // ...OOP für NextBuy-by-FirstSel berechnen: if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){ if(OrderType()==OP_SELL){ if(OrderSymbol()==Symbol()){ OOP_Buy_FiSel = NormalizeDouble( OrderOpenPrice() + D_ONO *Point,Digits); if( OOP_Buy_FiSel < OrderStopLoss() ){ for( Need_Buy ; Need_Buy>0 ; Need_Buy-- ){// ? if(IsTradeAllowed()==true)TI_NeBuy = OrderSend(Symbol(),OP_BUYSTOP,Lots,OOP_Buy_FiSel,Slippage,SL_FiBuy,TP_FiBuy,NULL,MN_NeBuy,NULL,Blue); while(IsTradeContextBusy()==true)Sleep(slMS); if( TI_NeBuy != -1 )Opened_Buy++; } } } } } }// Nach OS kein NextSel offen. //-----------------------------------------------------------------------------------------------------------*/ //Wenn nach OS doch NextSel offen ist... if( neSH==true ){ // ...OOP für NextBuy-by-NextSel berechnen: if(OrderSelect(TI_NeSel,SELECT_BY_TICKET)){ if(OrderType()==OP_SELL){ if(OrderSymbol()==Symbol()){ OOP_Buy_NeSel = NormalizeDouble( OrderOpenPrice() + D_ONO *Point,Digits); if( OOP_Buy_NeSel < OrderStopLoss() ){ Need_Buy = Opened_Sel * OrdersNeed_Multi; for( Need_Buy ; Need_Buy>0 ; Need_Buy-- ){// ? if(IsTradeAllowed()==true)TI_NeBuy = OrderSend(Symbol(),OP_BUYSTOP,Lots,OOP_Buy_NeSel,Slippage,SL_FiBuy,TP_FiBuy,NULL,MN_NeBuy,NULL,Blue); while(IsTradeContextBusy()==true)Sleep(slMS); if( TI_NeBuy != -1 )Opened_Buy++; } } } } } }// Nach OS kein NextSel offen. //-----------------------------------------------------------------------------------------------------------*/ }// Nach OS1 FirstSel & FirstBuy offen //============================================================================================================= // D E L E T E A L L P E N D I N G O R D E R S //=============================================================================================================}// Nach OS FirstSel und FirstBuy offen. if( fiSH==false && fiLO==false ){ if( neSH==true || neLO==true ){ for(n=OrdersTotal()-1;n>=0;n--){ if(OrderSelect(n,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if( (OrderMagicNumber()==MN_NeBuy&&OrderType()==OP_SELLSTOP) ||(OrderMagicNumber()==MN_NeSel&&OrderType()==OP_BUYSTOP ) ){ if(IsTradeAllowed())OD=OrderDelete(OrderTicket(),Red); while(IsTradeContextBusy())Sleep(slMS);} } } } } }// Bei DeleteAll kein FirstBuy und kein FirstSel offen. //============================================================================================================ // E A F U N K T I O N E N B E E N D E N //============================================================================================================= }// void OnTick()
Dann verwende den Debugger immer bevor der Zählerwert sich ändert.
Man kann den Halt ja auch in einem if(){ .. } 'verstecken', sodass angehalten wird wenn...
Wenn das (debuggen mit hist. Daten im MT4 nicht geht) muss nicht nur der Zählerwert ausgedruckt werden, sondern auch die Umstände und Variablenwerte, die zur Erhöhung führen.
Das Problem kenne ich ... nur meistens tut der Automat genau das, was man ihm sagt. Also hast Du ihm was falsches erzählt ;).
Können den Quellcode gerne mal per Skype durchgehen, wenn Du magst. Meld Dich dazu einfach.
Skype hab ich nicht und auch keine Ahnung davon.
Werd morgen oder vielleicht heute noch mal den ganzen Code posten und versuchen, ihn genau zu erklären.
Vermute inzwischen, dass...
1.
irgendwelche Orders sich gegenseitig im Weg sind...
2.
...oder irgendwelche Codes öfter als sie sollen ausgeführt werden, weil einige Orders mehrmals mit OrderSelect() ausgewählt werden.
Im Anhang noch mal die Quell-Dateie(n). In einer Vers. wird mit extra bools geprüft, was für Orders offen sind. In der Anderen hab ich versucht, dass nur mit OrderSelect(... , SELECT_BY_TICKET) zu prüfen. In beiden Vers. werden viel mehr Orders geöffnet, als eigentlich sollten. Die 4 eigenen Zähler spinnen nach dem Öffnen der 1.Sell- und der 1.Buy-Order nur noch total rum.
Wollte eben den Code genauer erklären, bin aber irgendwie auf nen falschen Knopf gekommen.
So viel zu erklären gibts aber eigentlich nicht. Wenns irgendwelche Fragen zum Code gibt, dann immer raus damit.
Irgendwo ab hier scheinen die eigenen Zähler bloß noch zu spinnen. Ich hab keine Ahnung wieso. Vielleicht ist aber davor auch schon was falsch.
// Wenn nach OS FirstSel und FirstBuy offen sind... if( fiLO==true && fiSH==true ){ //============================================================================================================= // O P E N N E X T S E L //============================================================================================================= //...wenn nach OS noch kein NextBuy offen ist... if( neLO==false ){// ? // ...OOP für NextSel-by-FirstBuy berechnen: if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){ if(OrderType()==OP_BUY){ if(OrderSymbol()==Symbol()){ OOP_Sel_FiBuy = NormalizeDouble( OrderOpenPrice() - D_ONO *Point,Digits); if( OOP_Sel_FiBuy > OrderStopLoss() ){ for( Need_Sel ; Need_Sel>0 ; Need_Sel-- ){// ? if(IsTradeAllowed()==true)TI_NeSel = OrderSend(Symbol(),OP_SELLSTOP,Lots,OOP_Sel_FiBuy,Slippage,SL_FiSel,TP_FiSel,NULL,MN_NeSel,NULL,Blue); while(IsTradeContextBusy()==true)Sleep(slMS); if( TI_NeSel != -1 )Opened_Sel++; } } } } } }// Nach OS kein NextBuy offen. //-----------------------------------------------------------------------------------------------------------*/ //...wenn nach OS doch NextBuy offen ist... if( neLO==true ){ // ...OOP für NextSel-by-NextBuy berechnen: if(OrderSelect(TI_NeBuy,SELECT_BY_TICKET)){ if(OrderType()==OP_BUY){ if(OrderSymbol()==Symbol()){ OOP_Sel_NeBuy = NormalizeDouble( OrderOpenPrice() - D_ONO *Point,Digits); if( OOP_Sel_NeBuy > OrderStopLoss() ){ Need_Sel = Opened_Buy * OrdersNeed_Multi; for( Need_Sel ; Need_Sel>0 ; Need_Sel-- ){// ? if(IsTradeAllowed()==true)TI_NeSel = OrderSend(Symbol(),OP_SELLSTOP,Lots,OOP_Sel_NeBuy,Slippage,SL_FiSel,TP_FiSel,NULL,MN_NeSel,NULL,Blue); while(IsTradeContextBusy()==true)Sleep(slMS); if( TI_NeSel != -1 )Opened_Sel++; } } } } } }// Nach OS doch NextBuy offen. //============================================================================================================= // O P E N N E X T B U Y //============================================================================================================= //Wenn nach OS noch kein NextSel offen ist... if( neSH==false ){ // ...OOP für NextBuy-by-FirstSel berechnen: if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){ if(OrderType()==OP_SELL){ if(OrderSymbol()==Symbol()){ OOP_Buy_FiSel = NormalizeDouble( OrderOpenPrice() + D_ONO *Point,Digits); if( OOP_Buy_FiSel < OrderStopLoss() ){ for( Need_Buy ; Need_Buy>0 ; Need_Buy-- ){// ? if(IsTradeAllowed()==true)TI_NeBuy = OrderSend(Symbol(),OP_BUYSTOP,Lots,OOP_Buy_FiSel,Slippage,SL_FiBuy,TP_FiBuy,NULL,MN_NeBuy,NULL,Blue); while(IsTradeContextBusy()==true)Sleep(slMS); if( TI_NeBuy != -1 )Opened_Buy++; } } } } } }// Nach OS kein NextSel offen. //-----------------------------------------------------------------------------------------------------------*/ //Wenn nach OS doch NextSel offen ist... if( neSH==true ){ // ...OOP für NextBuy-by-NextSel berechnen: if(OrderSelect(TI_NeSel,SELECT_BY_TICKET)){ if(OrderType()==OP_SELL){ if(OrderSymbol()==Symbol()){ OOP_Buy_NeSel = NormalizeDouble( OrderOpenPrice() + D_ONO *Point,Digits); if( OOP_Buy_NeSel < OrderStopLoss() ){ Need_Buy = Opened_Sel * OrdersNeed_Multi; for( Need_Buy ; Need_Buy>0 ; Need_Buy-- ){// ? if(IsTradeAllowed()==true)TI_NeBuy = OrderSend(Symbol(),OP_BUYSTOP,Lots,OOP_Buy_NeSel,Slippage,SL_FiBuy,TP_FiBuy,NULL,MN_NeBuy,NULL,Blue); while(IsTradeContextBusy()==true)Sleep(slMS); if( TI_NeBuy != -1 )Opened_Buy++; } } } } } }// Nach OS kein NextSel offen. //-----------------------------------------------------------------------------------------------------------*/ }// Nach OS1 FirstSel & FirstBuy offen //============================================================================================================= // D E L E T E A L L P E N D I N G O R D E R S //=============================================================================================================}// Nach OS FirstSel und FirstBuy offen. if( fiSH==false && fiLO==false ){ if( neSH==true || neLO==true ){ for(n=OrdersTotal()-1;n>=0;n--){ if(OrderSelect(n,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if( (OrderMagicNumber()==MN_NeBuy&&OrderType()==OP_SELLSTOP) ||(OrderMagicNumber()==MN_NeSel&&OrderType()==OP_BUYSTOP ) ){ if(IsTradeAllowed())OD=OrderDelete(OrderTicket(),Red); while(IsTradeContextBusy())Sleep(slMS);} } } } } }// Bei DeleteAll kein FirstBuy und kein FirstSel offen. //============================================================================================================ // E A F U N K T I O N E N B E E N D E N //============================================================================================================= }//
Wie ist das eigentlich mit dem Managen von Orders, wenn gleichzeitg mehrere Sell- und Buy-Orders offen sind? Bzw. wenn allgemein mehrere Orders mit dem selben EA im selben Symbol() offen sind. Geht das so oder muss man das irgendwie anders machen?
for(int i = OrdersTotal()-1 ; i>=0 ; i-- ){ if(OrderSelect( i , SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ ...
Wie ist das eigentlich mit dem Managen von Orders, wenn gleichzeitg mehrere Sell- und Buy-Orders offen sind? Bzw. wenn allgemein mehrere Orders mit dem selben EA im selben Symbol() offen sind. Geht das so oder muss man das irgendwie anders machen?
Kann man die ignorieren und so auf das Expertenwissen pfeifen?
Geht das so oder muss man das irgendwie anders machen?
Geht anders. Frage ist ja auch: was verstehst Du unter "managen".
Mein Angebot der Hilfe per Skype steht noch. Für hier ist mir der Quelltext einfach zu lang ;).

- 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.
Seit Wochen schlag ich mich mit nem EA rum. Er soll vollautomatisch ne Art Martin-Gale Strategie im Metatrader 4 traden.
Er soll zuerst eine Sell- und eine Buy-Order öffnen. Je nachdem ob Ask / Bid nen gewissen Abstand zum OrderOpenPrice() der ersten Orders erreichen, sollen in die entsprechende Richtung weitere Orders geöffnet werden. Also geht z.B. der Sell 20 Pips long über seinen OOP(), sollen dort 2 weitere Buy-Orders geöffnet werden und immer so weiter. Bis Ask / Bid ne Art Gewinn-Distanz der 1. Orders erreichen. Also geht z.B. der Bid long 40 Pips über den OOP() der 1. Buy-Order, sollen alle Orders geschlossen werden und das Ganze von vorn los gehn.
Allerdings öffnet er immer viel mehr Orders als er soll. Hab unzählige Male getestet, durch geguckt, etliche Sachen geändert. Weiß einfach nicht warum. Kann leider derzeit die Datei nicht hochladen, nur den Code rein kopieren.