Spiegazione dettagliata di iCustom

 

Salve.

Sono nuovo nella codifica e sto imparando molto, tuttavia mi sono imbattuto in qualcosa che non riesco a capire al momento. Sto cercando di chiamare il risultato di un test in uno dei miei indicatori, ad un ea, in modo che possa aggiungerlo ai propri test prima di piazzare un trade. L'ea è un semplice incrocio di medie mobili. L'indicatore è un indicatore di tendenza o di range. Ho allegato il codice dell'indicatore.

Vorrei un aiuto e, se possibile, una spiegazione semplice che mi permetta di capire come dovrebbe essere impostato all'interno dell'indicatore, affinché l'ea lo riconosca. Una volta sistemato l'indicatore, passerò all'ea.

L'indicatore ha due test, in cui vorrei aggiungere la funzione iCustom. In questa fase, voglio aggiungerla solo in un test, non importa quale, perché sto cercando di capirlo. Chiunque voglia aiutarmi e spiegarlo semplicemente, sarebbe di grande beneficio - non riesco a trovare nulla on-line che lo spieghi in modo da capirlo. Il risultato del test potrebbe essere semplicemente "vero".

Grazie in anticipo per il vostro tempo.
Mike

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Yellow
#property  indicator_color2  Red
#property  indicator_width1  1

//---- indicator parameters
extern string PairName = "";   // Leave blank for the pair of the chart, enter other pair name to compare correlated pairs

extern int StdDev.MA.Period=12;  // D1=20
extern int StdDev.MA.Shift=0;    //
extern int StdDev.MA.Method = 0; // 0=SMA 1=EMA 2=Smoothed 3=Linear Weighted
extern int StdDev.MA.Price = 0;  // 0 Close price, 1 Open price, 2 High price, 3 Low price, 4 Median price, (high+low)/2, 5 Typical price, (high+low+close)/3, 6 Weighted close price, (high+low+close+close)/4

extern int MA.Fast.Period = 3;
extern int MA.Fast.Method = 2;   //  0=SMA 1=EMA 2=Smoothed 3=Linear Weighted
extern int MA.Fast.Shift = 0;

extern bool CheckOncePerBar = true;

int i, limit, counted_bars;
static string Pair1;

datetime CurrentTimeStamp;

//---- indicator buffers
double     STDBuffer[];
double     stddevma[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  
   IndicatorDigits(Digits+1);
     
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE); // 
   SetIndexStyle(1,DRAW_LINE);

      
//---- indicator buffers mapping
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);

   
   if (PairName == "") Pair1 = Symbol();
   else Pair1 = PairName;

//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("SFX TOR: "+Pair1+"("+StdDev.MA.Period+")");
   SetIndexLabel(0,"StdDev");
   SetIndexLabel(1,"StdDev MA");

//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {

   counted_bars=IndicatorCounted();
   
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   
//---- macd counted in the 1-st buffer
  for(int i=limit-1; i>=0; i--){
     STDBuffer[i]=iStdDev(Pair1,0,StdDev.MA.Period, StdDev.MA.Shift, StdDev.MA.Method, StdDev.MA.Price, i);
     }
  for(i=limit-1; i>=0; i--){
     stddevma[i] = iMAOnArray(STDBuffer, 0, MA.Fast.Period, MA.Fast.Shift, MA.Fast.Method, i);
     } 
    
//Execute on bar Open
    if( CheckOncePerBar == true ){
      if( CurrentTimeStamp == Time[0] )
         return( 0 );
   }
   
   CurrentTimeStamp = Time [0];
   
//Tests
        
      if( STDBuffer[1] > stddevma[1] ){
      if( STDBuffer[2] <= stddevma[2]){
         PlaySound("alert.wav");
         Alert(Symbol()," M",Period()," 30MCrossing");
         SendMail("30MCrossing","30MCrossing");
      }   
   }
   else{ // if it's not greater then it is either lesser than or equal
      if( STDBuffer[2] >= stddevma[2]){
         PlaySound("alert.wav");
         Alert(Symbol()," M",Period()," 30MCrossing");
         SendMail("30MCrossing","30MCrossing");  
      }
   }
          
//---- done
   return(0);
  }
 

iCustom ti permette di accedere ai buffer dei tuoi indicatori...è così semplice.

Per esempio, stai scrivendo un EA che ha una strategia basata su 2 indicatori, potresti costruire il codice dell'indicatore nell'EA, questo è possibile ma è un po' complicato perché i buffer degli indicatori non funzionano sugli EA, dovresti usare gli array e gestirli in modo "as series" . . . l'alternativa è avere gli indicatori in esecuzione e accedere ai loro buffer dall'EA . . . questo è ciò che iCustom facilita. Non sono necessarie modifiche agli indicatori . . . . l'EA accede semplicemente ai buffer di cui ha bisogno ai valori di shift di cui ha bisogno. Nella chiamata iCustom può anche passare qualsiasi variabile esterna che è necessaria per impostare l'indicatore come applicabile

 
RaptorUK:

