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

 
GumRai:

Versuchen Sie zunächst einmal nicht, eine Funktion innerhalb einer anderen Funktion zu deklarieren.

Ich bin nicht in der Lage, anhand des von Ihnen geposteten Codes herauszufinden, was Sie zu tun versuchen. Daher kann ich Ihnen nicht helfen.

Vielen Dank, GumRai, für Ihre prompte Antwort. Mein Programm hat viele Bedingungen wie die folgenden. Ich habe bis zu P12 geprüft. Es ist wie ein Drehpunkt. Wenn die Bedingungen erfüllt sind, werden Limit-Trades auf den Niveaus P1, P2 und .... eröffnet, deren Anzahl 12 beträgt. Ich wollte nicht für jede Instanz einen Kauf-/Verkaufscode schreiben. Deshalb habe ich separate buycall/sellcall-Funktionen erstellt. Nachfolgend mein alter Code für Sell.

     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  
         .......................many more
 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}
 

Dies ist das Beispiel. Gleiche Handel Platzierung auf jedem Tick. Ich muss dies auf jede Stunde zu platzieren. Da seine eine stündliche Pivot.

 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}

Wenn Sie ein Verkaufslimit öffnen, setzen Sie BuyTicket auf 0.

Als Nächstes prüfen Sie, ob BuyTicket==0 ist, was natürlich der Fall ist, denn Sie haben es ja gerade gesetzt.

Dann setzen Sie SellTicket auf 0.

Nächster Tick, Sellticket==0, also öffnen Sie ein Verkaufslimit und setzen BuyTicket wieder auf 0.

und so weiter und so fort............

 
GumRai:

Wenn Sie ein Verkaufslimit öffnen, setzen Sie BuyTicket auf 0.

Als Nächstes prüfen Sie, ob BuyTicket==0 ist, was natürlich der Fall ist, denn Sie haben es ja gerade gesetzt.

Dann setzen Sie SellTicket auf 0.

Nächster Tick, Sellticket==0, also öffnen Sie ein Verkaufslimit und setzen BuyTicket wieder auf 0.

und so weiter und so fort............

Dann sollte ich die beiden Zeilen, die Sie hervorgehoben haben, entfernen. Das habe ich getan. Jetzt wird nur noch das Ergebnis einer Stunde für 2 Monate Datenbacktest angezeigt.

Eine andere Sache, die ich bemerke, in meinem Sellcall, habe ich eine umgekehrte Handel auf kaufen. Wenn der Verkaufshandel gestoppt wird, wird der Kaufhandel eröffnet. Jetzt für sellcall Funktion gibt es (Selltickets) so ist es ok?

Vielen Dank!

 

int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
   if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,0,Red);
   
   // reverse tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       
       }
   }
 } 
 }
   return(SellTicket);

Ich verstehe jetzt in diesem Code, zuerst prüft es sellticket == 0 ja offensichtlich, dann platziert verkaufen um, nächste buyticket == 0 ja, nächste Plätze kaufen um...aber wenn Rückkehr...wieder überprüfen sellticket == 0, nein, es ist nicht jetzt...also das ist, warum Ea gestoppt, nachdem Sie eine Menge. Aber wie man dieses Problem zu entfernen. In meinem EA werden inaktive schwebende Aufträge alle 59 Minuten ab der Startstunde gelöscht. Ich habe es so eingestellt.

 

Jetzt habe ich den Code in folgender Weise geändert, es liest für alle Unterstützung und Widerstand.

Ich habe maximal 6 Unterstützung & 6 Widerstand für eine Stunde. Unter diesen 6 erfüllen die Bedingungen, dann öffnet es Grenzen Aufträge auf, dass 6. Wenn 1 erfüllen dann öffnet Grenzen Aufträge für die ein. Dies ist der Algo.

Also habe ich den Code für den Funktionsaufruf folgendermaßen eingestellt.

int BuyCall( double BC)
{  
      
if ( BuyTicket >= 0 && BuyTicket <= 5)
  {
   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)
{
  
 if( SellTicket >= 0 && SellTicket <= 5)
   {
   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);
}

Jetzt läuft es für eine Stunde und prüft für 6 Ebenen für jeden Kauf/Verkauf. Aber er läuft nur eine Stunde lang. Was ist hier zu tun, um es perfekt für den gesamten Datensatz laufen.

 
if ( BuyTicket >= 0 && BuyTicket <= 5)

Dies funktioniert nur im Strategietester und wird nichts mehr bewirken, sobald die ersten 6 Aufträge geöffnet sind.

Sie können auf diese Weise keine Ticketnummer für einen Test verwenden

 
GumRai:

Dies funktioniert nur im Strategietester und bewirkt nichts mehr, sobald die ersten 6 Aufträge geöffnet sind.

Sie können auf diese Weise keine Ticketnummer für einen Test verwenden.

Vielen Dank für Ihre Antwort.

Was soll ich dann tun. Wenn ich das BuyTicket =>0 oder irgendeine BuyTicket-Bedingung entferne. Dann nimmt EA viele gleiche Trades mit jedem Tick.....und gibt mir einen Orderend-Fehler von 148.

 
cashcube: Was soll ich dann tun?
Zuvor beantwortet.
 
cashcube:

Ich danke Ihnen für Ihre Antwort.

Was sollte ich dann tun. Wenn ich die BuyTicket =>0 oder jede BuyTicket Bedingungen zu entfernen. Dann EA nimmt viele gleiche Trades mit jedem tick.....Giving mir ordersend Fehler von 148.

Wir wissen nicht, was Sie zu tun versuchen

Wenn Sie jeweils nur einen offenen Handel wünschen, überprüfen Sie, dass keine offenen Aufträge vorhanden sind, bevor Sie einen neuen senden.

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

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