Pourquoi mon EA donne-t-il toujours un profit négatif lors du back-testing ? - page 4

 

voici mon dernier code. je ne vois rien d'anormal, si ce n'est qu'il ne me donne pas les résultats que je souhaite.

//+------------------------------------------------------------------+
//|                                       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"
#include <stderror.mqh>
#include <stdlib.mqh>


extern int RSIPeriod        =  2;      //number of periods for RSI
extern double UpperBound    =  95;     //set upper bound value for RSI
extern double LowerBound    =  5;      //set lower bound value for RSI

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;



//---
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----   
  Alert(OrdersTotal());

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



//Check for open orders if there are none then check for conditions to open one

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

  if (OrdersTotal() ==0 && LastRSI < PrevRSI && PrevRSI < CurrentRSI && CurrentRSI > UpperBound && pBid < MA200) {     //Condition to execute sell entry
  
       Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, Slippage.Pips, pAsk + ( StopLoss * Point ), pBid - ( TakeProfit * Point ), "Sell.",MagicNumber, 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); 
        }
   } 
      
      }
 


   
    int ticket=OrderTicket();
    double lots=OrderLots();
   
   
   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
   
      if (OrderSelect(i, SELECT_BY_POS))
      {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {


         if (OrderType() == OP_BUY && pBid > MA5)
         {
          Ticket3 = OrderClose(ticket, lots, pBid, Slippage.Pips);
          
          if (Ticket3 == true ) {
          Print("BUY position closed", OrderClosePrice());
          }
          if (Ticket3 == false) {
          Print("Error closing BUY position", ErrorDescription(GetLastError()));
          }
          }
          
          if (OrderType() == OP_SELL && pBid < MA5)
          {
          Ticket4 = OrderClose(ticket, lots, pAsk, Slippage.Pips);
           if (Ticket4 == true ) {
          Print("SELL position closed", OrderClosePrice());
          }
          if (Ticket4 == false) {
          Print("Error closing SELL position", ErrorDescription(GetLastError()));
          }
    }
      }
      
   }
   }
   
   
   
        
        
           return(0);
}
 

Si vous regardez à la page 2 de ce sujet, vous trouverez ce que je vous ai donné.

//+------------------------------------------------------------------+
//|                                       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//WHY DIDN't  YOU LEAVE THIS VALUE 3 
extern double UpperBound    =  90;     //set upper bound value for RSI//WHY DID YOU MAKE THIS TO 95
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;                            //WHY DID YOU REMOVE THIS FROM YOUR CODE
//++++ 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 //WHY DID YOU REMOVE THIS       
//----      
//??    Alert(OrdersTotal());   //WHAT IS THIS DOING HERE  THIS IS NOT IN MY CODE
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Ticket;
   double SL,TP;
   int Total;
   
   double pAsk = MarketInfo(Symbol(), MODE_ASK);
   double pBid = MarketInfo(Symbol(), MODE_BID);
   double MA200 = iMA(NULL, 1440, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 1440, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average
   double CurrentRSI = iRSI (NULL, 1440, RSIPeriod,PRICE_CLOSE ,0);
   //WHY DID YOU MAKE  PrevRSI and LastRSI  REMOVE IT IT IS NOT IN MY CODE
   
   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()<1)            //  WHY DID YOU REMOVE THIS
        {
         BUYS=0;
         SELLS=0;
        } 
 
28
cyxstudio2013.01.31 18:36
deVries:

C'est le début.....

Donnez votre commentaire ..... sur ce qui est différent du vôtre jusqu'à présent...

Puis lisez https://www.mql5.com/en/forum/139654 et essayez de faire une boucle de décompte pour vérifier les transactions.


Comme vous pouvez le voir, je vous ai demandé de créer une boucle de comptage descendant pour vérifier les transactions.

C'est ma prochaine étape dans le code

Je ne vous demande que cette partie du code

pour qu'il compte les transactions d'achat et de vente séparément.

 
deVries:

Si vous regardez à la page 2 de ce sujet, vous trouverez ce que je vous ai donné.



je l'ai enlevé parce que je ne savais pas comment l'utiliser. tu m'as donné le code partiellement je ne pouvais pas voir comment il fonctionne.
 

--

 
deVries:

28
cyxstudio2013.01.31 18:36
deVries:

C'est le début.....

Donnez votre commentaire ..... sur ce qui est différent du vôtre jusqu'à présent...

Puis lisez https://www.mql5.com/en/forum/139654 et essayez de faire une boucle de décompte pour vérifier les transactions.


Comme vous pouvez le voir, j'ai demandé à faire une boucle de décompte pour vérifier les transactions.

C'est ma prochaine étape dans le code

Je ne vous demande que cette partie du code

pour qu'il compte les transactions d'achat et de vente séparément.

comme ceci ?

int ticket=OrderTicket() ;
double lots=OrderLots() ;
for (int i = OrdersTotal() - 1 ; i >= 0 ; i--)
{
if (OrderSelect(i, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {


//blocs de codes à exécuter

}
}

}

 
cyxstudio:

je l'ai supprimé parce que je ne savais pas comment l'utiliser. vous m'avez donné le code partiellement je ne pouvais pas voir comment il fonctionne.
 if(OrdersTotal()<1)  
        {
         BUYS=0;
         SELLS=0;
        } 

Au moment où l'EA redémarre

BUYS est mis à 1

SELLS est fixé à 1

OrdersTotal() donne le total de toutes les transactions ouvertes sur votre compte.

Il peut être égal à zéro, dans ce cas nous n'avons pas de transactions ouvertes et nous n'avons pas besoin de vérifier s'il y a des transactions de cet EA.

SiOrdersTotal() > 0 BUYS reste à 1 et SELLS reste à 1

nous devons vérifier dans ce cas si cela provient de notre EA et nous devons compter les différents types (buy,sell,buylimit....)

donc

 
cyxstudio:

comme ça ?

int ticket=OrderTicket() ;
double lots=OrderLots() ;
for (int i = OrdersTotal() - 1 ; i >= 0 ; i--)
{
if (OrderSelect(i, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {


//blocs de codes à exécuter

}
}

}

Utiliser le bouton SRC

Cette boucle ne fait que commencer (pour quelle condition).

Comment savez-vous que la transaction sélectionnée dans la boucle est un achat ou une vente ?

Et comment les compter ?

 
deVries:

Utiliser le bouton SRC

Cette boucle ne fait que commencer (pour quelle condition).

Comment savez-vous que la transaction sélectionnée dans la boucle est un achat ou une vente ?

Et comment les compter ?


opps.

 if (OrderType() == OP_BUY && pBid > MA5)
         {
          Ticket3 = OrderClose(ticket, lots, pBid, Slippage.Pips);
          
          if (Ticket3 == true ) {
          Print("BUY position closed", OrderClosePrice());
          }
          if (Ticket3 == false) {
          Print("Error closing BUY position", ErrorDescription(GetLastError()));
          }
          }
          
          if (OrderType() == OP_SELL && pBid < MA5)
          {
          Ticket4 = OrderClose(ticket, lots, pAsk, Slippage.Pips);
           if (Ticket4 == true ) {
          Print("SELL position closed", OrderClosePrice());
          }
          if (Ticket4 == false) {
          Print("Error closing SELL position", ErrorDescription(GetLastError()));
          }
    }
      }

pour la fonction de transaction fermée.

en utilisant

 if (OrderType() == OP_SELL && pBid < MA5)

pour différencier l'achat et la vente.

Y a-t-il un problème avec mes conditions d'ouverture de l'ordre ?

if (OrdersTotal() == 0 )

Devrais-je les supprimer et les remplacer par la boucle que j'ai utilisée pour la fonction d'ordre de fermeture ?

 
cyxstudio:


opps.

pour la fonction de commerce fermé.

en utilisant

pour différencier l'achat et la vente.

Y a-t-il un problème avec mes conditions d'ouverture de l'ordre ?

Dois-je les supprimer et les remplacer par la boucle que j'ai utilisée pour la fonction d'ordre de fermeture ?

À ce moment-là, vous devez vérifier s'il y a déjà une transaction ouverte.

Avant d'ouvrir une position, vous devez savoir s'il y a une position ouverte.

Je ne vois toujours pas que vous avez effectué le comptage des transactions.

.

Jetez un coup d'oeil au code de l' EA Moyenne Mobile sur votre station metatrader et voyez comment il est fait là .....