¿Por qué mi EA sigue dando ganancias negativas cuando hace pruebas de espalda?

 

Imité y escribí un mismo EA con el ejemplo de aquí https://www.mql5.com/en/articles/1510 excepto las condiciones de compra/venta

Condición para abrir la posición de compra : RSI por debajo de 5 Y precio de venta por encima de la media móvil de 200 días, salir cuando el precio de venta esté por encima de la media móvil de 5 días.

Condición para abrir una posición de venta : El RSI está por encima de 95 Y el precio de oferta está por debajo de la media móvil de 200 días, salir cuando el precio de oferta esté por debajo de la media móvil de 5 días.

Cuando hago pruebas de espalda obtengo ganancias negativas cada vez que no sé por qué. La mejor parte es que a veces me da error 134 que significa que no tiene suficiente dinero.

En una nota lateral, ¿puedo saber lo que es el cambio y ma_shift y cómo debo llenar en? es un parámetro necesario para iRSI () indicador que no sabía qué escribir así que sólo asignar 0 a la misma.

Aquí está el código

//+------------------------------------------------------------------+
//|                                              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);
  }
//+------------------------------------------------------------------+
 

El parámetro RSI está ajustado a 0, sin resultado como... Nada

RSI 0

Al menos 2

rsi 2

 

No todos los EA y no todas las estrategias son rentables

Al utilizar el strategytester hazlo también con el modo visual activado y coloca en el gráfico los indicadores que tienes con la misma configuración que has establecido en el EA

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

Cada tick estás calculando los valores de arriba y pueden cambiar con cada tick porque has elegido "....,PRICE_CLOSE, 0);"

Los valores que ves en el gráfico cuando se hace el test no son los que tenías cuando se abre una operación...

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

Cuando se cumplen las condiciones para abrir una compra, y el probador abre una compra, entonces no se comprueba si ya tienes una abierta con la misma condición.

Después de que una compra se abre la siguiente garrapata puede tener de nuevo la condición para la apertura de un comercio.

Esta apertura de operaciones puede funcionar en StrategyTester pero en tiempo real en demo en cuenta real,

Por ejemplo, la elección de "3" deslizamiento es demasiado bajo para el comercio en '5 dígitos' cuenta

Enviando el OrderSend con un valor para OrderStopLoss() y OrdertakeProfit() > 0 fallará para cuentas ECN

   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 
     {
En el OrderSend y en este bucle de comprobación de operaciones echo de menos que hagas uso de tu OrderMagicNumber()

y veo que el bucle está contando hacia arriba en lugar de contar hacia abajo, mientras que usted también quiere que cerrar las posiciones si es necesario Así que otro error

El OrderModify puede ocurrir con cada punto esto puede conducir a errores de broker como tradecontext demasiado ocupado

 
FXEWEN:

El parámetro RSI está ajustado a 0, sin resultado como... Nada

Al menos 2

He puesto el período iRSI a 2....

 
cyxstudio:


En una nota lateral, ¿puedo saber lo que es el cambio y ma_shift y cómo debo llenarlo? es un parámetro necesario para el indicador iRSI() no sabía qué escribir así que sólo asignar 0 a la misma.


No sé de dónde has sacado esa información pero es incorrecta....

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

¿quizás te referías a iMA()? shift es el número de barra del tiempo para el que quieres la MA, ma_shift te permite mover el valor de la MA en relación al número de barra, así que si le das un shift de 5 y un ma_shift de -2 te dará la MA de la barra 7, tendrías que experimentar un poco con esto para comprobar que estoy en lo cierto, en principio sí.


 
deVries:


Con el uso del strategytester hazlo también con el modo visual activado y coloca en el gráfico los indicadores que estés con la misma configuración que hayas establecido en el EA

Cada tick estás calculando los valores de arriba y pueden cambiar con cada tick porque has elegido " ....,PRICE_CLOSE, 0);"


¿qué debo elegir para el valor de desplazamiento" ....,PRICE_CLOSE, 0);" entonces?

 
cyxstudio:

¿Qué debo elegir para el valor de desplazamiento" ....,PRICE_CLOSE,0);" entonces?

¿Qué es lo que pide tu estrategia? Usa eso. Usa la barra 0 si quieres, pero se "repintará" incluso si usas PRICE_CLOSE, Close[0](precio de cierre de la barra 0) == Bid. Cuando la barra 0 finalmente se cierra ya no es la barra 0, se convierte en la barra 1.
 
deVries:

No todos los EA y no todas las estrategias son rentables

Con el uso del strategytester hazlo también con el modo visual activado y coloca en el gráfico los indicadores que estás con la misma configuración que has puesto en el EA

Cada tick estás calculando los valores de arriba y pueden cambiar con cada tick porque has elegido "....,PRICE_CLOSE, 0);"

Los valores que ves en el gráfico cuando se hace la prueba no son los valores que tenías cuando se abre una operación...

Cuando se cumplen las condiciones para abrir una compra, y el probador abre una compra, entonces no se comprueba si ya tienes una abierta con la misma condición.

Después de que una compra se abre la siguiente garrapata puede tener de nuevo la condición para la apertura de un comercio.

Esta apertura de operaciones puede funcionar en StrategyTester pero en tiempo real en demo en cuenta real,

Por ejemplo, la elección de "3" deslizamiento es demasiado bajo para el comercio en '5 dígitos' cuenta

Enviando el OrderSend con un valor para OrderStopLoss() y OrdertakeProfit() > 0 fallará para cuentas ECN

En el OrderSend y en este bucle de comprobación de operaciones echo de menos que hagas uso de tu OrderMagicNumber()

y veo que el bucle está contando hacia arriba en lugar de contar hacia abajo, mientras que usted también quiere que cerrar las posiciones si es necesario Así que otro error

El OrderModify puede ocurrir con cada punto esto puede conducir a errores de corredor como tradecontext demasiado ocupado

He rehecho todo y he arreglado el bucle, el deslizamiento, he arreglado los valores de la media móvil y del RSI, me he asegurado de que todas las posiciones abiertas se cierren antes de iniciar una nueva posición, pero cuando hago el backtest, no pasa nada, no se ejecuta ninguna compra/venta... ¿cuál es el problema?

//+------------------------------------------------------------------+
//|                                                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:

He rehecho todo y he arreglado el bucle, el deslizamiento, he arreglado los valores de la media móvil y del RSI, me he asegurado de que todas las posiciones abiertas se cierren antes de iniciar una nueva posición, pero cuando hago el backtest, no pasa nada, no se ejecuta ninguna compra/venta... ¿cuál es el problema?


No, el bucle no está arreglado, sino que se ha eliminado, por lo que el problema es mayor.

. estás usando A1 y A2 que obtienen el valor verdadero en el momento en que se abre la operación

Pero que pasaría si el suministro de energía de tu pc se cae y tienes que reiniciar tu pc y metatrader.

Tienes que comprobar en ese momento si hay operaciones abiertas desde tu EA

Como vas a hacer eso ????

Para hacerlo más fácil utiliza un OrderMagicNumber específico para abrir y comprobar tus operaciones

.

la media móvil ahora no se mueve algunas barras en el futuro ok

pero la calculas solo en la sección init() esta solo se ejecutará al arrancar tu Expert Advisor

Lo echo de menos en Start() .... ¿Por qué lo has quitado ahí?

.

 

He reescrito su código y probado una prueba ver también la configuración

No con los mejores backtestdata pero si lo haces bien puede ser rentable

Informe de prueba de la estrategia
RSI_estrategia_cyxstudio
AlpariUK-Demo - Micro+Classic (Build 451)

SímboloEURUSD (Euro vs Dólar)
PeriodoDiario (D1) 2010.10.01 00:00 - 2013.01.29 00:00 (2010.10.01 - 2013.01.30)
ModeloCada tick (el método más preciso basado en todos los marcos temporales mínimos disponibles)
ParámetrosRSIPeriod=3; UpperBound=90; LowerBound=5; MASlowPeriod=200; MAFastPeriod=5; Lots=0.1; StopLoss=60; TakeProfit=120; TrailingStop=40; MagicNumber=54333; CommentEA="Estrategia RSI"; Slippage.Pips=3;
Barras en la prueba1603Ticks modelados40187739Calidad de la modelizaciónn/d
Errores de gráficos no coincidentes2062601
Depósito inicial3000.00
Beneficio neto total967.18Beneficio bruto2226.34Pérdida bruta-1259.16
Factor de beneficio1.77Beneficio esperado13.62
Reducción absoluta107.10Reducción máxima327.47 (7.99%)Reducción relativa7.99% (327.47)
Total de operaciones71Posiciones cortas (% de ganancias)66 (69.70%)Posiciones largas (% de won)5 (80.00%)
Operaciones con beneficios (% del total)50 (70.42%)Operaciones con pérdidas (% del total)21 (29.58%)
Mayorde beneficios120.07operación con pérdidas-60.00
Mediade beneficios44.53Comercio de pérdidas-59.96
Máximovictorias consecutivas (beneficio en dinero)8 (424.26)Pérdidas consecutivas (pérdida en dinero)3 (-179.93)
Máximobeneficio consecutivo (recuento de victorias)424.26 (8)Pérdidas consecutivas (recuento de pérdidas)-179.93 (3)
Mediaganancias consecutivas4pérdidas consecutivas2

 
deVries:

He reescrito su código y probado una prueba ver también la configuración

No con el mejor backtestdata pero si lo haces bien puede ser rentable


Total de operaciones71Posiciones cortas (% ganado)66 (69.70%)Posiciones largas (% de ganancias)5 (80.00%)





Esto me hace pensar que hay algo que no está bien.
Razón de la queja: