Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 370

 
PokrovMT5:

Добрый день! Подскажите пожалуйста , в индикаторе если прописывать в iДанных , неважно любая программа или ссылка на данные бара, где можно указать таймфрейм графика, почему данные с других таймфреймом не отражаются корректно на текущем отличном по времени графике, а только на графике указанного таймфрейма? Спасибо.   


Не совсем понял

Но, думаю это поможет

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

Спасибо за ссылку, у меня абсолютно такая же картинка получается, только немного другой алгоритм, суть в том, чтобы еще точки(в дорисовке), заставить появляться с порогом.

 
Alekseu Fedotov:

Не совсем понял

Но, думаю это поможет


Спасибо, обязательно изучу, но как пример принцип почему не работает , если вместо нуля  прописать данные другого таймфрейма , почему не отражается правильно, нужно что скопировать их вначале а потом отрисовывать ? 

iClose(NULL,0,i);


 

 
Alekseu Fedotov:

Здесь глянь


Novaja:

Спасибо за ссылку, у меня абсолютно такая же картинка получается, только немного другой алгоритм, суть в том, чтобы еще точки(в дорисовке), заставить появляться с порогом.


 Можно сделать так, но получается ренко, т.е. делит на равные отрезки расстоянием м/у вершинами. При этом ломается сам алгоритм поиска вершин, вопрос как сделать при сохранении начального кода, пороговое значение между точками(по дорисовке), должно получиться кратное расстояние между всеми, кроме последней и вершиной(будет меньше порога).

 
//+------------------------------------------------------------------+
//|                                                       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);
}
//+------------------------------------------------------------------+
 

Почему-то код не вставился сразу комментарий, пришлось повторно написать.

 
PokrovMT5:

Спасибо, обязательно изучу, но как пример принцип почему не работает , если вместо нуля  прописать данные другого таймфрейма , почему не отражается правильно, нужно что скопировать их вначале а потом отрисовывать ? 


 


CopyClose     более современная функция, ну да ладно и  iClose(...) нормально работает

Так как она не правильно работает?   Картинку или кусок кода, можно по точней.

 
Alekseu Fedotov:

CopyClose     более современная функция, ну да ладно и  iClose(...) нормально работает

Так как она не правильно работает?   Картинку или кусок кода, можно по точней.

Ну вот самый простой пример, хочу чтобы цены закрытия отражались на графике, таймфрейм прописан час, на часах все хорошо, на любом другом все иначе . А идея была видеть цены закрытия старших  на меньшем таймфрейме. Картинка 30 мин.   
//+------------------------------------------------------------------+
//|                                                   Проверка 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:
Ну вот самый простой пример, хочу чтобы цены закрытия отражались на графике, таймфрейм прописан час, на часах все хорошо, на любом другом все иначе . А идея была видеть цены закрытия старших  на меньшем таймфрейме. Картинка 30 мин.   

Как то так


     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:

Как то так



Спасибо, Вам большое!

Причина обращения: