Extreme Orderüberfüllung trotz Counter!!?? Was tun?? MT4

 

Was tun bekomme die ganze zeit den "error 1"& "error 130" angezeigt ... (Wichtig -> MT4)


(Zuvor gab es Probleme mit dem "Ticket()" in den OrderModifys, welche jedoch behoben werden konnten.)

int total= OrdersTotal();
   LongOrder=0; ShortOrder=0;  //auch wenn ich diese Zeile weglasse werden wieder endlos viele Orders geöffnet...
   int freeze_level = (int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL);
   for(int Orderzaehlung=0; Orderzaehlung<=total; Orderzaehlung++ ){
      if( !OrderSelect(Orderzaehlung,SELECT_BY_POS,MODE_TRADES) )
         continue;

      if( OrderSymbol()!=Symbol() )
         continue;
      
      if( OrderMagicNumber()!=EA1_MagicNummer )
         continue;
         
         if (total ==0){break;}
         
         
 if( OrderType()== OP_BUY ){
         
         
         //SL für LongOrder setzen
   if (OrderCloseTime()==0 && OrderStopLoss()==0 )//Order noch nicht geschlossen & SL nochnicht gesetzt
      { StopLossLong = NormalizeDouble(OrderOpenPrice()/(1+(SL_prozent/100)),Digits);
      if (StopLossLong<freeze_level){StopLossLong=freeze_level;}
        SL_Setzen = OrderModify(OrderTicket(),OrderOpenPrice(),StopLossLong,OrderTakeProfit(),0,Yellow);}
         
         //TP für LongOrder Setzen
   if (OrderCloseTime()==0 && OrderTakeProfit()==0 ) //Order noch nicht geschlossen & TP nochnicht gesetzt
      {
      TakeProfitLong=NormalizeDouble(OrderOpenPrice()*(1+(TP_prozent/100)),Digits);
      if (TakeProfitLong<freeze_level){TakeProfitLong=freeze_level;}
      TP_Setzen=OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(),TakeProfitLong,0,Orange);
      }
            
        if (OrderCloseTime()>0){LongOrder--;} 
         
            }
            
         
else if( OrderType()== OP_SELL ){
         ShortOrder++;
         
         //SL für ShortOrder setzen
         if (OrderCloseTime()==0 && OrderStopLoss()==0) //Order noch nicht geschlossen & SL nochnicht gesetzt
      { StopLossShort=NormalizeDouble(OrderOpenPrice()*(1+(SL_prozent/100)),Digits);
      if (StopLossShort<freeze_level){StopLossShort=freeze_level;}
      SL_Setzen=OrderModify(OrderTicket(),OrderOpenPrice(),StopLossShort,OrderTakeProfit(),0,Yellow);}
      
      //TP für ShortOrder setzen
   if (OrderCloseTime()==0 && OrderTakeProfit()==0) //Order noch nicht geschlossen & TP nochnicht gesetzt
      {
     TakeProfitShort=NormalizeDouble(OrderOpenPrice()/(1+(TP_prozent/100)),Digits);
     if (TakeProfitShort<freeze_level){TakeProfitShort=freeze_level;}
     TP_Setzen=OrderModify(OrderTicket(), OrderOpenPrice(),OrderStopLoss(),TakeProfitShort,0,Orange);
      }
   
if (OrderCloseTime()>0){ShortOrder--;}
      }
 

}
//Orders Auslösen
   //Long
    //if (DayOfWeek()==0 && Hour()<23 && DayOfWeek()==5 && Hour()<23){return(0);}
if (DayOfWeek()==Handelsbeginntag && Hour()<HandelsbeginntagUhrzeit && DayOfWeek()==Handelsendetag && Hour()<HandelsendetagUhrzeit){return;}
//else if (DayOfWeek()==5 && Hour()>23){return(0);}//lohnt sich nur bei backtesting ab 6 Monaten
else if (Hour()>HandelsbeginnUrhzeit && Hour()<HandelsendeUhrzeit) // 
{
   if(LongOrder==0 && MAkurzhandle>MAlanghandle && Bid>=MAkurzhandle)
   {
   LongOrder = OrderSend(Symbol(),OP_BUY,Lot,Bid,10,0,0,"einfach Long",EA1_MagicNummer,0,Blue);
   LongOrder++;
   total++;
   }
   
   
   //Short
 else if(ShortOrder==0 && MAkurzhandle<MAlanghandle && Ask<=MAkurzhandle){
   ShortOrder = OrderSend(Symbol(),OP_SELL,Lot,Ask,10,0,0,"einfach Short",EA1_MagicNummer,0,Red);
   ShortOrder++;
   total++;

Ebenfalls interessant ist, dass es nur 20 Buy Orders gab...
 
Mein Tip: verwende MQL5, da ist alles viel einfacher, und da kann ich auch besser helfen.
 

Error 130 ist meist ein Zeichen für ungültige SL oder TP, Stichwort Mindestabstand: MarketInfo(_Symbol,MODE_STOPLEVEL).

  1. Verwende nicht OrderOpenPrice() für SL und TP, da kann das passieren, besser OrderClosePrice(),
  2. In schnellen Märkten passiert das (130er) wenn SL oder TP zu nahe sind!
Wegen zu viele Orders würde ich, bei einer neuen Order, die Variablen ausdrucken, die eigentlich das verhindern sollten. Sind diese Variablen local oder global oder static?
 

@Otto Pauser

MQL5 ist mir zu kompliziert, die Arrays zum speichern der Kurse & Moving Averages haben bei mir im ersten Versuch eine Frustationsgrenze überschritten...


@Carl Schreiber

Ist alles im OnTick() . Ich habe das Gefühl, dass das LongOrder++ oder ShortOrder++ in der for Schleife nicht richtig Rauskommen, sodass die beiden Integer immernoch auf 0 bleiben.( Jmd eine Idee, wie ich aus einer Schleife einen Integer der Ausserhalb dieser schleife ist Addieren bzw. Subtrahieren kann, falls dies nicht schon der Fall ist?

Meine hierbei:

LongOrder=0;
for(...){

 if( OrderType()== OP_BUY )
  {LongOrder++}

...
...
...

         
            }
}
/gilt nun ausserhalb des for loops LongOrder=1?(wenn Order noch nicht geschlossen)
 

mir ist ja nicht ganz klar was Du mit dem Code hier ausdrücken willst. Jedenfalls ist die Order Selektion nicht korrekt wenn er dir zuviele Order reingibt. 

 
amando:

mir ist ja nicht ganz klar was Du mit dem Code hier ausdrücken willst. Jedenfalls ist die Order Selektion nicht korrekt wenn er dir zuviele Order reingibt. 

Ich will dass im For loop erstmal gecheckt wird, ob (es überhaupt eine Order gibt->der Zähler "LongOrder" oder "ShortOrder" wird um 1 Addiert) & es sich bei der ausgewählten Order um die Order mit der MagicNummer des reichtigen Expert Advoisors handelt, wenn ja sollen SL & TP gesetzt werden(falls noch nicht vorhanden). 


Wenn die Orders dann bei einem der nächsten Durchläufe geschlossen worden sein sollten, wird diese Order vom Zähler der Orderarten ("LongOrder", "ShortOrder") abgezogen.

Orders werden nach dem Loop also außerhalb durchgeführt unter der richtigen Marktbedingung und der Bedingung, dass der Orderzähler  ("LongOrder", "ShortOrder") wieder bei Null ist. 

Jedoch wird der orderzähler durch den Loop nicht ausserhalb erhöht/gesenkt-> orderzähler ("LongOrder", "ShortOrder") sind als immer Null.

Das Problem ist, dass ich die orderAusführungen nicht in den Loop einfügen kann, weil es sonst wider irgendeinen Widerspruch gibt. 

Alternative Lösungsvorschläge die vor dem modify die MagicNummer checken sind auch selbstverständlich willkommen.

 

ganz versteh ich es nicht

du baust eine schleife ein um zu wissen das eine order drin ist.

wenn keine rand Bedingungen zu tragen kommen, dann macht er eine order auf

wenn du ihn sagst, du willst max. 17 order dann macht er 17 order zu dem zeitpunkt auf


die mn allein hilft dir hier nicht, da du die rand Bedingungen noch definieren musst, das er zum dem preis keine 2te order aufmachen darf

 
btw, MT5 geht einfacher zu programmieren
 

Bayne,

  1. verwende doch den Styler (Extras oder Ctrl+,) für Deinen Code und ersetze damit Deinen Code von oben - er ist zZ sehr unübersichtlich!
  2. Das es zumindest bei MT4 Probleme gibt, wenn man, in einer Schleife die hoch zählt (i++), Positionen löscht, zähle ich immer 'runter: int o=OrdersTotal(); while(o-->){..
  3. Wie viele Positionen sollen denn maximal zugleich geöffnet sein?
  4. Sonst könntest Du einen Zeitabstand definieren für die nächste Position: datetime nextPos = TimeCurent()+x; /*Sekunden*/ if (TimeCurrent()>=nextPos) .. /* neue Position */
  5. Ich kann Dir eins versichern: Es gibt fast nix, was nicht schon für MT4/5 programmiert wurde. Erst suchen (und dann nur etwas ändern) ist wahrscheinlich viel schneller!
 
Bayne:

@Otto Pauser

MQL5 ist mir zu kompliziert, die Arrays zum speichern der Kurse & Moving Averages haben bei mir im ersten Versuch eine Frustationsgrenze überschritten...


Du wirst da auf lange Sicht nicht drumrum kommen.

Der Mt4 hängt nur noch an der Herz-Lungen-Maschine.

Du investierst unnütze Zeit .....

 
amando:

ganz versteh ich es nicht

du baust eine schleife ein um zu wissen das eine order drin ist.

wenn keine rand Bedingungen zu tragen kommen, dann macht er eine order auf

wenn du ihn sagst, du willst max. 17 order dann macht er 17 order zu dem zeitpunkt auf


die mn allein hilft dir hier nicht, da du die rand Bedingungen noch definieren musst, das er zum dem preis keine 2te order aufmachen darf

@amandoIch sage doch mit LongOrder==0, dass er nur dann eine Order öffnen soll, wenn bei der Vroherigen Zählung in der For Schleife keine LongOrder gefunden werden konnte, danach wird LongOrder doch um 1 eins addiert.

wie mache ich dass denn, dass zu dem gleichen preis keine 2. gekauft wird?