Warum liefert mein EA beim Backtesting immer wieder negative Gewinne? - Seite 3

 
deVries:

wenn Sie Ihren Metatrader starten, muss der EA herausfinden, ob ein Handel offen ist

Ich mache nur die Schleife, die abwärts zählt, um zu prüfen, ob es einen Handel gibt.

Wenn ich es am Anfang auf eins setze und OrdersTotal() >0, dann prüft es die Trades if(.......> || .......> ){die Schleife ausführen....

Sind Sie sicher, dass Sie mir den Code gegeben haben, der Ihnen die oben gezeigten Ergebnisse geliefert hat? Ich habe ihn mit einer Periode von 1440 (1 TAG) getestet und es wurden keine Trades ausgeführt. Wenn ich ihn jedoch auf 1M ändere, wurden viele Trades ausgeführt.
 
cyxstudio:
sind Sie sicher, dass u gab mir den Code, der Ihnen die Ergebnisse auf oben gezeigt? ich testete es auf 1440 (1 DAY) Zeitraum und keine Trades ausgeführt wurden. jedoch, wenn ich es ändern, um 1M viele Trades ausgeführt wurden
Wie viele Tage zurück gehen Ihre Daten, wenn Sie meinen Test noch einmal überprüfen, finden Sie den Zeitraum des Tests und den Zeitrahmen getestet auf
 

OK hier geht.....Ich werde versuchen, hier zu helfen, wenn ich kann.

Diese Ma_Shift-Frage habe ich schon seit einiger Zeit und konnte nie eine klare Antwort darauf finden.

Wenn Sie in Ihrem Code bemerken, dass Sie eine Verschiebung von 8 auf Ihren gleitenden Durchschnitten verwenden.... was bedeutet das?

MA200 = iMA(NULL, 0, 200, 8,MODE_SMA,PRICE_CLOSE, 0); MA5 = iMA(NULL, 0, 5, 8,MODE_SMA,PRICE_CLOSE, 0); CurrentRSI = iRSI (NULL, 0, VarPeriod,PRICE_CLOSE ,0);
Wie Sie sehen können, existiert diese Verschiebungseinstellung nicht auf dem RSI ... sie wird in einem eigenen Fenster angezeigt ... das ist ein Anhaltspunkt.
Wenn Sie einen gleitenden Durchschnitt auf Ihrem Chart ablegen, sehen Sie das, was dem Ma_Shift entspricht, als Einstellung im Feld Shift.
Beachten Sie auch, dass die Reihenfolge der Parameter 200,8,sma,close. beim Aufruf des Indikators dieselbe ist
wie die Reihenfolge, in der sie in der Box aufgeführt sind...die NULL und der Zeitrahmen sind das, worauf Sie das Ma fallen lassen
so sind sie nicht in hier benötigt. noch ist die letzte Verschiebung Einstellung... wie diese ma wird ständig auf die aktuelle Kerze ändern 
aktuelle Kerze....Sie werden dies in einem Moment zu verstehen.
Wenn Sie sich die Einstellungen des iAlligator-Indikators ansehen, sehen Sie Einstellungen für die Kieferverschiebung, die Zahnverschiebung und die Lippenverschiebung... das ist die MaVerschiebung jedes dieser Gleitenden Durchschnitte.
Sie können alle auf dem Chart nach links oder rechts verschoben werden, wie viele Balken Sie wollen.

Das sieht dann wie folgt aus: ............

Dies macht einen Unterschied von 3 Pips im Wert dieser 08:00-Kerze, wie hier im Datenfenster angezeigt.

Das bringt uns zu der Frage: Wofür ist die "Shift"-Einstellung am Ende?

Nun, wenn Sie bei geöffnetem Datenfenster mit der Maus über Ihr Diagramm fahren und von Kerze zu Kerze gehen

werden Sie sehen, dass sich die Zahlen für den 5 SMA von Kerze zu Kerze ändern...

Darum geht es bei dem letzten SHIFT-Wert... Sie müssen bedenken, dass die aktuelle Kerze, die gerade gezeichnet wird

die letzte abgeschlossene Kerze ist die Kerze 1. Wenn es also insgesamt 1000 Kerzen auf Ihrem Chart gibt

werden sie rückwärts nummeriert, von 999 am linken Rand des Charts bis 0, wo Sie sich gerade befinden.

Wenn Sie also wissen möchten, wie hoch der Wert des 5 SMA vor 5 abgeschlossenen Kerzen war, setzen Sie eine 5 an diese letzte Stelle.

setzen Sie eine 5 an diese letzte Stelle ... natürlich im Laufe der Zeit ... Kerze 5 wird auf die nächste Kerze ändern.

Nun, wie bereits erwähnt ... wenn Sie immer den Wert der Kerze 0... dann ist dieser Wert constanly

mit dem Preis ändern. So können Sie ein Signal nehmen und dann der Indikator repaints auf Sie .. aber wenn Sie sind

aber wenn Sie immer nach den Informationen von Kerze 1 fragen, ist es vorbei und wird sich nicht ändern....

Ich hoffe das hilft...

 
cyxstudio:

Ich habe alles neu gemacht und fixiert die Schleife, Schlupf, fixiert den gleitenden Durchschnitt und RSI-Werte, stellte sicher, dass jede geöffnete Positionen geschlossen werden, bevor Sie neue Position. aber wenn ich backtest es, nichts passiert, keine kaufen/verkaufen wurden ausgeführt... was das Problem mit ihm wieder?



Die init()-Funktion wird nur beim Start ausgeführt und nicht bei jedem Tick wie die start()-Funktion. Sie müssen die gleitenden Durchschnitte wieder in die start-Funktion statt in die init()-Funktion einfügen, damit es funktioniert und immer neue Zahlen liefert...
 

Überarbeitet

Fügen Sie eine Funktion ein, bei der der EA prüft, ob es noch offene Aufträge gibt, bevor er eine neue Position eröffnet. Wenn es eine offene oder schwebende Order gibt, wird nicht versucht, eine neue Position zu eröffnen.

Ich sehe, dass jeder eine Schleife verwendet, um zu prüfen, ob es eine offene Position gibt, bevor er kauft. Ich kann die Logik dessen nicht erkennen. Solange OrdersTotal > 0 ist, gibt es offene Aufträge und mein EA wird nicht versuchen, weitere Positionen zu eröffnen.

Ich habe die absteigende Schleife korrigiert.

Diesmal bekomme ich den OrderClose-Fehler 138, der nicht durch Hinzufügen von refreshrates() gelöst werden kann.

und ich verliere am Ende immer noch Geld, was ich nicht tun sollte.

Ich kann nicht denken, von etwas anderes zu beheben...

//+------------------------------------------------------------------+
//|                                       RSI_strategy_cyxstudio.mq4 |
//|                                  Copyright 2013, Tjipke de Vries |
//|                                     https://forum.mql4.com/53695/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"


extern int RSIPeriod        =  3;      //number of periods for RSI
extern double UpperBound    =  90;     //set upper bound value for RSI
extern double LowerBound    =  5;      //set lower bound value for RSI
extern int MASlowPeriod     = 200;
extern int MAFastPeriod     = 5;
extern double Lots  = 0.1;
extern double StopLoss      = 60;       //Set the stop loss level
extern double TakeProfit    = 120;       //Set the take profit level
extern double TrailingStop = 40;
//extra settings for OrderSend
extern int        MagicNumber = 54333;
extern string     CommentEA = "RSI strategy";
extern int        Slippage.Pips    = 3;


int    BUYS=1,SELLS=1;
//++++ These are adjusted for 5 digit brokers.
int     pips2points;      // slippage  3 pips    3=points    30=points
double  pips2dbl;         // Stoploss 15 pips    0.015      0.0150
int     Digits.pips;      // DoubleToStr(dbl/pips2dbl, Digits.pips)
//---
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----   
   if(Digits % 2 == 1)  // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
     {pips2dbl = Point*10; pips2points = 10;   Digits.pips = 1;}
     else {pips2dbl = Point;    pips2points =  1;   Digits.pips = 0;}
     // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl        
//----      

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Ticket;
   double SL,TP;
   int Total;
   double MagicNo;
   double Slippage;
   
   double pAsk = MarketInfo(Symbol(), MODE_ASK);
   double pBid = MarketInfo(Symbol(), MODE_BID);
   double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average
   double CurrentRSI = iRSI (NULL, 1440, RSIPeriod,PRICE_CLOSE ,0);
  
   int Ticket2;
   int cnt;
   
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   
   if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }


  
        
        
        if (OrdersTotal() == 0 ) {
        
        if (CurrentRSI < LowerBound && pAsk > MA200) {    //Condition to execute buy entry
  
        Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", 111,0,Yellow)   ;       //execute buy order
   
    if(Ticket>0)
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("BUY order opened : ",OrderOpenPrice());
            
           }
         if (Ticket < 0) {
         Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
   }
  
  }
  
  
 
  if (CurrentRSI > UpperBound && pBid < MA200) {     //Condition to execute sell entry
  
       Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, 3, pAsk + ( StopLoss * Point ), pBid - ( TakeProfit * Point ), "Sell.",000, 0, Yellow)  ;     //execute sell order
       if(Ticket2>0)
           {
            if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("SELL order opened : ",OrderOpenPrice());
           
           }
         if (Ticket2<0) {
          Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      
   
   } 
   }
   
   if (OrdersTotal() > 0 ) {
   
   int PositionIndex;    //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable

for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --)  //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   RefreshRates();
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )      // <-- or is it a Sell Order ?
   
   if (pAsk > MA5){      //condition to close long position
   RefreshRates();
    OrderClose(OrderTicket(),OrderLots(),pBid,3,Violet); // close long position
 
   return(0); // exit
   
   if(TrailingStop>0)  
              {                 
               if(pBid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<pBid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),pBid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
   
  }
   
   if(pBid < MA5){       //condition to close short position
   RefreshRates();
   OrderClose(OrderTicket(),OrderLots(),pAsk,3,Violet); // close short position
  
   return(0); // exit
   
   
  if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-pAsk)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(pAsk+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),pAsk+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
   }
   
      if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) )               // <-- try to close the order
         Print("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() );  // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop
   
   
   }
  
   
   
   
   
   
        
        
           return(0);
}
 
cyxstudio:

Überarbeitet

Fügen Sie eine Funktion ein, bei der der EA prüft, ob es noch offene Aufträge gibt, bevor er eine neue Position eröffnet. Wenn es eine offene oder schwebende Order gibt, wird nicht versucht, eine neue Position zu eröffnen.

Ich sehe, dass jeder eine Schleife verwendet, um zu prüfen, ob es eine offene Position gibt, bevor er kauft. Ich kann die Logik dessen nicht erkennen. Solange OrdersTotal > 0 ist, gibt es offene Aufträge und mein EA wird nicht versuchen, weitere Positionen zu eröffnen.

Ich habe die absteigende Schleife korrigiert.

Diesmal bekomme ich den OrderClose-Fehler 138, der nicht durch Hinzufügen von refreshrates() gelöst werden kann.

und ich verliere am Ende immer noch Geld, was ich nicht tun sollte.

Mir fällt nichts mehr ein, was ich beheben könnte...

Warum haben Sie die Logik für die Eröffnung eines Kaufs platziert, bevor Sie die Trades überprüfen, die Ihr EA auf Ihrem Konto geöffnet hat ????

Was wird jetzt ???? mit der Programmierung, die Sie bisher haben, passieren?

Angenommen, Sie haben ein Konto mit Ihrem EA laufen. Sie eröffnen manuell einen Handel für GBPUSD.

Wie viele Trades hat OrdersTotal() mit diesem Trade?

Ihr Code.... für BUY

if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }


  
        
        
        if (OrdersTotal() == 0 ) {
        
        if (CurrentRSI < LowerBound && pAsk > MA200) {    //Condition to execute buy entry
  
        Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", 111,0,Yellow)   ;       //execute buy order
   
    if(Ticket>0)
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("BUY order opened : ",OrderOpenPrice());
            
           }
         if (Ticket < 0) {
         Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
   }
  

Was macht er jetzt und aus welchem Grund tut er das?

 
deVries:

Warum haben Sie die Logik für die Eröffnung eines Kaufs platziert, bevor Sie die Trades überprüfen, die Ihr EA auf Ihrem Konto geöffnet hat ????

Was passiert nun ???? mit der Programmierung, die Sie bisher vorgenommen haben?

Angenommen, Sie haben ein Konto mit Ihrem EA laufen. Sie eröffnen manuell einen Handel für GBPUSD.

Wie viele Trades sind OrdersTotal() mit diesem Trade?

Ihr Code.... für BUY

Was macht er jetzt und aus welchem Grund tut er das?


nur kaufen, wenn die Kaufbedingungen erfüllt sind und keine Positionen eröffnet wurden
 
cyxstudio:

nur kaufen, wenn die Kaufbedingungen erfüllt sind und keine Positionen eröffnet wurden

Angenommen, Sie haben ein Konto mit Ihrem EA laufen. Sie eröffnen manuell einen Handel für GBPUSD.

Wird die Bedingung erfüllt sein

 if (OrdersTotal() == 0 )
 
cyxstudio2013.01.31 18:04

Würden Sie mir bitte einen Blick auf Ihre Codes geben?

Ich möchte wissen, warum ich gescheitert bin und wie ich es richtig machen kann.

.

Ihre Nachricht an mich kann ich Ihnen den vollständigen Code direkt geben.....

Das wird nicht kostenlos sein, dafür müssen Sie den BereichJobs nutzen und dafür bezahlen...

Du wirst ihn dann dort bekommen

.

Eine andere Möglichkeit ist, Ihre Themen gut zu lesen.

Wir helfen dir hier zu lernen, wie du es selbst programmieren kannst. Das ist kostenlose Hilfe.

Wir zeigen dir deine Fehler und helfen dir in die Richtung, wie du sie lösen kannst.

Ich zeige dir den Code, den ich habe, sobald du einen Weg gefunden hast, ihn zu schreiben ....

Du brauchst dann nicht zu bezahlen und kannst ihn gleich mit dem Code vergleichen, den du hier mit Hilfe dieses Forums erstellt hast

....

meine letzte Frage ist immer noch nicht beantwortet

Angenommen, Sie haben ein Konto mit Ihrem EA laufen. Sie eröffnen manuell einen Handel für GBPUSD.

wird die Bedingung wahr sein

 if (OrdersTotal() == 0 )

.

. Im anderen ThemaOrderClose Fehler 138

Sie haben dort sehr gut geholfen(RaptorUK und WHRoeder danke für die Erklärung dort ich denke sehr gut gemacht)

.

Eine andere Frage, die ich an Sie habe, ist

Warum haben Sie den Timeframe bei der Berechnung des Moving Average geändert?

   double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average

Das ist nicht dasselbe wie das, was ich angegeben habe,

Es ist nicht die Berechnung der richtigen Wert auf anderen Chart Daily

.

Nehmen Sie sich also Zeit zum Lernen und Üben und lesen Sie sorgfältig die Hilfe, die Sie hier in diesem Forum erhalten

oder Sie bezahlen jemanden, der für Sie auf einer Seite wie Jobs programmiert.

 
deVries:
cyxstudio2013.01.31 18:04

Würden Sie mir bitte einen Blick auf Ihre Codes geben?

Ich möchte wissen, warum ich gescheitert bin und wie ich es richtig machen kann.

.

Ihre Nachricht an mich kann ich Ihnen den vollständigen Code direkt geben.....

Das wird nicht kostenlos sein, dafür musst du den BereichJobs nutzen und dafür bezahlen...

Du wirst ihn dann dort bekommen

.

Eine andere Möglichkeit ist, Ihre Themen gut zu lesen.

Wir helfen dir hier zu lernen, wie du es selbst programmieren kannst. Das ist kostenlose Hilfe.

Wir zeigen dir deine Fehler und helfen dir in die Richtung, wie du sie lösen kannst.

Ich zeige dir den Code, den ich habe, sobald du einen Weg gefunden hast, ihn zu schreiben ....

Du brauchst dann nicht zu bezahlen und kannst ihn gleich mit dem Code vergleichen, den du hier mit Hilfe dieses Forums erstellt hast

....

meine letzte Frage ist immer noch nicht beantwortet

Angenommen, Sie haben ein Konto mit Ihrem EA laufen. Sie eröffnen manuell einen Handel für GBPUSD.

wird die Bedingung wahr sein

.

. Im anderen ThemaOrderClose Fehler 138

Sie haben dort sehr gut geholfen(RaptorUK und WHRoeder danke für die Erklärung dort ich denke sehr gut gemacht)

.

Eine andere Frage, die ich an Sie habe, ist

Warum haben Sie den Timeframe bei der Berechnung des Moving Average geändert?

Das ist nicht dasselbe wie das, was ich angegeben habe,

Es ist nicht die Berechnung der richtigen Wert auf anderen Chart Daily

.

Nehmen Sie sich also Zeit zum Lernen und Üben und lesen Sie sorgfältig die Hilfe, die Sie hier in diesem Forum erhalten

oder Sie bezahlen jemanden, der für Sie auf einer Seite wie Jobs programmiert.

sollOrdersTotal() die Gesamtzahl der Pending Orders und Market Orders anzeigen, unabhängig davon, ob sie durch EA oder manuell geöffnet wurden?

Ich habe in diese Richtung gedacht. Mein EA prüft immer, ob es offene Orders gibt, und wenn ja, öffnet er keine weiteren Orders, und er öffnet nur neue Orders, wenn es keine offenen Orders mehr gibt.

if (OrdersTotal() == 0 )

Ich denke, es funktioniert gut, weil meine Ergebnisse Abschnitt zeigt mir die Reihenfolge 1,1,2,2,3,3,4,4, was bedeutet, eine Bestellung geschlossen ist, bevor neue Bestellung geöffnet wird.

Die Variablen für den gleitenden Durchschnitt und den RSI haben sich aus Testgründen geändert. Ich war es auf verschiedenen Zeitrahmen/Periode experimentieren, aber nicht ändern es zurück, wenn ich es hier posten.

und die bizarrsten von allen, mein Code wird NUR ausführen, um zu kaufen. es hat nie ausgeführt, nicht einmal eine... verkaufen, um. das ist einfach seltsam,

Kurz gesagt, die Probleme, mit denen ich jetzt noch konfrontiert bin.

1. er führt nur Kaufaufträge aus, aber nie Verkaufsaufträge, obwohl ich den Verkauf kodiert habe

2. sie macht immer noch einen negativen Gewinn, was bei dieser Strategie nicht der Fall sein sollte.