Aiuto per la codifica - pagina 726

 

Ciao Mladen,

Sto cercando di codificare questo in MT5, ma penso che non sto usando l'implementazione corretta,

la mia idea è di usare più indicatori, per favore dammi una luce... ;-)

I need help to make this modular, because I will work with more indicators (6 to 8), 
this is a sample to understand I'm trying to do..

in this sample:
I put only 3 indicadors.

//global variables
bool m_buy = true;
bool m_sell = true;
enum Signal{
   IN_OUT=0,  //in & out
   IN=1,      //in
   OUT=2,     //out
};

I have a EA with indicators that I want to mix and optimize it in BackTest.

//some sample data for signal for In/Out states only for exemplification
iT_InOut = IN_OUT;  //Itrend usage => In & Out
RSI_InOut = IN_;     //RSI usage =>only IN 
MFI_InOut = OUT_;     //MFI usage =>only OUT
//

//this is the complete sequence IF I USE all signals in+out
//only to show the completly sequence (I will not use it)
m_buy=(m_it00[0]>m_it10[0] && m_it00[0]>m_it01[0] && m_rsi0[0]>m_rsi1[0] && m_mfi0[0]>m_mfi1[0]);
// The green is growing and more than red, RSI is growing, MFI is growing
m_sell=(m_it00[0]<m_it10[0] && m_it00[0]<m_it01[0] && m_rsi0[0]<m_rsi1[0] && m_mfi0[0]<m_mfi1[0]);
// The green falls and less than red, RSI falls, MFI falls


//now the skeleton that I'm trying to make work (in future I will use much more indicators)
               
              if(!PositionSelect(Symbol()))   ///No opened it's first entrance
                 {              
                 
                 if (!iT_InOut==OUT_) //Itrend (only options with IN)
                     {
                     m_buy= (m_buy  && m_it00[0]>m_it10[0] && m_it00[0]>m_it01[0]);
                     m_sell=(m_sell && m_it00[0]<m_it10[0] && m_it00[0]<m_it01[0]);
                     }
                  
                 if (!RSI_InOut==OUT_) //RSI (only options with IN)
                     {
                     m_buy =(m_buy  && m_rsi0[0]>m_rsi1[0]);
                     m_sell=(m_sell && m_rsi0[0]<m_rsi1[0]);
                     }                
                
                 if (!MFI_InOut==OUT_) //MFI (only options with IN)
                     {
                     m_buy =(m_buy  && m_mfi0[0]>m_mfi1[0]);
                     m_sell=(m_sell && m_mfi0[0]<m_mfi1[0]);
                     }                 
                  }
                 
                 ///We have opened order it's EXIT
                 else
                 {
                 //Itrend (only options with EXIT)
                 if (!iT_InOut==IN_)
                     {
                     m_buy =(m_buy  && m_it00[0]>m_it10[0] && m_it00[0]>m_it01[0]);
                     m_sell=(m_sell && m_it00[0]<m_it10[0] && m_it00[0]<m_it01[0]);
                     }
                 //RSI (only options with EXIT)
                 if (!RSI_InOut==IN_)
                     {
                     m_buy =(m_buy  && m_rsi0[0]>m_rsi1[0]);
                     m_sell=(m_sell && m_rsi0[0]<m_rsi1[0]);
                     }                     
                 //MFI (only options with EXIT)
                 if (!MFI_InOut==IN_)
                     {
                     m_buy =(m_buy  && m_mfi0[0]>m_mfi1[0]);
                     m_sell=(m_sell && m_mfi0[0]<m_mfi1[0]);
                     }
                 }
 
baraozemo:

Ciao Mladen,

Sto cercando di codificare questo in MT5, ma penso che non sto usando l'implementazione corretta,

la mia idea è di usare più indicatori, per favore dammi una luce... ;-)

I need help to make this modular, because I will work with more indicators (6 to 8), 
this is a sample to understand I'm trying to do..

in this sample:
I put only 3 indicadors.

//global variables
bool m_buy = true;
bool m_sell = true;
enum Signal{
   IN_OUT=0,  //in & out
   IN=1,      //in
   OUT=2,     //out
};

I have a EA with indicators that I want to mix and optimize it in BackTest.

//some sample data for signal for In/Out states only for exemplification
iT_InOut = IN_OUT;  //Itrend usage => In & Out
RSI_InOut = IN_;     //RSI usage =>only IN 
MFI_InOut = OUT_;     //MFI usage =>only OUT
//

//this is the complete sequence IF I USE all signals in+out
//only to show the completly sequence (I will not use it)
m_buy=(m_it00[0]>m_it10[0] && m_it00[0]>m_it01[0] && m_rsi0[0]>m_rsi1[0] && m_mfi0[0]>m_mfi1[0]);
// The green is growing and more than red, RSI is growing, MFI is growing
m_sell=(m_it00[0]<m_it10[0] && m_it00[0]<m_it01[0] && m_rsi0[0]<m_rsi1[0] && m_mfi0[0]<m_mfi1[0]);
// The green falls and less than red, RSI falls, MFI falls


//now the skeleton that I'm trying to make work (in future I will use much more indicators)
               
              if(!PositionSelect(Symbol()))   ///No opened it's first entrance
                 {              
                 
                 if (!iT_InOut==OUT_) //Itrend (only options with IN)
                     {
                     m_buy= (m_buy  && m_it00[0]>m_it10[0] && m_it00[0]>m_it01[0]);
                     m_sell=(m_sell && m_it00[0]<m_it10[0] && m_it00[0]<m_it01[0]);
                     }
                  
                 if (!RSI_InOut==OUT_) //RSI (only options with IN)
                     {
                     m_buy =(m_buy  && m_rsi0[0]>m_rsi1[0]);
                     m_sell=(m_sell && m_rsi0[0]<m_rsi1[0]);
                     }                
                
                 if (!MFI_InOut==OUT_) //MFI (only options with IN)
                     {
                     m_buy =(m_buy  && m_mfi0[0]>m_mfi1[0]);
                     m_sell=(m_sell && m_mfi0[0]<m_mfi1[0]);
                     }                 
                  }
                 
                 ///We have opened order it's EXIT
                 else
                 {
                 //Itrend (only options with EXIT)
                 if (!iT_InOut==IN_)
                     {
                     m_buy =(m_buy  && m_it00[0]>m_it10[0] && m_it00[0]>m_it01[0]);
                     m_sell=(m_sell && m_it00[0]<m_it10[0] && m_it00[0]<m_it01[0]);
                     }
                 //RSI (only options with EXIT)
                 if (!RSI_InOut==IN_)
                     {
                     m_buy =(m_buy  && m_rsi0[0]>m_rsi1[0]);
                     m_sell=(m_sell && m_rsi0[0]<m_rsi1[0]);
                     }                     
                 //MFI (only options with EXIT)
                 if (!MFI_InOut==IN_)
                     {
                     m_buy =(m_buy  && m_mfi0[0]>m_mfi1[0]);
                     m_sell=(m_sell && m_mfi0[0]<m_mfi1[0]);
                     }
                 }
In questo codice non vedo affatto l'uso dell'indicatore (e come i valori vengono copiati negli array corrispondenti)
 

Ciao ragazzi,

Ho davvero bisogno di aiuto, sto costruendo un esperto con l'indicatore waddah attar scalping, la logica funziona, tutto è ok.

Tranne una cosa, come si vede nello screenshot del backtest, ad ogni barra verde l'esperto apre un acquisto, lo stesso per le barre rosse. Voglio solo 1 trade per ogni cambio di colore.

Quello che voglio è :

L'indicatore diventa verde ---> apre un acquisto ---> l'acquisto si chiude ---> L'indicatore diventa rosso ---> apre una vendita ---> la vendita si chiude ---> ripeto

Voglio solo 1 trade per ogni cambio di colore.

Ecco il mio codice: (lo stesso per lo short)

//Trading decision.
   bool SendLong = false, SendShort = false;
  
    double clnowsell = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,1,clbar);
    double clpresell = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,1,clbar+1);
  
    double clnowbuy = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,0,clbar);
    double clprebuy = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,0,clbar+1);

   //Long trade
  
   //Specific system filters
   //if (some condition) SendLong = true;
  
   if (clnowbuy > 0) SendLong = true;

Qualcuno può per favore venire con una soluzione semplice, guardate la linea 1265, la logica viene qui.

Grazie mille!

 
LittleCaro:

Ciao ragazzi,

Ho davvero bisogno di aiuto, sto costruendo un esperto con l'indicatore waddah attar scalping, la logica funziona, tutto è ok.

Tranne una cosa, come si vede nello screenshot del backtest, ad ogni barra verde l'esperto apre un acquisto, lo stesso per le barre rosse. Voglio solo 1 trade per ogni cambio di colore.

Quello che voglio è :

L'indicatore diventa verde ---> apre un acquisto ---> l'acquisto si chiude ---> L'indicatore diventa rosso ---> apre una vendita ---> la vendita si chiude ---> ripeto

Voglio solo 1 trade per ogni cambio di colore.

Ecco il mio codice: (lo stesso per lo short)

//Trading decision.
   bool SendLong = false, SendShort = false;
  
    double clnowsell = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,1,clbar);
    double clpresell = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,1,clbar+1);
  
    double clnowbuy = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,0,clbar);
    double clprebuy = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,0,clbar+1);

   //Long trade
  
   //Specific system filters
   //if (some condition) SendLong = true;
  
   if (clnowbuy > 0) SendLong = true;

Qualcuno può per favore venire con una soluzione semplice, guardate la linea 1265, la logica viene qui.

Grazie mille!

Cambia la condizione in

  if (clnowbuy > 0 && clprebuy == 0) SendLong = true;

Lo stesso per i pantaloncini

 

Grazie Mladen!

A volte ci blocchiamo e abbiamo bisogno di uno sguardo nuovo sul nostro lavoro.

Grazie ancora!

 
LittleCaro:

Grazie Mladen!

A volte ci blocchiamo e abbiamo bisogno di uno sguardo nuovo sul nostro lavoro.

Grazie ancora!

Bonjour,

Ravi de voir une Française, tiens moi au courant des tes résultats avec waddah attar ;)

Pippi verdi

 

Ciao ragazzi sto cercando di modificare un indicatore ema-rsi che può mostrare una freccia verso l'alto o verso il basso quando si incrociano 4 ema e l'rsi è > o < 50.

Il mio problema è che queste frecce non si aggiornano perogni tick una volta che sono apparse, ho bisogno di cambiare timeframe se voglio controllare se le condizioni sono ancora buone per mostrare la freccia. Potete dirmi dov'è il problema? Ho postato il codice.

Grazie a voi

#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 Green
#property  indicator_color2 Red

#property  indicator_width1 4
#property  indicator_width2 4

double CrossUp[];
double CrossDown[];
extern int FasterEMA1     = 6;
extern int SlowerEMA1     = 12;
extern int FasterEMA2     = 7;
extern int SlowerEMA2     = 14;
extern int RSInowPeriod   = 6;
extern int barsBack       = 2000;
extern bool AlertsMessage = true;
extern bool AlertsSound   = true;
extern bool debug         = false;
extern double K           = 1.0 ;

bool EMACrossedUp = false;
bool RSICrossedUp = false;
bool EMACrossedDown = false;
bool RSICrossedDown = false;
int SignalLabeled = 0// 0: initial state; 1: up; 2: down.
int upalert=false,downalert=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0DRAW_ARROWEMPTY);
   SetIndexArrow(0241);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1DRAW_ARROWEMPTY);
   SetIndexArrow(1242);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int limit, i, counter;
   double fasterEMA1now, slowerEMA1now, fasterEMA1previous, slowerEMA1previous, fasterEMA2now, slowerEMA2now, fasterEMA2previous, slowerEMA2previous;
   double RSInow;
   double Range, AvgRange;

   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;

   limit=MathMin(Bars-counted_bars,barsBack);
   
   for(i = limit; i>=0; i--) {
       
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
      {
        AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;

      fasterEMA1now = iMA(NULL0, FasterEMA1, 0MODE_EMAPRICE_CLOSE, i);
      fasterEMA1previous = iMA(NULL0, FasterEMA1, 0MODE_EMAPRICE_CLOSE, i+1);
      
      fasterEMA2now = iMA(NULL0, FasterEMA2, 0MODE_EMAPRICE_CLOSE, i);
      fasterEMA2previous = iMA(NULL0, FasterEMA2, 0MODE_EMAPRICE_CLOSE, i+1);
      
      slowerEMA1now = iMA(NULL0, SlowerEMA1, 0MODE_EMAPRICE_CLOSE, i);
      slowerEMA1previous = iMA(NULL0, SlowerEMA1, 0MODE_EMAPRICE_CLOSE, i+1);
      
      slowerEMA2now = iMA(NULL0, SlowerEMA2, 0MODE_EMAPRICE_CLOSE, i);
      slowerEMA2previous = iMA(NULL0, SlowerEMA2, 0MODE_EMAPRICE_CLOSE, i+1);
      
      RSInow=iRSI(NULL,0,RSInowPeriod,PRICE_CLOSE,i);
      
      if (RSInow > 50) {
         if (debug)Print(TimeToStr(Time[i],TIME_DATE)+TimeToStr(Time[i],TIME_SECONDS)+" RSI UP ");
         RSICrossedUp = true;
         RSICrossedDown = false;
      }
      
      if (RSInow < 50) {
         if (debug)Print(TimeToStr(Time[i],TIME_DATE)+TimeToStr(Time[i],TIME_SECONDS)+" RSI DOWN ");
         RSICrossedUp = false;
         RSICrossedDown = true;
      }
      
      if ((fasterEMA1now >= slowerEMA1now) && (fasterEMA1previous < slowerEMA1previous) && (fasterEMA2now >= slowerEMA2now) && (fasterEMA2previous < slowerEMA2previous) ) {
         if (debug)Print(TimeToStr(Time[i],TIME_DATE)+TimeToStr(Time[i],TIME_SECONDS)+" EMA UP ");
         EMACrossedUp = true;
         EMACrossedDown = false;
      }

      if ((fasterEMA1now <= slowerEMA1now) && (fasterEMA1previous > slowerEMA1previous) && (fasterEMA2now <= slowerEMA2now) && (fasterEMA2previous > slowerEMA2previous)) {
         if (debug)Print(TimeToStr(Time[i],TIME_DATE)+TimeToStr(Time[i],TIME_SECONDS)+" EMA DOWN ");
         EMACrossedUp = false;
         EMACrossedDown = true;
      }

      if ((EMACrossedUp == true) && (RSICrossedUp == true) && (SignalLabeled != 1)) {
         CrossUp[i] = Low[i] - K*Range;
         if (debug)Print(TimeToStr(Time[i],TIME_DATE)+TimeToStr(Time[i],TIME_SECONDS)+" SIGNAL UP ");
         if(i<=2 && AlertsMessage && !upalert)
           {
            Alert (Symbol()," ",Period(),"M  BUY SIGNAL ");
            //SendMail("EMA Cross Up on "+Symbol(),"");
            upalert=true;
            downalert=false;
           }           
         if(i<=2 && AlertsSound && !upalert)
           {
            PlaySound("alert.wav");
            upalert=true;
            downalert=false;
           }
         SignalLabeled = 1;
      }

      else if ((EMACrossedDown == true) && (RSICrossedDown == true) && (SignalLabeled != 2)) {
         CrossDown[i] = High[i] + K*Range;
         if (debug)Print(TimeToStr(Time[i],TIME_DATE)+TimeToStr(Time[i],TIME_SECONDS)+" SIGNAL DOWN ");
         if(i<=2 && AlertsMessage && !downalert)
           {
            Alert (Symbol()," ",Period(),"M  SELL SIGNAL ");
            //SendMail("EMA Cross Down on "+Symbol(),"");
            downalert=true;
            upalert=false;
           }
         if(i<=2 && AlertsSound && !downalert)
           {
            PlaySound("alert.wav");
            downalert=true;
            upalert=false;
           }
         SignalLabeled = 2;
      }
   }
   return(0);
}
//end
 
mladen:
In quel codice non vedo affatto l'uso dell'indicatore (e come i valori vengono copiati negli array corrispondenti)

Ciao Mladen,

Ecco il "sample-ea-modular.mq5" con del codice all'interno... e con l'interfaccia che ha l'idea che voglio.

Sto cercando di renderlo modulare, l'idea è di ottimizzare separatamente in/out di ogni indicatore...

Se riesco a fare questo con il "sample-ea-modular.mq5" cambierò il vero EA.

la base reale è il Ea-sample.mq5. (sto postando solo per voi vedere tutti gli indicatori)

File:
 
oguz:

Caro @mladen,

Se sei in grado di risolvere l'errore menzionato qui sotto, ti prego di essere molto contento.

Grazie...

"Domanda: C'è un avviso quando ho collegato il grafico e uso l'offset gmt automatico.


Avviso come questo: Attenzione, usa GMToffset manuale solo su backtest.

Il calcolo automatico dell'offset GMT funziona solo sul trading live/demo
e dovrebbe essere impostato come FALSE per i backtest - test di strategia.

È normale? O dovrei impostare l'offset automatico gmt su false?

Risposta : Ho disattivato AutoGMTOffset e impostato l'offset GMT manualmente. Nessun altro messaggio di avviso e sembra funzionare bene sulla demo. Vai a capire. Forse è un bug. Oh sì, è sicuramente un bug.

Ho guardato il codice e un'operazione "else" è omessa o mal posizionata. Il messaggio dovrebbe essere emesso solo se UseAutoGMTOffset è impostato su FALSE.

Quindi, ignorate questo messaggio e siate felici. Tutto funziona come (ehm) progettato".

oguz

Come al solito (lo sai già) non commento il codice decompilato, ma vedo che sei sulla strada giusta: se funziona (l'opzione), usala. Se non funziona allora non farlo. Per quanto vedo che è solo un messaggio (non un errore) quindi ...

 

Caro @mladen,

Se sei in grado di risolvere l'errore menzionato qui sotto, ti prego di essere molto contento.

Grazie...

"Domanda: C'è un avviso quando ho collegato il grafico e uso l'offset gmt automatico.


Avviso come questo: Attenzione, usa GMToffset manuale solo su backtest.

Il calcolo automatico dell'offset GMT funziona solo sul trading live/demo
e dovrebbe essere impostato come FALSE per i backtest - test di strategia.

È normale? O dovrei impostare l'offset automatico gmt su false?

Risposta : Ho disattivato AutoGMTOffset e impostato l'offset GMT manualmente. Nessun altro messaggio di avviso e sembra funzionare bene sulla demo. Vai a capire. Forse è un bug. Oh sì, è sicuramente un bug.

Ho guardato il codice e un'operazione "else" è omessa o mal posizionata. Il messaggio dovrebbe essere emesso solo se UseAutoGMTOffset è impostato su FALSE.

Quindi, ignorate questo messaggio e siate felici. Tutto funziona come (ehm) progettato".
Motivazione: