Perché il mio EA continua a dare profitti negativi durante il back testing? - pagina 3

 
deVries:

quando si avvia la Metatrader l'EA deve scoprire se c'è una negoziazione aperta

Faccio solo il conto alla rovescia per controllare i trade se c'è un trade

Se lo imposto all'inizio su uno e OrdersTotal() >0 allora lo faccio controllare i trade if(.......> || .......> ){fare il loop....

sei sicuro di avermi dato il codice che ti ha dato i risultati mostrati sopra? l'ho testato sul periodo 1440 (1 DAY) e nessun trade è stato eseguito. tuttavia quando l'ho cambiato a 1M molti trade sono stati eseguiti
 
cyxstudio:
sei sicuro di avermi dato il codice che ti ha dato i risultati mostrati sopra? l'ho testato sul periodo 1440 (1 GIORNO) e nessun trade è stato eseguito. tuttavia quando l'ho cambiato a 1M molti trade sono stati eseguiti
quanti giorni indietro vanno i tuoi dati se controlli di nuovo il mio test troverai il periodo del test e il timeframe su cui è stato testato
 

OK qui va..... Cercherò di aiutare qui se posso.

Questa domanda su Ma_Shift è una che ho avuto per qualche tempo e non sono mai stato in grado di ottenere una risposta chiara.

Se noti nel tuo codice stai usando uno shift di 8 sulle tue medie mobili.... cosa significa?

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);
Come potete vedere questa impostazione di spostamento non esiste sull'RSI ... viene visualizzata nella sua propria finestra... questo è un indizio.
Se lasciate una media mobile sul vostro grafico, vedrete ciò che equivale al Ma_Shift come impostazione nella casella Shift.
Notate anche che l'ordine dei parametri 200,8,sma,close. è lo stesso quando chiamate l'indicatore
come l'ordine in cui sono elencati nel riquadro ... il NULL e il timeframe sono qualsiasi cosa su cui si lascia cadere la Ma
quindi non sono necessari qui. e nemmeno l'impostazione dell'ultimo spostamento... poiché questa ma cambierà costantemente sulla 
candela corrente.... lo capirete tra un attimo.
se vai a guardare le impostazioni dell'indicatore iAlligator vedrai le impostazioni per lo spostamento della mascella, lo spostamento dei denti e lo spostamento delle labbra... questo è il MaShift di ciascuna di queste medie mobili.
Possono essere tutte spostate sul grafico a sinistra o a destra di quante barre vuoi.

che si visualizza così............

Questo fa una differenza di 3 pip nel valore di questa candela delle 08:00 come mostrato qui nella finestra dei dati.

Il che ci porta alla domanda: a cosa serve l'impostazione "Shift" alla fine?

Bene, quando passate il mouse sul vostro grafico con la finestra dei dati aperta e vi spostate da candela a candela

vedrete i numeri cambiare per la 5 SMA mentre passate da candela a candela...

Questo è il significato dell'ultimo valore SHIFT... tenendo presente che la candela attuale che viene

disegnata è la candela zero... l'ultima candela completata è la candela 1 quindi se ci sono 1000 candele totali sul

sul vostro grafico sono numerate all'indietro da 999 sul bordo sinistro del vostro grafico a 0 dove vi trovate attualmente.

Quindi se vuoi sapere quale era il valore della 5 SMA 5 candele completate fa

metti un 5 in quell'ultimo punto... naturalmente con il passare del tempo... la candela 5 passerà alla candela successiva.

Ora, come è stato menzionato... se si ottiene sempre il valore della candela 0... allora quel valore è costantemente

cambiare con il prezzo. Così si può prendere un segnale e poi l'indicatore si ridisegna su di voi .. ma se si sono

sempre chiedendo le informazioni dalla candela 1 è fatto e non cambierà....

Spero che questo aiuti...

 
cyxstudio:

Ho rifatto tutto e sistemato il loop, lo slippage, sistemato la media mobile e i valori RSI, fatto in modo che ogni posizione aperta sia chiusa prima di iniziare una nuova posizione. ma quando faccio il backtest, non succede niente, nessun acquisto/vendita è stato eseguito... qual è il problema ancora?



la funzione init() viene eseguita solo all'avvio e non ad ogni tick come la funzione start()... dovrai rimettere le medie mobili nella funzione start invece che nella init() solo per farlo funzionare in modo che continui a ricevere numeri freschi...
 

Rielaborato

Aggiungere una funzione in cui l'EA controlla se ci sono ordini in sospeso prima di decidere di aprire una nuova posizione. Se c'è un ordine pendente o aperto, allora non tenterà di aprirne altri.

vedo che tutti usano un ciclo per controllare se c'è una posizione aperta prima di comprare, non riesco a vedere la logica di questo. finché OrdersTotal è > 0 ci sono ordini aperti e il mio EA non cercherà di aprire altre posizioni.

Ho corretto il ciclo decrescente.

Questa volta mi dà l'errore OrderClose 138 che non può essere risolto aggiungendo refreshrates()

e finisco ancora per perdere soldi che non dovrei avere.

Non riesco a pensare a nient'altro da correggere...

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

Rielaborato

Aggiungere una funzione in cui l'EA controlla se ci sono ordini in sospeso prima di decidere di aprire una nuova posizione. Se c'è un ordine pendente o aperto, allora non tenterà di aprirne altri.

vedo che tutti usano un ciclo per controllare se c'è una posizione aperta prima di comprare, non riesco a vedere la logica di questo. finché OrdersTotal è > 0 ci sono ordini aperti e il mio EA non cercherà di aprire altre posizioni.

Ho corretto il ciclo decrescente.

Questa volta mi dà l'errore OrderClose 138 che non può essere risolto aggiungendo refreshrates()

e finisco ancora per perdere soldi che non dovrei avere.

Non riesco a pensare a nient'altro da correggere...

Perché hai messo la logica di apertura di un acquisto prima di controllare i trade che il tuo EA ha aperto sul tuo conto ????

Cosa succederà ora ???? con la programmazione che hai fatto finora?

Supponiamo che tu abbia un conto in esecuzione con il tuo EA. Aprite manualmente un trade per GBPUSD.

quanti trade sono OrdersTotal() con quel trade??

Il tuo codice.... per 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); 
   }
  

cosa sta facendo ora e per quale motivo lo sta facendo?

 
deVries:

Perché hai messo la logica per aprire un acquisto prima di controllare i trade che il tuo EA ha aperto sul tuo conto ????

Cosa succederà ora ???? con la programmazione che hai fatto finora?

Supponiamo che tu abbia un conto in esecuzione con il tuo EA. Aprite manualmente un trade per GBPUSD.

quanti trade sono OrdersTotal() con quel trade??

Il tuo codice.... per BUY

cosa sta facendo ora e per quale motivo lo sta facendo?


comprare solo se le condizioni di acquisto sono state soddisfatte e se non sono state aperte posizioni
 
cyxstudio:

comprare solo se le condizioni di acquisto sono state soddisfatte e se nessuna posizione è stata aperta

Supponiamo che tu abbia un conto in esecuzione con il tuo EA. Aprite manualmente un trade per GBPUSD.

la condizione sarà vera

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

Per favore, mi fareste dare un'occhiata ai vostri codici?

Voglio sapere perché ho fallito e come ottenerlo correttamente.

.

Il tuo messaggio a me posso darti il codice completo direttamente.....

Non sarà gratis. Per questo devi usare la sezioneJobs e pagare per ottenerlo...

Lo otterrai allora lì

.

Un altro modo è leggere bene i vostri argomenti

Ti stiamo aiutando qui per imparare a programmare da solo. Questo è un aiuto gratuito

Vi mostriamo i vostri errori e vi aiutiamo nella direzione come risolvere.

Mostro il codice che ho nel momento in cui hai imparato un modo per scriverlo ....

Non c'è bisogno di pagare allora e puoi in quel momento confrontarlo con il codice che hai fatto qui con l'aiuto di questo forum

....

la mia ultima domanda qui non ha ancora una risposta

Supponiamo che tu abbia un conto in esecuzione con il tuo EA. Apri manualmente un trade per GBPUSD.

la condizione sarà vera

 if (OrdersTotal() == 0 )

.

. In altro argomentoOrderClose errore 138

siete stati aiutati molto bene(RaptorUK e WHRoeder grazie per la spiegazione, penso che sia stata fatta molto bene)

.

Un'altra domanda che ho per voi è

Perché hai cambiato il Timeframe in questo calcolo della media mobile

   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

Questo non è lo stesso che ho dato,

Non sta calcolando il giusto valore su altri grafici giornalieri

.

Quindi prendi tempo per imparare e fare pratica e leggi attentamente l'aiuto che ricevi qui su questo forum

o pagate qualcuno che programmi per voi in un sito come Jobs

 
deVries:
cyxstudio2013.01.31 18:04

Per favore, mi faresti dare un'occhiata ai tuoi codici?

Voglio sapere perché ho fallito e come ottenerlo correttamente.

.

Il tuo messaggio a me posso darti il codice completo direttamente.....

Non sarà gratis. Per questo devi usare la sezioneJobs e pagare per ottenerlo...

Lo otterrai allora lì

.

Un altro modo è leggere bene i vostri argomenti

Ti stiamo aiutando qui per imparare a programmare da solo. Questo è un aiuto gratuito

Vi mostriamo i vostri errori e vi aiutiamo nella direzione come risolvere.

Mostro il codice che ho nel momento in cui hai imparato un modo per scriverlo ....

Non c'è bisogno di pagare allora e puoi in quel momento confrontarlo con il codice che hai fatto qui con l'aiuto di questo forum

....

la mia ultima domanda qui non ha ancora una risposta

Supponiamo che tu abbia un conto in esecuzione con il tuo EA. Apri manualmente un trade per GBPUSD.

la condizione sarà vera

.

. In altro argomentoOrderClose errore 138

siete stati aiutati molto bene(RaptorUK e WHRoeder grazie per la spiegazione, penso che sia stata fatta molto bene)

.

Un'altra domanda che ho per voi è

Perché hai cambiato il Timeframe in questo calcolo della media mobile

Questo non è lo stesso che ho dato,

Non sta calcolando il giusto valore su altri grafici giornalieri

.

Quindi prendi tempo per imparare e fare pratica e leggi attentamente l'aiuto che ricevi qui su questo forum

o pagate qualcuno che programmi per voi in un sito come Jobs

OrdersTotal() dovrebbe rivelare l'ammontare totale degli ordini pendenti e degli ordini a mercato, indipendentemente dal fatto che siano stati aperti tramite EA o manualmente?

Stavo pensando in questo modo. Il mio EA controllerà sempre se ci sono ordini aperti e se ci sono, non aprirà più ordini e aprirà nuovi ordini solo quando non ci sono ordini aperti.

if (OrdersTotal() == 0 )

Penso che funzioni bene perché la mia sezione dei risultati mi mostra la sequenza di ordini 1,1,2,2,3,3,4,4 che significa che un ordine viene chiuso prima che un nuovo ordine venga aperto.

le variabili per la media mobile e l'RSI sono cambiate per motivi di test. Lo stavo sperimentando su diversi time frame/periodo ma non l'ho cambiato di nuovo quando l'ho postato qui.

e il più bizzarro di tutti, il mio codice eseguirà SOLO l'ordine di acquisto. non ha mai eseguito nemmeno un ordine di vendita,

in poche parole, i problemi che sto affrontando ancora adesso.

1. esegue solo l'acquisto ma non esegue mai la vendita nonostante il fatto che ho codificato la vendita

2. ancora facendo profitto negativo che io sono la fiducia che questa strategia non è supposto per.