Доработка индикатора ZigZag_ws_Chanel_R

stawros45

Активный участник
Будучи , так сказать, программистом-любителем,написал себе трендовый советник на основе стандартных индикаторов ZigZag и RSI, торгующий по дивергенции и подъемам/спадам по вершинам ZigZaga.Советник показывает неплохие результаты , но пропускает хорошие тренды, возникающие после пробоя ценой сторон симметричного(или его еще называют сходящимся) треугольника или клина.Решил дополнить советник и этими сигналами .Нашел в Интернете вроде бы подходящий индикатор ZigZag_ws_Chanel_R, строящий по соседним вершинам канал,а по последним двум - лучики-линии тренда, образующие тот самый симметричный треугольник.Дополнил советник сигналами на пробой линий тренда.но вот беда - лучи в индикаторе в истории не сохраняются,а с образованием новой вершины b2 ZigZaga "обрезаются" по вершине b2,ставшей вершиной b4 и в виде таких отрезков b2-b4 хранятся в истории.Тем самым невозможно прогнать советник в тестере ,чтобы устранить возможные недоработки и "подводные камни"(всех ситуаций сразу предусмотреть невозможно),так как как раз пробиваемый участок лучика от вершины треугольника до вершины b2 ZigZaga (на картинке в данном случае это уже вершина b3, так как уже образована новая вершина b1) в истории отсутствует. Отсюда вопрос к знающим людям- как доработать код индикатора ZigZag_ws_Chanel_R, чтобы он обрезал лучи не по вершинам b2, а по вершине треугольника. по точке пересечения лучей(апексу)? Сохранять лучи полностью на истории не имеет смысла.Как-то помню мне в руки попал индикатор, строивший лучи по двум фракталам и сохранявшим их в истории,естественно график был забит этими лучами,так что ничего невозможно было разобрать.А вот сохранить в истории треугольник по вершину(апекс) для проверки в тестере советников,работающих на пробой линий тренда треугольников имело бы смысл.Подскажите пожалуйста,господа опытные программисты.Картинку и код индикатора прилагаю.
 

Вложения

  • EURUSDH1_1.png
    EURUSDH1_1.png
    54,4 КБ · Просмотры: 747
  • ZigZag_ws_Chanel_R.mq4
    8,6 КБ · Просмотры: 165
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Было-бы интересно поломать башку, но прочитав несколько раз я нихрена не понял... Может потому что не совсем трезв... Хотя вряд-ли.
 

stawros45

Активный участник
Не понял, что именно непонятно. Если речь о картинке , то это вроде классика графического анализа на графиках цен.Раздел - фигуры разворота тренда. Фигура - сужающийся симметричный треугольник, свидетельствует о сложившейся неопределенности на рынке, как правило в ожидании важных новостей. Разрешается пробоем стороны треугольника, трендом вверх или вниз в зависимости от знака новости для данной валютной пары. На картинке после выхода новости 2014.09.24. о росте продаж домов в США на 18% вместо ожидавшихся 4,5% доллар пошел вверх соответственно график пары EURUSD пробил нижнюю сторону треугольника.
Если речь об индикаторе и советнике то при пробое вниз советник открывает ордер на продажу. При использовании такого советника он получает информацию о значении пробитого нижнего луча цвета "хаки" на баре пробоя с помощью ф-ции ObjectGetValueByShift(). Этот луч, существует на графике как объект только до образования новой вершины b2 ZigZaga, а после обрезается или заменяется линией цвета "пинк" только от вершины до вершины, которая дальше и хранится в буфере и чертится на истории . Участок же луча от вершины ZigZaga до апекса (точки пересечения верхнего и нижнего лучей)исчезает с графика и не чертится на истории, а вместо него строится новый луч по новым вершинам и так далее . Из-за этого невозможно проверить работу советника на пробой сторон важной фигуры разворота тренда "треугольника" в тестере МТ4. Видимо нет буфера, где бы хранились данные луча от вершины ZigZaga до апекса. Но если индикатор рисует на истории линии цвета "пинк" от вершины до вершины ZigZaga , то интуитивно понимаешь, что в принципе можно сделать так, чтобы линии "пинк" индикатор чертил на истории от второй вершины через первую аж до апекса.Благодаря чему в истории будет сохраняться значения линии на баре пробоя. И можно будет проверить работу советника в тестере.
Ну и разумеется это имеет смысл делать в этом индикаторе, тогда, когда точка пересечения лучей находится по оси времени на удалении в разумных пределах , 24-48 часов от момента образования нового луча для графика Н1.Для лучей параллельных или даже с точкой пересечения на удалении более 48 часов хранить и чертить на истории участок луча от последней вершины ZigZaga до вершины треугольника никчему. Так, что тут не так все просто, как кажется на первый взгляд.
 

Вложения

  • EURUSDH1_2.png
    EURUSDH1_2.png
    65,2 КБ · Просмотры: 238
Последнее редактирование модератором:

AlexeyVik

Программист mql4 mql5
Не понял, что именно непонятно. Если речь о картинке , то это вроде классика графического анализа на графиках цен. Раздел - фигуры разворота тренда. Фигура - сужающийся симметричный треугольник, свидетельствует о сложившейся неопределенности на рынке, как правило в ожидании важных новостей. Разрешается пробоем стороны треугольника, трендом вверх или вниз в зависимости от знака новости для данной валютной пары. На картинке после выхода новости 2014.09.24. о росте продаж домов в США на 18% вместо ожидавшихся 4,5% доллар пошел вверх соответственно график пары EURUSD пробил нижнюю сторону треугольника.
Если речь об индикаторе и советнике то при пробое вниз советник открывает ордер на продажу. При использовании такого советника он получает информацию о значении пробитого нижнего луча цвета "хаки" на баре пробоя с помощью ф-ции ObjectGetValueByShift(). Этот луч, существует на графике как объект только до образования новой вершины b2 ZigZaga, а после обрезается или заменяется линией цвета "пинк" только от вершины до вершины, которая дальше и хранится в буфере и чертится на истории. Участок же луча от вершины ZigZaga до апекса (точки пересечения верхнего и нижнего лучей) исчезает с графика и не чертится на истории, а вместо него строится новый луч по новым вершинам и так далее. Из-за этого невозможно проверить работу советника на пробой сторон важной фигуры разворота тренда "треугольника" в тестере МТ4. Видимо нет буфера, где бы хранились данные луча от вершины ZigZaga до апекса. Но если индикатор рисует на истории линии цвета "пинк" от вершины до вершины ZigZaga, то интуитивно понимаешь, что в принципе можно сделать так, чтобы линии "пинк" индикатор чертил на истории от второй вершины через первую аж до апекса. Благодаря чему в истории будет сохраняться значения линии на баре пробоя. И можно будет проверить работу советника в тестере.
Обалдеть... БОльшая часть твоего поста не отображается? Админы форума говорили что это от недостатка пробелов в тексте.
а не понятно вот что:
так как как раз пробиваемый участок лучика от вершины треугольника до вершины b2 ZigZaga (на картинке в данном случае это уже вершина b3, так как уже образована новая вершина b1)
Ну если на картинке b3 и b1 то и говори об этих точках.

ps; Вот, после редактирования виден весь текст.
 
Последнее редактирование:

stawros45

Активный участник
Действительно странности. В одном браузере полный текст не отображается в другом отображается. Придется повторить с другого браузера. Может отобразится полностью.
Не понял, что именно непонятно. Если речь о картинке , то это вроде классика графического анализа на графиках цен. Раздел - фигуры разворота тренда. Фигура - сужающийся симметричный треугольник, свидетельствует о сложившейся неопределенности на рынке, как правило в ожидании важных новостей. Разрешается пробоем стороны треугольника, трендом вверх или вниз в зависимости от знака новости для данной валютной пары. На картинке после выхода новости 2014.09.24. о росте продаж домов в США на 18% вместо ожидавшихся 4,5% доллар пошел вверх соответственно график пары EURUSD пробил нижнюю сторону треугольника.
Если речь об индикаторе и советнике то при пробое вниз советник открывает ордер на продажу. При использовании такого советника он получает информацию о значении пробитого нижнего луча цвета "хаки" на баре пробоя с помощью ф-ции ObjectGetValueByShift().Этот луч, существует на графике как объект только до образования новой вершины b2 ZigZaga, а после обрезается или заменяется линией цвета "пинк" только от вершины до вершины,которая дальше и хранится в буфере и чертится на истории . Участок же луча от вершины ZigZaga до апекса (точки пересечения верхнего и нижнего лучей)исчезает с графика и не чертится на истории,а вместо него строится новый луч по новым вершинам и так далее . Из-за этого невозможно проверить работу советника на пробой сторон важной фигуры разворота тренда "треугольника" на истории в тестере МТ4. Видимо нет буфера , где бы хранились данные луча от вершины ZigZaga до апекса. Но если индикатор рисует на истории линии цвета "пинк" от вершины до вершины ZigZaga , то интуитивно понимаешь, что в принципе можно сделать так, чтобы линии "пинк" индикатор чертил на истории от второй вершины через первую аж до апекса.Благодаря чему в истории будет сохраняться значения линии на баре пробоя. И можно будет проверить работу советника в тестере.
Ну и разумеется это имеет смысл делать в этом индикаторе, тогда, когда точка пересечения лучей находится по оси времени на удалении в разумных пределах , 24-48 часов от момента образования нового луча для графика Н1. Для лучей параллельных или даже с точкой пересечения на удалении более 48 часов хранить и чертить на истории участок луча от последней вершины ZigZaga до вершины треугольника никчему. Так, что тут не так все просто, как кажется на первый взгляд.
 

Вложения

  • EURUSDH1_2.png
    EURUSDH1_2.png
    65,2 КБ · Просмотры: 148
Последнее редактирование модератором:

stawros45

Активный участник
Обалдеть... БОльшая часть твоего поста не отображается? Админы форума говорили что это от недостатка пробелов в тексте.
а не понятно вот что:

Ну если на картинке b3 и b1 то и говори об этих точках.

ps; Вот, после редактирования виден весь текст.

Вы в принципе правы. Неточность в первом (да и собственно во втором) сообщении есть. Везде где говорится о вершине ZigZaga b2 следует читать "b2 и(или) b3", так как сторон-лучей треугольника два, верхняя и нижняя , и обе они в истории обрезаются по этим двум вершинам ZigZaga. Но откорректировать текст сообщений уже невозможно. В данном конкретном случае речь конечно идет о нижней, пробитой стороне треугольника от апекса до вершины b3. Вы правы.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Ну, вот... Сегодня ещё принял и стало чуток понятней...
В общем надо найти где свойству OBJPROP_RAY трендовой присваивается false. И исходя из этого, перед этой строкой надо определить координаты точки пробоя и присвоить эти координаты второй точке.
Или после пробоя проделать эту манипуляцию. Хотя-бы только перенести координаты второй точки линии.

ps; Увы, посмотрел я код и понял что не прав. Трендовые не остаются. Они заменяются индикаторными буферами стилем DRAW_SECTION.
Надо колдовать с чувством...
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Ну вот чуток поколдовал, не проверял что получится, но надежда есть.
В историю рисовать потом поколдую (если будет время), а пока должен работать так:
Если на текущем баре произошло пересечение линий, то дополнительно рисуются линии с флагом OBJPROP_RAY = false от текущего бара до точки b4 или b5
Вот код
Код:
void SetLowZZ(int pShift, double pValue) 
{  double line10, line20, line11, line21; int b1, b2; [COLOR=Red]// Добавлено объявление переменных и переменные b1 и b2 вынесены из циклов.[/COLOR]
    ZigzagBuffer[pShift]=pValue;
    BufChanelLow[pShift]=pValue;
    
    // Верхний лучик ---------------------------------------------
    for (b1=0; b1<200; b1++) [COLOR=Red]// здесь удалено int [/COLOR]
    {
        if (BufChanelHigh[b1] > 0) break;
        
    }
    for (b2=b1+1; b2<400; b2++) [COLOR=Red]// и здесь тоже[/COLOR]
    {
        if (BufChanelHigh[b2] > 0) break;
    }
    
    ObjectSet("ZZCR1", OBJPROP_TIME1, Time[b2]);
    ObjectSet("ZZCR1", OBJPROP_PRICE1, High[b2]);
    ObjectSet("ZZCR1", OBJPROP_TIME2, Time[b1]);
    ObjectSet("ZZCR1", OBJPROP_PRICE2, High[b1]);
    
[COLOR=Red]// Это блок рисования линий.[/COLOR]
      line10 = ObjectGetValueByShift("ZZCR1", 0);
      line11 = ObjectGetValueByShift("ZZCR1", 1);
       line20 = ObjectGetValueByShift("ZZCR2", 0);
       line21 = ObjectGetValueByShift("ZZCR2", 1);
      if(line11 >= line21 && line10 <= line20)
       {
        ObjectCreate("ZZCR1"+Time[0], OBJ_TREND, 0, Time[b2], High[b2], Time[0], line10);
         ObjectSet("ZZCR1"+Time[0], OBJPROP_COLOR, Aqua);
          ObjectSet("ZZCR1"+Time[0], OBJPROP_WIDTH, 2);
         ObjectSet("ZZCR1"+Time[0], OBJPROP_BACK, false);
          ObjectSet("ZZCR1"+Time[0], OBJPROP_RAY, false);
       }[COLOR=Red]// Здесь всё...[/COLOR]
}
Аналогично попробуй сделать вторую функцию void SetHighZZ(int pShift, double pValue)
Что-то я устал, пойду спать. Проверишь на тестере с визуализацией отпиши что получилось.
 

stawros45

Активный участник
Изменил в коде индикатора ф-ции SetLowZZ(int pShift, double pValue) и SetHighZZ(int pShift, double pValue) в соответствии с вашими рекомендациями. И ничего не изменилось.Как в картинке - объекты по прежнему рисуются не отрезками до вершины треугольника , а лучами.Так и в работе советника. Советник по прежнему не может получить значение линии на баре прорыва .Впрочем как и на всех остальных барах.В ответ на строку запроса в советнике например:

double L_ResTr_1=ObjectGetValueByShift("ZZCR1",1); //Получение значения цены верхней трендовой линии сопротивления на баре 1

пишет в журнале тестера: Alert: EURUSD L_ResTr_1=0

На любом баре ,хоть 22-го числа (когда лучей еще нет),хоть 23-го и 24-го числа,когда они уже есть на графике.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Изменил в коде индикатора ф-ции SetLowZZ(int pShift, double pValue) и SetHighZZ(int pShift, double pValue) в соответствии с вашими рекомендациями. И ничего не изменилось.Как в картинке - объекты по прежнему рисуются не отрезками до вершины треугольника , а лучами.Так и в работе советника. Советник по прежнему не может получить значение линии на баре прорыва .Впрочем как и на всех остальных барах.В ответ на строку запроса в советнике например:

double L_ResTr_1=ObjectGetValueByShift("ZZCR1",1); //Получение значения цены верхней трендовой линии сопротивления на баре 1

пишет в журнале тестера: Alert: EURUSD L_ResTr_1=0

На любом баре ,хоть 22-го числа (когда лучей еще нет),хоть 23-го и 24-го числа,когда они уже есть на графике.
Да я ещё перед тем как заснуть, вчера, понял что поспешил и этот код не туда всунул. Жди.
 

stawros45

Активный участник
Да, нет пророка в своем отечестве, как нет советчиков по MQL4 на форуме.Увы.Может не в тот раздел попал?
 

AlexeyVik

Программист mql4 mql5
Да, нет пророка в своем отечестве, как нет советчиков по MQL4 на форуме.Увы.Может не в тот раздел попал?
Тот вариант что я тебе предложил работает, но только в режиме реального времени.
Но есть ещё проблема в том, что если нарисовался треугольник и цена его пробила но не дошла до пересечения линий (апекса) и треугольник перерисовался, то тот треугольник нарисован не будет.
Закончить, пока у меня не хватает вдохновения, но если тебе уже не надо, то мне тем-более.
 

stawros45

Активный участник
Дорогой Алексей! Надо! Но в реальном времени все работает и на первоначальной версии индикатора. О том что с образованием новой вершины ZigZaga лучи и соответственно образованный ими треугольник перерисовывается в новый я писал еще в первом посте. Не может быть, чтобы на языке MQL4 невозможно было сохранить эти лучи-треугольники на истории. Я уже писал, что у меня был такой индикатор, который рисовал аналогичные лучи по двум последним фракталам и хранил их в истории.Но я сейчас не могу его найти у себя в компе.Давно это было.к сожалению.
 

AlexeyVik

Программист mql4 mql5
Дорогой Алексей! Надо! Но в реальном времени все работает и на первоначальной версии индикатора. О том что с образованием новой вершины ZigZaga лучи и соответственно образованный ими треугольник перерисовывается в новый я писал еще в первом посте. Не может быть, чтобы на языке MQL4 невозможно было сохранить эти лучи-треугольники на истории. Я уже писал, что у меня был такой индикатор, который рисовал аналогичные лучи по двум последним фракталам и хранил их в истории.Но я сейчас не могу его найти у себя в компе.Давно это было.к сожалению.
Может я не совсем по-русски пишу, но я говорил о том, что в том варианте который я предложил изначально,
Если на текущем баре произошло пересечение линий, то дополнительно рисуются линии с флагом OBJPROP_RAY = false от текущего бара до точки b4 или b5
и они сохраняются потом на графике даже если МТ перегрузить.
Но если цена пробивает сторону треугольника и треугольник перерисовывается до того как пересечение сторон (апекс) окажется на первом баре, то этот треугольник не рисуется.

На скрине пример работы. Были нарисованы треугольники ABC и ADE
Но текущий треугольник нарисован не будет.
Как разрисовать всю историю, пока идей нет. Можно конечно пойти по пути тупого рисования и последующего удаления не нужных, но хотелось-бы поприличней написать...
 

Вложения

  • EURUSDM5 0.png
    EURUSDM5 0.png
    52,5 КБ · Просмотры: 160

stawros45

Активный участник
Ну вот!Нашел у себя в компе тот самый индикатор RFractals_SuppAndRes_V22 , который рисует линии по двум последним фракталам и сохраняет отрезки этих линий на истории.Индикатор еще и рисует гистограмму ,которая по сути и есть запись на истории фактов пересечения ценой нарисованных линий .При пересечении ценой верхней линии снизу вверх с запасом 10 п. цвет гистограммы становится зеленым,при пересечении нижней сверху вниз - красным. Это значительно упрощает написание советника по такому индикатору.Цвет гистограммы меняется на красный - сигнал на продажу,цвет меняется на зеленый - сигнал на покупку. При этом вы можете заметить, что индикатор RFractals_SuppAndRes_V22 часто дает ложные сигналы. Оно и понятно - не всякое пересечение линии,построенной по двум последним фракталам означает изменение тренда. А вот индикатор, дающий такие сигналы при пересечении ценой линий по вершинам ZigZaga , да еще если они образуют такую разворотную фигуру как сходящийся треугольник - это сильный сигнал разворота тренда.
Думаю, что такому программисту как вы не составит труда перенести из этого индикатора в индикатор ZigZag_ws_Chanel_R куски кода обрезающие лучи до заданной точки(апекса) и сохраняющие их на истории. Разумеется с учетом того,что, как уже было сказано, вершина треугольника должна находиться по времени правее последней вершины ZigZaga не более чем на 48-50 баров.Больше просто не имеет смысла. Хорошо было бы так же прикрутить к индикатору и такую же гистограмму ,меняющую цвет по тем же принципам.Для упрощения работы советника, так как все таки получить на истории сигнал о пробитии ценой сторон треугольника, даже если он чертится на истории , может быть проблематично.
 

Вложения

  • RFractals_SuppAndRes_V22.mq4
    18,8 КБ · Просмотры: 127
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Думаю, что такому программисту как вы не составит труда перенести из этого индикатора в индикатор ZigZag_ws_Chanel_R куски кода обрезающие лучи до заданной точки(апекса) и сохраняющие их на истории. Разумеется с учетом того,что, как уже было сказано, вершина треугольника должна находиться по времени правее последней вершины ZigZaga не более чем на 48-50 баров.Больше просто не имеет смысла. Хорошо было бы так же прикрутить к индикатору и такую же гистограмму ,меняющую цвет по тем же принципам.Для упрощения работы советника, так как все таки получить на истории сигнал о пробитии ценой сторон треугольника, даже если он чертится на истории , может быть проблематично.
Такому программисту как я не интересны чужие коды. В них разбираться очень сложно, у каждого своя манера написания. Да, ладно...
Не глядя в код этого индикатора, просто помня твои слова о том, что лишние линии видны и мешают, я с уверенностью могу сказать, что:
1. Эти линии строятся с координатами двух фракталов, а пересечение этих линий происходит правее второй координаты. Т.е. если этим линиям поставить свойство ObjectSet(nameLine, OBJPROP_RAY, false); то эти линии пересекаться не будут.
2. У каждой из этих линий имя содержит время бара которому принадлежит одна из координат.

В твоём-же случае надо, как я понял, рисовать не каждый треугольник, а только те которые пересекаются ценой. Или я не правильно понял? Все рисовать?

В общем, сегодня не сделаю, завтра еду в деревню и пошаманю только на следующей неделе.
 

stawros45

Активный участник
Все сходящиеся треугольники, у которых точка пересечения сторон отстоит от последнего фрактала не более чем на 50, ну может быть максимум 60 баров(для ходового таймфрейма Н1 соответственно на 50-60 часов). Они естественно все пересекаются ценой, так как цена из сходящегося треугольника не может выйти иначе как через пересечение стороны треугольника.Ну что же.Будем ждать результата.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Все сходящиеся треугольники, у которых точка пересечения сторон отстоит от последнего фрактала не более чем на 50, ну может быть максимум 60 баров(для ходового таймфрейма Н1 соответственно на 50-60 часов). Они естественно все пересекаются ценой, так как цена из сходящегося треугольника не может выйти иначе как через пересечение стороны треугольника.Ну что же.Будем ждать результата.
А вот то, что треугольник может перерисоваться до выхода из него цены или цена уже вне нового треугольника ты не учитываешь. Вопрос был о таких треугольниках.
В общем я поехал в деревню.
 

stawros45

Активный участник
А вот то, что треугольник может перерисоваться до выхода из него цены или цена уже вне нового треугольника ты не учитываешь. Вопрос был о таких треугольниках.
В общем я поехал в деревню.
Уехал человек в деревню и пропал с концами.Вопрос об индюке заглох.Ну что ж будем ковырять сами.
 
Последнее редактирование:
Верх