Многотаймфреймовый индикатор или Как перебороть психологическую несовместимость с MQL5 - страница 2

 
Подобнее здесь - Стили рисования

 

Ну да логично. Спасибо.  Остался вопрос почему не исполняется условие...

      if ((i>2)&&(High[i-1]>=High[i-2])&&
          (Close[i-1]<(High[i-1]-Low[i-1])/2)&&(Low[i]<Low[i-1]))ExtBuffer[i]=1.0;
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots   1
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_width1  3
#property indicator_style1  STYLE_SOLID
#property indicator_label1  "ReversalBar"

color  ColorOf[3]={CLR_NONE,Blue,Red};
double ExtBuffer[];
double         OpenBuffer[];
double         HighBuffer[];
double         LowBuffer[];
double         CloseBuffer[];
void OnInit()
  {
   SetIndexBuffer(0,OpenBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,HighBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,LowBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,CloseBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,ExtBuffer,INDICATOR_COLOR_INDEX); 
   PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,3);
   for(int i=1;i<3;i++)
      PlotIndexSetInteger(0,PLOT_LINE_COLOR,i,ColorOf[i]);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);   
  }

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 &TickVolume[],
                const long &Volume[],const int &Spread[])
  {
   int i;
   if(prev_calculated==0) i=0;
   else i=prev_calculated-1; 
   while(i<rates_total){ 
      OpenBuffer[i]=Open[i];
      HighBuffer[i]=High[i];
      LowBuffer[i]=Low[i];
      CloseBuffer[i]=Close[i]; 
      ExtBuffer[i]=2.0;
      if ((i>2)&&(High[i-1]>=High[i-2])&&
          (Close[i-1]<(High[i-1]-Low[i-1])/2)&&(Low[i]<Low[i-1]))ExtBuffer[i]=1.0;
      if ((i>2)&&(Low[i-1]<=Low[i-2])&&
          (Close[i-1]>(High[i-1]-Low[i-1])/2)&&(High[i]>High[i-1]))ExtBuffer[i]=0.0;    
      if (i>2)Print(i," ",ExtBuffer[i]);
      i++;
     }
   return(rates_total);
  }

 
zfs:

Ну да логично. Спасибо.  Остался вопрос почему не исполняется условие...

Проверте условие.
 
mql5:
Проверте условие.
Спасибо. Это ещё старые косяки. Сомневаешься в каждом месте... Маленькая мелочь выродилась большими мучениями.
 

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

I.
В МТ4 при отображении индикатора из другото ТФ  применялся следующий блок: 

 

for (; i>=0; i--)
   { //6
       nb3=iBarShift(NULL, TimeFrame_new, Time[i], False);
Line_0[i]=iCustom(NULL,TimeFrame_new,FOMULA,Bar_Count_TimeFrame,0,nb3) ;
//Print("5,  nb3= ",nb3," i =", i,"   Line_0[i]= ",Line_1[i] );
  } //6 

Терминал МТ4 историю и реалтайм (Rt) отображал все красиво  ( прикрепленный файл  h1_m15_MT4.gif  ).

В МТ5:

1.      Создаем хэндл

MA1_handle = iCustom( NULL, 
                      PERIOD_H1,   // на данном этапе пока так. Автовыбора  верхнего ТФ пока нет
                      FOMULA,  
                      Bar_Count ,   // кол-во рассчитываемых бар
                        MA_1_Period,      // Период
                         PRICE_CLOSE  );   // считаем по ценам закрытия

2.      Создаем копию в буфер   

     CopyBuffer_MA1_handle= CopyBuffer(MA1_handle, 0, 0, Bar_Count ,   ma1) ;  

3.  По аналогии обработываем  данные (часть кода)  

