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

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

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

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

evbut:

evbut: День добрый, Игорь... начитался статей и ваших кодов. Кстати говоря, индикатор Всплеск и полка не что иное как один из Сложных паттернов ПрайсЭкшен в вашей статье. В общем кое-что у меня получается переделать в индикаторе через структуры. Похвастаюсь куском кода, который заполняет массив структуры паттернов: //+-----------------------------------------------------------------------------+ //| Сбор данных | //+-----------------------------------------------------------------------------+ void GetData(int index, int& startBar, int &type, int &patternName) { //- 1 - == Определим тип найденного паттерна по направлению ===================== if(IsBullsPPRPattern(index) || IsBUOVBPattern(index) || IsBullsRailsPattern(index) || IsBullsTOKPattern(index)) type = BULL_TYPE; if(IsBearsPPRPattern(index) || IsBearsRailsPattern(index) || IsBearsTOKPattern(index) || IsBEOVBPattern(index)) type = BEAR_TYPE; //- 1 - == Конец =============================================================== //- 2 - == Определим левую границу найденного паттерна ========================= if(IsBullsPPRPattern(index) || IsBearsPPRPattern(index) || IsBullsTOKPattern(index) || IsBearsTOKPattern(index)) startBar = index+2; if(IsBUOVBPattern(index) || IsBEOVBPattern(index)|| IsBearsRailsPattern(index) || IsBullsRailsPattern(index)) startBar = index+1; //- 2 - == Конец =============================================================== //- 3 - == Ообозначим паттерн по названию======================================= if(IsBullsRailsPattern(index) || IsBearsRailsPattern(index)) patternName = RAILS_INDEX; if(IsBUOVBPattern(index) || IsBEOVBPattern(index)) patternName = OVB_INDEX; if(IsBullsPPRPattern(index)|| IsBearsPPRPattern(index)) patternName = PPR_INDEX; if(IsBullsTOKPattern(index) || IsBearsTOKPattern(index)) patternName = TOK_INDEX; //- 3 - == Конец =============================================================== } //+-----------------------------------------------------------------------------+ //| Заполнение массива и отрисовка паттернов | //+-----------------------------------------------------------------------------+ 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; double BuyTP = ND(lowPrice + patternHeight * FiboTarget / 100.0); double SellTP = ND(highPrice - patternHeight * FiboTarget / 100.0); // string nameofpattern = PatternName(patternName); int patternArray = ArraySize(g_patterns); if(patternDir !=0) { if( ArrayResize(g_patterns, patternArray+1, ARRAY_RESERVE_SIZE) < 0) { Alert(WindowExpertName(),(g_isRussianLang)? ": Недостаточно памяти для продолжения работы программы. Индикатор отключен.": ": Not enough memory to continue work the program. Indicator is turned off."); } g_patterns[patternArray].patternType = patternDir; g_patterns[patternArray].patternName = patternName; g_patterns[patternArray].leftBarIndex = startBar; g_patterns[patternArray].rightBarIndex = index; g_patterns[patternArray].patternHighPrice = highPrice; g_patterns[patternArray].patternLowPrice = lowPrice; if(patternDir == BEAR_TYPE) g_patterns[patternArray].patternColor = RegcolorBears; else g_patterns[patternArray].patternColor = RegcolorBulls; if(patternDir == BULL_TYPE) g_patterns[patternArray].patternTarget = BuyTP; else g_patterns[patternArray].patternTarget = SellTP; //Проверка паттерна на отработку таргета if(IsShowWorked) 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.patternColor = WorkColor; } } 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.patternColor = WorkColor; } } } // === Отрисуем паттерны =========== if(!IsShowALLPatterns) DeleteAnyPattern(index, index+2); // Удаление перекрытых паттернов if(IsRectangleShow) { string name = GetUniqueID(g_patterns[patternArray], FIRST_PART); /*string name = GetObjectName(g_patterns[patternArray].rightBarIndex, g_patterns[patternArray].patternType, FIRST_PART);// Имя объекта паттерна*/ ShowRectangle(name, Time[g_patterns[patternArray].leftBarIndex], g_patterns[patternArray].patternLowPrice, Time[g_patterns[patternArray].rightBarIndex],g_patterns[patternArray].patternHighPrice, "",g_patterns[patternArray].patternColor); } /*string name = GetObjectName(g_patterns[patternArray].rightBarIndex, g_patterns[patternArray].patternType, SECOND_PART);// Имя объекта паттерна */ string name = GetUniqueID(g_patterns[patternArray], SECOND_PART); ShowTarget(name, Time[g_patterns[patternArray].leftBarIndex], g_patterns[patternArray].patternTarget, Time[g_patterns[patternArray].rightBarIndex], g_patterns[patternArray].patternTarget, "",g_patterns[patternArray].patternColor); Print(" Pattetn Count " +string(patternArray) + // " Pattern Start Bar " + g_patterns[patternArray].leftBarIndex + " Pattern End Bar " + string(g_patterns[patternArray].rightBarIndex) + " Pattern Type " + EnumToString(g_patterns[patternArray].patternType) + " Pattern Name " + EnumToString(g_patterns[patternArray].patternName)); // " Pattern Color " + g_patterns[patternArray].patternColor + // " Pattern High " + g_patterns[patternArray].patternHighPrice + // " Pattern Target " + g_patterns[patternArray].patternTarget); } } И рисует и перерисовывает, если таргет паттерна пробит - голову сломал об эту логику )) Пока это все в одной функции находится, но на 90% работает... Теперь осталось только сделать, чтоб перекрывающиеся паттерны не отображались.

Scriptong: evbut пишет: Теперь осталось только сделать, чтоб перекрывающиеся паттерны не отображались. Достаточно сложная задача. Чтобы ее решить, нужно организовать запоминание расположения паттернов. В итоге при отображении очередного паттерна нужно проверить, накладывается ли этот паттерн на какой-либо другой. Это еще несложно. Сложность в том, чтобы разработать правило, позволяющее наиболее оптимальным образом отобразить оба эти паттерна или только один из них. Для каждой подобной задачи приходится искать сугубо ее, индивидуальное, решение. К примеру, в показанном Вами случае нужно не отображать тот паттерн, который полностью перекрывается следующим паттерном. Правда, возникает вопрос: а как же указать пользователю, что имеет место наложение паттернов? В компьютерных играх такая ситуация разрешается путем отображения специального значка, указывающего на наложение элементов. Затем, если игрок выделяет такой элемент, то выводится меню, показывающее все наложенные в этом месте элементы. При помощи такого меню можно получить доступ к каждому элементу. В случае с МТ подобная возможность может быть реализована. Первый подход к этому я сделал в индикаторе Скрытые гэпы. Правда, не скажу, что результатом я доволен на 100%.


evbut: Scriptong пишет: Сложность в том, чтобы разработать правило, позволяющее наиболее оптимальным образом отобразить оба эти паттерна или только один из них. Для каждой подобной задачи приходится искать сугубо ее, индивидуальное, решение. Как, видите, каждый паттерн отображается не только в виде прямоугольника, но и черточки таргета. В случае реализации полного набора паттернов прайс экшен (В вашем индикаторе их 11 штук) задача вами решалась посредством приоритетности (силе) того или иного паттерна. Мне нужны только 3 из них (хотя не сложно добавить и другие, как оказалось) по этому проблема наложения актуальна лишь для прямоугольников, черточки не так сильно загромождают график, поэтому, как вариант, полагаю, достаточно будет реализовать удаление или не отображение лишь прямоугольника, а для черточки, если ее паттерн еще актуальный, но перекрывается с соседним, можно добавить описание, что паттерн еще актуальный. Кстати, это момент (актуальный паттерн или нет) стоит добавить вообще ко всем паттернам. Еще вариант - возможность заливки прямоугольника на выбор, что кстати реализовано у меня, но он как бы неплохо смотрится при малом количестве паттернов (см. рисунок - рыжие - неактуальные паттерны, голубой - актуальные), а если паттернов будет 11, то это не спасет - будет чахорда линий от прямоугольников на свечах... Также можно фильтровать паттерны через ATR, если высота паттерна меньше ATR(24), то не отображается паттерн и кстати. это было бы логично, потому как зачастую чахорда происходит при низкой волатильности.

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



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