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



Сообщение: 1
Зарегистрирован: 11.04.16
Репутация: 0
ссылка на сообщение  Отправлено: 11.04.16 09:01. Заголовок: Простые паттерны Price Action


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




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





Сообщение: 15
Зарегистрирован: 11.04.16
Репутация: 0
ссылка на сообщение  Отправлено: 30.06.16 14:53. Заголовок: Scriptong пишет: Эт..


Scriptong пишет:

 цитата:
Это далеко не три-четыре строки кода. Сложность чуть ниже среднего уровня программирования.


Далеко мне еще до этого уровня )))
Но вот читаю код индикатора простых паттернов со статистикой и думаю, что из него можно что-то переделать под мою задачу. А именно вот какие куски кода интересны и думаю будут полезны.
Для Scriptong пишет:

 цитата:
1. Поиск паттерна.
2. Запись паттерна в базу данных паттернов.


использовать функцию FindPattern - ей мы находим все паттерны в истории и создаем их базу с таргетами

 цитата:
patternIndex[patternCnt] = i; // Паттерн есть - запишем номер бара,
patternDir[patternCnt] = direction; // ..направление паттерна,..
if (direction == PATTERN_BULL) // ..и рассчитаем уровень ТП
BullsTargets[patternCnt]=
if(direction ==PATTERN_BEAR)
BearsTargets[patternCnt] =


Далее для
 цитата:
3. Проверка "срабатывания" паттерна.


можно использовать код функции GetPatternProfit, где производится расчет "срабатывания" паттерна, только там берется промежуток между паттернами
 цитата:
for (int i = finish-1; i >= start; i--)

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

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





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


evbut пишет:

 цитата:
можно использовать код функции GetPatternProfit, где производится расчет "срабатывания" паттерна, только там берется промежуток между паттернами


Здесь как раз можно проще - использовать последнюю известную цену (обрабатываемую свечу) для сравнения достижения цели. То есть не нужно перебирать все свечи от паттерна до конца истории. Это будет делаться на этапе поиска новых паттернов, а затем на обработке каждого нового тика.

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



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


Scriptong пишет:

 цитата:
Здесь как раз можно проще - использовать последнюю известную цену (обрабатываемую свечу) для сравнения достижения цели. То есть не нужно перебирать все свечи от паттерна до конца истории. Это будет делаться на этапе поиска новых паттернов, а затем на обработке каждого нового тика.


Не... не по силам мне все это Взываю к Вашей помощи

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





Сообщение: 2230
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 01.07.16 20:44. Заголовок: evbut пишет: Не... ..


evbut пишет:

 цитата:
Не... не по силам мне все это Взываю к Вашей помощи


К примеру, имеются массивы целей Buy и Sell от паттернов:

 цитата:
double buyTargets[], sellTargets[];
// Заполнение массивов с постепенным изменением размера каждого из них


Это наша "база данных".
Далее достаточно на каждом тике проверить, есть ли достижение цели того или иного паттерна:

 цитата:
int arraySize = ArraySize(buyTargets);
for (int i = 0; i < arraySize; i++)
if (Bid >= buyTargets[ i ])
{
// Удаление паттерна из массива, т. к. он отработал
}


Аналогично для Sell-целей:

 цитата:
int arraySize = ArraySize(sellTargets);
for (int i = 0; i < arraySize; i++)
if (Bid <= sellTargets[ i ])
{
// Удаление паттерна из массива, т. к. он отработал
}



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



Сообщение: 17
Зарегистрирован: 11.04.16
Репутация: 0
ссылка на сообщение  Отправлено: 02.07.16 16:17. Заголовок: Scriptong пишет: Э..



Scriptong пишет:

 цитата:
Это наша "база данных".
Далее достаточно на каждом тике проверить, есть ли достижение цели того или иного паттерна:


Добрый день, Игорь. Очень признателен вам за оперативное участие в решении моего вопроса. Увидел ваше сообщение уже после того как сам "навыдумывал" код. Сильно не смейтесь только )))
Пока решил оставить перекрашивание отработанных паттернов в другой цвет. Вот что нашаманил, но не отображается...

 цитата:
//+-------------------------------------------------------------------------------------+
//| Поиск паттернов указанного типа в истории |
//+-------------------------------------------------------------------------------------+
int FindHistoryPatterns(int patternType, int total, int& patternCnt, int& patternIndex[],
int& patternDir[], double& BullsTargets[], double& BearsTargets[])
{
int patternStart, condition;

// - 1 - ====== Найдем все паттерны в истории ===========================================
for (int i = 2; i < total; i++) // Идем справа налево по графику,..
{ // ..проверяя наличие паттерна на..
int direction = GetPatternDirection(i, total, // .. каждом баре
patternType, patternStart);

if (direction == PATTERN_NO) // Паттерна нет - идем дальше
continue;

patternIndex[patternCnt] = i; // Паттерн есть - запишем номер бара,
patternDir[patternCnt] = direction; // ..направление паттерна,..

// и расчитаем уровни целей
//в зависимости от направления
if(direction == PATTERN_BULL)
BullsTargets[patternCnt] = Low[iLowest(NULL,0,MODE_LOW,patternStart - i + 1, i)]
+ (High[iHighest(NULL,0,MODE_HIGH,patternStart - i + 1, i)]
- Low[iLowest(NULL,0,MODE_LOW,patternStart - i + 1, i)])
* FiboTarget /100;

if(direction ==PATTERN_BEAR)
BearsTargets[patternCnt] = High[iHighest(NULL,0,MODE_HIGH,patternStart - i + 1, i)]
- (High[iHighest(NULL,0,MODE_HIGH,patternStart - i + 1, i)]
- Low[iLowest(NULL,0,MODE_LOW,patternStart - i + 1, i)])
* FiboTarget / 100;

patternCnt++; // Количество паттернов увеличилось
}
RefreshRates();
ArrayResize(patternIndex, total); // Максимальное кол-во паттернов на..
ArrayResize(patternDir, total); // ..этом участке истории
ArrayResize(BullsTargets,total);
ArrayResize(BearsTargets,total);

for (i = patternCnt-1; i >= 0; i--) // По массиву паттернов
{
if(direction == PATTERN_BULL)
{
if(High >= BullsTargets)
return (GETED_TARGET);
else
return(UNGETED_TARGET);
}
if(direction == PATTERN_BEAR)
{
if(Low <= BearsTargets)
return(GETED_TARGET);
else
return(UNGETED_TARGET);
}
}
return(condition);
}


Тут как бы понятно, что находим паттерны в истории с их таргетами, записываем их в массивы и паттерны и таргеты с привязкой к паттерну. В целом же думаю, чтобы эта функция возвращала состояние отработанности (GETED_TARGET или UNGETED_TARGET), которая передается в функцию FindAndShowPatterns (через нее настраивается отображение паттернов), которую подправляю, чтобы согласно полученному condition изменялся цвет отображаения паттернов. Кусочек этой функции:

 цитата:
static datetime lastAlert = 0;

int patternType, patternCnt, patternIndex[], patternDir[];
double BullsTargets[], BearsTargets[];

int condition = FindHistoryPatterns(patternType, total, patternCnt,patternIndex,
patternDir, BullsTargets, BearsTargets);
color clr;

if(!IsGetedTarget && condition == UNGETED_TARGET) clr = colorBulls; // для бычьих паттернов
if(IsGetedTarget && condition == GETED_TARGET) clr = GetTargetColor;



Мне кажется косяк где-то зарыт в первом куске кода... Не передается этот кондишн ((

С уважением Евгений.

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





Сообщение: 2232
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 02.07.16 21:28. Заголовок: evbut пишет: Мне ка..


evbut пишет:

 цитата:
Мне кажется косяк где-то зарыт в первом куске кода..


Не только там, а везде

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

 цитата:
#property strict


то как раз на фатальную ошибку и получим. При этом, думаю, сами и сможете разобраться, в чем причина - массивы не имеют размера. Ведь размер массивов в первом куске кода указывается только после того, как произошла в них запись данных. Это то же самое, что загружать товар в вагоны, но вагоны подавать уже после загрузки. Спрашивается: куда же мы загружали товар, если вагонов не было?

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



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


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

 цитата:

//+-------------------------------------------------------------------------------------+
//| Поиск паттернов указанного типа в истории |
//+-------------------------------------------------------------------------------------+
void FindPatterns(int total, int& BullpatternCnt, int& BearpatternCnt,
int& BullpatternIndex[], int& BearpatternIndex[],double& BullpatternTP[],
double& BearpatternTP[], int& BullTPIndex[],int& BearTPIndex[], int& GetTP)
{
int patternStart, dir;
double lowPrice, highPrice, patternHeight;

for (int i = 2; i < total; i++) // Идем справа налево по графику,..
{ // ..проверяя наличие паттерна на..
patternStart = StartIndex(i,total);
dir = Direction(i, total);

lowPrice = Low[iLowest(NULL, 0, MODE_LOW, // Нижняя граница паттерна
patternStart - i + 1, i)];
highPrice = High[iHighest(NULL, 0,MODE_HIGH, // Верхняя граница паттерна
patternStart - i + 1, i)];
patternHeight = highPrice - lowPrice;

if(dir == PATTERN_BULL)
{
BullpatternCnt++;
BullpatternIndex[BullpatternCnt] = i;
BullTPIndex[BullpatternCnt]= i; // Паттерн есть - запишем номер бара
BullpatternTP[BullpatternCnt] = lowPrice + patternHeight * FiboTarget / 100.0;
}
if(dir==PATTERN_BEAR)
{
BearpatternCnt++;
BearpatternIndex[BearpatternCnt] = i;
BearTPIndex[BearpatternCnt] = i;
BearpatternTP[BearpatternCnt] = highPrice - patternHeight * FiboTarget / 100.0;
}
}
}



2. и функция определения отработанности паттерна

 цитата:

//+-------------------------------------------------------------------------------------+
//| Проверка паттернов на отработку |
//+-------------------------------------------------------------------------------------+
int GetPatternTarget(int total)
{
// ---- обозначим и инициализируем переменные и буферы

int BullpatternCnt = 0;
int BearpatternCnt= 0;
int GetTP;
int BearpatternIndex[];
int BullpatternIndex[];
int BullTPIndex[];
int BearTPIndex[];

double BullpatternTP[];
double BearpatternTP[];
ArrayResize(BullpatternIndex, total);
ArrayResize(BullpatternTP, total);
ArrayResize(BullTPIndex,total);
ArrayResize(BearpatternIndex, total);
ArrayResize(BearpatternTP, total);
ArrayResize(BearTPIndex,total);

FindPatterns(total, BullpatternCnt, BearpatternCnt, BullpatternIndex,
BearpatternIndex, BullpatternTP, BearpatternTP, BullTPIndex, BearTPIndex, GetTP);

// - 1 - == Окончание блока =============================================================
for (int i = 0; i < BullpatternCnt; i++)
{
if (Bid >= BullpatternTP)
{
GetTP = GET_TARGET;
}
else
{
GetTP = NOTGET_TARGET;
}
Print ("Бычий паттерн № - " + BullpatternCnt + " Свеча паттерна № - "
+ BullTPIndex+ " Его таргет - " +DoubleToStr(BullpatternTP,Digits)+
" Отработал ли паттерн? " + GetTP);
}
return(GetTP);
}


Принтами проверяю то ли находится, на какой свече, с каким таргетом и отработан ли паттерн относительно Bid (GetTP - возвращает 1, если отработан и -1, если нет).

Собственно цель сообщения - просьба помочь реализовать кусок кода (скорей всего это будет не один цикл, а зацикленный цикл в цикле - не могу вразуметь этот вопрос - запутываюсь постоянно), в котором для каждого паттерна его таргет (BullpatternTP) сравнивался с хаем каждой последующей свечи начиная со свечи после формирования паттерна (BullpatternIndex -1) до тех пор пока хай не будет больше таргета, как только это случилось, паттерна перекрашивается или удаляется из массива - не суть.
Буду очень признателен


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





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


evbut пишет:

 цитата:
Игорь, предложенный вами вариант сравнения элементов массивов таргетов с Bid как бы не совсем то, чтобы хотелось видеть


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

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

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

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



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


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

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





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


evbut пишет:

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


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

evbut пишет:

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


В SplashAndShelf нет проверки отработки паттерна по фракталам. Там паттерн строится по фракталам. Срабатывание паттерна - по экстремумам свечей, т. е. так, как я и советую Вам с Price Action. Если делать проверку отработки по фракталам, то получим дополнительное запаздывание в два бара, т. к. в момент пробоя еще неизвестно, будет тут фрактал, или нет. Запаздывание мешает уже на этапе регистрации паттерна, но тут уже ничего не поделаешь. Если добавлять сюда запаздывание по пробою, то картинка совсем грустная выйдет.

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



Сообщение: 34
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 11.10.16 15:35. Заголовок: Спасибо за развернут..


Спасибо за развернутый ответ профессионала. Конечно вам видней как проще решить поставленную задачу. Не знаю насколько способностей хватит, чтобы, имея вообще поверхностное знание программирования, освоить и структуры. Пока желание получить решение моей задачи не пропало, то будем шагать в эту сторону. Глядишь и полностью индикатор перепешу)))

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





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


evbut пишет:

 цитата:
Конечно вам видней как проще решить поставленную задачу.


У одной и той же задачи, чаще всего, существует несколько решений. Но для конкретного человека такое множество решений не всегда доступно. Поэтому я говорю чисто "со своей колокольни".

evbut пишет:

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


Так может просто подтянуть уровень знаний? Ведь в этом деле основной камень преткновения - желание. Если желание получения знаний есть, то это 90% гарантии того, что все у Вас получится. Большинство программистов MQL4 именно так и учились. Я в том числе.

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



Сообщение: 35
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 11.10.16 18:09. Заголовок: Так может просто под..



 цитата:
Так может просто подтянуть уровень знаний?


Как видите на ваших примерах и статьях повышаю навыки, коль уже за структуры начали говорить )) В качестве наглядного пособия почитаю код индикатора "Всплес и полка". А вот учебного что-нить можете подсказать, документация и учебник mql4 слабоват на эту тему - там про классы больше.

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





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


evbut пишет:

 цитата:
коль уже за структуры начали говорить


Структуры - это не очень сложно, если Вы уже осилили понятие "Типы данных". Ведь структура - это пользовательский тип данных. Довольно неплохо описано вот здесь. Не смотрите, что там для C++. Ведь MQL4 - это и есть модифицированный для торговли C++. То есть примеры из статьи можно применять непосредственно в MQL4.

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



Сообщение: 36
Зарегистрирован: 11.04.16
Откуда: Иркутск
Репутация: 0
ссылка на сообщение  Отправлено: 13.10.16 04:57. Заголовок: Scriptong пишет: Ст..


Scriptong пишет:

 цитата:
Структуры - это не очень сложно, если Вы уже осилили понятие "Типы данных".


С этой штукой знаком конечно. Спасибо, обязательно почитаю и по ссылке и так, что сам найду

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

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