Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 370

 
PokrovMT5:

Ciao, puoi dirmi per favore se hai bisogno di digitare in iData per questo indicatore, non importa se è qualsiasi programma o riferimento ai dati della barra, dove è possibile specificare il timeframe, perché i dati da altri timeframe non si riflettono correttamente nel grafico corrente diverso su timeframe, ma solo nel grafico del timeframe specificato? Grazie.


Non capisco bene

Ma penso che questo aiuterà

Доступ к таймсериям и индикаторам - Справочник MQL4
Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Функции для работы с таймсериями и индикаторами. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым). Для копирования значений таймсерий и индикаторов рекомендуется использовать только динамические массивы, так как функции копирования...
 

Grazie per il link, ho esattamente la stessa immagine, solo un algoritmo leggermente diverso, il punto è fare più punti (nel disegno finale), farli apparire con una soglia.

 
Alekseu Fedotov:

Non ho capito bene.

Ma credo che aiuti.


Grazie, indagherò, ma come esempio il principio perché non funziona se invece di scrivere i dati di un altro timeframe invece di zero, perché non si riflette correttamente, devo prima copiarli e poi disegnarli ?

iClose(NULL,0,i);
 
Alekseu Fedotov:

Controlla qui.


Novaja:

Grazie per il link, ho esattamente la stessa immagine, solo un algoritmo leggermente diverso, l'essenza è fare più punti (nel disegno finale), per farli apparire con una soglia.


Si può fare così, ma risulta Renco, cioè si divide in segmenti uguali distanza m / un vertice. Questo rompe l'algoritmo stesso ricerca vertici, la questione come fare pur mantenendo il codice iniziale, la soglia tra i punti (sul disegno inoltre), dovrebbe ottenere un multiplo della distanza tra tutti ma l'ultimo e la parte superiore (sarà inferiore alla soglia).

 
//+------------------------------------------------------------------+
//|                                                       FastZZ.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, Yurich"
#property link      "https://login.mql5.com/ru/users/Yurich"
//---
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Gold
#property indicator_color4 DodgerBlue

#property indicator_width3 3
#property indicator_width4 3

//--- input parameters
extern int  Depth    = 10;
//---
double zzH[], zzL[];
double depth;
int last, direction, pbars;
datetime lastbar;

double ArrUp[];
double ArrDn[];
//+------------------------------------------------------------------+
int init()
{
//---- indicators
   SetIndexBuffer(0,zzH);
   SetIndexBuffer(1,zzL);
   SetIndexBuffer(2,ArrUp);
   SetIndexBuffer(3,ArrDn);
   
   SetIndexStyle(0,DRAW_ZIGZAG);
   SetIndexStyle(1,DRAW_ZIGZAG);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexStyle(3,DRAW_ARROW);
   
   SetIndexArrow(2,159);
   SetIndexArrow(3,159);
   
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   IndicatorDigits(Digits);
//----
   depth=Depth*Point;
   direction=1;
   last=0;
   pbars=0;
   lastbar=0;
   return(0);
}
//+------------------------------------------------------------------+
int start()
{
   int limit=Bars-IndicatorCounted()-1;
   if(lastbar!=Time[0])
   {
      lastbar=Time[0];
      last++;
   }
   if(MathAbs(Bars-pbars)>1) { last=Bars-1; limit=last;}
   pbars=Bars;
   //---
   for(int i=limit; i>0; i--)
   {
      bool set=false;
      zzL[i]=0;
      zzH[i]=0;
      ArrUp[i]=EMPTY_VALUE;
      ArrDn[i]=EMPTY_VALUE;
      //---
      if(direction>0)
      { 
         if(High[i]>zzH[last]+depth)
         {
            zzH[last]=0;
            zzH[i]=High[i];
           
            ArrUp[i]=High[i];
            
            if(Low[i]<High[last]-depth)
            {
               if(Open[i]<Close[i])
                {
                  zzH[last]=High[last]; 
                  ArrUp[last]=High[last];
                }else direction=-1;
               zzL[i]=Low[i];
               ArrDn[i]=Low[i];
            }
            last=i;
            set=true;
         }
         if(Low[i]<zzH[last]-depth && (!set || Open[i]>Close[i]))
         {
            zzL[i]=Low[i];
            ArrDn[i]=Low[i];
            
            if(High[i]>zzL[i]+depth && Open[i]<Close[i])
             {
               zzH[i]=High[i];
               ArrUp[i]=High[i]; 
             }else direction=-1;
            last=i;
         }
      } else //direction<0
      {
         if(Low[i]<zzL[last]-depth)
         {
            zzL[last]=0;
            zzL[i]=Low[i];
        
            ArrDn[i]=Low[i];            
            
            if(High[i]>Low[last]+depth)
            {
               if(Open[i]>Close[i])
                {
                  zzL[last]=Low[last]; 
                  ArrDn[last]=Low[last];
                }else direction=1;
               zzH[i]=High[i];
               ArrUp[i]=High[i];
            }
            last=i;
            set=true;
         }
         if(High[i]>zzL[last]+depth && (!set || Open[i]<Close[i]))
         {
            zzH[i]=High[i];
            ArrUp[i]=High[i];
            
            if(Low[i]<zzH[i]-depth && Open[i]>Close[i])
             {
               zzL[i]=Low[i]; 
               ArrDn[i]=Low[i];
             }else direction=1;
            last=i;
         }
      }
   }
//----
   zzH[0]=0;
   zzL[0]=0;
//----
   return(0);
}
//+------------------------------------------------------------------+
 

Per qualche motivo il codice non ha inserito il commento immediatamente, ho dovuto riscriverlo.

 
PokrovMT5:

Grazie, ci darò un'occhiata, ma come esempio perché non funziona se invece di scrivere zero si mettono i dati di un altro timeframe, perché non si riflette correttamente, devo prima copiarli e poi disegnarli?



CopyClose è una funzione più moderna, ma ok,iClose(...) funziona bene

In che modo non funziona correttamente? Un'immagine o un pezzo di codice, per favore sii più specifico.

 
Alekseu Fedotov:

CopyClose è una funzione più moderna, ma ok, iClose(...) funziona bene

Un'immagine o un pezzo di codice, per favore sii più preciso.

Bene, ecco un semplice esempio, voglio vedere i prezzi di chiusura sul grafico, voglio vedere un'ora sul timeframe, tutto va bene sull'orologio, ma è diverso su qualsiasi altro timeframe. L'idea era di vedere i prezzi di chiusura di quelli più alti su un orizzonte temporale più piccolo. L'immagine è di 30 minuti.
//+------------------------------------------------------------------+
//|                                                   Проверка 2.mq4 |
//|                                                  Bugaev Vladimir |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Bugaev Vladimir"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 clrBlue
#property indicator_width1 2
int i,limit;

double C,CC[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
IndicatorBuffers(1);
//----      
   SetIndexBuffer(0,CC);
  
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
 
 {
if(prev_calculated<1) limit=rates_total-1;
if(prev_calculated>0)limit=rates_total-prev_calculated;
for(i=limit; i>0; i--)  
  
  {
 C= iClose(NULL,60,i);
 CC[i]=C; 



  }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
PokrovMT5:
Bene ecco l'esempio più semplice, voglio vedere i prezzi di chiusura sul grafico, il timeframe è scritto un'ora, tutto è buono sull'orologio, tutto è diverso su qualsiasi altro timeframe. L'idea era di vedere i prezzi di chiusura di quelli più alti su un orizzonte temporale più piccolo. L'immagine è di 30 minuti.

Come questo


     int shift;
     datetime  T;
  
   for(i=limit; i>=0; i--)
     {
      T = iTime(NULL,0,i); 
      shift=iBarShift(NULL,60,T); 
      C=iClose(NULL,60,shift);
      CC[i]=C;
     }
 
Alekseu Fedotov:

Le cose stanno così.



Grazie mille!