АвторСообщение



Сообщение: 43
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 16.12.16 05:39. Заголовок: Паттерны ПрайсЭкшен через структуру


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

Отображает он все как мне хотелось бы. При наведении мышки на паттерн отображает информацию из функции GetUniqueID:

 цитата:
string GetUniqueID(const Pattern & pattern, string middlePart)
{

return(PREFIX + EnumToString(pattern.patternName)+EnumToString(pattern.getTarget)+"_"
+EnumToString(pattern.patternType)+ middlePart + string(Time[pattern.rightBarIndex]));
}


Но тут где-то собака зарылась, не пойму относительно отображения EnumToString(pattern.getTarget), которая определяется отдельной функцией (кстати подобными строками перекрашиваются паттерны):

 цитата:
int IsActualPattern(Pattern &pattern)
{
for(int i = ArraySize(g_patterns)-1; i >= 0; i--)
{
if(g_patterns.patternType == BEAR_TYPE)
{
for(int k = g_patterns.rightBarIndex-1; k >= 0; k--)
{
if(iLow(NULL, 0, k) < g_patterns.patternTarget)
g_patterns.getTarget = WORKED;
else
g_patterns.getTarget = ACTUAL;
}
}
if(g_patterns.patternType == BULL_TYPE)
{
for(int k = g_patterns.rightBarIndex-1; k >= 0; k--)
{
if(iHigh(NULL, 0, k) > g_patterns.patternTarget)
g_patterns.getTarget = WORKED;
else
g_patterns.getTarget = ACTUAL;
}
}
}
return (g_patterns[ArraySize(g_patterns)-1].getTarget);
}


Так вот... Eсли медвежий паттерн отработан (WORKED) - то окрашивается он как отработанный, и в подписи к нему EnumToString(pattern.getTarget) пишет WORKED, а вот с бычьими почему-то не пишет... окрашивает как отработанный, но в подписи и в принте пишет что он актуальный (см. рис). Как побороть это недоразумение? Сдается мне что тут вина в implicit enum conversion в строке
g_patterns[patternArray].getTarget = getTarget, его энум
Скрытый текст

Кроме этого таких предупреждений еще два штуки есть по коду в строках:
g_patterns[patternArray].patternType = patternDir, его Энум выглядит так
Скрытый текст

и
g_patterns[patternArray].patternName = patternName, его энум
Скрытый текст

Ну и все они в структуре объявлены и инициализированы вот так
patternType = NONE_TYPE;
patternName = NONE_INDEX;
getTarget = NONE;
И на всякий случай функция GetData
Скрытый текст

Ткните, плиз носом, как победить этот недуг


Просмотрев немного по истории, точной закономерности не выявил, но вот покажу участок, где стрелками показаны два по рассраске отработанных бычьих паттерна, между ними 8 свечей (две стрелки указывают на один и тот паттерн). Но подписи у них разные... тот что ниже слева - пишет WORKED, а тот что через 8 свечей справа - ACTUAL.


Чо к чему... не пойму А главное как так-то? Может в коде какого дополнительного условия не хватает в функции IsActualPattern? Или это не понятные примудрусти какие-то в функции строки подписи?
Скрытый текст



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 87 , стр: 1 2 3 4 5 6 All [только новые]







Сообщение: 2442
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 17.02.17 12:23. Заголовок: evbut пишет: Откуда..


evbut пишет:

 цитата:
Откуда такая разница в вызове этих строк, ведь они выполняют похожие действия и баров одинаковое количество проверяют? По логике их должно быть максимум 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 объясняется просто: они ведь вызываются в зависимости от типа паттерна.

Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 66
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 13.02.17 10:51. Заголовок: Игорь, здравствуйте!..


Игорь, здравствуйте! Появилось желание сделать индикатор под МТ5. Судя по ошибкам, выдаваемым компилятором МТ5 главная загвоздка будет состоять в переделке в функциях нахождения паттернов, а именно всякие Low, High, Close и подобные, которых в mql5 нету... Универсальности кода по-видимому не получиться... Нужно искать аналоги... На что еще стоит обратить внимание в испытуемом коде при переносе в mql5 для корректной работы?

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2443
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 17.02.17 12:25. Заголовок: evbut пишет: Игорь,..


evbut пишет:

 цитата:
Игорь, здравствуйте! Появилось желание сделать индикатор под МТ5. Судя по ошибкам, выдаваемым компилятором МТ5 главная загвоздка будет состоять в переделке в функциях нахождения паттернов, а именно всякие Low, High, Close и подобные, которых в mql5 нету... Универсальности кода по-видимому не получиться... Нужно искать аналоги... На что еще стоит обратить внимание в испытуемом коде при переносе в mql5 для корректной работы?


Чтобы переходить на МТ5, сначала следует полностью отладить программу на МТ4. Без этого никак. Ну а универсальность кода для индикаторов вполне достижима (для советников - нет). Чтобы написать в стиле МТ5, используйте функции типа Copy (CopyRates, CopyHigh, CopyLow и т. д.) вместо iLow, iHigh И т. д. Правда придется немного поменять подход к их использованию, готовя данные заранее, а не беря их в том месте, где потребовались.

Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 68
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 24.02.17 01:50. Заголовок: Вы убрали цикл из эт..



 цитата:
Вы убрали цикл из этой функции?


Нет... с цикломосталось, но через свич

 цитата:
ENUM_GET_TARGET IsPatternWorked(Pattern &pattern)
{
for(int k = iBarShift(NULL,0,pattern.rightTime); k > 0; k--)
{
switch(pattern.patternType)
{
case BULL_TYPE : if(iHigh(NULL,0,k) > pattern.patternTarget)
return pattern.getTarget = WORKED; break;

case BEAR_TYPE : if(iLow(NULL,0,k) < pattern.patternTarget)
return pattern.getTarget = WORKED; break;
}
}
return (g_patterns[ArraySize(g_patterns)-1].getTarget);
}



Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2448
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 02.03.17 14:31. Заголовок: evbut пишет: Нет.....


evbut пишет:

 цитата:
Нет... с цикломосталось, но через свич


Настоятельно рекомендую сделать так:

 цитата:
ENUM_GET_TARGET IsPatternWorked(Pattern &pattern, int nBarIndex)
{
if (pattern.getTarget == WORKED)
return pattern.getTarget;

switch(pattern.patternType)
{
case BULL_TYPE : if (iHigh(NULL,0,nBarIndex) > pattern.patternTarget)
pattern.getTarget = WORKED;
break;

case BEAR_TYPE : if(iLow(NULL,0,nBarIndex) < pattern.patternTarget)
pattern.getTarget = WORKED;
break;
}
return (pattern.getTarget);
}



Не проверял синтаксис, могут быть ошибки. В целом смысл такой: передавать в функцию IsPatternWorked индекс обрабатываемого бара. И только на нем проверять отработку паттерна. Не нужно на каждом баре проверять отработку паттерна от момента его регистрации до нулевого бара. Это огромное количество лишней работы. Итогом станет многократный рост производительности индикатора.

Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 69
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 03.03.17 11:06. Заголовок: Настоятельно рекомен..



 цитата:
Настоятельно рекомендую сделать так:


Не работает так с имеющимся кодом - еще на начальном этапе ее конструирования она ничего не делала - как были паттерны ACTUAL, так и остаются, поскольку эта функция передает свой результат в функцию FindPatternsAndFillDB (int index)

 цитата:
g_patterns[patternArray].getTarget =
(IsPatternWorked(g_patterns[patternArray],index) == WORKED)? WORKED : ACTUAL;



Откуда должен передаваться индекс обрабатываемого бара?


Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2452
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 03.03.17 18:13. Заголовок: evbut пишет: Не раб..


evbut пишет:

 цитата:
Не работает так с имеющимся кодом


Тогда нужен весь имеющийся код. Понятно, что проблема комплексная. Но, имея лишь фрагменты кода, я не смогу помочь с решением.

evbut пишет:

 цитата:
Откуда должен передаваться индекс обрабатываемого бара?


Из функции ShowIndicatorData.

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 70
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 05.03.17 02:16. Заголовок: ЗДЕСЬ 14 Дней будет ..


ЗДЕСЬ 14 Дней будет лежать Крайняя версия индикатора. В ней мал-мало переделал функцию неотображения перекрывающихся паттернов, добавил опцию удаления отработанных, а также добавил еще один паттерн - Fakey.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2456
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 23.03.17 16:36. Заголовок: evbut пишет: ЗДЕСЬ ..


evbut пишет:

 цитата:
ЗДЕСЬ 14 Дней будет лежать Крайняя версия индикатора. В ней мал-мало переделал функцию неотображения перекрывающихся паттернов, добавил опцию удаления отработанных, а также добавил еще один паттерн - Fakey.


К сожалению, меня не было здесь больше - был в отпуске. Повторите, пожалуйста.

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 71
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 23.03.17 18:43. Заголовок: С возвращением в сур..


С возвращением в суровые будни )) Надеюсь отпуск удался?
Пожалуйста




Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2460
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 24.03.17 15:42. Заголовок: evbut пишет: С возв..


evbut пишет:

 цитата:
С возвращением в суровые будни )) Надеюсь отпуск удался?
Пожалуйста


Скачал. Чуть позже гляну.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2462
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 28.03.17 14:39. Заголовок: evbut пишет: С возв..


evbut пишет:

 цитата:
С возвращением в суровые будни )) Надеюсь отпуск удался?
Пожалуйста


Уже намного выше быстродействие, чем было. Внес несколько правок.

Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 72
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 27.03.17 07:40. Заголовок: На перспективу появи..


На перспективу появилось жгучее желание сделать из него мульти кросплатформенную (MT4/MT5) версию, чтоб на желаемых инструментах из списка и на любых ТФ искал паттерны, а потом отображал в виде таблицы на подобии Этой Панели. Эх, жалко что нет исходника этой панельки - так бы можно было бы пошаманить... А поскольку там уже классы используются, то задумку придется отложить в долгий ящик, пока не пойму что это такое - классы ... Со структурой то еще шибко храмают навыки... А тут классы - дремучий лес )))
А вообще, как вы считаете будет ли достаточным в структуру struct Pattern просто добавить такие переменные как patternSymbol и patternTimeFrame, что бы бы сделать его по моему желанию? Или можно обойтись вообще без структуры -получать данные из функций типа IsBullsRailsPattern, IsBearsRailsPattern и т.д? Ведь по большому счету нужен будет лишь факт нахождения на конкретном символе, конкретного ТФ на первом баре конкретного паттерна и его таргета...


Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2463
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 28.03.17 14:43. Заголовок: evbut пишет: Эх, жа..


evbut пишет:

 цитата:
Эх, жалко что нет исходника этой панельки - так бы можно было бы пошаманить...


У меня имеется подобная, правда не в подокне, а в основном окне. Делалось для поиска дивергенций на разных символах/периодах - Сканер дивергенций.

Спасибо: 1 
ПрофильЦитата Ответить





Сообщение: 2464
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 28.03.17 14:47. Заголовок: evbut пишет: А вооб..


evbut пишет:

 цитата:
А вообще, как вы считаете будет ли достаточным в структуру struct Pattern просто добавить такие переменные как patternSymbol и patternTimeFrame, что бы бы сделать его по моему желанию? Или можно обойтись вообще без структуры -получать данные из функций типа IsBullsRailsPattern, IsBearsRailsPattern и т.д? Ведь по большому счету нужен будет лишь факт нахождения на конкретном символе, конкретного ТФ на первом баре конкретного паттерна и его таргета...


Есть разные пути для внедрения мультимивола/мультипериода. Можно обойтись и без классов/структур в процедурном стиле. Но элегантнее код будет выглядеть для таких случаев именно в ООП. Соответственно, его отладка станет намного проще процедурного подхода.

Спасибо: 1 
ПрофильЦитата Ответить
Ответов - 87 , стр: 1 2 3 4 5 6 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  2 час. Хитов сегодня: 8
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет