Guarda come scaricare robot di trading gratuitamente
Ci trovi su Telegram!
Unisciti alla nostra fan page
Script interessante?
Pubblica il link!
lasciare che altri lo valutino
Ti è piaciuto lo script? Provalo nel Terminale MetaTrader 5
Visualizzazioni:
47
Valutazioni:
(61)
Pubblicato:
Freelance MQL5 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.

Il perfetto ZigZag

Vantaggi:

  1. 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;
  2. 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;
  3. Nessun top sospeso;
  4. Possibilità di cercare i top in modo efficiente senza cercare i valori degli indicatori;
  5. Lavoro molto veloce;
  6. Elaborazione corretta dell'inserimento dello storico e del cambio di timeframe;
  7. Indispensabile per lavorare con gli Expert Advisor.

Svantaggi:

  1. 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.
  2. 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) Corrected Average (CA)

Indicatore di media corretta di A.Uhl (noto anche come "media mobile ottimale").

Cambio_di_periodo_del_cartello 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 CDatetimeMsc

CDateTime estensione millisecondi + estensione variabile di supervisione datetime

La versione di Jolly Roger del consigliere La versione di Jolly Roger del consigliere

Basato sul partecipante Pirat al Campionato di Trading Automatico 2011.