Warum liefert mein EA beim Backtesting immer wieder negative Gewinne?

 

Ich imitiere und schrieb eine gleiche EA mit dem Beispiel in hier https://www.mql5.com/en/articles/1510 außer die Bedingungen für Kauf/Verkauf

Bedingung für die Eröffnung einer Kaufposition : RSI unter 5 UND Briefkurs über 200 Tage gleitender Durchschnitt, Ausstieg, wenn der Briefkurs über dem 5 Tage gleitenden Durchschnitt liegt.

Bedingung für die Eröffnung einer Verkaufsposition: Der RSI liegt über 95 UND der Geldkurs liegt unter dem gleitenden 200-Tage-Durchschnitt, Ausstieg, wenn der Geldkurs unter dem gleitenden 5-Tage-Durchschnitt liegt.g

Wenn ich Backtests mache, erhalte ich jedes Mal einen negativen Gewinn, was ich nicht weiß, warum. Der beste Teil ist manchmal gibt es mir Fehler 134, die nicht genug Geld bedeutet.

Auf eine Randbemerkung, kann ich wissen, was ist shift und ma_shift und wie sollte ich es in zu füllen? seine ein Parameter für iRSI() Indikator erforderlich, ich wusste nicht, was zu schreiben, so dass ich nur 0 zuweisen.

Hier ist der Code

//+------------------------------------------------------------------+
//|                                              My RSI strategy.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#include <stderror.mqh> 
#include <stdlib.mqh>  
//All Variables here

extern double UpperBound    =  90;      //set upper bound value for RSI
extern double LowerBound    =  5;      //set lower bound value for RSI
extern double VarPeriod     =  2;      //number of periods
extern double BuyVolume     = 0.1;       //set buying volume(lots)
extern double SellVolume    = 0.1;       //set selling volume(lots)
extern double StopLoss      = 25;       //Set the stop loss level
extern double TakeProfit    = 25;       //Set the take profit level
extern double TrailingStop = 30;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   Alert ("The minimum stoploss and take profit is " + MarketInfo(Symbol(),MODE_STOPLEVEL));
   double CurrentRSI;                  //Finds out the RSI for now
   double MA200;                       //200 day Moving Average           
   double MA5;                         //5 day Moving Average
   double CurrentAsk;                  //Finds out the Ask price now
   double CurrentBid;                  //Finds out the Bid price now
  
   
   CurrentAsk = MarketInfo(Symbol(), MODE_ASK);
   CurrentBid = MarketInfo(Symbol(), MODE_BID);
   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);
   
   Alert("Bid is " + CurrentBid);
   Alert("Ask is " + CurrentAsk);
   Alert("200 Day Moving Average is " + MA200); 
   Alert("5 Day Moving Average is " + MA5); 
   Alert("RSI Index is " + CurrentRSI);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
   double CurrentRSI;                  //Finds out the RSI for now
   double MA200;                       //200 day Moving Average           
   double MA5;                         //5 day Moving Average
   double CurrentAsk;                  //Finds out the Ask price now
   double CurrentBid;                  //Finds out the Bid price now
   int Ticket;
   int cnt;
   int Ticket2;
   int Total;
   
   CurrentAsk = MarketInfo(Symbol(), MODE_ASK);
   CurrentBid = MarketInfo(Symbol(), MODE_BID);
   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);
   
   
    if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   
   if(AccountFreeMargin()<(1000*BuyVolume))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
   
    if (CurrentRSI < LowerBound && MarketInfo(Symbol(), MODE_ASK) > MA200 ) {    //Condition to execute buy entry
  
        Ticket = OrderSend(Symbol(), OP_BUY, BuyVolume, Ask, 3, Bid - ( StopLoss * Point ), Ask + ( 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); 
   }
   return(0);
  }
  
 
  if (CurrentRSI > UpperBound && MarketInfo(Symbol(), MODE_BID) > MA200) {     //Condition to execute sell entry
  
       Ticket2 = OrderSend(Symbol(), OP_SELL, SellVolume, Bid, 3, Ask + ( StopLoss * Point ), Bid - ( 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); 
        }
       return(0);
   
   } 
   
   Total=OrdersTotal();
    for(cnt=0;cnt<Total;cnt++)
  {
   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
   if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())  // check for symbol and check for opened position 
     {
if(OrderType()==OP_BUY)   // long position is opened
{
   
   if (CurrentAsk > MA5){      //condition to close long position
    OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close long position
   return(0); // exit
   
   if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
   
   }
   }
   
   if(OrderType()==OP_SELL)   // long position is opened
{
   if(CurrentBid < MA5){       //condition to close short position
   OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close short position
   return(0); // exit
   }
   
  if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
   }
   }
   }
   
    
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

RSI-Parameter auf 0 gesetzt, kein Ergebnis, da . . . Nichts

RSI 0

Mindestens 2

rsi 2

 

Nicht jeder EA und nicht jede Strategie ist profitabel

Verwenden Sie den Strategietester auch im visuellen Modus und platzieren Sie die Indikatoren mit den gleichen Einstellungen, die Sie im EA eingestellt haben, auf dem Chart.

   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);

Bei jedem Tick werden die obigen Werte berechnet und sie können sich mit jedem Tick ändern, da Sie "....,PRICE_CLOSE, 0);" gewählt haben.

Die Werte, die Sie auf dem Chart sehen, wenn der Test abgeschlossen ist, sind nicht die Werte, die Sie haben, wenn ein Handel eröffnet wird...

   if(AccountFreeMargin()<(1000*BuyVolume))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
   
    if (CurrentRSI < LowerBound && MarketInfo(Symbol(), MODE_ASK) > MA200 ) {    //Condition to execute buy entry
  
        Ticket = OrderSend(Symbol(), OP_BUY, BuyVolume, Ask, 3, Bid - ( StopLoss * Point ), Ask + ( 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); 
   }
   return(0);
  }
  

Wenn die Bedingungen für die Eröffnung eines Kaufs erfüllt sind und der Tester einen Kauf eröffnet, wird nicht geprüft, ob Sie bereits einen Kauf mit derselben Bedingung eröffnet haben.

Nachdem ein Kauf eröffnet wurde, können Sie beim nächsten Tick wieder die Bedingung für die Eröffnung eines Handels haben.

Dieses Eröffnen von Trades kann in StrategyTester funktionieren, aber in Echtzeit in der Demo auf dem echten Konto,

Zum Beispiel ist die Auswahl von "3" Slippage zu niedrig für den Handel auf einem "5-stelligen" Konto.

Das Senden der OrderSend mit einem Wert für OrderStopLoss() und OrdertakeProfit() > 0 wird für ECN-Konten fehlschlagen

   Total=OrdersTotal();
    for(cnt=0;cnt<Total;cnt++)
  {
   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
   if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())  // check for symbol and check for opened position 
     {
In der OrderSend und in dieser Schleife zur Überprüfung der Trades vermisse ich die Verwendung Ihrer OrderMagicNumber()

und ich sehe, dass die Schleife aufwärts statt abwärts zählt, während Sie auch Positionen schließen wollen, wenn es nötig ist - also ein weiterer Fehler

Die OrderModify kann mit jedem Punkt passieren, was zu Fehlern von Brokern wie Tradecontext führen kann, die zu beschäftigt sind.

 
FXEWEN:

RSI-Parameter auf 0 gesetzt, kein Ergebnis, da . . . Nichts

Mindestens 2

Ich habe die iRSI-Periode auf 2 gesetzt....

 
cyxstudio:


Auf einer Nebenbemerkung, kann ich wissen, was ist Shift und ma_shift und wie sollte ich es in zu füllen? seine ein Parameter für iRSI() Indikator erforderlich ich wusste nicht, was zu schreiben, so dass ich nur 0 zuweisen.


Ich weiß nicht, woher Sie diese Information haben, aber sie ist falsch...

iRSI() double iRSI(string symbol,int timeframe,int period,int applied_price,int shift)

vielleicht meinten Sie iMA()? shift ist die Taktnummer des Zeitraums, für den Sie den MA haben wollen, ma_shift ermöglicht es Ihnen, den MA-Wert relativ zur Taktnummer zu verschieben, wenn Sie also einen Shift von 5 und einen ma_shift von -2 zuweisen, erhalten Sie den MA für Takt 7, Sie müssten ein wenig damit experimentieren, um zu prüfen, ob ich richtig liege, im Prinzip schon.


 
deVries:


Mit der Verwendung der strategytester tun es auch mit visuellen Modus auf und legen Sie auf dem Diagramm die Indikatoren, die Sie mit den gleichen Einstellungen, die Sie in der EA gesetzt haben, sind

Jeden Tick berechnen Sie die Werte oben und sie können sich mit jedem Tick ändern, weil Sie " ....,PRICE_CLOSE, 0);" gewählt haben.


was soll ich dann für den Shift-Wert" ....,PRICE_CLOSE, 0);" wählen?

 
cyxstudio:

Was soll ich dannfür den Shift-Wert" ....,PRICE_CLOSE,0);"wählen?

Verwenden Sie das. Verwenden Sie Bar 0, wenn Sie wollen, aber es wird "neu malen", auch wenn Sie PRICE_CLOSE, Close[0](Schlusskurs von Bar 0) == Bid verwenden. Wenn Bar 0 schließlich schließt, ist es nicht mehr Bar 0, sondern wird Bar 1.
 
deVries:

Nicht jeder EA und nicht jede Strategie ist profitabel

Wenn Sie den Strategietester verwenden, tun Sie es auch mit dem visuellen Modus und platzieren Sie die Indikatoren mit den gleichen Einstellungen, die Sie im EA eingestellt haben, auf dem Chart.

Bei jedem Tick werden die oben genannten Werte berechnet und sie können sich bei jedem Tick ändern, da Sie "....,PRICE_CLOSE, 0);" gewählt haben.

Die Werte, die Sie im Chart sehen, wenn der Test abgeschlossen ist, sind nicht die Werte, die Sie hatten, als ein Handel eröffnet wurde...

Wenn die Bedingungen für die Eröffnung eines Kaufs erfüllt sind und der Tester einen Kauf eröffnet, wird nicht geprüft, ob Sie bereits einen Kauf mit derselben Bedingung eröffnet haben.

Nachdem ein Kauf eröffnet wurde, können Sie beim nächsten Tick wieder die Bedingung für die Eröffnung eines Handels haben.

Dieses Eröffnen von Trades kann in StrategyTester funktionieren, aber in Echtzeit in der Demo auf dem echten Konto,

Zum Beispiel ist die Auswahl von "3" Slippage zu niedrig für den Handel auf einem "5-stelligen" Konto.

Das Senden der OrderSend mit einem Wert für OrderStopLoss() und OrdertakeProfit() > 0 wird für ECN-Konten fehlschlagen

In der OrderSend und in dieser Schleife zur Überprüfung der Trades vermisse ich die Verwendung Ihrer OrderMagicNumber()

und ich sehe, dass die Schleife aufwärts statt abwärts zählt, während Sie auch Positionen schließen wollen, falls erforderlich.

Die OrderModify kann mit jedem Point passieren, was zu Fehlern vom Broker führen kann, z.B. dass der Tradecontext zu beschäftigt ist.

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?

//+------------------------------------------------------------------+
//|                                                My Strategy 4.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double StopLoss = 40;
extern double TakeProfit = 40;
extern double Lots = 0.1;
extern double Slippage = 10;
extern double RSINow;
extern double MA200;
extern double MA5;
extern bool A1 = false;
extern bool A2 = false;
extern int Ticket;
extern int Ticket2;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+ 
int init()
  {
//----
   Alert("Minimum Stop Level is " + MarketInfo(Symbol(), MODE_STOPLEVEL)); //find out minimum stop loss
   
   RSINow = iRSI(NULL, 1440, 2, PRICE_CLOSE, 0);			//calculates the RSI value for 2 days
   MA200 = iMA(NULL, 1440, 200, 0, MODE_SMA, PRICE_CLOSE,0);		//calculates the moving average for 200 days
   MA5 = iMA(NULL, 1440, 5, 0, MODE_SMA, PRICE_CLOSE,0);     		//calculates the moving average for 5 days
   Alert(RSINow);
   Alert(MA200);
   Alert(MA5);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----

   
   
   //check if a long position is possible, A is false means no buy trade is open , execute buy when RSI drops below 5 and when Ask price rises above 200 day moving average
   if (A1 == false && RSINow < 5 && Ask > MA200) {
   
   Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Bid - ( StopLoss * Point ), Ask + ( TakeProfit * Point ));
   
   if(Ticket>0) {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) {
               Print("BUY order opened : ",OrderOpenPrice());
               A1 = true;
           }
         if (Ticket < 0) {
         Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
   }
   }
   } 
   
   
   
     //check if a short position is possible, A2 is false means no sell trade is open , execute sell when RSI rises above 95 and when Bid price drops below 200 day moving average

   if (A2 == false && RSINow > 95 && Bid < MA200) {
   
   Ticket2 = OrderSend(Symbol(), OP_BUY, Lots, Bid, Slippage, Ask + ( StopLoss * Point ), Bid - ( TakeProfit * Point ));
   if(Ticket2>0) {
            if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES)) {
               Print("SELL order opened : ",OrderOpenPrice());
               A2 = true;
           }
         if (Ticket2 < 0) {
         Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
         }
   }
   
   } 
   
   
   //check if buy position can be closed, once Ask price rises above 5 day moving average, its time to close the position.
   
   if ((A1 == true) && (Ask > MA5)) {
   OrderClose(Ticket, Lots, Bid, Slippage, Violet);
   A1 = false;
   return(0);
   }
   
   
   
   
   //check if sell position can be closed, if Bid price drops below 5 day moving average, close sell position.
   
   if ((A2 == true) && (Bid < MA5)) {
   OrderClose(Ticket2, Lots, Bid, Slippage, Violet);
   A2 = false;
   return(0);
   }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
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?


Nein, die Schleife ist nicht fixiert, sie wurde entfernt und damit ist das Problem größer.

Sie verwenden A1 und A2, die den Wert true erhalten, sobald der Handel eröffnet wird.

aber was passiert, wenn die Stromversorgung Ihres PCs ausfällt und Sie Ihren PC und Metatrader neu starten müssen.

Sie haben zu diesem Zeitpunkt zu überprüfen, ob es Trades offen von Ihrem EA sind

Wie wollen Sie das machen ????

Um es einfacher zu machen, verwenden Sie eine spezielle OrderMagicNumber, die Ihre Trades öffnet und überprüft

.

der gleitende Durchschnitt wird nun nicht um einige Balken in der Zukunft verschoben ok

aber du berechnest ihn nur in der Sektion init() dies wird nur beim Starten deines Expert Advisors ausgeführt

Ich vermisse es in Start() .... Warum haben Sie es dort entfernt???

.

 

Habe Ihren Code umgeschrieben und einen Test versucht siehe auch die Einstellungen

Nicht mit den besten Backtestdaten, aber wenn man es richtig macht, kann es profitabel sein

Strategie-Testbericht
RSI_Strategie_cyxstudio
AlpariUK-Demo - Mikro+Klassisch (Build 451)

SymbolEURUSD (Euro gegen US Dollar)
ZeitraumTäglich (D1) 2010.10.01 00:00 - 2013.01.29 00:00 (2010.10.01 - 2013.01.30)
ModellJeder Tick (die präziseste Methode auf der Grundlage aller verfügbaren Mindestzeitrahmen)
ParameterRSIPeriod=3; UpperBound=90; LowerBound=5; MASlowPeriod=200; MAFastPeriod=5; Lots=0.1; StopLoss=60; TakeProfit=120; TrailingStop=40; MagicNumber=54333; CommentEA="RSI strategy"; Slippage.Pips=3;
Bars im Test1603Ticks modelliert40187739Qualität der Modellierungk.A.
Fehler bei nicht übereinstimmenden Diagrammen2062601
Ursprüngliche Kaution3000.00
Gesamtnettogewinn967.18Bruttogewinn2226.34Bruttoverlust-1259.16
Gewinnfaktor1.77Erwartete Auszahlung13.62
Absoluter Drawdown107.10Maximale Auszahlung327.47 (7.99%)Relative Absenkung7.99% (327.47)
Gesamte Abschlüsse71Short-Positionen (gewonnene %)66 (69.70%)Long-Positionen (Won %)5 (80.00%)
Gewinnbringende Geschäfte (% der Gesamtsumme)50 (70.42%)Verlustgeschäfte (% der Gesamtzahl)21 (29.58%)
GrößteGewinngeschäft120.07Verlusthandel-60.00
DurchschnittlicheGewinn-Handel44.53Verlusthandel-59.96
Maximalaufeinanderfolgende Gewinne (Gewinn in Geld)8 (424.26)Verluste in Folge (Verlust in Geld)3 (-179.93)
MaximalGewinn in Folge (Anzahl der Gewinne)424.26 (8)Konsekutiver Verlust (Anzahl der Verluste)-179.93 (3)
DurchschnittKonsekutive Gewinne4aufeinanderfolgende Verluste2

 
deVries:

Habe Ihren Code umgeschrieben und einen Test versucht siehe auch die Einstellungen

Nicht mit den besten Backtestdaten, aber wenn man es richtig macht, kann es profitabel sein


Trades insgesamt71Short-Positionen (gewonnene %)66 (69.70%)Long-Positionen (gewonnene %)5 (80.00%)





Das lässt mich vermuten, dass da etwas nicht stimmt.