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



Сообщение: 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 
ПрофильЦитата Ответить
Новых ответов нет , стр: 1 2 3 4 5 6 All [см. все]







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


evbut пишет:

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


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

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



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


Scriptong пишет:

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


Оно так и есть, я лишь на примере бычьих показал... Какими-то участками то бычьи, то медвежьи не верно запоминает (( Не думал, что один и тот же код по разному воспринимается переменными, в частности enum...
В общем и эта проблема решилась... Оставил код определения факта отработки такой же как и для цвета, а энум оставил такой

 цитата:
enum ENUM_GET_TARGET
{
ACTUAL, //Актуальный
WORKED
};


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

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





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


evbut пишет:

 цитата:
В общем и эта проблема решилась... Оставил код определения факта отработки такой же как и для цвета, а энум оставил такой


Перечисление в данном случае не при чем. Не нужно было его менять. NONE - это тип неопределенного паттерна. Он необходим для правильной работы индикатора.
По всей видимости, Вы не поняли, в чем именно проблема. В таком случае попытаюсь объяснить еще раз.
В приведенном коде видно, что проверка достижения цели паттерна происходит на всем участке истории от момента формирования паттерна до нулевого бара. И это правильно. Но упущен важный момент: когда найдено достижение цели паттерна, требуется прекращение дальнейшего хода цикла.
К примеру, найден паттерн на баре с индексом 5. После этого запускается цикл поиска достижения цели от бара с индексом 4 до текущего бара (с индексом 0). Допустим, цель достигнута на 3-ем баре, а после этого цена откатила и больше не достигала цели. Приведенный код поставит на 3-ем баре признак WORKED, но потом перейдет к барам 2, 1 и 0, где цель не достигнута, и вернет признак ACTUAL обратно. А нужно сделать так, чтобы признак ACTUAL уже не мог быть установлен, если признак WORKED имеется.

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



Сообщение: 47
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 19.12.16 16:42. Заголовок: Scriptong пишет: По..


Scriptong пишет:

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


Этот момент я понимаю, не вразумлю только в каком месте цикла нужно брикнуть, чтоб срабатывала проверка Новый обнаруженный паттерн обозначает как ACTUAL, но не перепроверяется на актуальность база паттернов ладе на новой свече... Видимо для этого дела лучше делать отдельную функцию ведь эта проверка всего лишь условие не являющееся обязательным - if(ShowWorkedpattern) - чтобы вносить ее в БД

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





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


evbut пишет:

 цитата:
Этот момент я понимаю, не вразумлю только в каком месте цикла нужно брикнуть, чтоб срабатывала проверка


Как только обнаружено достижение цели (WORKED) нужно выходить из цикла, чтобы не перезаписать вновь значение ACTUAL. Хотя в Вашем случае более уместно добавить проверку в цикл k:

 цитата:
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 && g_patterns.patternTarget == ACTUAL; 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 && g_patterns.patternTarget == ACTUAL; 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);
}



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



Сообщение: 48
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 21.12.16 05:45. Заголовок: Scriptong пишет: К ..


Scriptong пишет:

 цитата:
К примеру, найден паттерн на баре с индексом 5. После этого запускается цикл поиска достижения цели от бара с индексом 4 до текущего бара (с индексом 0). Допустим, цель достигнута на 3-ем баре, а после этого цена откатила и больше не достигала цели. Приведенный код поставит на 3-ем баре признак WORKED, но потом перейдет к барам 2, 1 и 0, где цель не достигнута, и вернет признак ACTUAL обратно. А нужно сделать так, чтобы признак ACTUAL уже не мог быть установлен, если признак WORKED имеется.


А принты не говорят об этом, а показывают отработан паттерн. Вывел специально текстовое описание паттерна, которое показывает тип паттерна и его отработанность... Все говорит о том, что Ваша верная логическая цепочка не работает дальше момента, когда цель достигнута на 3-ьем баре, на барах со 2 по 0 факт WORKED не переписывается. Или я самообманываюсь?


 цитата:

//+-------------------------------------------------------------------------------------+
//| Актуален ли паттерна |
//+-------------------------------------------------------------------------------------+
ENUM_GET_TARGET 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; k>=0; k--)
{
if(iLow(NULL,0,k)<g_patterns.patternTarget)
g_patterns.getTarget=WORKED;
}
}
if(g_patterns.patternType==BULL_TYPE)
{
for(int k=g_patterns.rightBarIndex; k>=0; k--)
{
if(iHigh(NULL,0,k)>g_patterns.patternTarget)
g_patterns.getTarget=WORKED;
}
}
}
return (g_patterns[ArraySize(g_patterns)-1].getTarget);
}


Объясните почему в энуме по отработке стоит оставить NONE? Ведь по сути у паттерна не может быть такого состояния. Как только паттерн обнаружился он по факту ACTUAL пусть даже на долю секунды на минутном графике при выходе новостей и бешенной скорости изменения цены.

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





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


evbut пишет:

 цитата:
Объясните почему в энуме по отработке стоит оставить NONE? Ведь по сути у паттерна не может быть такого состояния.


В момент инициализации паттерна такое значение может быть. То есть когда паттерна нет (он не ACTUAL и не WORKED).

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



Сообщение: 45
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 19.12.16 03:20. Заголовок: Игорь, подскажите, к..


Игорь, подскажите, как заставить индикатор рисовать в тестере? Тяжко на минутном графике даже выжидать как он работает в реале ))
Но таки высмотрел такой момент.Функцию FindAndShowPatterns малость переделал
Скрытый текст

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

 цитата:
int total;
int limit=GetRecalcIndex(total,rates_total,prev_calculated); // Определим первый расчетный бар

for(int i=limit; i>0; i--) // Обработаем все новые бары
{
FindAndShowPatterns(i);
ChartRedraw();
}
return rates_total;


НЕ пойму почему, подскажите, пожалуйста

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





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


evbut пишет:

 цитата:
НЕ пойму почему, подскажите, пожалуйста


Скорее всего, проблема в функции отображения паттерна. Покажите ее код (ShowRectangle)

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



Сообщение: 46
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 19.12.16 16:38. Заголовок: Scriptong пишет: По..


Scriptong пишет:

 цитата:
Покажите ее код (ShowRectangle)



 цитата:
void ShowRectangle(string name,datetime time1,double price1,datetime time2,
double price2,string toolTip,color clr)
{
if(ObjectFind(name)<0) // Если объект не существует
{
ObjectCreate(0,name,OBJ_RECTANGLE,0,time1,price1,time2,price2);
ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
ObjectSetInteger(0,name,OBJPROP_WIDTH,LineWidth);
ObjectSetInteger(0,name,OBJPROP_STYLE,LineStyle);
ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
ObjectSetInteger(0,name,OBJPROP_BACK,FillRectangle);
ObjectSetString(0,name,OBJPROP_TOOLTIP,toolTip);
return;
}
ObjectMove(name,0, time1, price1); // Перемещение существующего объекта
ObjectMove(name, 1, time2, price2); // Перемещение существующего объекта
}



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





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


evbut пишет:

 цитата:
Покажите ее код (ShowRectangle)


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

 цитата:

void ShowRectangle(string name,datetime time1,double price1,datetime time2,
double price2,string toolTip,color clr)
{
if(ObjectFind(name)<0) // Если объект не существует
{
ObjectCreate(0,name,OBJ_RECTANGLE,0,time1,price1,time2,price2);
ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
ObjectSetInteger(0,name,OBJPROP_WIDTH,LineWidth);
ObjectSetInteger(0,name,OBJPROP_STYLE,LineStyle);
ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
ObjectSetInteger(0,name,OBJPROP_BACK,FillRectangle);
ObjectSetString(0,name,OBJPROP_TOOLTIP,toolTip);
return;
}
ObjectMove(name,0, time1, price1); // Перемещение существующего объекта
ObjectMove(name, 1, time2, price2); // Перемещение существующего объекта
ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
}



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



Сообщение: 51
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 27.12.16 08:52. Заголовок: Scriptong пишет: Ка..


Scriptong пишет:

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


Добавил не достающую строку, всю равно не перекрашивает (( Вся перекраска происходит только после обновления графика или в момент инициализации индикатора. Такое ощущение, что чего-то не хватает, где-то чего не учел я - не соображу... уже голову наизнанку вывернул. Уже и функцию цвета переделал под манер функции проверки ACTUAL или WORKED паттерн (ее пока оставил, ибо не удобно следить). Видно надо перекур сделать ))

Скрытый текст



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





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


evbut пишет:

 цитата:
Добавил не достающую строку, всю равно не перекрашивает (( Вся перекраска происходит только после обновления графика или в момент инициализации индикатора. Такое ощущение, что чего-то не хватает, где-то чего не учел я - не соображу... уже голову наизнанку вывернул. Уже и функцию цвета переделал под манер функции проверки ACTUAL или WORKED паттерн (ее пока оставил, ибо не удобно следить). Видно надо перекур сделать ))


Давайте тогда уже весь индикатор (приаттачьте через dropmefiles или любой другой ресурс). Ведь по обрывку кода трудно что-то сказать.

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



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


Scriptong пишет:

 цитата:
Давайте тогда уже весь индикатор


Тынц Ссыль действительна 6 дней

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





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


evbut пишет:

 цитата:
Тынц Ссыль действительна 6 дней


Скачал. Посмотрю уже в следующем году

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

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