Por que minha EA continua dando lucro negativo quando volta a testar?

 

Eu imito e escrevi um mesmo EA com o exemplo aqui https://www.mql5.com/en/articles/1510 exceto as condições de compra/venda

Condição para abrir posição de compra : RSI abaixo de 5 E preço Ask acima da média móvel de 200 dias, sair quando o preço Ask estiver acima da média móvel de 5 dias.

Condição para abrir posição de venda : RSI está acima de 95 E o preço de compra está abaixo de 200 Dias de idade média móvel, saída quando o preço de compra está abaixo da média móvel de 5 dias.g

Quando volto a fazer testes, tenho lucro negativo toda vez que não sei por quê. A melhor parte é que às vezes isso me dá erro 134 o que significa não ter dinheiro suficiente.

Em uma nota lateral, posso saber o que é turno e ma_shift e como devo preenchê-lo? é um parâmetro necessário para o indicador iRSI() eu não sabia o que escrever, então eu apenas atribuo 0 a ele.

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

Parâmetro RSI ajustado a 0, sem resultado como . . . Nada

RSI 0

Pelo menos 2

rsi 2

 

Nem toda EA e nem toda Estratégia é lucrativa

Com o uso do Strategytester, faça-o também com o modo visual e coloque no gráfico os indicadores que você está com as mesmas configurações que você definiu na 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 que você está calculando os valores acima e eles podem mudar a cada tick porque você escolheu "....,PRICE_CLOSE, 0);"

Os valores que você vê no gráfico quando o teste é feito não são os valores que você tinha quando uma troca é aberta...

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

Quando as condições são cumpridas para abrir uma compra, e o testador abre uma compra, então não há verificação se você já tem uma aberta com a mesma condição.

Depois que uma compra abre o próximo tick, você pode ter novamente a condição para abrir uma troca.

Esta abertura de negócios pode funcionar no StrategyTester, mas em tempo real em demonstração em conta real,

você pode obter erros que não vê no testador. Por exemplo, escolher "3" Slippage é muito baixo para negociar em conta de "5 dígitos

O envio da OrderSend com um valor para OrderStopLoss() e OrdertakeProfit() > 0 falhará para as contas 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 
     {
No OrderSend e neste laço para verificação de negócios sinto sua falta de utilizar seu OrderMagicNumber()

e vejo que o loop está contando para cima em vez de contar para baixo enquanto você também quer que ele feche posições se necessário Então outro erro

A OrderModify pode acontecer com cada ponto, o que pode levar a erros de corretor como um contexto de comércio muito ocupado.

 
FXEWEN:

Parâmetro RSI ajustado a 0, sem resultado como . . . Nada

Pelo menos 2

Eu fixei o período iRSI em 2....

 
cyxstudio:


Em uma nota lateral, posso saber o que é shift e ma_shift e como devo preenchê-lo? é um parâmetro necessário para o indicador iRSI() eu não sabia o que escrever, então eu apenas atribuo 0 a ele.


Não tenho certeza de onde você obteve essas informações, mas elas estão incorretas ...

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

Talvez você quis dizer iMA()? turno é o número de barra do tempo para o qual você quer o MA, ma_shift permite que você mova o valor do MA em relação ao número de barra, então se você der um turno de 5 e um ma_shift de -2 ele lhe dará o MA para a barra 7, você precisaria experimentar um pouco para verificar se estou correto, em princípio estou.


 
deVries:


Com o uso do Strategytester, faça-o também com o modo visual e coloque no gráfico os indicadores que você está com as mesmas configurações que você definiu na EA

Cada tick que você está calculando os valores acima e eles podem mudar a cada tick porque você escolheu "....,PRICE_CLOSE, 0);"


o que devo escolher para o valor do turno" ....,PRICE_CLOSE, 0);" então?

 
cyxstudio:

o que devo escolher para o valor do turno" ....,PRICE_CLOSE,0);" então?

O que sua estratégia exige? Use a barra 0 se você quiser, mas ela "repintará" mesmo que você use PRICE_CLOSE, Close[0](preço fechado da barra 0) == Oferta. Quando a barra 0 finalmente fecha não é mais a barra 0, ela se torna a barra 1.
 
deVries:

Nem toda EA e nem toda Estratégia é lucrativa

Com o uso do Strategytester, faça-o também com o modo visual e coloque no gráfico os indicadores que você está com as mesmas configurações que você definiu na EA

Cada tick que você está calculando os valores acima e eles podem mudar a cada tick porque você escolheu "....,PRICE_CLOSE, 0);"

Os valores que você vê no gráfico quando o teste é feito não são os valores que você tinha quando uma troca é aberta...

Quando as condições são cumpridas para abrir uma compra, e o testador abre uma compra, então não há verificação se você já tem uma aberta com a mesma condição.

Depois que uma compra abre o próximo tick, você pode ter novamente a condição para abrir uma troca.

Esta abertura de negócios pode funcionar no StrategyTester, mas em tempo real em demonstração em conta real,

você pode obter erros que não vê no testador. Por exemplo, escolher "3" Slippage é muito baixo para negociar em conta de "5 dígitos

O envio da OrderSend com um valor para OrderStopLoss() e OrdertakeProfit() > 0 falhará para as contas ECN

No OrderSend e neste laço para verificação de negócios sinto sua falta de utilizar seu OrderMagicNumber()

e vejo que o loop está contando para cima em vez de contar para baixo enquanto você também quer que ele feche posições se necessário Então outro erro

A OrderModify pode acontecer com cada ponto, o que pode levar a erros de corretor como um contexto de comércio muito ocupado.

Eu refiz tudo e consertei o loop, o deslizamento, consertei a média móvel e os valores RSI, certifiquei-me de que todas as posições abertas fossem fechadas antes de começar uma nova posição. mas quando eu volto atrás, nada acontece, nenhuma compra/venda foi executada... qual é o problema com isso novamente?

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

Eu refiz tudo e consertei o loop, o deslizamento, consertei a média móvel e os valores RSI, certifiquei-me de que todas as posições abertas fossem fechadas antes de começar uma nova posição. mas quando eu volto atrás, nada acontece, nenhuma compra/venda foi executada... qual é o problema com isso novamente?


não o laço não é fixo ele é removido com que o problema é maior

. você está usando A1 e A2 que se valorizam no momento da abertura do comércio

mas o que acontecerá se a energia de seu computador for suficiente e você tiver que reiniciar seu computador e seu metatrader.

Você tem que verificar nesse momento se há negócios abertos de seu EA

Como você vai fazer isso ????

Para facilitar o uso de um OrderMagicNumber específico, abrindo e verificando seus negócios

.

a média móvel agora não é movida algumas barras no futuro ok

mas você o calcula somente na seção init() isto só será executado no início de seu Expert Advisor

Sinto falta em Start() .... Por que você o removeu lá ????

.

 

Reescreva seu código e experimente um teste veja também as configurações

Não com os melhores dados retroativos, mas se você fizer bem, pode ser lucrativo

Relatório de teste de estratégia
RSI_strategy_cyxstudio
AlpariUK-Demo - Micro+Classic (Build 451)

SímboloEURUSD (Euro vs Dólar americano)
PeríodoDiário (D1) 2010.10.01 00:00 - 2013.01.29 00:00 (2010.10.01 - 2013.01.30)
ModeloCada carrapato (o método mais preciso baseado em todos os prazos mínimos disponíveis)
ParâmetrosRSIPeriod=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;
Barras em teste1603Carrapatos modelados40187739Qualidade de modelagemn/d
Erros de gráficos não correspondentes2062601
Depósito inicial3000.00
Lucro líquido total967.18Lucro bruto2226.34Perda bruta-1259.16
Fator de lucro1.77Pagamento previsto13.62
Desembolso absoluto107.10Máximo de drawdown327.47 (7.99%)Drawdown relativo7.99% (327.47)
Total de negócios71Posições curtas (ganhadas %)66 (69.70%)Posições longas (ganho %)5 (80.00%)
Lucros comerciais (% do total)50 (70.42%)Perdas comerciais (% do total)21 (29.58%)
A maiorcomércio lucrativo120.07comércio de perdas-60.00
Médiacomércio lucrativo44.53comércio de perdas-59.96
Máximovitórias consecutivas (lucro em dinheiro)8 (424.26)perdas consecutivas (perda em dinheiro)3 (-179.93)
Maximallucro consecutivo (contagem de vitórias)424.26 (8)perda consecutiva (contagem de perdas)-179.93 (3)
Médiavitórias consecutivas4perdas consecutivas2

 
deVries:

Reescreva seu código e experimente um teste veja também as configurações

Não com os melhores dados retroativos, mas se você fizer bem, pode ser lucrativo


Total de negócios71Posições curtas (ganhadas %)66 (69.70%)Posições longas (ganho %)5 (80.00%)





Isso me faria pensar que há algo que não está certo.