Ea erstellt mehrere gleiche schwebende/begrenzte Aufträge [Hilfe bitte] - Seite 3

 
GumRai:

Wir wissen nicht, was Sie zu tun versuchen

Wenn Sie jeweils nur einen offenen Handel wünschen, prüfen Sie, ob es keine offenen Aufträge gibt, bevor Sie einen neuen senden.

Wenn Sie nur einen Handel pro Balken wünschen, testen Sie nur einmal pro Balken.

Wenn Sie eine Kombination von Bedingungen wünschen, testen Sie die Kombination.

Ich erkläre das hier:

Ich habe maximal 6 Unterstützungen & 6 Widerstände für jede Stunde. Es können 2 Unterstützungen und 2 Widerstände oder irgendetwas anderes sein, aber maximal 6 Unterstützungen und 6 Widerstände für jede Stunde.

Ich möchte eine Limit-Order für diese S/R-Levels zu Beginn jeder Stunde eröffnen.

Ich habe eine Kauf- und eine Verkaufsfunktion erstellt, so dass ich nicht denselben Kauf-/Verkaufscode für insgesamt 12 S/R-Levels aufschreiben muss.

Wenn ich nun den folgenden Code verwende:

int SellCall(double SC)
{
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);

   return(0);
}

Es werden mehrere gleiche Aufträge erstellt:

Ich habe auch den WHRoeder-Codeverwendet. In einer separaten Funktion. Da ich keine Funktion innerhalb einer Funktion deklarieren kann.

 

Ihr Problem ist nicht die Funktion, die Sie gepostet haben, Ihr Problem liegt im Code, der die Funktion aufruft.

Offensichtlich gibt es keine Prüfung, ob die Aufträge bereits erteilt wurden

 
GumRai:

Ihr Problem ist nicht die Funktion, die Sie gepostet haben, Ihr Problem liegt im Code, der die Funktion aufruft.

Offensichtlich gibt es keine Prüfung, ob die Aufträge bereits erteilt wurden

Code für den Aufruf der Funktion (Snapshot)

 if(FS == 1 || FS == 5 || FS == 7)
   {
     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      
      BuyCall(S1);
      }  
     if( P3 == 1 || P3 ==5 || P3 ==7)
      {
  
      BuyCall(S2);
      }  
     if( P4 == 1 || P4 ==5 || P4 ==7)
      {
      
      BuyCall(S3);
      }      
          
     if( P5 == 1 || P5 ==5 || P5 ==7)
      {
     
      BuyCall(S4);
      }      
     if( P6 == 1 || P6 ==5 || P6 ==7)
      {
     
      BuyCall(S5);
      }  
     if( P7 == 1 || P7 ==5 || P7 ==7)
      {
      
      SellCall(R0);
      } 
     
      if( P8 == 1 || P8==5 || P8 ==7)
      {
    
      SellCall(R1);
      }  
      
     if( P9 == 1 || P9==5 || P9 ==7)
      {
      
      SellCall(R2);
      }          
          
    if( P10 == 1 || P10==5 || P10 ==7)
      {
     
      SellCall(R3);
      }   
    if( P11 == 1 || P11==5 || P11 ==7)
      {
     
      SellCall(R4);
      }                       
    if( P12 == 1 || P12==5 || P12 ==7)
      {
       
      SellCall(R5);
      }            
          
    }
   

Wie kann man überprüfen, ob die Aufträge bereits erteilt wurden oder nicht? Mit Buyticket > 0 Bedingungen?

 
cashcube:

Code für den Aufruf der Funktion (Snapshot)

Wie kann man überprüfen, ob bereits Bestellungen aufgegeben wurden oder nicht? Mit Buyticket > 0 Bedingungen?

Es ist schwierig, einen Rat zu geben, da ich nicht weiß, was Sie am Ende der Stunde mit nicht ausgelösten Aufträgen machen und wie Sie ausgelöste Aufträge verwalten.

Sie könnten ein global deklariertes Array (oder 2) erstellen und die Ticketnummern für die offenen Aufträge speichern. Bevor Sie einen neuen Auftrag öffnen, prüfen Sie das Array-Element, das dem Level entspricht, auf einen Wert >0.

Natürlich müssen Sie auch die Ticketnummern überprüfen, und wenn Sie nicht ausgelöste Aufträge löschen, setzen Sie das Array-Element auf 0. Möglicherweise müssen Sie auch überprüfen, ob der Auftrag geschlossen wurde, und je nach Ihrer Logik das Array-Element wieder auf 0 setzen.

 
GumRai:

Es ist schwierig, Ratschläge zu geben, da ich nicht weiß, was Sie am Ende der Stunde mit nicht ausgelösten Aufträgen machen und wie Sie ausgelöste Aufträge verwalten.

Sie könnten ein global deklariertes Array (oder 2) erstellen und die Ticketnummern für die offenen Aufträge speichern. Bevor Sie einen neuen Auftrag öffnen, prüfen Sie das Array-Element, das dem Level entspricht, auf einen Wert >0.

Natürlich müssen Sie auch die Ticketnummern überprüfen, und wenn Sie nicht ausgelöste Aufträge löschen, setzen Sie das Array-Element auf 0. Möglicherweise müssen Sie auch überprüfen, ob der Auftrag geschlossen wurde, und je nach Ihrer Logik das Array-Element wieder auf 0 setzen.

Wenn ich die Verfallszeiten für nicht ausgelöste Orders festlege, laufen sie um 0:59 oder 59. Minute ab. Für getriggerte Aufträge werden SL und TP festgelegt.

Früher habe ich Ea, die entweder Kauf-oder Verkaufsaufträge in jeder Stunde nimmt entworfen... kein Problem Code war einfach. Aber hier scheint es sehr schwierig zu sein.

Ok, ich werde versuchen, es zu codieren, wie Sie gesagt haben. Wenn Probleme auftreten, werde ich hier posten. Außerdem wäre es gut, wenn Sie ein einfaches Code-Beispiel für die Zählung der Ticketnummer nennen könnten.

Vielen Dank für Ihre Anregung.

 

Ich habe mein Problem vorübergehend mit folgendem Code gelöst, der im Stundendiagramm ausgeführt wird. Einfach

 //--- go trading only for first tiks of new bar
   if(Volume[0]>1) return(0);
 
Bars ist unzuverlässig (ein Refresh/Reconnect kann die Anzahl der Bars auf dem Chart ändern) Volumen ist unzuverlässig (miss ticks) Verwenden Sie immer time. Neue Kerze - MQL4 forum
 
WHRoeder:
Bars ist unzuverlässig (ein Refresh/Reconnect kann die Anzahl der Bars auf dem Chart ändern) Volumen ist unzuverlässig (miss ticks) Verwenden Sie immer Zeit. Neue Kerze - MQL4 forum

Vielen Dank für den Code. Ich habe ihn in die Tick-Funktion eingefügt. Aber jetzt nimmt mein EA keine Trades an. Da ich die Funktion buycall/sell call für die Platzierung von Pending Orders verwende. Ich konnte diese Funktion nicht innerhalb der Funktion hinzufügen.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{     
              BuyStopLoss = BC - (StopLoss * CalcPoint1);
              BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
              BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,TimeCurrent()+3540,Green);
         
return(0);
}


int SellCall(double SC)
{ 
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);

   return(0);
}
       
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick(){
   static datetime timeCur; datetime timePre = timeCur; timeCur=Time[0];
   bool isNewBar = timeCur != timePre;
   if(isNewBar){ 
     return; // Once per bar
   }
   return; // every tick
}  

Hat jemand eine Idee?

 

Auch der umgekehrte Handel bei gestoppten Aufträgen funktioniert nicht.

//-------------Reverse trade for buy
     for(xx =OrdersHistoryTotal()-1;xx >=0;xx --)
     {
         if(OrderSelect(xx, SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
           {
          //for buy order reverse
          if(OrderType()==OP_BUY && OrderProfit()<0) // if last buy closed with loss
          { 
            //--- go trading only for first tiks of new bar
            if(Volume[0]>1) return(0);
            SellStopLoss = Bid + (StopLoss * CalcPoint1);
            SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
            SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Reverse Order",MagicNumber,0,Red);
          }
         break; 
          }
          }
     } 
 

Gibt es einen Hinweis auf den umgekehrten Code? Warum funktioniert er nicht?

Vielen Dank!

Grund der Beschwerde: