Отправлено: 16.12.16 05:39. Заголовок: Паттерны ПрайсЭкшен через структуру
Игорь добрый день! Перенесу сюда свои мытарства с перепрограммированием индикатора по паттернам под свои нужды. В той ветке я показал, что кое-какие сдвиги к получению желаемого мной результата есть. В текущем варианте как вы видели по картинкам он уже отрисовывает паттерны и их цели, способен перекрасить паттерны, если его таргет пробит. Вопрос по удалению перекрытых паттернов пока откладываю на потом, поскольку возник более актуальный. Повторю здесь кусок кода, где происходят главные события с паттернами: Скрытый текст
цитата:
void FindAndShowPatterns(int index) { int startBar, patternDir,patternName; GetData(index,startBar,patternDir,patternName);
double lowPrice = ND(Low[iLowest(NULL, 0, MODE_LOW, // Нижняя граница паттерна startBar - index + 1, index)]);
double highPrice = ND(High[iHighest(NULL, 0, MODE_HIGH, // Верхняя граница паттерна startBar - index + 1, index)]); double patternHeight = highPrice - lowPrice;
Но тут где-то собака зарылась, не пойму относительно отображения EnumToString(pattern.getTarget), которая определяется отдельной функцией (кстати подобными строками перекрашиваются паттерны):
Так вот... Eсли медвежий паттерн отработан (WORKED) - то окрашивается он как отработанный, и в подписи к нему EnumToString(pattern.getTarget) пишет WORKED, а вот с бычьими почему-то не пишет... окрашивает как отработанный, но в подписи и в принте пишет что он актуальный (см. рис). Как побороть это недоразумение? Сдается мне что тут вина в implicit enum conversion в строке g_patterns[patternArray].getTarget = getTarget, его энум Скрытый текст
Кроме этого таких предупреждений еще два штуки есть по коду в строках: g_patterns[patternArray].patternType = patternDir, его Энум выглядит так Скрытый текст
Ну и все они в структуре объявлены и инициализированы вот так patternType = NONE_TYPE; patternName = NONE_INDEX; getTarget = NONE; И на всякий случай функция GetData Скрытый текст
цитата:
void GetData(int index, int& startBar, int &type, int &patternName) { //- 1 - == Определим тип найденного паттерна по направлению ===================== if(IsBullsRailsPattern(index)|| IsBUOVBPattern(index) || IsBullsPPRPattern(index)) type = BULL_TYPE; if(IsBearsRailsPattern(index) || IsBEOVBPattern(index)|| IsBearsPPRPattern(index)) type = BEAR_TYPE; //- 1 - == Конец ===============================================================
Просмотрев немного по истории, точной закономерности не выявил, но вот покажу участок, где стрелками показаны два по рассраске отработанных бычьих паттерна, между ними 8 свечей (две стрелки указывают на один и тот паттерн). Но подписи у них разные... тот что ниже слева - пишет WORKED, а тот что через 8 свечей справа - ACTUAL.
Чо к чему... не пойму А главное как так-то? Может в коде какого дополнительного условия не хватает в функции IsActualPattern? Или это не понятные примудрусти какие-то в функции строки подписи? Скрытый текст
Откуда такая разница в вызове этих строк, ведь они выполняют похожие действия и баров одинаковое количество проверяют? По логике их должно быть максимум 278 каждая...
Дело то не столько в двойном вызове функции, а в том, что она делает огромное количество повторяющихся действий. Разберем по полочкам, что же происходит. 1. Цикл i в ShowIndicatorData указывает на бар с индексом 1000. Допустим, на этом баре найден какой-то паттерн. В итоге вызывается функция IsPatternWorked(), которая запускает свой цикл от бара 1000 до бара с индексом 0. Получаем 1000 итераций сходу. 2. Цикл i в ShowIndicatorData указывает на бар с индексом 998. Допустим, на этом баре найден еще какой-то паттерн. Уже два паттерна. В итоге два раза вызывается функция IsPatternWorked(), которая запускает цикл от бара 998 до бара с индексом 0. Получаем 1996 итераций. Причем заметьте, что цикл для предыдущего найденного паттерна повторяет 998 итераций, которые были совершены на итерации цикла i = 1000 в ShowIndicatorData. 3. Цикл i в ShowIndicatorData указывает на бар с индексом 995. Допустим, на этом баре найден еще какой-то паттерн. Уже три паттерна. В итоге три раза вызывается функция IsPatternWorked(), которая запускает цикл от бара 995 до бара с индексом 0. Получаем 2985 итераций. Здесь уже два цикла лишних, т. к. эта работа уже давно выполнена. 4. Цикл i в ShowIndicatorData указывает на бар с индексом 500. Допустим, к этому моменту найдено 100 паттернов. В итоге 100 раз вызывается функция IsPatternWorked(), которая запускает цикл от бара 500 до бара с индексом 0. Получаем 500 * 100 = 50 000 итераций.
В итоге за 500 обработанных баров было совершено огромное количество лишней работы, которая и приводит к такому медленному выполнению индикатора. Чтобы уйти от такой неоптимальности, в функции IsPatternWorked() нужно избавиться от циклов. Они не нужны. Достаточно проверить отработку каждого найденного на данный момент паттерна на текущем баре (тот, который в цикле i ShowIndicatorData).
P. S. Ну а разность вызовов iLow и iHigh объясняется просто: они ведь вызываются в зависимости от типа паттерна.
Игорь, здравствуйте! Появилось желание сделать индикатор под МТ5. Судя по ошибкам, выдаваемым компилятором МТ5 главная загвоздка будет состоять в переделке в функциях нахождения паттернов, а именно всякие Low, High, Close и подобные, которых в mql5 нету... Универсальности кода по-видимому не получиться... Нужно искать аналоги... На что еще стоит обратить внимание в испытуемом коде при переносе в mql5 для корректной работы?
Игорь, здравствуйте! Появилось желание сделать индикатор под МТ5. Судя по ошибкам, выдаваемым компилятором МТ5 главная загвоздка будет состоять в переделке в функциях нахождения паттернов, а именно всякие Low, High, Close и подобные, которых в mql5 нету... Универсальности кода по-видимому не получиться... Нужно искать аналоги... На что еще стоит обратить внимание в испытуемом коде при переносе в mql5 для корректной работы?
Чтобы переходить на МТ5, сначала следует полностью отладить программу на МТ4. Без этого никак. Ну а универсальность кода для индикаторов вполне достижима (для советников - нет). Чтобы написать в стиле МТ5, используйте функции типа Copy (CopyRates, CopyHigh, CopyLow и т. д.) вместо iLow, iHigh И т. д. Правда придется немного поменять подход к их использованию, готовя данные заранее, а не беря их в том месте, где потребовались.
Не проверял синтаксис, могут быть ошибки. В целом смысл такой: передавать в функцию IsPatternWorked индекс обрабатываемого бара. И только на нем проверять отработку паттерна. Не нужно на каждом баре проверять отработку паттерна от момента его регистрации до нулевого бара. Это огромное количество лишней работы. Итогом станет многократный рост производительности индикатора.
Не работает так с имеющимся кодом - еще на начальном этапе ее конструирования она ничего не делала - как были паттерны ACTUAL, так и остаются, поскольку эта функция передает свой результат в функцию FindPatternsAndFillDB (int index)
цитата:
g_patterns[patternArray].getTarget = (IsPatternWorked(g_patterns[patternArray],index) == WORKED)? WORKED : ACTUAL;
Откуда должен передаваться индекс обрабатываемого бара?
Отправлено: 05.03.17 02:16. Заголовок: ЗДЕСЬ 14 Дней будет ..
ЗДЕСЬ 14 Дней будет лежать Крайняя версия индикатора. В ней мал-мало переделал функцию неотображения перекрывающихся паттернов, добавил опцию удаления отработанных, а также добавил еще один паттерн - Fakey.
Отправлено: 23.03.17 16:36. Заголовок: evbut пишет: ЗДЕСЬ ..
evbut пишет:
цитата:
ЗДЕСЬ 14 Дней будет лежать Крайняя версия индикатора. В ней мал-мало переделал функцию неотображения перекрывающихся паттернов, добавил опцию удаления отработанных, а также добавил еще один паттерн - Fakey.
К сожалению, меня не было здесь больше - был в отпуске. Повторите, пожалуйста.
Отправлено: 27.03.17 07:40. Заголовок: На перспективу появи..
На перспективу появилось жгучее желание сделать из него мульти кросплатформенную (MT4/MT5) версию, чтоб на желаемых инструментах из списка и на любых ТФ искал паттерны, а потом отображал в виде таблицы на подобии Этой Панели. Эх, жалко что нет исходника этой панельки - так бы можно было бы пошаманить... А поскольку там уже классы используются, то задумку придется отложить в долгий ящик, пока не пойму что это такое - классы ... Со структурой то еще шибко храмают навыки... А тут классы - дремучий лес ))) А вообще, как вы считаете будет ли достаточным в структуру struct Pattern просто добавить такие переменные как patternSymbol и patternTimeFrame, что бы бы сделать его по моему желанию? Или можно обойтись вообще без структуры -получать данные из функций типа IsBullsRailsPattern, IsBearsRailsPattern и т.д? Ведь по большому счету нужен будет лишь факт нахождения на конкретном символе, конкретного ТФ на первом баре конкретного паттерна и его таргета...
Отправлено: 28.03.17 14:47. Заголовок: evbut пишет: А вооб..
evbut пишет:
цитата:
А вообще, как вы считаете будет ли достаточным в структуру struct Pattern просто добавить такие переменные как patternSymbol и patternTimeFrame, что бы бы сделать его по моему желанию? Или можно обойтись вообще без структуры -получать данные из функций типа IsBullsRailsPattern, IsBearsRailsPattern и т.д? Ведь по большому счету нужен будет лишь факт нахождения на конкретном символе, конкретного ТФ на первом баре конкретного паттерна и его таргета...
Есть разные пути для внедрения мультимивола/мультипериода. Можно обойтись и без классов/структур в процедурном стиле. Но элегантнее код будет выглядеть для таких случаев именно в ООП. Соответственно, его отладка станет намного проще процедурного подхода.
Все даты в формате GMT
2 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет