Форум » Индикаторы » Простые паттерны Price Action » Ответить

Простые паттерны Price Action

evbut: Добрый день! Уж простите коль не в нужном месте тему создал. Хотел выразить большое спасибо автору советника и индикатора по прайсэкшен, которые обнаружил ЗДЕСЬ. Поиск самого автора привел меня сюда. Мне интересна тема прайсэкшен и торгую по ней, в основном рельсы, поглощение, PPR. Но использую другой подход - ТП рассчитываю через фибо от величины паттерна. Хотелось бы расположенный по ссылке советник адаптировать под свою стратегию, т.е. убрать из него автооптимизацию и автоподстановку СЛ и ТП, а ввентить установку ТП через фибо (параметр настраиваемый) и СЛ, который устанавливается на вершине (для продаж) или дне паттерна (для покупок). Буду премного благодарен, если отзовется автор или кто другой кто сможет переделать советник

Ответов - 35, стр: 1 2 3 All

evbut: Scriptong пишет: Это далеко не три-четыре строки кода. Сложность чуть ниже среднего уровня программирования. Далеко мне еще до этого уровня ))) Но вот читаю код индикатора простых паттернов со статистикой и думаю, что из него можно что-то переделать под мою задачу. А именно вот какие куски кода интересны и думаю будут полезны. Для Scriptong пишет: 1. Поиск паттерна. 2. Запись паттерна в базу данных паттернов. использовать функцию FindPattern - ей мы находим все паттерны в истории и создаем их базу с таргетами patternIndex[patternCnt] = i; // Паттерн есть - запишем номер бара, patternDir[patternCnt] = direction; // ..направление паттерна,.. if (direction == PATTERN_BULL) // ..и рассчитаем уровень ТП BullsTargets[patternCnt]= if(direction ==PATTERN_BEAR) BearsTargets[patternCnt] = Далее для 3. Проверка "срабатывания" паттерна. можно использовать код функции GetPatternProfit, где производится расчет "срабатывания" паттерна, только там берется промежуток между паттернами for (int i = finish-1; i >= start; i--) , но можно его переделать в режим "от конца паттерна до первой свечи, где в этом промежутке будем сравнивать таргеты с наибольшим хаем и наименьшим лоу и передавать результат сравнения в функцию, которая будет закрашивать отработанные паттерны в другой цвет (согласен с Вами - этот вариант лучше). Копаю дальше )

Scriptong: evbut пишет: можно использовать код функции GetPatternProfit, где производится расчет "срабатывания" паттерна, только там берется промежуток между паттернами Здесь как раз можно проще - использовать последнюю известную цену (обрабатываемую свечу) для сравнения достижения цели. То есть не нужно перебирать все свечи от паттерна до конца истории. Это будет делаться на этапе поиска новых паттернов, а затем на обработке каждого нового тика.

evbut: Scriptong пишет: Здесь как раз можно проще - использовать последнюю известную цену (обрабатываемую свечу) для сравнения достижения цели. То есть не нужно перебирать все свечи от паттерна до конца истории. Это будет делаться на этапе поиска новых паттернов, а затем на обработке каждого нового тика. Не... не по силам мне все это Взываю к Вашей помощи


Scriptong: evbut пишет: Не... не по силам мне все это Взываю к Вашей помощи К примеру, имеются массивы целей Buy и Sell от паттернов: double buyTargets[], sellTargets[]; // Заполнение массивов с постепенным изменением размера каждого из них Это наша "база данных". Далее достаточно на каждом тике проверить, есть ли достижение цели того или иного паттерна: int arraySize = ArraySize(buyTargets); for (int i = 0; i < arraySize; i++) if (Bid >= buyTargets[ i ]) { // Удаление паттерна из массива, т. к. он отработал } Аналогично для Sell-целей: int arraySize = ArraySize(sellTargets); for (int i = 0; i < arraySize; i++) if (Bid <= sellTargets[ i ]) { // Удаление паттерна из массива, т. к. он отработал }

evbut: Scriptong пишет: Это наша "база данных". Далее достаточно на каждом тике проверить, есть ли достижение цели того или иного паттерна: Добрый день, Игорь. Очень признателен вам за оперативное участие в решении моего вопроса. Увидел ваше сообщение уже после того как сам "навыдумывал" код. Сильно не смейтесь только ))) Пока решил оставить перекрашивание отработанных паттернов в другой цвет. Вот что нашаманил, но не отображается... //+-------------------------------------------------------------------------------------+ //| Поиск паттернов указанного типа в истории | //+-------------------------------------------------------------------------------------+ int FindHistoryPatterns(int patternType, int total, int& patternCnt, int& patternIndex[], int& patternDir[], double& BullsTargets[], double& BearsTargets[]) { int patternStart, condition; // - 1 - ====== Найдем все паттерны в истории =========================================== for (int i = 2; i < total; i++) // Идем справа налево по графику,.. { // ..проверяя наличие паттерна на.. int direction = GetPatternDirection(i, total, // .. каждом баре patternType, patternStart); if (direction == PATTERN_NO) // Паттерна нет - идем дальше continue; patternIndex[patternCnt] = i; // Паттерн есть - запишем номер бара, patternDir[patternCnt] = direction; // ..направление паттерна,.. // и расчитаем уровни целей //в зависимости от направления if(direction == PATTERN_BULL) BullsTargets[patternCnt] = Low[iLowest(NULL,0,MODE_LOW,patternStart - i + 1, i)] + (High[iHighest(NULL,0,MODE_HIGH,patternStart - i + 1, i)] - Low[iLowest(NULL,0,MODE_LOW,patternStart - i + 1, i)]) * FiboTarget /100; if(direction ==PATTERN_BEAR) BearsTargets[patternCnt] = High[iHighest(NULL,0,MODE_HIGH,patternStart - i + 1, i)] - (High[iHighest(NULL,0,MODE_HIGH,patternStart - i + 1, i)] - Low[iLowest(NULL,0,MODE_LOW,patternStart - i + 1, i)]) * FiboTarget / 100; patternCnt++; // Количество паттернов увеличилось } RefreshRates(); ArrayResize(patternIndex, total); // Максимальное кол-во паттернов на.. ArrayResize(patternDir, total); // ..этом участке истории ArrayResize(BullsTargets,total); ArrayResize(BearsTargets,total); for (i = patternCnt-1; i >= 0; i--) // По массиву паттернов { if(direction == PATTERN_BULL) { if(High >= BullsTargets) return (GETED_TARGET); else return(UNGETED_TARGET); } if(direction == PATTERN_BEAR) { if(Low <= BearsTargets) return(GETED_TARGET); else return(UNGETED_TARGET); } } return(condition); } Тут как бы понятно, что находим паттерны в истории с их таргетами, записываем их в массивы и паттерны и таргеты с привязкой к паттерну. В целом же думаю, чтобы эта функция возвращала состояние отработанности (GETED_TARGET или UNGETED_TARGET), которая передается в функцию FindAndShowPatterns (через нее настраивается отображение паттернов), которую подправляю, чтобы согласно полученному condition изменялся цвет отображаения паттернов. Кусочек этой функции: static datetime lastAlert = 0; int patternType, patternCnt, patternIndex[], patternDir[]; double BullsTargets[], BearsTargets[]; int condition = FindHistoryPatterns(patternType, total, patternCnt,patternIndex, patternDir, BullsTargets, BearsTargets); color clr; if(!IsGetedTarget && condition == UNGETED_TARGET) clr = colorBulls; // для бычьих паттернов if(IsGetedTarget && condition == GETED_TARGET) clr = GetTargetColor; Мне кажется косяк где-то зарыт в первом куске кода... Не передается этот кондишн (( С уважением Евгений.

Scriptong: evbut пишет: Мне кажется косяк где-то зарыт в первом куске кода.. Не только там, а везде Так, во втором куске кода объявлены переменные и массивы, но ничто не инициализировано. В переменных - мусор, массивы имеют нулевой размер. В итоге тело функции FindHistoryPattern пишет данные не в массивы, а неизвестно куда. По большому счету это фатальная ошибка исполнения. Если поставить в начале индикатора: #property strict то как раз на фатальную ошибку и получим. При этом, думаю, сами и сможете разобраться, в чем причина - массивы не имеют размера. Ведь размер массивов в первом куске кода указывается только после того, как произошла в них запись данных. Это то же самое, что загружать товар в вагоны, но вагоны подавать уже после загрузки. Спрашивается: куда же мы загружали товар, если вагонов не было?

evbut: И снова я со своими тараканами))) Здрасьте. Игорь, предложенный вами вариант сравнения элементов массивов таргетов с Bid как бы не совсем то, чтобы хотелось видеть, ибо при каждом новом запуске индикатор все будет делать заново относительно уже другой цены бид и не факт, что запустив его снова через день другой от перекрасит или удалит теже отработанные паттерны, что при запуске до этого. Поэтому хочется все же по более верному пути пойти, а именно через сравнения таргетов с хаем или лоем последующих новых свечей, т.е. от правой свечи паттерна вплоть до 0 к примеру. На сегодняшний момент имею вот такие подправленные функции: 1. ф-ция нахождения паттерно в истории в зависимости от направления //+-------------------------------------------------------------------------------------+ //| Поиск паттернов указанного типа в истории | //+-------------------------------------------------------------------------------------+ void FindPatterns(int total, int& BullpatternCnt, int& BearpatternCnt, int& BullpatternIndex[], int& BearpatternIndex[],double& BullpatternTP[], double& BearpatternTP[], int& BullTPIndex[],int& BearTPIndex[], int& GetTP) { int patternStart, dir; double lowPrice, highPrice, patternHeight; for (int i = 2; i < total; i++) // Идем справа налево по графику,.. { // ..проверяя наличие паттерна на.. patternStart = StartIndex(i,total); dir = Direction(i, total); lowPrice = Low[iLowest(NULL, 0, MODE_LOW, // Нижняя граница паттерна patternStart - i + 1, i)]; highPrice = High[iHighest(NULL, 0,MODE_HIGH, // Верхняя граница паттерна patternStart - i + 1, i)]; patternHeight = highPrice - lowPrice; if(dir == PATTERN_BULL) { BullpatternCnt++; BullpatternIndex[BullpatternCnt] = i; BullTPIndex[BullpatternCnt]= i; // Паттерн есть - запишем номер бара BullpatternTP[BullpatternCnt] = lowPrice + patternHeight * FiboTarget / 100.0; } if(dir==PATTERN_BEAR) { BearpatternCnt++; BearpatternIndex[BearpatternCnt] = i; BearTPIndex[BearpatternCnt] = i; BearpatternTP[BearpatternCnt] = highPrice - patternHeight * FiboTarget / 100.0; } } } 2. и функция определения отработанности паттерна //+-------------------------------------------------------------------------------------+ //| Проверка паттернов на отработку | //+-------------------------------------------------------------------------------------+ int GetPatternTarget(int total) { // ---- обозначим и инициализируем переменные и буферы int BullpatternCnt = 0; int BearpatternCnt= 0; int GetTP; int BearpatternIndex[]; int BullpatternIndex[]; int BullTPIndex[]; int BearTPIndex[]; double BullpatternTP[]; double BearpatternTP[]; ArrayResize(BullpatternIndex, total); ArrayResize(BullpatternTP, total); ArrayResize(BullTPIndex,total); ArrayResize(BearpatternIndex, total); ArrayResize(BearpatternTP, total); ArrayResize(BearTPIndex,total); FindPatterns(total, BullpatternCnt, BearpatternCnt, BullpatternIndex, BearpatternIndex, BullpatternTP, BearpatternTP, BullTPIndex, BearTPIndex, GetTP); // - 1 - == Окончание блока ============================================================= for (int i = 0; i < BullpatternCnt; i++) { if (Bid >= BullpatternTP) { GetTP = GET_TARGET; } else { GetTP = NOTGET_TARGET; } Print ("Бычий паттерн № - " + BullpatternCnt + " Свеча паттерна № - " + BullTPIndex+ " Его таргет - " +DoubleToStr(BullpatternTP,Digits)+ " Отработал ли паттерн? " + GetTP); } return(GetTP); } Принтами проверяю то ли находится, на какой свече, с каким таргетом и отработан ли паттерн относительно Bid (GetTP - возвращает 1, если отработан и -1, если нет). Собственно цель сообщения - просьба помочь реализовать кусок кода (скорей всего это будет не один цикл, а зацикленный цикл в цикле - не могу вразуметь этот вопрос - запутываюсь постоянно), в котором для каждого паттерна его таргет (BullpatternTP) сравнивался с хаем каждой последующей свечи начиная со свечи после формирования паттерна (BullpatternIndex -1) до тех пор пока хай не будет больше таргета, как только это случилось, паттерна перекрашивается или удаляется из массива - не суть. Буду очень признателен

Scriptong: evbut пишет: Игорь, предложенный вами вариант сравнения элементов массивов таргетов с Bid как бы не совсем то, чтобы хотелось видеть Согласен. Если речь идет об истории, то Bid не поможет. Нужно запоминать паттерн и затем, по экстремумам последующих свечей, делать выводы о его отработке. Это более сложная задача. Подобную задачу я как раз решал в индикаторе Всплеск и полка. Для этого организовывался массив зарегистрированных паттернов (см. переменную g_patterns), который пополнялся при обнаружении нового паттерна (функция AddPatternToArray) и уменьшался в момент пробоя уровня полки или истечения паттерна (функция ProcessPatterns). Таким образом, необходимо разделить два этих процесса: регистрацию паттернов и отслеживание их отработки.

evbut: Вы пошутник, батенька )))) я тут циклы освоить не могу, а вы мне предлагаете разобраться в структурах и переделать индикатор через них Если серьезно - то мысль отличная - сравнивать отработку не по хаям каждой последующей свечи, а по фракталам.

Scriptong: evbut пишет: Вы пошутник, батенька )))) я тут циклы освоить не могу, а вы мне предлагаете разобраться в структурах и переделать индикатор через них Дело в том, что, на мой взгляд, наиболее просто поставленная Вами задача решается именно так, как я показал. Если убрать из решения структуры, то принцип работы будет несколько затуманен, решение будет сложнее. Поэтому тут могу советовать только продвинуться в направлении массивов и структур. Если есть желание с Вашей стороны продвинуться, то можете открыть отдельную ветку, в которой задать мне вопросы по проблемам, с которыми не смогли освоить сами. Но сразу оговорюсь - основная работа по обучению будет на Вас. То есть Вы сами начинаете разбираться в проблеме, а только потом, когда что-то непонятно, задаете вопрос. Конкретный вопрос, а не общий. evbut пишет: Если серьезно - то мысль отличная - сравнивать отработку не по хаям каждой последующей свечи, а по фракталам. В SplashAndShelf нет проверки отработки паттерна по фракталам. Там паттерн строится по фракталам. Срабатывание паттерна - по экстремумам свечей, т. е. так, как я и советую Вам с Price Action. Если делать проверку отработки по фракталам, то получим дополнительное запаздывание в два бара, т. к. в момент пробоя еще неизвестно, будет тут фрактал, или нет. Запаздывание мешает уже на этапе регистрации паттерна, но тут уже ничего не поделаешь. Если добавлять сюда запаздывание по пробою, то картинка совсем грустная выйдет.

evbut: Спасибо за развернутый ответ профессионала. Конечно вам видней как проще решить поставленную задачу. Не знаю насколько способностей хватит, чтобы, имея вообще поверхностное знание программирования, освоить и структуры. Пока желание получить решение моей задачи не пропало, то будем шагать в эту сторону. Глядишь и полностью индикатор перепешу)))

Scriptong: evbut пишет: Конечно вам видней как проще решить поставленную задачу. У одной и той же задачи, чаще всего, существует несколько решений. Но для конкретного человека такое множество решений не всегда доступно. Поэтому я говорю чисто "со своей колокольни". evbut пишет: Не знаю насколько способностей хватит, чтобы, имея вообще поверхностное знание программирования, освоить и структуры Так может просто подтянуть уровень знаний? Ведь в этом деле основной камень преткновения - желание. Если желание получения знаний есть, то это 90% гарантии того, что все у Вас получится. Большинство программистов MQL4 именно так и учились. Я в том числе.

evbut: Так может просто подтянуть уровень знаний? Как видите на ваших примерах и статьях повышаю навыки, коль уже за структуры начали говорить )) В качестве наглядного пособия почитаю код индикатора "Всплес и полка". А вот учебного что-нить можете подсказать, документация и учебник mql4 слабоват на эту тему - там про классы больше.

Scriptong: evbut пишет: коль уже за структуры начали говорить Структуры - это не очень сложно, если Вы уже осилили понятие "Типы данных". Ведь структура - это пользовательский тип данных. Довольно неплохо описано вот здесь. Не смотрите, что там для C++. Ведь MQL4 - это и есть модифицированный для торговли C++. То есть примеры из статьи можно применять непосредственно в MQL4.

evbut: Scriptong пишет: Структуры - это не очень сложно, если Вы уже осилили понятие "Типы данных". С этой штукой знаком конечно. Спасибо, обязательно почитаю и по ссылке и так, что сам найду



полная версия страницы