Анатолий, большое спасибо, жаль здесь нельзя вставить иконку, как в Скайпе с поклоном. Всё просто и элегантно получилось. Из общения с другими программами тех. анализа, понимаю, что так и должно быть, но практики работы с mql пока не хватает. Спасибо за подсказку с выделением в метод - по разбираюсь.
На послед, не подскажите как избежать, множественного выставления ордеров на одном баре этим советником? Добрые люди уже давали подсказки, но надушу не легли.
Попробовал решить вашу проблему, и вот что получилось. Впрочем обо всем по порядку.
Кто виноват и что делать? Или откуда растут ноги…
У вас в советнике, для открытия позиции (и соответственно закрытия предыдущей) используются разные настройки индикатора CCI. Для покупки, свои настройки, для продажи свои. Насколько я понял в этом и есть фишка. Например при up-тренде, выгодней использовать менее чувствительные настройки для покупки, чтобы дать прибыли «расти» (то есть имеет смысл держать позицию по тренду по дольше). В то время для продаж (при up-тренде) нужны более чувствительные настройки, для быстрых входов/выходов, при попытках например поймать коррекцию (соответственно быть в рынке с позицией против тренда по меньше времени). Все очень логично, и идея тоже не лишена здравого смысла, но возникает при такой системе один нюанс, что делать, если из-за разностей настройки (по сути, для терминала это два индикатора) возникает два противоположенных сигнала одновременно?
Про голубые стрелочки…
Советник на одном баре получает одновременно сигнал для покупки, и для продажи, а так как я писал выше, при открытии одной позиции противоположенная должна быть закрыта. Вот и получается такая картинка, дается команда купить, и закрыть продажу, так как продажи к тому моменту нет, то советник открывает BUY. На следующем тике, генерируется противоположенный сигнал, продать, и соответственно только что открытая покупка закрывается. Еще одно наблюдение, вы заметили что «колбасит» исключительно покупки (кучи голубых стрелочек)? Реализация методов купли/продажи насколько я понял, взята из учебника, а там есть такая особенность, что по завершению операции происходит выход из метода start(), оператором return, то есть за один тик может произойти только одно открытие/закрытие. Так вот, при получении «двойного сигнала», происходит закрытие всех сделок (блок закрытия описан первым), далее блок открытия сделок, а в нем покупка описана первой!!!, а после покупки происходит выход из start(), так что советник просто не успевает добраться до продаж :))) и зацикливается до тех пор пока не получит «нормальный» одиночный приказ.
Про способы решения…
Способов решения не мало. 1. Дедовский. Для начала можно «убить» идею, и просто задавать одинаковые параметры для покупок и продаж, и проблема исчезнет сама собой.
2. Сложный. Нужно вписать алгоритм определения основного тренда в советник, и соответственно придавать разный «вес» сделкам. Так при поступлении разнонаправленных сигналов, предпочтение отдавать тому, у которого больший «вес» (то есть тому, который по тренду).
3. Без названия. При поступлении разнонаправленных сигналов… Ничего не делать.
if(Opn_B && Opn_S)return;
Именно такой вариант в прикрепленном ниже файле. Надеюсь все понятно объяснил. Удачи :)))
Пост Volfram'a удален за размножение в нескольких ветках.
Volfram, Вы создали специально для этой цели свою ветку. Вам уже ответили; этого недостаточно?
P.S. Скажу Вам по секрету, Volfram: отсутствие явного интереса к Вашей идее неявно свидетельствует о том, что эта идея не заслуживает внимания. Соответственно и не нашлось желающих реализовывать ее "забисплатно".
2. Сложный. Нужно вписать алгоритм определения основного тренда в советник, и соответственно придавать разный «вес» сделкам. Так при поступлении разнонаправленных сигналов, предпочтение отдавать тому, у которого больший «вес» (то есть тому, который по тренду).
3. Без названия. При поступлении разнонаправленных сигналов… Ничего не делать.
Именно такой вариант в прикрепленном ниже файле. Надеюсь все понятно объяснил. Удачи :)))
Можно и мне добавить свою веху... :)
Я тож начинал с учебника. Можно сделать проще: Достаточно убрать закрытие бай при сигнале селл и закрытие селл при сигнале бай, т.е. не использовать свинговую торговлю, реализованную в учебнике Сергея Ковалёва... Отслеживание позиций проводить не по тикету, а по магику. Поначалу я так и сделал и спокойненько тестировал свои идеи. Далее уже написал свои функции для работы...
ЗЫ. Код не смотрел, посему могу ошибаться применительно к данному советнику...
В функции определения тренда явно указано, что если АС на первом баре больше, чем АС на втором баре (т.е. увеличивается), но тренд нисходящий (другие индюки кажут вниз), то в таком случае возвращать ноль, т.е. нет тренда вниз... Но советник упорно игнорирует, в чём может быть причина?
Ф-ция опр. тренда:
int Trend_BBOsMA (string sy, int tf)
{
if (sy=="" || sy=="0") sy=Symbol();
double
BB =iCustom(sy,tf,"BB_MA",13,13,0,1),
OsMA =iOsMA (sy,tf,9,21,5,PRICE_CLOSE,1),
AC1 =iAC(sy,tf,1),
AC2 =iAC(sy,tf,2),
AC3 =iAC(sy,tf,3);
if (BB>0 && OsMA>0 && AC1>AC2) return(1);
if (BB<0 && OsMA<0 && AC1<AC2) return(-1);
elsereturn(0);
}
Проверка на открытие доливок (в самом начале проверка тренда, на которую не реагирует: trH1 и trM15 ) - дальше эксперименты с условиями, не обращайте внимания, но код рабочий...
//============================================================================================== // Доливка 1//============================================================================================== //------------------------- Покупка 1 ------------------------ if (AddPose1 &&
trH1==1 && // Если часовой и trM15==1 && // пятнадцатиминутный тренды восходящие
Mom5_1>Mom5_2 && // найден разворот
Mom5_2<=Mom5_3 && // Моментума// Mom5_2<=100.0 &&// DeM5_1<=0.6 && // и Демаркер в зоне перепроданности// AC1>AC2 && // Ускорение вверх ----------------------- ВОТ ЗДЕСЬ УБРАЛ
SecondsAfterOpenLastPos(NULL, OP_BUY, 511)>=4*60
)
{
Magic=511; // Задаём магик...
Lots=GetSizeLot();
divider=1;
// if (trH1==10 || trM15==10) divider=2;
Lots_New=NormalizeLot(Lots/divider, true, NULL);
New_Comm="Buy_M5_Стратегия_1_Доливка1"; // Задаём комментарий для позиции
OpenPosition(NULL, OP_BUY, Lots_New, 0, 0, Magic, New_Comm);
}
//------------------------- Продажа 1 ------------------------ if (AddPose1 &&
trH1==-1 && // Если часовой и trM15==-1 && // пятнадцатиминутный тренды нисходящие
Mom5_1<Mom5_2 && // найден разворот
Mom5_2>=Mom5_3 && // Моментума// Mom5_2>=100.0 &&// DeM5_1>=0.4 && // и Демаркер в зоне перекупленности// AC1<AC2 && // Ускорение вниз ------------------------ ВОТ ЗДЕСЬ УБРАЛ
SecondsAfterOpenLastPos(NULL, OP_SELL, 511)>=4*60
)
{
Magic=511; // Задаём магик...
Lots=GetSizeLot();
divider=1;
// if (trH1==-10 || trM15==-10) divider=2;
Lots_New=NormalizeLot(Lots/divider, true, NULL);
New_Comm="Sell_M5_Стратегия_1_Доливка1"; // Задаём комментарий для позиции
OpenPosition(NULL,OP_SELL,Lots_New,0,0,Magic,New_Comm);
}
//==============================================================================================
На скриншоте не видно индикатора BB_MA. И в верхнем коде нет проверок направления тренда. Переменная ВВ будет всегда содержать одно значение. Насколько я понял, индикатор ВВ_МА - это скользящая средняя. Чтоб определить направление скользящей нужно иметь 2 значения на разных свечках, например на первой и второй свече и сравнивать эти значения между собой. Поэтому можно сказать, что верхний код выполняет свою задачу лишь отчасти.
есть у меня массив данных который хранит значения:
как найти переломы - экстремумы используя массив данных из 250 элементов и сохранить только номера элементов где находятся эти экстремумы
Организуем цикл, в котором проходим по значениям массива. Значение в предыдущей ячейке массива сравниваем со значением в текущей ячейке. Если оно больше, то переходим к следующей итерации цикла. Короче, до тех пор, пока значение в каждой последующей ячейке массива растёт, продолжаем перебор. Как только оно стало меньше предыдущего, номер предыдущей ячейки запоминаем в заранее объявленный массив, так как произошёл перелом тенденции - мы отыскали пик. Теперь тенденция едет вниз. Теперь выполняем перебор до тех пор, пока в очередной ячейке ни обнаружится значение больше, чем в предыдущей. Как только это произошло, номер предыдущей ячейки запоминаем в заранее объявленный массив, так как произошёл перелом тенденции - мы отыскали дно впадины. Можно вносить номера в разные массивы,чтоб отфильтровать пики от впадин. Словом, после полного перебора всех значений массива, мы получим отсортированные данные (искомые номера ячеек в одном/двух других массивах)
Организуем цикл, в котором проходим по значениям массива. Значение в предыдущей ячейке массива сравниваем со значением в текущей ячейке. Если оно больше, то переходим к следующей итерации цикла. Короче, до тех пор, пока значение в каждой последующей ячейке массива растёт, продолжаем перебор. Как только оно стало меньше предыдущего, номер предыдущей ячейки запоминаем в заранее объявленный массив, так как произошёл перелом тенденции - мы отыскали пик. Теперь тенденция едет вниз. Теперь выполняем перебор до тех пор, пока в очередной ячейке ни обнаружится значение больше, чем в предыдущей. Как только это произошло, номер предыдущей ячейки запоминаем в заранее объявленный массив, так как произошёл перелом тенденции - мы отыскали дно впадины. Можно вносить номера в разные массивы,чтоб отфильтровать пики от впадин. Словом, после полного перебора всех значений массива, мы получим отсортированные данные (искомые номера ячеек в одном/двух других массивах)
угу значит надо через while попробовать - это до первого пика, а потом ........ - опять не соображу
drknn: На скриншоте не видно индикатора BB_MA. И в верхнем коде нет проверок направления тренда. Переменная ВВ будет всегда содержать одно значение. Насколько я понял, индикатор ВВ_МА - это скользящая средняя. Чтоб определить направление скользящей нужно иметь 2 значения на разных свечках, например на первой и второй свече и сравнивать эти значения между собой. Поэтому можно сказать, что верхний код выполняет свою задачу лишь отчасти.
Нет, BB_MA - это я так для краткости для себя назвал Bears&Bulls_MA, который складывает значения сил быков и медведей и выводит их как гистограмму, что-то типа макдака или ему подобных. Всегда, когда гистограмма выше нуля - тренд вверх, ниже - вниз...
Посему, проверка направления тренда - это:
if (BB>0 && OsMA>0 && AC1>AC2) return(1);
для UP и
if (BB<0 && OsMA<0 && AC1<AC2) return(-1);
для DOWN, ну и
elsereturn(0);
для Flat.
Т.е. функция возвращает 1 если Bears&Bulls_MA выше ноля, OsMA выше ноля и значение первого бара АС больше значения второго бара АС,
для тренда вниз - наоборот... Ну и для флета все остальные разногласия в графиках (пока..., далее, как с этим разберусь, подключу проверку движения с ускорением/замедлением и разворот).
Открываться позиции должны только при однозначном "тренд вверх" или "тренд вниз"... В принципе, всё работало, пока я не добавил АС для контроля скорости движения валюты, дабы исключить (частично) открытия поз в конце движения, на истощении тренда или коррекции.
Анатолий, большое спасибо, жаль здесь нельзя вставить иконку, как в Скайпе с поклоном. Всё просто и элегантно получилось. Из общения с другими программами тех. анализа, понимаю, что так и должно быть, но практики работы с mql пока не хватает. Спасибо за подсказку с выделением в метод - по разбираюсь.
На послед, не подскажите как избежать, множественного выставления ордеров на одном баре этим советником? Добрые люди уже давали подсказки, но надушу не легли.
Попробовал решить вашу проблему, и вот что получилось. Впрочем обо всем по порядку.
Кто виноват и что делать? Или откуда растут ноги…
У вас в советнике, для открытия позиции (и соответственно закрытия предыдущей) используются разные настройки индикатора CCI. Для покупки, свои настройки, для продажи свои. Насколько я понял в этом и есть фишка. Например при up-тренде, выгодней использовать менее чувствительные настройки для покупки, чтобы дать прибыли «расти» (то есть имеет смысл держать позицию по тренду по дольше). В то время для продаж (при up-тренде) нужны более чувствительные настройки, для быстрых входов/выходов, при попытках например поймать коррекцию (соответственно быть в рынке с позицией против тренда по меньше времени). Все очень логично, и идея тоже не лишена здравого смысла, но возникает при такой системе один нюанс, что делать, если из-за разностей настройки (по сути, для терминала это два индикатора) возникает два противоположенных сигнала одновременно?
Про голубые стрелочки…
Советник на одном баре получает одновременно сигнал для покупки, и для продажи, а так как я писал выше, при открытии одной позиции противоположенная должна быть закрыта. Вот и получается такая картинка, дается команда купить, и закрыть продажу, так как продажи к тому моменту нет, то советник открывает BUY. На следующем тике, генерируется противоположенный сигнал, продать, и соответственно только что открытая покупка закрывается. Еще одно наблюдение, вы заметили что «колбасит» исключительно покупки (кучи голубых стрелочек)? Реализация методов купли/продажи насколько я понял, взята из учебника, а там есть такая особенность, что по завершению операции происходит выход из метода start(), оператором return, то есть за один тик может произойти только одно открытие/закрытие. Так вот, при получении «двойного сигнала», происходит закрытие всех сделок (блок закрытия описан первым), далее блок открытия сделок, а в нем покупка описана первой!!!, а после покупки происходит выход из start(), так что советник просто не успевает добраться до продаж :))) и зацикливается до тех пор пока не получит «нормальный» одиночный приказ.
Про способы решения…
Способов решения не мало.
1. Дедовский.
Для начала можно «убить» идею, и просто задавать одинаковые параметры для покупок и продаж, и проблема исчезнет сама собой.
2. Сложный.
Нужно вписать алгоритм определения основного тренда в советник, и соответственно придавать разный «вес» сделкам. Так при поступлении разнонаправленных сигналов, предпочтение отдавать тому, у которого больший «вес» (то есть тому, который по тренду).
3. Без названия.
При поступлении разнонаправленных сигналов…
Ничего не делать.
Именно такой вариант в прикрепленном ниже файле.
Надеюсь все понятно объяснил.
Удачи :)))
Пост Volfram'a удален за размножение в нескольких ветках.
Volfram, Вы создали специально для этой цели свою ветку. Вам уже ответили; этого недостаточно?
P.S. Скажу Вам по секрету, Volfram: отсутствие явного интереса к Вашей идее неявно свидетельствует о том, что эта идея не заслуживает внимания. Соответственно и не нашлось желающих реализовывать ее "забисплатно".
2. Сложный.
Нужно вписать алгоритм определения основного тренда в советник, и соответственно придавать разный «вес» сделкам. Так при поступлении разнонаправленных сигналов, предпочтение отдавать тому, у которого больший «вес» (то есть тому, который по тренду).
3. Без названия.
При поступлении разнонаправленных сигналов…
Ничего не делать.
Именно такой вариант в прикрепленном ниже файле.
Надеюсь все понятно объяснил.
Удачи :)))
Можно и мне добавить свою веху... :)
Я тож начинал с учебника. Можно сделать проще: Достаточно убрать закрытие бай при сигнале селл и закрытие селл при сигнале бай, т.е. не использовать свинговую торговлю, реализованную в учебнике Сергея Ковалёва... Отслеживание позиций проводить не по тикету, а по магику. Поначалу я так и сделал и спокойненько тестировал свои идеи. Далее уже написал свои функции для работы...
ЗЫ. Код не смотрел, посему могу ошибаться применительно к данному советнику...
никак не соображу как найти экстремумы функции
есть у меня массив данных который хранит значения:
как найти переломы - экстремумы используя массив данных из 250 элементов и сохранить только номера элементов где находятся эти экстремумы
Ребяты, а у меня вот такой вопрос:
В функции определения тренда явно указано, что если АС на первом баре больше, чем АС на втором баре (т.е. увеличивается), но тренд нисходящий (другие индюки кажут вниз), то в таком случае возвращать ноль, т.е. нет тренда вниз... Но советник упорно игнорирует, в чём может быть причина?
Ф-ция опр. тренда:
Проверка на открытие доливок (в самом начале проверка тренда, на которую не реагирует: trH1 и trM15 ) - дальше эксперименты с условиями, не обращайте внимания, но код рабочий...
Мож кто что увидит, что мне не видно? Спасибо.
никак не соображу как найти экстремумы функции
есть у меня массив данных который хранит значения:
как найти переломы - экстремумы используя массив данных из 250 элементов и сохранить только номера элементов где находятся эти экстремумы
Организуем цикл, в котором проходим по значениям массива. Значение в предыдущей ячейке массива сравниваем со значением в текущей ячейке. Если оно больше, то переходим к следующей итерации цикла. Короче, до тех пор, пока значение в каждой последующей ячейке массива растёт, продолжаем перебор. Как только оно стало меньше предыдущего, номер предыдущей ячейки запоминаем в заранее объявленный массив, так как произошёл перелом тенденции - мы отыскали пик. Теперь тенденция едет вниз. Теперь выполняем перебор до тех пор, пока в очередной ячейке ни обнаружится значение больше, чем в предыдущей. Как только это произошло, номер предыдущей ячейки запоминаем в заранее объявленный массив, так как произошёл перелом тенденции - мы отыскали дно впадины. Можно вносить номера в разные массивы,чтоб отфильтровать пики от впадин. Словом, после полного перебора всех значений массива, мы получим отсортированные данные (искомые номера ячеек в одном/двух других массивах)
Организуем цикл, в котором проходим по значениям массива. Значение в предыдущей ячейке массива сравниваем со значением в текущей ячейке. Если оно больше, то переходим к следующей итерации цикла. Короче, до тех пор, пока значение в каждой последующей ячейке массива растёт, продолжаем перебор. Как только оно стало меньше предыдущего, номер предыдущей ячейки запоминаем в заранее объявленный массив, так как произошёл перелом тенденции - мы отыскали пик. Теперь тенденция едет вниз. Теперь выполняем перебор до тех пор, пока в очередной ячейке ни обнаружится значение больше, чем в предыдущей. Как только это произошло, номер предыдущей ячейки запоминаем в заранее объявленный массив, так как произошёл перелом тенденции - мы отыскали дно впадины. Можно вносить номера в разные массивы,чтоб отфильтровать пики от впадин. Словом, после полного перебора всех значений массива, мы получим отсортированные данные (искомые номера ячеек в одном/двух других массивах)
угу значит надо через while попробовать - это до первого пика, а потом ........ - опять не соображу
На скриншоте не видно индикатора BB_MA. И в верхнем коде нет проверок направления тренда. Переменная ВВ будет всегда содержать одно значение. Насколько я понял, индикатор ВВ_МА - это скользящая средняя. Чтоб определить направление скользящей нужно иметь 2 значения на разных свечках, например на первой и второй свече и сравнивать эти значения между собой. Поэтому можно сказать, что верхний код выполняет свою задачу лишь отчасти.
Посему, проверка направления тренда - это:
для UP и
для DOWN, ну и
для Flat.
Т.е. функция возвращает 1 если Bears&Bulls_MA выше ноля, OsMA выше ноля и значение первого бара АС больше значения второго бара АС,
для тренда вниз - наоборот... Ну и для флета все остальные разногласия в графиках (пока..., далее, как с этим разберусь, подключу проверку движения с ускорением/замедлением и разворот).
Открываться позиции должны только при однозначном "тренд вверх" или "тренд вниз"... В принципе, всё работало, пока я не добавил АС для контроля скорости движения валюты, дабы исключить (частично) открытия поз в конце движения, на истощении тренда или коррекции.
Пока не работает... и именно АС
угу значит надо через while попробовать - это до первого пика, а потом ........ - опять не соображу
Нет - цикл нужно делать через for. Ща попробую скриптик такой набросать. Идея-то вобщем-то осуществима.