// ========  Расчет цифровых индикаторов тренда ===============
// для расчета истории (prev_calculated == 0) limit=bar-Bar_Count   при инициализации  
if(prev_calculated > 0) limit = rates_total - 1; // в R/t расчет только последнего бара
          for(i=limit;i<rates_total;i++)
   { // 8
     if(ma3[i]> ma4[i] && ma4[i]> ma5[i]) K=100; else  // сравнение двух мувингов
     if(ma3[i]< ma4[i] && ma4[i]< ma5[i]) K=-100; else K=0;
         Line_0[i]=K; 

 

4. Получаем побарное отображение истории из H1 в текущий М15 (прикрепленный файл h1_m15_MT5 .gif ). Далее в R/t  временное отображение.  То есть для временного отображения истории нужно добавлять дополнительный блок обработки.        Пока нету.

II.  В МТ4 в моих индикаторах есть автовыбор верхнего ТФ  при переходе на другой (текущий) ТФ. При использовании индикатора G3.mq4  старший  ТФ  выбирался автоматически на 1 ступень.

//----------------------- выбор ТФ --------------------- 10+
TimeFrame_0  = Period();
if(TimeFrame_auto_Count== true)
   {//3 
  if( TimeFrame_0 == 1)     TimeFrame_new =    5;   else
  if( TimeFrame_0 == 5)     TimeFrame_new =   15;   else
  if( TimeFrame_0 == 15)    TimeFrame_new =   30;   else
  if( TimeFrame_0 == 30)    TimeFrame_new =   60;   else
  if( TimeFrame_0 == 60)    TimeFrame_new =  240;   else
  if( TimeFrame_0 ==240)    TimeFrame_new = 1440;   else
  if( TimeFrame_0 ==1440)   TimeFrame_new =10080;   else
  if( TimeFrame_0 ==10080)  TimeFrame_new =43200;   else
                            TimeFrame_new =43200;
    } //3
                   else     TimeFrame_new = TimeFrame;
//---------------------------------------------------------  11+

 

При использовании индикатора G33.mq4  старший  ТФ  выбирался (по аналогии) автоматически на 2 ступени.

При использовании индикатора G2.mq4  младший  ТФ  выбирался автоматически на 1 ступень ниже.

В МТ5 добавились новые ТФ. Хотя  на демосчете пока видны ТФ как в МТ4.

III.  Спасибо   vdv2001 2010.01.12 17:52 2010.01.12 17:52:04 #     за идею «Алгоритма бинарного поиска требуемого интервала»          https://www.mql5.com/ru/forum/332 , то есть на этой ветке.

  PS:   Со второго раза себе объяснишь, вроде становится понятно себе. Может и другие подскажут, чего я еще не понял .        : )

Многотаймфреймовый индикатор или Как перебороть психологическую несовместимость с MQL5
Многотаймфреймовый индикатор или Как перебороть психологическую несовместимость с MQL5
  • www.mql5.com
Нужно получить значение средней для любого таймфрейма несмотря на таймфрейм графика, на который бросили индикатор.
Файлы:
h1_m15_mt4.gif  23 kb
h1_m15_mt5.gif  33 kb
 
pvm63:

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


 

Большая просьба - почитайте статью MQL5 Community - Памятка пользователя:

Кнопка  Код предназначена для вставки исходного кода MQL в текст сообщения. При нажатии появляется пустое окно, в которое необходимо вставить код и далее нажать кнопку Вставить. Для отмены вставки кода необходимо нажать кнопку Отмена.

 
sergeev:


Странный вопрос - вызов индкиатора в МQL5 увеличивается всего на одну строку. - получения данных из буфера.

Пошагово

1. Создали хендл индикатора. - передав в него ЛЮБОЙ ТФ и ВАЛЮТУ

2. Прочитали из буфера данные

3. Анализируем данные.  

Если период расчитывается динамично то это значит что каждый раз нужно будет создавать новый хендл ?

Думаю что проще написать функцию масчёта iMA самопальную и узать её как душе угодно, хотя решение конечно через аунс.

 
Urain:

Если период расчитывается динамично то это значит что каждый раз нужно будет создавать новый хендл ?

Думаю что проще написать функцию масчёта iMA самопальную и узать её как душе угодно, хотя решение конечно через аунс.

Читайте справку - например, раздел Технические индикаторы:

Все функции типа iMA, iAC, iMACD, iIchimoku и т.п., создают в глобальном кеше клиентского терминала копию соответствующего технического индикатора. Если копия индикатора с этими параметрами уже существует, то новая копия не создается, а увеличивается счетчик ссылок на данную копию.

Эти функции возвращают хэндл соответствующей копии индикатора. Используя этот хэндл в дальнейшем можно получать данные, рассчитанные соответствующим индикатором. Данные соответствующего буфера (технические индикаторы содержат рассчитанные данные в своих внутренних буферах, которых, в зависимости от индикатора, может быть от 1 до 5) можно копировать в mql5-программу при помощи функции CopyBuffer().

Нельзя обратиться к данным индикатора сразу после его создания, так как на расчет значений индикатора требуется некоторое время, и поэтому создавать хэндлы индикаторов лучше всего в OnInit(). Функция iCustom() создает соответствующий пользовательский индикатор и при успешном создании возвращает его хэндл. Пользовательские индикаторы могут содержать до 512 индикаторных буферов, содержимое которых также можно получать при помощи функции CopyBuffer(), используя полученный хэндл.

Существует универсальный метод создания любого технического индикатора с помощью функции IndicatorCreate(). Эта функция получает в качестве входных параметров:

  • имя символа;
  • таймфрейм;
  • тип создаваемого индикатора;
  • количество входных параметров индикатора;
  • массив типа MqlParam, содержащий все необходимые входные параметры.

Для освобождения памяти компьютера от неиспользуемого больше индикатора служит функция IndicatorRelease(), которой передается хэндл этого индикатора.

Примечание. Многократное обращение к функции индикатора с одними и теми же параметрами в пределах одной mql5-программы не приводит к многократному увеличению счетчика ссылок, счетчик будет увеличен всего один раз на 1. Однако рекомендуется получать хэндлы индикаторов в функции OnInit() или в конструкторе класса, с последующим использованием полученных хэндлов в остальных функциях. Счетчик ссылок уменьшается при деинициализации mql5-программы.

Вам дали возможность экономного обращения с памятью и другими ресурсами терминала/компьютера. Не нужно думать - щас все набросаю, а оно само пусть там как хочет, так и расхлебывается.
 
Rosh:

Читайте справку - например, раздел Технические индикаторы:

Вам дали возможность экономного обращения с памятью и другими ресурсами терминала/компьютера. Не нужно думать - щас все набросаю, а оно само пусть там как хочет, так и расхлебывается.

Я ж не против чтоб ресурсы расходовались экономней, я о том что одно лечим другое калечим.

Спасибо за ответ но так и остался в неведении

как экономно по ресурсам получить данные индикатора с периодом который изменяется динамично ?

Во первых не всегда известен диапазон изменения,

но даже если он известен зарание, то выходит самое лучшее это создать 200 хендлов (в ините) для каждого периода а потом запрашивать нужный ?!

Ну а как вариант потребуеться не более 10 но в случайном порядке по полю от 1 до 200 вот вам бабушка и юрьев день.

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

 
Urain:

но даже если он известен зарание, то выходит самое лучшее это создать 200 хендлов (в ините) для каждого периода а потом запрашивать нужный ?!

....

вас ждет куча удивительных вещей (подводных камней), эти данные могут быть динамически выгружены терминалом, если вы к ним не обращались ( у меня получилось около минуты) и обращение к этим данным вызовет ошибку https://www.mql5.com/ru/forum/986/5921#comment_5921
CopyTime
CopyTime
  • www.mql5.com
С появлением нового бара идут ошибки.
Причина обращения: