Ein wenig Hilfe?

 

Also ich lerne mql4 nach ein paar anderen Sprachen, und ich (oder so dachte ich) gerade fertig die erste Version meines ersten EA, eine einfache gleitenden Durchschnitt Trader. Ich ließ es laufen während gestern ohne Bedenken, Eintritt und Austritt waren wie erwartet, und ich dachte, es war bereit zu gehen. Heute Morgen bin ich auf alle möglichen Probleme gestoßen, zunächst würde der Code, wenn ich ihn wiederholte, unabhängig von der Position nur verkaufen, und jetzt, nach ein wenig Fummelei, kauft und verkauft er in den richtigen Positionen, ABER wenn er kauft, wird der Handel beim nächsten Tick geschlossen, egal. Das passiert nicht, wenn ich verkaufe, obwohl ich das gleiche Format habe - kann mir jemand sagen, woran das liegt?

(Als Randbemerkung, mein Computer war in der Lage, den Code den ganzen Tag gestern ohne viel mehr von einem Brummen (CPU durchschnittlich 12%) heute seine gehen wie Höllenglocken, um den Code (~60-90%) laufen)

Code:

int total;
//+------------------------------------------------------------------+
//| expert init function                                            |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   int i;
   total=0;
   if (OrdersTotal()==0)
      {
      total=OrdersTotal();
   }
   else 
      {
      for (i=1; i<=OrdersTotal(); i++)                                                       //--- counter for any trades open on the pair
         {
         if (OrderSelect(i-1,SELECT_BY_POS)==true)
            {
            if (OrderSymbol()==Symbol())
               {
               if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                  { 
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                   //--- with an open buy if the conditions have reversed close on initiation
               }
               if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                  {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                   //--- same with sell
               }
               else 
                  {
                  total++;                                                                   //--- if there are open trades yet to be completed add to tally (*)
               }
           }
       }
   }
}
//----
   return;
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                   |
//+------------------------------------------------------------------+
int start()
  {
//----
   int p,q,z,i,L;
   while (AccountBalance()>50)                                                                                    //---- ensures an infinite loop for 1 trade a run 
   {                                                                                                              //---- (no infibuying!) (*) but always run
//---- 
RefreshRates();
//----
if ((iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)<70)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))&&(total==0))
      {                                                                                                                             //---------- ^ conditions to buy
      p=OrderSend(Symbol(),OP_BUY,0.1,Bid,0,0,0,"",z,0,Red);                                                                        //---------- Buy Order
      OrderSelect(p,SELECT_BY_TICKET);
         while (iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))                             //- whilst the above remains true
            {
            RefreshRates();                                                                                                         //- refresh then do nothing
            Sleep(1000);
         }
      OrderClose(OrderTicket(),0.1,OrderClosePrice(),0,Green);                                                                      //---when above is broken, close
         while (TimeSeconds(TimeCurrent())!=0)                                                                                      //---wait until a new minute
            {
            Sleep(1000);
         }
         continue;
      }
//-----         
if ((iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)>30)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))&&(total==0))
       {                                                                                                                            //---Same steps as above for sell
       q=OrderSend(Symbol(),OP_SELL,0.1,Ask,0,0,0,"",z,0,Blue);
       OrderSelect(q,SELECT_BY_TICKET);
         while (iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))
            {
            RefreshRates();
            Sleep(1000);
         }
      OrderClose(OrderTicket(),0.1,OrderClosePrice(),0,Green);
         while (TimeSeconds(TimeCurrent())!=0)
            {
            Sleep(1000);
         }      
         continue;
      }
if (total!=0)
   {
   L=0;
   for (i=1; i<=OrdersTotal(); i++)                                                       //--- if trades were open which werent initially closed
         {
         if (OrderSelect(i-1,SELECT_BY_POS)==true)
            {
            if (OrderSymbol()==Symbol())
               {
               if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                  { 
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                   //--- close them if now the position has change
               }
               if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                  {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                   //--- same with sell
               }
               else 
                  {
                  L++;
               }
            }
            total=L;
         }
      }
   }
else 
   {
   Sleep(1000);
} 
}
//----
return;
}
//--------------------------------------------------------------+
 

Ich bin nicht zu tief in Ihren Code eingedrungen.

Warum RefreshRates und dann für 1 Sekunde schlafen, wenn der Markt sich schnell bewegt, werden die Daten veraltet sein!?

Sie rechnen auf Ticks, nicht auf Balken, so dass 1 Tick einen Auftrag auslösen kann, wenn sich ein MA um einen minimalen Betrag über/unter den anderen bewegt. Wenn sich der folgende Tick (nach dem Sleep) umkehrt, kreuzen sich die MAs wieder und der Auftrag wird geschlossen.

 

Die Idee ist, einfach in der Schleife zu halten, während die Bedingungen warten, bis die schließen Bedingungen auftreten (Aka die SMA's umschalten) - zugegebenermaßen nicht der beste Weg, dies zu tun, aber eine der billigsten rechnerisch.

Die SMA's schnell bewegen über/unter einander ist eines der Probleme des Codes - aber ich sehe keinen Grund, warum, wenn es derzeit 10 - 15 Pips zwischen den beiden, die ich auf, würde dazu führen, zu schließen? die Bedingungen sind definitiv halten für die while-Schleife, um in der Kontrolle zu bleiben, anstatt sofort springen, um den Abschluss (meine Annahme ist, dass die while-Schleife für den Kauf ignoriert wird, aber nicht den Verkauf - und ich weiß nicht, warum)

 
j.w.msb:

Die Idee ist, einfach in der Schleife zu halten, während die Bedingungen warten, bis die schließen Bedingungen auftreten (Aka die SMA's umschalten) - zugegebenermaßen nicht der beste Weg, dies zu tun, aber eine der billigsten rechnerisch.

Die SMA's bewegen sich schnell über/unter einander ist eines der Probleme des Codes - aber ich sehe keinen Grund, warum, wenn es derzeit 10 - 15 Pips zwischen den beiden, die ich auf, würde dazu führen, dass die Schließung? die Bedingungen sind definitiv halten für die while-Schleife, um die Kontrolle zu bleiben, anstatt sofort springen, um die Schließung (meine Annahme ist, dass die while-Schleife für den Kauf ignoriert wird, aber nicht den Verkauf - und ich weiß nicht, warum)


Wenn Sie nur überprüfen, ob ein MA über/unter dem anderen ist, bezweifle ich, dass es normalerweise 10 bis 15 Pips Unterschied ist, es kann 0,1 Pips sein und so kann der nächste Tick es leicht umkehren.

Es ist nur meine Meinung, aber wenn ich mit Crossovers arbeite, glaube ich, dass es am besten ist, nur auf geschlossenen Bars zu berechnen, um zu viele entgegengesetzte Signale zu vermeiden.

 

Auch in Ihrem Init

 int i;
   total=0;
   if (OrdersTotal()==0)
      {
      total=OrdersTotal();
   }
   else 
      {
      for (i=1; i<=OrdersTotal(); i++)                                                       //--- counter for any trades open on the pair
         {
         if (OrderSelect(i-1,SELECT_BY_POS)==true)
            {
            if (OrderSymbol()==Symbol())
               {
               if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                  { 
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                   //--- with an open buy if the conditions have reversed close on initiation
               }
               if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                  {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                   //--- same with sell
               }
               else 
                  {
                  total++;                                                                   //--- if there are open trades yet to be completed add to tally (*)
               }
           }
       }
   }
}

gilt Ihr else nur für das letzte if, d.h. wenn der EA eine offene Verkaufsorder nicht schließt, wird die Gesamtsumme um 1 erhöht. Warum sollten Sie das wollen?

 
GumRai:


Wenn Sie nur prüfen, ob ein MA über/unter dem anderen liegt, bezweifle ich, dass es normalerweise 10 bis 15 Pips Unterschied sind, es können 0,1 Pips sein und so kann der nächste Tick es leicht umkehren.

Es ist nur meine Meinung, aber wenn ich mit Crossovers arbeite, glaube ich, dass es am besten ist, nur auf geschlossenen Bars zu berechnen, um zu viele entgegengesetzte Signale zu vermeiden


war eine Fehlkalkulation meinerseits in Bezug auf Pips! mein Fehler! Aber der Punkt ist, dass es sicherlich eine Atempause zwischen den beiden gibt, so dass es kein Cross-Over-Signal gibt, das den Verkauf erzwingt. Das Ersetzen des Sleep(1000) durch while (TimeSecond(TimeCurrent)!=59) {Sleep(1000)} würde sicherstellen, dass der Crossover erst beim Schließen der Kerze getestet wird?


Ich habe die OrderClose in der Buy-Sektion entfernt, und die Order wird immer noch geöffnet, wenn sie läuft, und dann mit dem nächsten Pip geschlossen :s


Als Nächstes habe ich OP_BUY und OP_SELL umgeschaltet, und der Verkauf hält wie erwartet, wenn der 6SMA über dem 21SMA liegt - ich warte auf den nächsten Crossover, um zu sehen, was passiert (natürlich teste ich dies vorerst im Minuten-Zeitrahmen)

 

Es gibt eine Menge zu ändern..... eine Sache, an der man arbeiten muss

Welche Magicnumber haben die Trades, die Ihr EA erstellt?

Warum machen Sie es nicht als externe Eingabevariable, so dass Sie es eine eindeutige Nummer und es ist nicht schließen Trades anderen EA's machen können

int init()
  {

//---- 
   int i;
   total=0;
   if (OrdersTotal()==0)
      {
      total=OrdersTotal();
   }

was hier passiert...

      for (i=1; i<=OrdersTotal(); i++)                                                       //--- counter for any trades open on the pair

         {
         if (OrderSelect(i-1,SELECT_BY_POS)==true)
            {
            if (OrderSymbol()==Symbol())
               {
               if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                  { 
                  OrderClose( OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                   //--- with an open buy if the conditions have reversed close on initiation
               }
               if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                  {
                  OrderClose(O rderTicket(),OrderLots(),OrderClosePrice(),0,Green);                   //--- same with sell
               }
               else 
                  {
                  total++;                                                                   //--- if there are open trades yet to be completed add to tally (*)
               }
           }
       }

Zählen Sie nicht die zu prüfenden Trades auf, es wird fehlschlagen, wenn Sie Trades innerhalb der Schleife schließen, wie Sie es jetzt tun

Werfen Sie einen Blick hier, um zu sehen, warum Sie arbeiten müssen und wie das Herunterzählen

https://www.mql5.com/en/forum/139654

(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)

diese Bedingung kann sich mehrmals in wenigen Augenblicken ändern, wenn ein neuer Tick in jedem Handel kommt, den Sie Spread bezahlen

Bedingung ist nicht immer ändern einmal ....auf einen einzigen bar

   while (AccountBalance()>50)                                                                                    //---- ensures an infinite loop for 1 trade a run 
   {                                                                                                              //---- (no infibuying!) (*) but always run
//---- 

was immer läuft, lassen Sie es schlafen

und wenn der Tick fertig ist und ein neuer Tick kommt, wird wieder start() aufgerufen

    while (TimeSeconds(TimeCurrent())!=0)                                                                                      //---wait until a new minute
            {
            Sleep(1000);
         }
         continue;
      }

auf diese Weise wird der Code nur dann ausgeführt, wenn die Sekunde 0 ist, was oft nicht funktioniert

weil es oft vorkommen kann, dass in einer Sekunde kein neuer Tick kommt

wenn der erste Tick der Minute bei 1 Sekunde kommt, müssen Sie auf die neue Minute warten und hoffen, dass der neue Tick bei Sekunde 0 der nächsten Minute kommt

Prüfen Sie die Funktion RefreshRates()

es gibt noch mehr Dinge, wie z.B. dass es sowohl mit 4- als auch mit 5-stelligen Brokern funktioniert

Überprüfung der Returncodes....

Slippage Ihr Wert 0 warum ist es notwendig??? um es größer zu haben

 
deVries:

Es gibt eine Menge zu ändern..... eine Sache, an der man arbeiten muss

Welche Magicnumber haben die Trades, die Ihr EA erstellt?

Warum machen Sie es nicht als externe Eingabevariable, so dass Sie es eine eindeutige Nummer und es ist nicht schließen Trades anderen EA's machen können

was hier passiert...

Zählen Sie nicht die zu prüfenden Trades auf, es wird fehlschlagen, wenn Sie Trades innerhalb der Schleife schließen, wie Sie es jetzt tun

Werfen Sie einen Blick hier, um zu sehen, warum Sie arbeiten müssen und wie das Herunterzählen

https://www.mql5.com/en/forum/139654

diese Bedingung kann sich mehrmals in wenigen Augenblicken ändern, wenn ein neuer Tick in jeden Handel kommt, den Sie als Spread bezahlen

Bedingung ist nicht immer ändern einmal ....auf einen einzigen bar

was immer läuft, lassen Sie es schlafen

und wenn der Tick fertig ist und ein neuer Tick kommt, wird wieder start() aufgerufen

auf diese Weise wird der Code nur dann ausgeführt, wenn die Sekunde 0 ist, was oft nicht funktioniert

weil es oft vorkommen kann, dass in einer Sekunde kein neuer Tick kommt

wenn der erste Tick der Minute bei 1 Sekunde kommt, muss man auf die neue Minute warten und hoffen, dass der neue Tick bei Sekunde 0 der nächsten Minute kommt

Prüfen Sie die Funktion RefreshRates()

es gibt noch mehr Dinge, wie z.B. dass es sowohl mit 4- als auch mit 5-stelligen Brokern funktioniert

Überprüfung der Returncodes....

Slippage Ihr Wert 0 warum ist es notwendig??? um es größer zu haben

danke für Ihre Hilfe, ich nehme jetzt Änderungen vor und werde sehen, wie es läuft! Dumme Fehler, die durch dumme Fehler meinerseits verstärkt wurden! Es ist fast ein Wunder, warum es überhaupt lief!
 

Also, ich gestrippt zurück den Code in den einfachsten Kapazitäten (dh Crossover = Reverse-Positionen) laufen - seine verursacht viele kaufen/verkaufen Aufträge, wenn die beiden SMAs nahe sind, aber Im nicht besorgt über das (für jetzt) und läuft gut auf einem Demo-Konto. Was ist jetzt über mich ist, wenn ich meinen Code auf der Strategie-Tester laufen, öffnet es die erste Position richtig, aber dann nicht nach vorne Zeit weise zu bewegen, so dass die SMAs nie überqueren. Was mache ich falsch? Meine Druckliste lautet:

2013.10.22 23:41:26 2013.09.18 00:41 Tester: Auftrag #1 ist geschlossen

2013.10.22 23:41:26 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0

...

2013.10.22 23:40:53 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0

2013.10.22 23:40:52 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0

2013.10.22 23:40:51 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0

2013.10.22 23:56:18 SMACode3 GBPJPY,M1: erfolgreich geladen

Code:



//+------------------------------------------------------------------+
//|                                                   SMA scripy.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern int z=1234;
int total;
//----

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   int i;
   total=0;
   if (OrdersTotal()!=0)
      {
      for (i=OrdersTotal()-1; i>=0; i--)                                                     
         {
         if (OrderSelect(i,SELECT_BY_POS))
            {
            if (OrderSymbol()==Symbol())
               {
               if (OrderMagicNumber()==z) 
                  {
                  if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                     { 
                     OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                  
                  }
                  if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                     {
                     OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                  
                  }
                  else 
                     {
                     total++;                                                                 
                  }
               }
           }
       }
   }
}
//----
   return;
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
}
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int start()
   {
//----
   int i,L;
   while (AccountBalance()>50)                                                                                     
   {
   RefreshRates();
//-----
double SMA6=iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0);
double SMA21=iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0);
double RSI70=iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)<70;
double RSI30=iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)>30;                                                                                                            
//-----   
if (IsTesting()==true)
{
Sleep(60000);
Print(GetLastError());
}
//----
   if (total==0)
      {
      if ((RSI70)&&(SMA6>SMA21))
         {                                                                                                                       
         OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,0,"",z,0,Red); 
         total+=1;                                                       
         continue;
      }
      if ((RSI30)&&(SMA6<SMA21))
         {
         OrderSend(Symbol(),OP_SELL,0.1,Bid,0,0,0,"",z,0,Blue);
         total+=1;
         continue;
      }  
   }
//---
if (total!=0)
   {
   L=0;
   for (i=OrdersTotal()-1; i>=0; i--)                                                    
      {
      if (OrderSelect(i,SELECT_BY_POS))
         {
         if (OrderSymbol()==Symbol())
            {
            if (OrderMagicNumber()==z) 
               {
               if ((OrderType()==OP_BUY)&&(SMA6<SMA21))
                  { 
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);
                     total+=-1;
                 return;
               }
               if ((OrderType()==OP_SELL)&&(SMA6>SMA21))
                  {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                 
                     total+=-1;
                  return;
               }
               else 
                  {
                  L++;                                                                  
               }
            }
            total=L;
         }
      }
   }
}
//----
}
//----
return;
}
//--------------------------------------------------------------+
 
j.w.msb: Wenn ich meinen Code im Strategietester ausführe, öffnet er die erste Position korrekt, bewegt sich dann aber zeitlich nicht vorwärts,
  1. int start(){
       while (AccountBalance()>50){
          :
    Nein, natürlich nicht. RTFM. Du bekommst nur ein neues Häkchen, wenn du vom Start zurückkehrst.
  2. if (IsTesting()==true){
        Sleep(60000);
        Print(GetLastError());
    }
    RTFM & Einschränkungen des Testers Sie können NICHT im Tester schlafen
  3.         OrderSend(Symbol(),OP_SELL,0.1,Bid,0,0,0,"",z,0,Blue);
                      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);
    
    Was sind Funktionsrückgabewerte? Wie kann ich sie verwenden? - MQL4-Forum
 
RefreshRates ändert keine Werte im Prüfgerät, so dass Sie in einer while-Schleife feststecken, weil es keine neuen Werte hat, mit denen es arbeiten kann.