Spiegazione dettagliata di iCustom - pagina 3

 
NewCoder47:

Grazie Dabbler. Ho allegato l'EA completo e l'indicatore. Ho letto le dichiarazioni su iCustom, e ho capito tutto a parte la parte dei parametri,

Quello che va nei parametri sono i valori che vuoi usare per le variabili esterne nell'indicatore... in questo caso questi...

//---- 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;
 

Guardiamo di nuovo il file di aiuto.

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift) 
 

guardando la definizione della parte ....

... - Parametri impostati (se necessario). I parametri passati e il loro ordine devono corrispondere all'ordine di desclarazione e al tipo di variabili esterne dell'indicatore personalizzato.


Hai 9 variabili esterne e quindi hai bisogno di 9 parametri nell'ordine corretto e con il tipo corretto

     double     STDBuffer = iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,0,0);
     double     stddevma =  iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,1,0);

Facile facile.

Poi chiedi "Inoltre, c'è un modo per vedere fisicamente quali valori vengono inviati all'EA?"

Certo.

Comment("StdBuffer=" + STDBuffer+"\nstddevma=" + stddevma);
 
dabbler:
 double     STDBuffer = iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,0,0);
 double     stddevma =  iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,1,0);

Sì, solo che Null è un errore di battitura.

Inizia con l'indicatore e genera il codice.

Indicatore
EA
Nome del file dell'indicatore senza estensione, compresi gli eventuali spazi vuoti.
#define SFX "SFX"
#define poiché è costante. Definiscilo una volta sola, così non ci saranno errori di battitura.
extern string PairName = "";     // Leave blank for ...

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=Sm...
extern int StdDev.MA.Price = 0;  // 0 Close price, 1 O...
extern int MA.Fast.Period = 3;
extern int MA.Fast.Method = 2;   //  0=SMA 1=EMA 2=Sm ...
extern int MA.Fast.Shift = 0;

extern bool CheckOncePerBar = true;
string  PairName            = "";     
int     StdDev.MA.Period    = 12;  
int     StdDev.MA.Shift     =  0;    
int     StdDev.MA.Method    =  MODE_SMA; 
int     StdDev.MA.Price     =  PRICE_CLOSE;  
int     MA.Fast.Period      =  3;
int     MA.Fast.Method      =  MODE_SMMA;
int     MA.Fast.Shift       =  0;
#define CheckOncePerBar        true;
I valori che NON influenzano i buffer, possono essere resi costanti.
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);
Potrebbe essere necessario leggere il codice per trovare il significato dei buffer. Es.
STDBuffer[i]= iStdDev(...)
stddevma[i] = iMAOnArray(
#define SFX_STD   0
#define SFX_STDMA 1
Le chiamate allora sono
double     STDBuffer = iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STD, 0)
double     stddevma =  iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STDMA, 0)
 

Grazie per la vostra risposta. quindi


 ExtMapBuffer1[i+3] = lower_fractal_7b;     could be used as calculated value when reversal fractal is called?

 
ubzen:
Si. Tutto il tempo. Sto parlando dei valori esterni. E immagino che tu stia parlando di Buffer.

Sì UBZEN,


Ho anche provato quello che hai suggerito e ha restituito il valore come indicato nel mio indicatore....

è semplicemente, facile da aggiungere o da usare senza tutti quei lunghi parametri.... specialmente quello con gli array.......

Potrei perdermi nella compilazione dei parametri, non voi ragazzi............ i PRO qui

grazie mille.... Stavo cercando questa risposta da qualche giorno

 
WHRoeder: Le chiamate allora sono:
double     STDBuffer = iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STD, 0)
double     stddevma =  iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STDMA, 0)
Che dovrebbero poi essere incapsulate.
double getSFX(int eBuf, int iBar = 0, int eTF=0){ 
   return( iCustom(NULL, eTF ,SFX,
                      PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                      StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                      MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                   eBuf, iBar) ); 
}
:
double     STDBuffer = getSFX(SFX_STD, 0);
double     stddevma  = getSFX(SFX_STDMA, 0);
:
 
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

Caro RaptorUK (e altri che potrebbero essere in grado di aiutare),


nel post citato descrivi due modi per utilizzare valori di indicatori personalizzati in un EA. Il primo è con iCustom che già conosco. Il secondo è un modo che vorrei conoscere meglio perché ho provato a internalizzare il codice degli indicatori personalizzati nel corpo dell'indicatore principale prima, ma senza successo. Vedete, quando ho trasformato un indicatore in una funzione e gli faccio restituire il suo valore più attuale (il valore nell'elemento 0) ottengo sempre l'EMPTY_VALUE per una variabile doppia invece del valore calcolato stesso. Ho provato a usare la funzione iCustom, impostando lo spostamento a 0, il valore più recente. Quando lo faccio il terminale inizia a restituire 0 accoppiato con l'errore STACK OVERFLOW nella scheda esperti. Alla seconda spunta restituisce un valore ma dopo ogni paio di valori [0] stampati dà un altro errore STACK OVERFLOW, questo continua a ripetersi più e più volte. Poiché iCustom restituisce il valore 0 e STACK OVERFLOW alla prima inizializzazione (e solo dopo inizia a dare valori corretti) non posso usare icustom nel mio EA perché chiama icustom per un simbolo diverso ogni volta che Start() viene attivato e chiama più indicatori personalizzati per questo. Questo causa il crash dell'EA. Non capisco perché ottengo un errore STACK OVERFLOW ogni volta che voglio che icustom restituisca il valore più recente [0] ma mi piacerebbe saperlo. Preferisco comunque internalizzare il codice di tutti gli indicatori che vengono chiamati trasformandoli in funzioni all'interno dell'indicatore principale. Hai detto qualcosa sull'uso degli array e la loro gestione in un "modo as series". Potresti elaborare questo?

Ho aggiunto un file mq4 dell'indicatore classico ADX.mq4. All'interno il valore di ADX viene stampato due volte. Una volta da Icustom, e una seconda volta dal codice ADX che è stato trasformato in una funzione all'interno dell'ADX. Icustom(ADX) restituisce un valore ma ADX(symbol,timeframe) no. Continua a restituire lo stesso EMPTY_VALUE di 247456457457 o qualcosa del genere più e più volte. Vi prego di spiegarmi perché questo accade e come posso rimediare sia in un modello EA che in un file indicatore personalizzato mq4.


Cordiali saluti e grazie in anticipo


PS: allegare il file non sembra funzionare. Ma è possibile scaricare sia l'indicatore di esempio CallicustomvsFunction che l'indicatore personalizzato ADX da http://www.forexfactory.com/showthre...37#post8569537(il mio nome è Codix)

 
  1. Non fare doppi post
  2. Non dirottare altri thread; le tue domande non riguardano l'uso di iCustom.
 

Nei post precedenti(https://www.mql5.com/en/forum/138577/page3#627521 e https://www.mql5.com/e n/forum/138577/page3#797401) ho usato punti e separatori di parole.

Questo non è più permesso dal 3 febbraio2014 (Build 600) Usa un underscore o un camel case.

 
whroeder1:

Usate un trattino basso o un camel case.

Non ho mai saputo che si chiamasse "camel case". Grazie!