iCustom ti permette di accedere ai buffer dei tuoi indicatori...è così semplice.

Per esempio, stai scrivendo un EA che ha una strategia basata su 2 indicatori, potresti costruire il codice dell'indicatore nell'EA, questo è possibile ma è un po' complicato perché i buffer degli indicatori non funzionano sugli EA, dovresti usare gli array e gestirli in modo "as series" . . . l'alternativa è avere gli indicatori in esecuzione e accedere ai loro buffer dall'EA . . . questo è ciò che iCustom facilita. Non sono necessarie modifiche agli indicatori . . . . l'EA accede semplicemente ai buffer di cui ha bisogno ai valori di shift di cui ha bisogno. Nella chiamata iCustom può anche passare qualsiasi variabile esterna che è necessaria per impostare l'indicatore come applicabile


Grazie per questo RaptorUK, tuttavia è la codifica effettiva con cui sto avendo difficoltà. Sono molto nuovo di MQL4, e lo sto facendo solo da un paio di mesi, e sto ancora imparando - quindi ho bisogno di una semplice spiegazione della codifica e di come impostarla nell'indicatore.

Grazie

Mike

 

RaptorUK:

Nella chiamata iCustom può anche passare qualsiasi variabile esterna che sia necessaria per impostare l'indicatore come applicabile

Correzione ...

Nella chiamata iCustom

DEVE

passare anche tutte le variabili esterne che sono necessarie per impostare l'indicatore, se del caso.
 
NewCoder47:


Grazie per questo RaptorUK, tuttavia è la codifica effettiva con cui sto avendo difficoltà. Sono molto nuovo di MQL4, e lo sto facendo solo da un paio di mesi, e sto ancora imparando - quindi ho bisogno di una semplice spiegazione della codifica e di come impostarla nell'indicatore.

Grazie

Mike

Quello che evidentemente ti manca qui è che non usi iCustom nell'indicatore. L'indicatore è un pezzo di codice indipendente. Il tuo EA può dare una sbirciatina a quello che succede nell'indicatore usando il comando iCustom .

https://docs.mql4.com/indicators/iCustom

https://forum.mql4.com/42002

 
dabbler:

Correzione ...

Nella chiamata iCustom

DEVE

passare anche tutte le variabili esterne che sono necessarie per impostare l'indicatore come applicabile.
Si possono lasciare i valori esterni vuoti. L'indicatore iCustom() userebbe quindi i suoi valori di default.
 
dabbler:

Correzione ...

Nella chiamata iCustom

DEVE

anche passare tutte le variabili esterne che sono necessarie per impostare l'indicatore come applicabile.

Ho letto diverse dichiarazioni riguardo a questo . . . Non ho mai usato iCustom quindi non posso parlare per esperienza personale... ma la tua affermazione vale anche quando le variabili esterne di default sono quelle necessarie?
 
RaptorUK:
Ho letto diverse affermazioni riguardo a questo . . . Non ho mai usato iCustom quindi non posso parlare per esperienza personale . . . ma la tua affermazione vale anche quando le variabili esterne di default sono quelle necessarie?
Sì. Il problema è che gli ultimi due parametri di iCustom sono cruciali, quindi non puoi omettere nulla.
 
dabbler:
Sì. Il problema è che gli ultimi due parametri dell'iCustom sono cruciali, quindi non si può omettere nulla.
Certamente... grazie.
 
ubzen:
Si possono lasciare i valori esterni vuoti. L'indicatore iCustom() userebbe quindi i suoi valori di default.
No, non si può. Ho appena provato. Non si compila se si tralascia uno dei parametri lasciando solo un posto vuoto tra le virgole.
 
NewCoder47:


.... Sono molto nuovo di MQL4, e lo sto facendo solo da un paio di mesi, e sto ancora imparando - quindi ho bisogno di una semplice spiegazione della codifica e di come impostarla nell'indicatore....

Riconosco l'indicatore come l'indicatore Trend_Or_Range di BarrowBoy. La chiave per capire gli indicatori è capire gli array. Avevo una sana paura degli Arrays fino a quando mi sono reso conto che li ho usati dal giorno 1 quando usavo mql4. Le logiche OrderSelect() e Ma_CrossOver sono alcune delle prime cose che uno deve capire per fare qualsiasi EA.

Come Raptor e Dabber hanno sottolineato. Sono solo una serie di numeri contati all'indietro o in avanti. Gli indicatori hanno il valore aggiunto di utilizzare molti più strumenti visivi degli esperti. Dato che questo indicatore personalizzato utilizza molti indicatori standard come la deviazione standard e le medie mobili, raccomando di fare questi calcoli all'interno dell'EA.

Motivazione: