Unisciti alla nostra fan page
- Visualizzazioni:
- 47
- Valutazioni:
- Pubblicato:
-
Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance
Zigzag ultraveloce secondo il principio più semplice possibile.
Nessun vertice penzolante. Con supporto per la ricerca dei vertici ottimizzata nel tempo.

Vantaggi:
- La funzione più pesante nei calcoli - iBarShift, che sostituisce completamente i loop inutili per la ricerca dei vertici - è stata sostituita da ArrayBSearch, il che significa che l'indicatore funzionerà in modo ancora più efficiente del suo analogo MQL4;
- Tutte le informazioni necessarie per ogni barra sono disponibili non solo in qualsiasi momento della storia, ma anche per l'Expert Advisor in qualsiasi momento della storia;
- Nessun top sospeso;
- Possibilità di cercare i top in modo efficiente senza cercare i valori degli indicatori;
- Lavoro molto veloce;
- Elaborazione corretta dell'inserimento dello storico e del cambio di timeframe;
- Indispensabile per lavorare con gli Expert Advisor.
Svantaggi:
- Costi di memoria. Per disegnare correttamente uno zigzag sono necessari 2 buffer (1 non è sufficiente, ci saranno dei blocchi), qui vengono utilizzati 5 buffer. Completamente compensato (imho) dal vantaggio del #6. Per definizione, nessuno zigzag veloce può gestire correttamente l'inserimento della storia su due buffer.
- Disegno di linee aggiuntive. È necessario renderle visibili all'Expert Advisor. Valori dell'ordine di grandezza che non dovrebbero essere visibili in nessun caso.
Principio:
Un nuovo ginocchio inizia ad essere costruito ad un pullback superiore a quello impostato nelle impostazioni. Può essere impostato in punti (IdealZZZ) o in percentuale (IdealZZZP).
Prendere i vertici:
input int ChannelWidth=100; #property indicator_chart_window datetime LastTime; int ZZHandle; //+------------------------------------------------------------------+ //| Funzione di inizializzazione dell'indicatore personalizzata | //+------------------------------------------------------------------+ void OnInit() { LastTime = 0; ZZHandle = iCustom(_Symbol, Period(), "IdealZZ", ChannelWidth); } //+------------------------------------------------------------------+ //| GetValue| //+------------------------------------------------------------------+ bool GetValue(double dir,int bar,int prevBar,double &peak, int &peakBar,datetime &peakTime,const datetime &T[]) { if(dir<0) { double t[1]; if(0>=CopyBuffer(ZZHandle,2,bar,1,t)) return false; int i= ArrayBsearch(T, (datetime)t[0]); if(i==prevBar) { if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); } double v[1]; if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false; if(v[0]==EMPTY_VALUE) { if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false; } peak=v[0]; peakBar=i; peakTime=(datetime)t[0]; } else if(dir>0) { double t[1]; if(0>=CopyBuffer(ZZHandle,3,bar,1,t)) return false; int i= ArrayBsearch(T, (datetime)t[0]); if(i==prevBar) { if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); } double v[1]; if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false; if(v[0]==EMPTY_VALUE) { if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false; } peak=v[0]; peakBar=i; peakTime=(datetime)t[0]; } else { return(false); } return(true); } //+------------------------------------------------------------------+ //| GetValue| //+------------------------------------------------------------------+ void SetPt(string name,double price,datetime time) { ObjectCreate(0,name,OBJ_ARROW,0,time,price); ObjectSetInteger(0,name,OBJPROP_ARROWCODE,108); ObjectSetDouble(0,name,OBJPROP_PRICE,price); ObjectSetInteger(0,name,OBJPROP_TIME,time); } //+------------------------------------------------------------------+ //| Funzione di iterazione dell'indicatore personalizzata | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &T[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { if(LastTime==T[0]) return(rates_total); LastTime=T[0]; ArraySetAsSeries(T,true); double dir_[1]; if(0>=CopyBuffer(ZZHandle,4,1,1,dir_)) return rates_total; double dir=dir_[0]; double rdir=-dir; if(dir==EMPTY_VALUE) return(rates_total); double v1,v2,v3,v4,v5; int i1,i2,i3,i4,i5; datetime t1,t2,t3,t4,t5; if( GetValue(dir,1,0,v1,i1,t1,T) && GetValue(rdir,i1,0,v2,i2,t2,T) && GetValue(dir,i2,i1,v3,i3,t3,T) && GetValue(rdir,i3,i2,v4,i4,t4,T) && GetValue(dir,i4,i3,v5,i5,t5,T) ) { SetPt("1",v1,t1); SetPt("2",v2,t2); SetPt("3",v3,t3); SetPt("4",v4,t4); SetPt("5",v5,t5); Print(v1," ",v2," ",v3," ",v4," ",v5," ",i1," ",i2," ",i3," ",i4," ",i5); } else { Print("Seems to be error available..."); } return(rates_total); } //+------------------------------------------------------------------+
Questo esempio è un indicatore che ad ogni barra (una volta per barra) segna gli ultimi 5 top (compreso quello attuale non formato).
Attenzione. Il codice potrebbe non funzionare correttamente se la modalità zero bar è abilitata.
Modalità barra zero:
Attivata nel codice dalla variabile DrawZeroBar. È disattivata per impostazione predefinita. Si sconsiglia di attivarla. Se l'indicatore viene utilizzato in un Expert Advisor, è fortemente sconsigliato.
Usatelo :) . Si prega di segnalare eventuali difetti riscontrati.
Tradotto dal russo da MetaQuotes Ltd.
Codice originale https://www.mql5.com/ru/code/925
Corrected Average (CA)
Indicatore di media corretta di A.Uhl (noto anche come "media mobile ottimale").
Cambio_di_periodo_del_cartello
Semplice script per la commutazione dei principali timeframe. Lo scopo principale è la comodità della commutazione tramite tasti di scelta rapida.
CDatetimeMsc
CDateTime estensione millisecondi + estensione variabile di supervisione datetime
La versione di Jolly Roger del consigliere
Basato sul partecipante Pirat al Campionato di Trading Automatico 2011.