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

Очень нужен третий сигнальный индикатор, который нормализует показания двух первых к одной шкале 0-1 и даст сигнал (сообщение) о том, что линия индикатора FL22 равна или поднялась выше верхней линии индикатора FL20 (sell сигнал), равна или опустилась ниже нижней линии индикатора FL20 (buy сигнал).
Сами индикаторы:
FL20.ex4 (8 Kb)
FL22.ex4 (7 Kb)
Комментарии (17)
35 AM2 Сообщений: 16665 - Андрей
Может кто поручится?..
С индикаторов значения считываются, но без нормализации или нормирования к единой шкале (не знаю как точно это называется) их никак не сравнить. Математически я это понимаю, но навыков программирования нет.
2 AlGriS Автор Сообщений: 12
11 mihhail777 Сообщений: 161 - Михаил
35 AM2 Сообщений: 16665 - Андрей
У индикатора есть максимальное значение и минимальное. Нужно найти их (я обратил внимание, что во вкладке параметров общие есть «закрепить максимум», «закрепить минимум» — может быть это можно использовать?). Затем вычисляем разницу между максимумом и минимумом и делим её, например, на сто (можно брать любую шкалу — в данном случае получится процентная шкала), получаем значение на условную единицу. Берём текущее значение и делим на условную единицу — получаем количество условных единиц в текущем значении. Делаем тоже с другим индикатором и уже можем сравнивать их по условным единицам, так как они уже в одном масштабе.
Формула:
текущее значение в усл.ед.=текущее значение/((максимальное-минимальное)/100).
Сейчас я говорю о шкале сравнения 0-100, то есть о процентной шкале (хоть раньше упоминал шкалу 0-1), так как это мне кажется более привычным.
Грубо говоря мы просто сравниваем процент текущего значения ко всему диапазону для каждого индикатора, а это сравнимые величины.
Надеюсь, не перемудрил.
2 AlGriS Автор Сообщений: 12
129-(-29)=158
Но вот текущее отрицательное значение нужно приводить к диапазону:
скажем текущее значение -13, для нормализации нужно сдвинуть 0 на -29:
0-(-29)+(-13)=16 и уже 16/((129-(-29))/100). Редактирован: 20 октября 2017, 01:39
2 AlGriS Автор Сообщений: 12
35 AM2 Сообщений: 16665 - Андрей
2 AlGriS Автор Сообщений: 12
35 AM2 Сообщений: 16665 - Андрей
Надеюсь, расчёт и алерт уже смогу сделать сам. Вот в циклах пока ещё туго разбираюсь.
2 AlGriS Автор Сообщений: 12
11 mihhail777 Сообщений: 161 - Михаил
Видите, пока что никто из программистов за полную реализацию не берутся, а у меня знания MQL на минимальном уровне.
Так жалко — с этими индикаторами в ручной торговле работаю несколько лет. Входы подтверждают отменно, только замучиваешься листать инструменты, чтобы их найти.
2 AlGriS Автор Сообщений: 12
<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
2 AlGriS Автор Сообщений: 12
14 Syte Сообщений: 399
Но в них идёт вызов данных из ячеек массивов, компилятор предупреждает о неинициализированных переменных, хотя массивы объявлены и заполнены
2 AlGriS Автор Сообщений: 12
14 Syte Сообщений: 399
2 AlGriS Автор Сообщений: 12
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий