Группа "Стол заказов MQL"

Рейтинг 2148



РЕКОМЕНДУЮ



Сигнальный индикатор для двух индикаторов с разными показателями.

Есть два индикатора FL20 и FL22. Оба устанавливаются в одно подвальное окно.

Очень нужен третий сигнальный индикатор, который нормализует показания двух первых к одной шкале 0-1 и даст сигнал (сообщение) о том, что линия индикатора FL22 равна или поднялась выше верхней линии индикатора FL20 (sell сигнал), равна или опустилась ниже нижней линии индикатора FL20 (buy сигнал).
Сами индикаторы:
FL20.ex4 (8 Kb)
FL22.ex4 (7 Kb)
  • 0
  • Просмотров: 5674
  • 19 октября 2017, 08:34
  • AlGriS
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
индикатор разворотные бары
Следующая запись в группе  
Переделать индикатор сетка
15 октября 2017
19 октября 2017

Брокер для ваших роботов, 15 лет на рынке

Комментарии (17)

+
0
Если с индикаторов можно считать значения, то можно будет написать и третий на их основе. Напомните когда будет 3-й уровень.
avatar

  35  AM2 Сообщений: 16353 - Андрей

  • 19 октября 2017, 18:10
+
0
Эх уровень, уровень…
Может кто поручится?..
С индикаторов значения считываются, но без нормализации или нормирования к единой шкале (не знаю как точно это называется) их никак не сравнить. Математически я это понимаю, но навыков программирования нет.
avatar

  2  AlGriS Автор Сообщений: 12

  • 19 октября 2017, 18:24
+
0
avatar

  10  mihhail777 Сообщений: 159 - Михаил

  • 19 октября 2017, 20:12
+
0
Каким образом вы предлагаете нормализовать 2 совершенно разных индикатора?

avatar

  35  AM2 Сообщений: 16353 - Андрей

  • 19 октября 2017, 20:23
+
0
Математически все просто.
У индикатора есть максимальное значение и минимальное. Нужно найти их (я обратил внимание, что во вкладке параметров общие есть «закрепить максимум», «закрепить минимум» — может быть это можно использовать?). Затем вычисляем разницу между максимумом и минимумом и делим её, например, на сто (можно брать любую шкалу — в данном случае получится процентная шкала), получаем значение на условную единицу. Берём текущее значение и делим на условную единицу — получаем количество условных единиц в текущем значении. Делаем тоже с другим индикатором и уже можем сравнивать их по условным единицам, так как они уже в одном масштабе.

Формула:
текущее значение в усл.ед.=текущее значение/((максимальное-минимальное)/100).

Сейчас я говорю о шкале сравнения 0-100, то есть о процентной шкале (хоть раньше упоминал шкалу 0-1), так как это мне кажется более привычным.

Грубо говоря мы просто сравниваем процент текущего значения ко всему диапазону для каждого индикатора, а это сравнимые величины.

Надеюсь, не перемудрил.
avatar

  2  AlGriS Автор Сообщений: 12

  • 20 октября 2017, 01:21
+
0
Да ещё. В одном из индикаторов минимальное значение отрицательное. На диапазон это не влияет.

129-(-29)=158

Но вот текущее отрицательное значение нужно приводить к диапазону:

скажем текущее значение -13, для нормализации нужно сдвинуть 0 на -29:

0-(-29)+(-13)=16 и уже 16/((129-(-29))/100).
Редактирован: 20 октября 2017, 01:39
avatar

  2  AlGriS Автор Сообщений: 12

  • 20 октября 2017, 01:36
+
0
В первую очередь делаю то что мне понятно а потом уже все остальное )
avatar

  35  AM2 Сообщений: 16353 - Андрей

  • 20 октября 2017, 18:22
+
0
Может быть хотя бы сделаете, как получать текущее, минимальное и максимальное значение по индикаторам (заготовку), а формулу я попробую применить сам, может и получится?
avatar

  2  AlGriS Автор Сообщений: 12

  • 20 октября 2017, 22:52
+
0
Заготовку сделал:




//+------------------------------------------------------------------+
//|                                                         FL33.mq4 |
//|                                            Copyright © 2017, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2017, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Lime
#property indicator_color4 Red

double up[];
double dn[];
double mid[];
double mid2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
//--- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(0,up);
   SetIndexBuffer(1,dn);
   SetIndexBuffer(2,mid);
   SetIndexBuffer(3,mid2);
//---
   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[])
  {
//---
   for(int i=1;i<1000;i++)
     {
      up[i]=iCustom(NULL,0,"FL20",1,i)/50;
      dn[i]=iCustom(NULL,0,"FL20",2,i)/50;
      mid[i]=iCustom(NULL,0,"FL22",0,i);
      mid2[i]=iCustom(NULL,0,"FL22",1,i);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16353 - Андрей

  • 21 октября 2017, 10:01
+
0
Огромное, спасибо!*hi* 
Надеюсь, расчёт и алерт уже смогу сделать сам. Вот в циклах пока ещё туго разбираюсь.
avatar

  2  AlGriS Автор Сообщений: 12

  • 21 октября 2017, 23:05
+
0
Не забудьте потом поделиться ;) 
avatar

  10  mihhail777 Сообщений: 159 - Михаил

  • 23 октября 2017, 13:32
+
0
Обязательно, если конечно получится.
Видите, пока что никто из программистов за полную реализацию не берутся, а у меня знания MQL на минимальном уровне.
Так жалко — с этими индикаторами в ручной торговле работаю несколько лет. Входы подтверждают отменно, только замучиваешься листать инструменты, чтобы их найти.
avatar

  2  AlGriS Автор Сообщений: 12

  • 23 октября 2017, 13:37
+
0
До создания отдельного индикатора руки так и не дошли. Но сравнение решить удалось сразу в советнике:
<code>
   // направление тренда и тенденции движения цены
   double   trcrup=0,trcrdn=0,trcr=0,trup=0,trdn=0,trCr=0,trUp=0,trDn=1000,maxRstCr,minRstCr;
   double   RUp[500];
   double   RDn[500];
   int      maxIdx,minIdx;

   trend=0;
   
   trcrup=iCustom(pairName,PERIOD_H4,"Use\\FL Trend Direction",48,3.0,16,false,0,1);
   trcrdn=iCustom(pairName,PERIOD_H4,"Use\\FL Trend Direction",48,3.0,16,false,1,1);
   if (trcrup<1000) trcr=trcrup;
   if (trcrdn<1000) trcr=trcrdn;

   for (int i=1 ; i<500; i++)
      {
      trup=iCustom(pairName,PERIOD_H4,"Use\\FL Trend Direction",48,3.0,16,false,0,i);
      trdn=iCustom(pairName,PERIOD_H4,"Use\\FL Trend Direction",48,3.0,16,false,1,i);
      if (trup<1000 && trup>trUp) trUp=trup;
      if (trdn<1000 && trdn<trDn) trDn=trdn;
      }
      
   trCr=(trcr-trDn)/((trUp-trDn)/100);

   for (int i=0; i<500; i++)
      {
      RUp[i] = iCustom(pairName,PERIOD_H4,"Use\\FL Restriction",11,12,2.3,2.3,71,1,i);
      RDn[i] = iCustom(pairName,PERIOD_H4,"Use\\FL Restriction",11,12,2.3,2.3,71,2,i);
      }
   maxIdx = ArrayMaximum(RUp,WHOLE_ARRAY,0);
   minIdx = ArrayMinimum(RDn,WHOLE_ARRAY,0);
   
   maxRstCr = (RUp[0]-RDn[minIdx])/((RUp[maxIdx]-RDn[minIdx])/100);
   minRstCr = (0-RDn[0])/((RUp[maxIdx]-RDn[minIdx])/100);
   
   if (trCr<=minRstCr) trend=1;
   if (trCr>=maxRstCr) trend=-1;

   // отладочная информация
   if (messInd==true)
      {
      string messageTr=StringConcatenate(pairName," | тренд вверх ",trcrup," | тренд вниз ",trcrdn," | текущий ",trcr);
      MessageBox(messageTr);
      string messageMMTr=StringConcatenate(pairName," | максимальный тренд ",trUp," | минимальный тренд ",trDn);
      MessageBox(messageMMTr);
      string messageR=StringConcatenate(pairName," | индекс верха ",maxIdx," | индекс низа ",minIdx);
      MessageBox(messageR);
      string messageRCr=StringConcatenate(pairName," | максимальный верх ",RUp[maxIdx]," | минимальный низ ",RDn[minIdx]);
      MessageBox(messageRCr);
      string messageCrTr=StringConcatenate(pairName," | текущий относительный тренд ",trCr," | текущий верх ",maxRstCr," | текущий низ ",minRstCr);
      MessageBox(messageCrTr);
      string messageIdTr=StringConcatenate(pairName," | текущий индекс тренда ",trend);
      MessageBox(messageIdTr);
      }
 </code>

Выкладываю, может быть понадобиться как образец сравнения несравнимого.
Есть одно но. Компилятор выдаёт сообщение:

Что не так, я не разобрался — всё-таки математик, не программист. Может кто знает и подскажет?
Названия индикаторов другие, но это те же FL20 и FL22, только переименованные для моего удобства.
Редактирован: 11 ноября 2017, 02:03
avatar

  2  AlGriS Автор Сообщений: 12

  • 11 ноября 2017, 01:58
+
0
Это предупреждение, дословный перевод, «возможно использование неинициализированной переменной». В целом, грубой ошибки так таковой нету, по этому предупреждение. Я предполагаю, что пытаетесь использовать не «инициализированную» переменную. Компилятор просто пропустит это место. Лучше весь код кинуть, что бы понять, что за чем идет. А по куску, тут трудно понять, где ошибка.
avatar

  14  Syte Сообщений: 399

  • 11 ноября 2017, 09:14
+
0
Претензия у компилятора к двум строкам
maxRstCr = (RUp[0]-RDn[minIdx])/((RUp[maxIdx]-RDn[minIdx])/100);
   minRstCr = (0-RDn[0])/((RUp[maxIdx]-RDn[minIdx])/100);

Но в них идёт вызов данных из ячеек массивов, компилятор предупреждает о неинициализированных переменных, хотя массивы объявлены и заполнены*???* 
avatar

  2  AlGriS Автор Сообщений: 12

  • 11 ноября 2017, 12:07
+
0
Попробуй их глобально объявить. Или забей на это :) 
avatar

  14  Syte Сообщений: 399

  • 11 ноября 2017, 12:38
+
0
Помогло!!! Спасибо.
avatar

  2  AlGriS Автор Сообщений: 12

  • 17 ноября 2017, 20:02

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий