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



Сообщение: 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 [только новые]







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


evbut пишет:

 цитата:
Уже и не помню ту версию что высылал вам


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

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



Сообщение: 60
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 25.01.17 15:15. Заголовок: Scriptong пишет: Во..


Scriptong пишет:

 цитата:
Вот и мне трудно поддерживать именно тот исходник,


ЗДЕСЬ можно взять крайнюю версию индикатора... Всё перерыл в коде... не найду отчего так отрисовывает и подписывает (( Все функции поиска паттернов взяты из вашего индикатора, за исключением WRB. Поглядите своим опытным глазом, пожалуйста... Ссылка живая будет 7 дней.

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





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


evbut пишет:

 цитата:
И вот при отображении только паттерна Рельсы на некоторых участках встречается вот такое как для бычьих так и для медвежьих направлений (см рис), что совсем не понятно откуда всплывает - Прямоугольник показывает ППР да и выглядит это комбинация свечей как ППР, а в подписи Рельсы (( В настройках параметры Рельс стоят 20 и 10


Проблема кода в том, что решение о регистрации паттерна разбросано по нескольким независимым функциям. Так, в основной функции FillPatternsDB несколько раз производятся одни и те же действия.
Сначала определяется направление паттерна:

 цитата:
ENUM_PATTERN_TYPE newPattern = PatternDir(index);


Сразу заметим, что функция PatternDir() вызывает функции IsBullsRailsPattern(), IsBUOVBPattern(), IsBullsPPRPattern() и IsBullsWRBPattern(). Причем этот вызов никак не реагирует на значения настроечных параметров, определяющих, какой паттерн следует искать. Как бы мы не настраивали индикатор, все равно он будет искать все включенные в него паттерны. Уже просчет.

Возвращаемся в FillPatternsDB(). Следующая строка:

 цитата:
ENUM_PATTEN_NAME newPatternName = NamePattern(index);


определяет имя паттерна. Как это делается? Снова через вызов функций IsBullsRailsPattern(), IsBUOVBPattern(), IsBullsPPRPattern() и IsBullsWRBPattern(). Но ведь мы вызывали эти функции для бара index! То есть снова выполняется уже проделанная работа.
Если идти далее, то видим третью строку FillPatternsDB():

 цитата:
int startBar = GetStartBar(index);


Причем функция GetStartBar() вновь оперирует теми же самыми функциями: IsBullsRailsPattern(), IsBUOVBPattern(), IsBullsPPRPattern() и IsBullsWRBPattern(). То есть эти функции были вызваны три раза на одном и том же баре.
Но и это еще не беда. Беда в том, что функции вызываются каждый раз в разном порядке:
    1. В PatternDir() порядок такой: Рельсы, OVB, PPR, WRB.
    2. В NamePattern: Рельсы, OVB, PPR, WRB.
    3. В GetStartBar: PPR, WRB, OVB, Рельсы.

В итоге получается каша. Если на одном и том же баре имеется несколько разных паттернов, то имя и направление берется от одного паттерна, а номер стартового бара - от другого.

Вывод. Таким образом, по озвученной проблеме рецепт такой: во всех функциях сделать единый порядок проверки паттернов, чтобы не было расхождений в регистрации.

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

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



Сообщение: 61
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 31.01.17 15:09. Заголовок: Scriptong пишет: сд..


Scriptong пишет:

 цитата:
сделать централизованную регистрацию паттернов, без необходимости поиска паттернов на одном баре несколько раз.



 цитата:
Это значительно ускорит работу индикатора


В целом омтечается заторможенность работы индикатора в этом виде кода, особенно когда историю большую ставишь... Если я правильно понял, стоит вернуть ваши функции FindAndShow-бла-блаPattern, что позволит ускорить его работу... Или будет достаточно расширить функционал функции FillPatternDB?


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


Не совсем понимаю как задать приоритет паттернов программно. Переменная указанная ниже не решает этот вопрос?

 цитата:
enum ENUM_PATTEN_NAME
{
NONE_INDEX =-1,
RAILS_,
OVB_,
PPR_,
WRB_
};




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





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


evbut пишет:

 цитата:
Или будет достаточно расширить функционал функции FillPatternDB


Нужно сделать так, чтобы на одном и том же баре не повторялись одни и те же действия. То есть вместо нескольких отдельных вызовов разных функций (PatternDir(), NamePattern(), GetStartBar()) нужно сделать одну функцию, которая все это вычисляет. Ведь все равно задача каждой из этих функций сводится к вызову одних и тех же функций. В итоге вместо трех вызовов функций IsBullsRailsPattern(), IsBUOVBPattern(), IsBullsPPRPattern() и IsBullsWRBPattern() будет лишь один их вызов.
Кстати, далее по коду FillPatternsDB() следует еще один вызов PatternDir(). Для чего? Ведь результат ее вызова уже кеширован в переменной newPattern. Вообще это очень плохая практика - прибегать к вызову одной и той же функции в прилежащих кусках кода. Ведь в этом случае Вы делаете упор на то, что результат вычислений функции будет один и тот же. Но это бывает далеко не всегда. К примеру, имеется такая распространенная ошибка у программистов, которая приводит к получению фатальной ошибки zero divide:

 цитата:
if (AccountEquity() != 0.0)
fPercent = fProfit / AccountEquity()


Здесь, казалось бы, перед операцией деления имеется проверка результата функции на равенство нулю. Но между двумя вызовами этой функции проходит время (пусть небольшое). За этот период времени значение, возвращаемое AccountEquity(), может измениться и стать равным нулю. Правильный подход в данном случае такой:

 цитата:
double fEquity = AccountEquity();
if (fEquity != 0.0)
fPercent = fProfit / fEquity



evbut пишет:

 цитата:
Не совсем понимаю как задать приоритет паттернов программно.


Сделать везде одинаковый порядок вызова функций, определяющих наличие паттерна. Паттерн, обрабатываемый первым, получит наивысший приоритет.



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



Сообщение: 62
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 01.02.17 02:28. Заголовок: Scriptong пишет: То..


Scriptong пишет:

 цитата:
То есть вместо нескольких отдельных вызовов разных функций (PatternDir(), NamePattern(), GetStartBar()) нужно сделать одну функцию, которая все это вычисляет.


Не знаю насколько оптимальное решение, но все эти функции вывел в FillPatternsDB (переименовал ее трохи)
Скрытый текст


 цитата:
Сделать везде одинаковый порядок вызова функций, определяющих наличие паттерна. Паттерн, обрабатываемый первым, получит наивысший приоритет.


И с порядком теперь получается порядок )) По поводу перекрытости паттернов ломаю голову дальше в плане установления приоритетности паттернов... Ведь нигде в коде не обозначено, что последовательность имен паттернов в enum ENUM_PATTEN_NAME

 цитата:
enum ENUM_PATTEN_NAME
{
NONE_INDEX =-1,
RAILS_,
OVB_,
WRB_,
PPR_

};


задает приоритет PPR над всеми остальными. Или только в совокупности расположения в ENUM_PATTEN_NAME и такой же последовательности вызова функций определяет приоритет? Этот момент не укладывается в голове ))
Еще такой момент: необходимо снизить нагрузку на компьютер. Найденное большое количество паттернов записанное в массив нагружает систему... а если много пар в работе - зависон полный будет. Решение проблемы пока такое вижу - запись параметров найденных и неперекрытых паттернов в файл, откуда функция ShowPatterns будет считывать исторические данные по символу и отрисовывать, а массив g_patterns - либо обнулять, либо пусть помнит не более 20-30 последних найденных паттернов, при деинициализации индикатора скидывал бы их в этот файл. Как по вашему рациональный подход или есть более оптимальный вариант, который мне пока в голову не приходит?

PS. Еще раз почитав код индикатора "Всплеск и полка" пришел к окончательному выводу - держать в памяти отработанные паттерны в принципе нет - они только нагружают ПК.. поэтому концовку представленной выше функции будет выглядеть так

 цитата:
//== и подадим сигнал
SignalOnPattern(g_patterns[patternArray], isAlert,index,lastAlert,soundpattern);
}
//== Если включен флаг "Не показывать перекрытые паттерны удалим лишние
if(!OverLaidPattern)
{
ProcessPatterns(index);
}
// == Раскрасим патерны и удалим отработанные из массива
for(int j = ArraySize(g_patterns)-1; j >= 0; j--)
{
ReDrawPattern(g_patterns[j]);
if(g_patterns[j].getTarget == WORKED)
DeleteElementFromArray(g_patterns, j);
}
}


А запись в файл полезно будет лишь в случае исследования паттернов на предмет факта отработки по имени паттерна, его направлению и сроку отработки (сколько времени прошло с момента формирования до момента отработки).

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





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


evbut пишет:

 цитата:
Не знаю насколько оптимальное решение, но все эти функции вывел в FillPatternsDB (переименовал ее трохи)


Не самое плохое решение Можно и так. В итоге приоритет поиска паттернов в данном случае получается следующий:
    1. PPR (т. к. его поиск идет самым последним, а, значит, паттерн при нахождении затрет любой другой паттерн)
    2. WRB
    3. OVB
    4. Рельсы

Сразу возникает вопрос: если на одном баре было зарегистрировано сразу четыре разных паттерна (гипотетически), и нам заранее известно, что будет принят только PPR, то зачем производился поиск всех остальных паттернов?
Ответ на этот вопрос: не нужно так делать. Паттерн с наивысшим приоритетом должен разыскиваться первым. Если же этот паттерн найден, то к поиску других паттернов даже приступать не стоит:

 цитата:
if(IsShowPPRPattern)
{
if(IsBullsPPRPattern(index))
{
newPattern = BULL_TYPE;
newPatternName = PPR_;
startBar = index + 2;
}
if(IsBearsPPRPattern(index))
{
newPattern = BEAR_TYPE;
newPatternName = PPR_;
startBar = index + 2;
}
}

if(IsShowSourcePattern && newPatternName == NONE_INDEX)
{
if(IsBullsWRBPattern(index))
{
newPattern = BULL_TYPE;
newPatternName = WRB_;
startBar = index + 2;
}
if(IsBearWRBPattern(index))
{
newPattern = BEAR_TYPE;
newPatternName = WRB_;
startBar = index + 2;
}
}

if(IsShowOVBPattern && newPatternName == NONE_INDEX)
{
if(IsBUOVBPattern(index))
{
newPattern = BULL_TYPE;
newPatternName = OVB_;
startBar = index + 1;
}

if(IsBEOVBPattern(index))
{
newPattern = BEAR_TYPE;
newPatternName = OVB_;
startBar = index + 1;
}
}

if(IsShowRailsPattern && newPatternName == NONE_INDEX)
{
if(IsBullsRailsPattern(index))
{
newPattern = BULL_TYPE;
newPatternName = RAILS_;
startBar = index + 1;
}
if(IsBearsRailsPattern(index))
{
newPattern = BEAR_TYPE;
newPatternName = RAILS_;
startBar = index + 1;
}
}




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





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


evbut пишет:

 цитата:
И с порядком теперь получается порядок )) По поводу перекрытости паттернов ломаю голову дальше в плане установления приоритетности паттернов... Ведь нигде в коде не обозначено, что последовательность имен паттернов в enum ENUM_PATTEN_NAME


Приоритеты поиска паттернов не зависят от последовательности объявления паттернов в перечислении. Приоритет назначается программно. Как именно - показал постом выше.

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





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


evbut пишет:

 цитата:
Еще такой момент: необходимо снизить нагрузку на компьютер. Найденное большое количество паттернов записанное в массив нагружает систему... а если много пар в работе - зависон полный будет. Решение проблемы пока такое вижу - запись параметров найденных и неперекрытых паттернов в файл, откуда функция ShowPatterns будет считывать исторические данные по символу и отрисовывать, а массив g_patterns - либо обнулять, либо пусть помнит не более 20-30 последних найденных паттернов, при деинициализации индикатора скидывал бы их в этот файл. Как по вашему рациональный подход или есть более оптимальный вариант, который мне пока в голову не приходит?


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

Это функция IsPatternWorked(). В ней каждый паттерн на каждом новом баре проверяется на предмет отработки (достижения цели). Более того, на каждом баре функция вызывается дважды: в FindPatternsAndFillDB() и в ReDrawPattern().
Лишняя работа заключается в том, что сразу при обнаружении паттерна производится проход по все истории от момента возникновения паттерна до текущего момента времени. Зачем? Ведь у нас уже имеется цикл, идущий по истории (в ShowIndicatorData()). Пусть он и задает текущий бар, на котором нужно проверять отработку паттерна. При таком подходе в IsPatternWorked исчезнет цикл, что сразу решит проблему быстродействия.

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 2496
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация: 3
ссылка на сообщение  Отправлено: 05.02.17 09:50. Заголовок: Встретился мне на за..


Встретился мне на забугорном форуме http://www.for-exe.com/mt4-free-indicators--scripts.html индикатор snorm_multibar_pinbar с
подобной реализацией идеи отображением паттернов, но только для Пин-бара.



С уважением! Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 64
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 07.02.17 06:18. Заголовок: Так, развейте не сты..


Так, развейте не стыковку по вашим высказываниям. Порядок приоритетности я брал из статьи по индикатору "Простые паттерны" (и в нем же порядок поиска паттернов располагается по возрастающему, с ваших слов в статье, приоритету - от "Inside Bar" до Island Reversal) и здесь
Scriptong пишет:

 цитата:
1. PPR (т. к. его поиск идет самым последним, а, значит, паттерн при нахождении затрет любой другой паттерн)


И далее по тексту читаю
Scriptong пишет:

 цитата:
Паттерн с наивысшим приоритетом должен разыскиваться первым.

.
Так как же на самом деле правильно?

Лирическое отступление )))
Логически как бы понятно, что чем реже встречается паттерн, тем сильнее он. Среди двух баровых - "Поглащение" будет сильней Рельс. Среди трех баровых из моего списка наверно предпочтение нужно отдать WRB... Но тот же PPR чаще встречается, чем теже Рельсы или Поглащение... И думается мне, что приоритетность на одном баре нужно определять как в поговорке "Кто первый встал, того и тапки"

Использование такого подхода получается частично избавляет от необходимости удалять перекрытые паттерны. А пока что не могу избавиться от функции

 цитата:

ENUM_PATTEN_NAME NamePattern(int index)
{
if(IsBullsPPRPattern(index) || IsBearsPPRPattern(index))
return PPR_;
if(IsBullsWRBPattern(index) || IsBearWRBPattern(index))
return WRB_;
if(IsBUOVBPattern(index) || IsBEOVBPattern(index))
return OVB_;
if(IsBullsRailsPattern(index) || IsBearsRailsPattern(index))
return RAILS_;
return NONE_INDEX;
}


Чтобы реализовать удаление перекрытых... Как говориться: "в голове вертится, а на язык не идет"... т.е. понимаю, что функционал удаления, можно воткнуть также в функцию FindPatternsAndFillDB на этапе нахождения минимум первых 3ёх любых паттернов, чтобы просто не давать накладывающимся паттернам записываться в БД согласно их приоритету.

Спасибо за наводку с профилированием - теперь знаю для чего нужна эта кнопочка )))

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





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


evbut пишет:

 цитата:
Так, развейте не стыковку по вашим высказываниям. Порядок приоритетности я брал из статьи по индикатору "Простые паттерны" (и в нем же порядок поиска паттернов располагается по возрастающему, с ваших слов в статье, приоритету - от "Inside Bar" до Island Reversal) и здесь


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

Таким образом, по хорошему, функцию FindPatternsAndFillDB нужно разбить на несколько более мелких функций, сделав поиск паттерна с наивысшим приоритетом первым. Если паттерн найден, то остальные даже не разыскиваются. А вот если паттерн не найден, то происходит переход к поиску следующего паттерна.

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



Сообщение: 67
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 20.02.17 07:34. Заголовок: Scriptong пишет: Та..


Scriptong пишет:

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


Функцию на мелкие не стал разбивать - но предложенный вами вариант

 цитата:
f(IsShowPPRPattern && newPatternName == NONE_INDEX)


позволил сократить число обращение функций ккаждому бару, Так теперь поиск самого важного паттерна WRB происходит на 1000 барах, поиск PPR происходит уже на 949 барах, а паттерн рельсы вообще ищется только 783 барах.
И кстати говоря, функцию IsPatternWorked маленько модифицировал, но суть осталась прежней и она таки не тормазит индикатор теперь, а число обращений к ней составляет общему числу найденных паттернов, в текущем случае - 303 раза.


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





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


evbut пишет:

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


Вы убрали цикл из этой функции? Если цикл убрать, то индикатор будет "летать"

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



Сообщение: 65
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 12.02.17 12:13. Заголовок: Это функция IsPatter..



 цитата:
Это функция IsPatternWorked().


Познакомился с профилированием..Двойной вызов этой функции убрал. Вызовов самой функции сейчас на 1000 баров истории составляет 278, что соответствует количеству найденных паттернов. Однако вызовов iLow в ней 20650, хотя iHigh из нее же - 4951. Откуда такая разница в вызове этих строк, ведь они выполняют похожие действия и баров одинаковое количество проверяют? По логике их должно быть максимум 278 каждая...


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

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