Отправлено: 04.02.15 21:32. Заголовок: Вопросик по советнику
Добрый день Игорь.
Я Вам посылал вопрос на почту: Почему при присоединении советника к графику он сразу открывает ордер. Хотя условия прошли, а новые еще не появились?
Индикаторы:
CrossMA, Parabolic, OsMA
Вы ответили:
"Добрый день.
Вы устанавливаете набор трендовых индикаторов, которые дают сигнал постоянно, у них нет таких моментов, когда сигнала вообще нет.
Так: 1. МА дает сигнал покупки всегда, пока быстрая средняя выше медленной, сигнал продажи - быстрая ниже медленной. 2. Parabolic дает сигнал покупки, пока цена закрытия выше точки, и сигнал продажи, пока цена ниже точки. 3. OsMA дает сигнал покупки, пока линия выше нуля, и сигнал продажи, пока линия ниже нуля.
Очевидно, что совпадение сигналов будет достаточно часто. В итоге практически всегда, когда включается советник, а на счете нет рыночного ордера, открытого им, он будет открывать сделку. После открытия сделки советник просто ждет ее закрытия (по ТР, SL или вручную). Как только это произойдет и сформируется новый сигнал (скорее всего, на той же или на следующей свече) вновь будет открыта сделка.
Чтобы сигналы не совпадали так часто, используйте в наборе хотя бы один нетрендовый индикатор (к примеру RSI)."
Дело в том, что я ставлю не просто MA индикатор, а crossMA - там сигнал на пересечение.
Дело в том, что я ставлю не просто MA индикатор, а crossMA - там сигнал на пересечение.
Посмотрел еще раз код CE_CrossMA. Все то же - индикатор держит сигнал Buy, пока быстрая выше медленной, и сигнал Sell, пока быстрая ниже медленной. Поэтому советник будет открывать ордер практически всегда (когда совпадает направление по другим трендовым индикаторам), если "своего" ордера нет.
Отправлено: 05.02.15 22:53. Заголовок: Любая из стратегий М..
Любая из стратегий Мартингейла - это не такая уж и простая программа, парой-тройкой строк не отделаешься. Если приведенные Вами изменения в коде комплексного советника - это все изменения, то, конечно же, работать не будет. Так, при открытии ордера Вы сохраняете тикет в переменную ticket, которая не является глобальной переменной - она локальная. Но даже если бы она и была глобальная, то где гарантия, что между открытием одного ордера и открытием следующего эксперт не был хотя бы переинициализирован, что приведет к очистке данных в переменной ticket?
Чтобы открыть ордер, опираясь на данные о закрытии предыдущего ордера, необходимо: 1. Придумать логическую связку между ордерами одной серии (когда последующий ордер должен продолжать увеличение или уменьшение лота на основании предыдущего). К примеру, делается это через MagicNumber, в который записывается номер колена Мартингейла. Так, если ордер продолжает серию, то в его MagicNumber записывается номер колена на 1 больший, чем номер колена у предыдущего ордера. Иначе номер колена сбрасывается в 0 (или 1, смотря какая логика принята). 2. Перед очередным открытием ордера просматривается история счета на предмет поиска последнего закрытого ордера эксперта. 3. Когда такой ордер найден (определен его тикет), то можно воспользоваться и тем кодом, который Вы привели. Только N в этом коде будет не подсчитываться, а браться непосредственно из MagicNumber последнего закрытого ордера.
Scriptong пишет: [quote]` Спасибо. буду что то думать.
А комплексный советник все равно. Время приходит, когда разрешено торговать и он сразу открывает ордер хотя условия прошли . Может как то открыт первый сигнал? Комплексный v2.
Варианта три: 1. На момент запуска советника должен существовать его рыночный ордер, соответствующий сигналу. 2. Необходимо использовать один из индикаторов, которые дают "точечный" сигнал. Например, RSI. 3. Переделать код CE_CrossMA так, чтобы индикатор выдавал сигнал только в момент пересечения средних, а не все время.
Варианта три: 1. На момент запуска советника должен существовать его рыночный ордер, соответствующий сигналу. 2. Необходимо использовать один из индикаторов, которые дают "точечный" сигнал. Например, RSI. 3. Переделать код CE_CrossMA так, чтобы индикатор выдавал сигнал только в момент пересечения средних, а не все время.
В коде видно :
// - 3 - ======================= Выдача сигналов ======================================== if (LastBar != Time[0]) // Один раз за один бар
А можно как то записать сигнал на последнем баре? При загрузке советника сигнал устарел, почему он хранится в глобальной переменной? Как то записывать время срабатывания сигнала и бара и предоставлять советнику или как то обнулять.
Как думаете?
1. Вариант не подходит, он и так открывает его сразу. 2. Использовать индикатор, тогда стратегия не будет работать. Нет такого индикатора, чтобы показывал тот же вход. Он будет или позже или раньше. 3. Да. Можно или добавить в условие FastMA > = LowMA. Либо добавить третью MA? например SrMA (средняя). Поможет фильтрануть. Хм.
При загрузке советника сигнал устарел, почему он хранится в глобальной переменной?
Глобальная переменная хранит свое значение, если ее не удалять. В каждом из индикаторов типа CE при окончании его работы производится удаление глобальных переменных. Так что в них всегда находятся актуальные значения.
Вот сделал. Но что то не открывает. Что то не хватает )
Вы сравниваете значения одних и тех же элементов массивов, а нужно - разных. Т. е.:
цитата:
if (FastMA[1] > SlowMA[1] && FastMA[2] < SlowMA[2]) GlobalVariableSet(Signal, 1); else if (FastMA[1] < SlowMA[1] && FastMA[2] > SlowMA[2]) GlobalVariableSet(Signal, -1); // Sell else GlobalVariableSet(Signal, 0); // Нет сигнала
Сначала сверяете значения на первом баре, а потом - на втором. В посте ниже Вы именно так и делаете, но зачем-то массивы убрали. Ну и четыре массива, конечно же, это перебор
P. S. Литера i в квадратных скобках воспринимается движком форума как BB-код курсив. Чтобы обойти это ограничение, ставьте пробелы вокруг литеры i. Вот так: [ i ].
Сначала сверяете значения на первом баре, а потом - на втором. В посте ниже Вы именно так и делаете, но зачем-то массивы убрали. Ну и четыре массива, конечно же, это перебор
P. S. Литера i в квадратных скобках воспринимается движком форума как BB-код курсив. Чтобы обойти это ограничение, ставьте пробелы вокруг литеры i. Вот так: [ i ].
спасибо. заработал. но появилась другая проблема. открывает через 3-4 пересечения. открывает 3 раза на пересечении потом пропускает 3-4 пересечения и только потом открывает. подскажите пожалуйста.
спасибо. заработал. но появилась другая проблема. открывает через 3-4 пересечения. открывает 3 раза на пересечении потом пропускает 3-4 пересечения и только потом открывает. подскажите пожалуйста.
С телепатией у меня пока туго. Приведите коды измененного индикатора и советника (если изменяли его). Файлы лучше закачать на какой-нибудь файловый сервер (например, dropmefiles.com), чтобы не выбрасывать на форум простыню исходного кода.
Отправлено: 11.02.15 07:17. Заголовок: Scriptong пишет: С ..
Scriptong пишет:
цитата:
С телепатией у меня пока туго. Приведите коды измененного индикатора и советника (если изменяли его). Файлы лучше закачать на какой-нибудь файловый сервер (например, dropmefiles.com), чтобы не выбрасывать на форум простыню исходного кода.
Добрый день Игорь. Спасибо за советы. Разобрался. Я поставил торговлю с 7 до 21. А в тестере забыл про это. Поэтому он не все пересечения открывал. )))
Кстати, тех двух строчек хватило, чтобы работал мартин. Сам в шоке. Открывает на ура удвоенную позицию.
Отправлено: 11.02.15 10:04. Заголовок: Вопросик по советнику
А. совсем забыл. Все хотел спросить. Дело в том что советник открывает позицию слишком поздно. После пересечения следующая свеча закрывается и еще на следующей после закрытия только открывается ордер. Я понимаю что на текущем баре цена может прыгать и соответственно пересечение. Но хотя бы на открытии следующей возможно открывать ордер?
Дело в том что советник открывает позицию слишком поздно. После пересечения следующая свеча закрывается и еще на следующей после закрытия только открывается ордер. Я понимаю что на текущем баре цена может прыгать и соответственно пересечение. Но хотя бы на открытии следующей возможно открывать ордер?
Проверил. Оригинальный CE_CrossMA выдает сигналы вовремя. Их также вовремя обрабатывает комплексный советник. Ни о какой задержке речь не идет:
Поэтому, опять же, нужен измененный Вами код. Тогда помочь будет возможно.
Да. вижу. Может у меня как проскальзование иногда происходит. (Вроде в коде на открытие ордера видел 3-ка - проскальзование).
Проскальзывание к сигналу не имеет никакого отношения. Разве что в баре будет слишком мало тиков для того, чтобы советник успел открыть позицию. Но на ТФ выше М1 это крайне маловероятно.
mitanq777 пишет:
цитата:
Я вот всю голову "сломал" решил сделать тогда, чтобы открывал сразу после сигнала на текущем баре.
Давайте конкретнее - о чем именно идет речь? Если речь о том, чтобы открываться на том баре, где пересечение только начинается, то это невозможно, т. к. является подглядыванием в будущее. Если же имеется в виду что-то другое, то, пожалуйста, опишите проблему подробнее.
Давайте конкретнее - о чем именно идет речь? Если речь о том, чтобы открываться на том баре, где пересечение только начинается, то это невозможно, т. к. является подглядыванием в будущее. Если же имеется в виду что-то другое, то, пожалуйста, опишите проблему подробнее.
Добрый вечер Игорь!
Ситуация такая. Цена изменяется каждый тик. И в течении одного бара она может подниматься и опускаться. Соответственно, если произошло пересечение в данный момент в текущем баре, возможно ли обработать этот тик? То есть записать сигнал и советник откроет позицию?
Это уже произошло. Это не будущее, прошлое. Да, пересечение может тоже то быть то не быть в течении одного бара, но вот оно произошло первый раз на текущем баре. Все - это сигнал. А то что будет дальше происходить с ценой уже не важно........ Понимаете?
Ситуация такая. Цена изменяется каждый тик. И в течении одного бара она может подниматься и опускаться. Соответственно, если произошло пересечение в данный момент в текущем баре, возможно ли обработать этот тик? То есть записать сигнал и советник откроет позицию?
Это уже произошло. Это не будущее, прошлое. Да, пересечение может тоже то быть то не быть в течении одного бара, но вот оно произошло первый раз на текущем баре. Все - это сигнал. А то что будет дальше происходить с ценой уже не важно........ Понимаете?
Эту ситуацию я понимаю лучше всего. Попробую объяснить, почему лучше не использовать ее. На текущем баре получен сигнал пересечения от какого-либо индикатора (речь не только об МА). ОК, открываем сделку. На следующем тике цена возвращается в положение, где сигнала не было. Но сделку мы уже открыли. Далее происходит следующее - цена разворачивается, формируя противоположный сигнал. Что будем делать? Реагируем на него, закрывая открытую сделку и открывая противоположную? ОК. Но по законам Мерфи, цена вновь разворачивается и снова формирует противоположный сигнал.
Думаю, дальше объяснять не нужно - на одном баре мы можем совершить с десяток сделок, ни одна из которых не даст прибыли. А вот истинное положение вещей будет сформировано только по закрытию бара. Это то положение, которые все мы видим в истории. Но в том то и дело, что раньше, чем закрытие бара, об этой истории судить нельзя.
Только кажется, что открывая сделку на опережение событий, мы что-то выигрываем. На самом деле таких опережающих сигналов до момента формирования бара существует намного больше, чем тех сигналов, которые реально дадут какой-либо выигрыш. Просто на истории мы не видим всего этого многообразия. Лечится просто - понаблюдайте за развитием цены внутри бара в визуализаторе тестера стратегий МТ4.
Эту ситуацию я понимаю лучше всего. Попробую объяснить, почему лучше не использовать ее. На текущем баре получен сигнал пересечения от какого-либо индикатора (речь не только об МА). ОК, открываем сделку. На следующем тике цена возвращается в положение, где сигнала не было. Но сделку мы уже открыли. Далее происходит следующее - цена разворачивается, формируя противоположный сигнал. Что будем делать? Реагируем на него, закрывая открытую сделку и открывая противоположную? ОК. Но по законам Мерфи, цена вновь разворачивается и снова формирует противоположный сигнал.
Думаю, дальше объяснять не нужно - на одном баре мы можем совершить с десяток сделок, ни одна из которых не даст прибыли. А вот истинное положение вещей будет сформировано только по закрытию бара. Это то положение, которые все мы видим в истории. Но в том то и дело, что раньше, чем закрытие бара, об этой истории судить нельзя.
Только кажется, что открывая сделку на опережение событий, мы что-то выигрываем. На самом деле таких опережающих сигналов до момента формирования бара существует намного больше, чем тех сигналов, которые реально дадут какой-либо выигрыш. Просто на истории мы не видим всего этого многообразия. Лечится просто - понаблюдайте за развитием цены внутри бара в визуализаторе тестера стратегий МТ4.
Так и знал, что Вы так ответите. В тестере смотрел уже очень много раз. Стратегия позволяет.
Так вот. Сигнал появляется (пересечение) и открываем ордер. И не важно, что потом цена может развернуться или будет еще раз пересечение на текущем баре. Советник открыл ордер со своим magik и второго ордера он уже не откроет.
Советник открыл ордер со своим magik и второго ордера он уже не откроет.
А как насчет того, что затем в истории пересечения вполне может не быть? То есть на время цена дала сигнал, но потом его отменила. Таких случаев тоже немало. Особенно, когда средние находятся друг возле друга. В итоге от упреждения этого сигнала вреда будет больше, чем выигрыша.
То есть на время цена дала сигнал, но потом его отменила.
У меня другие индикаторы фильтруют скачки. Я долго тестировал в тестере. Подгонял параметры. Доделал советника для бинарных опционов. Даже "мартингейл" прикрутил )))
А вот с открытием ордера на новом баре не могу разобраться. То есть на тике открывать (на пересечении например) Подскажите пожалуйста что надо убрать?
Пробовал закомментировать вот эти строки: // - 3 - ======================= Выдача сигналов ======================================== -------->>>>>> // if (LastBar != Time[0]) // Один раз за один бар -------->>>>>> // { if (FastMA[1] > SlowMA[1]) GlobalVariableSet(Signal, 1); else if (FastMA[1] < SlowMA[1]) GlobalVariableSet(Signal, -1); // Sell else GlobalVariableSet(Signal, 0); // Нет сигнала GlobalVariableSet(STime, Time[0]); // Время последнего обновления -------->>>>>> // LastBar = Time[0]; -------->>>>>> // } // - 3 - ============================ Окончание блока ===================================
Для проведения многих изменений недостаточно что-то добавить или убрать. Так и в этом случае нужно полностью изменить логику советника и индикаторов. Не на один час работы, если делать хорошо. Для "абы как", может быть, можно и за полчаса управиться.
Для проведения многих изменений недостаточно что-то добавить или убрать. Так и в этом случае нужно полностью изменить логику советника и индикаторов. Не на один час работы, если делать хорошо. Для "абы как", может быть, можно и за полчаса управиться.
Ясно. Будет повод изучать mql4. Придется Сделать отдельного советника на эти три индикатора, если уж совсем туго будет. В любом случае спасибо за ответы.
Придется Сделать отдельного советника на эти три индикатора, если уж совсем туго будет.
Если есть конкретная стратегия, то, действительно, лучше сделать специальный советник. Комплексный советник - это больше конструктор для исследований. К тому же у него очень много ограничений.
Есть такая функция OnTick () но она используется только в советнике. А дело в индикаторе!? Подскажите?
Функция OnTick - это обработчик события поступления нового тика в обновленном MQL4, аналог функции start, используемой в "старом" MQL4. Сейчас в советниках вместо start лучше использовать OnTick по той простой причине, что этот подход яснее - код советника невозможно перепутать с кодом индикатора, как раньше. В индикаторах теперь вместо функции start используется обработчик событий OnCalculate.
Это было лишь объяснение. Сам вопрос я пока не понял. Попробуйте сформулировать его по-другому.
Все даты в формате GMT
2 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет