Форум » Консультации по программированию » Комплексный советник. » Ответить

Комплексный советник.

mitanq: Добрый день. Игорь а возможно ли прикрутить мартингейл к комплексному советнику?

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

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

mitanq777: Добрый день Игорь. Я Вам посылал вопрос на почту: Почему при присоединении советника к графику он сразу открывает ордер. Хотя условия прошли, а новые еще не появились? Индикаторы: CrossMA, Parabolic, OsMA Вы ответили: "Добрый день. Вы устанавливаете набор трендовых индикаторов, которые дают сигнал постоянно, у них нет таких моментов, когда сигнала вообще нет. Так: 1. МА дает сигнал покупки всегда, пока быстрая средняя выше медленной, сигнал продажи - быстрая ниже медленной. 2. Parabolic дает сигнал покупки, пока цена закрытия выше точки, и сигнал продажи, пока цена ниже точки. 3. OsMA дает сигнал покупки, пока линия выше нуля, и сигнал продажи, пока линия ниже нуля. Очевидно, что совпадение сигналов будет достаточно часто. В итоге практически всегда, когда включается советник, а на счете нет рыночного ордера, открытого им, он будет открывать сделку. После открытия сделки советник просто ждет ее закрытия (по ТР, SL или вручную). Как только это произойдет и сформируется новый сигнал (скорее всего, на той же или на следующей свече) вновь будет открыта сделка. Чтобы сигналы не совпадали так часто, используйте в наборе хотя бы один нетрендовый индикатор (к примеру RSI)." Дело в том, что я ставлю не просто MA индикатор, а crossMA - там сигнал на пересечение.

mitanq777: mitanq777 пишет: Вообщем поставил торговлю по времени и перестал сразу открывать ордер.


Scriptong: mitanq777 пишет: Дело в том, что я ставлю не просто MA индикатор, а crossMA - там сигнал на пересечение. Посмотрел еще раз код CE_CrossMA. Все то же - индикатор держит сигнал Buy, пока быстрая выше медленной, и сигнал Sell, пока быстрая ниже медленной. Поэтому советник будет открывать ордер практически всегда (когда совпадает направление по другим трендовым индикаторам), если "своего" ордера нет.

mitanq777: Может подскажите что не так? Сделал чтобы советник можно было тестировать в тестере на закрытие ордеров по времени для бинарных опционов. Пытаюсь теперь прикрутить в комплексный советник антимартингейл (Открывает увеличенный лот после положительной сделки. Колен всего 2) Добавляю в советник код в функцию старт эксперта перед обработкой сигналов BY и SELL OrderSelect(ticket,SELECT_BY_TICKET); if(OrderProfit()>0) {l=OrderLots()*km; n++;} if(OrderProfit()<0 || n>N || ticket==0){ l=Lots; n=0;} Где N - количество колен мартина. rm - коэффициент умножения. Так же в открытии ордера изменил: ticket=OrderSend(Symbol(), Type, l, Price, 100, SL, TP, com, MagicNumber, 0); По идее должен открывать с удвоенным лотом. не хочет. Все перепробовал. И перед OrderSend ставил те строки. Не получается. ПОдскажите?

Scriptong: Любая из стратегий Мартингейла - это не такая уж и простая программа, парой-тройкой строк не отделаешься. Если приведенные Вами изменения в коде комплексного советника - это все изменения, то, конечно же, работать не будет. Так, при открытии ордера Вы сохраняете тикет в переменную ticket, которая не является глобальной переменной - она локальная. Но даже если бы она и была глобальная, то где гарантия, что между открытием одного ордера и открытием следующего эксперт не был хотя бы переинициализирован, что приведет к очистке данных в переменной ticket? Чтобы открыть ордер, опираясь на данные о закрытии предыдущего ордера, необходимо: 1. Придумать логическую связку между ордерами одной серии (когда последующий ордер должен продолжать увеличение или уменьшение лота на основании предыдущего). К примеру, делается это через MagicNumber, в который записывается номер колена Мартингейла. Так, если ордер продолжает серию, то в его MagicNumber записывается номер колена на 1 больший, чем номер колена у предыдущего ордера. Иначе номер колена сбрасывается в 0 (или 1, смотря какая логика принята). 2. Перед очередным открытием ордера просматривается история счета на предмет поиска последнего закрытого ордера эксперта. 3. Когда такой ордер найден (определен его тикет), то можно воспользоваться и тем кодом, который Вы привели. Только N в этом коде будет не подсчитываться, а браться непосредственно из MagicNumber последнего закрытого ордера.

mitanq777: Scriptong пишет: Спасибо. буду что то думать. А комплексный советник все равно. Время приходит, когда разрешено торговать и он сразу открывает ордер хотя условия прошли . Может как то открыт первый сигнал? Комплексный v2.

Scriptong: mitanq777 пишет: Может как то открыт первый сигнал? Варианта три: 1. На момент запуска советника должен существовать его рыночный ордер, соответствующий сигналу. 2. Необходимо использовать один из индикаторов, которые дают "точечный" сигнал. Например, RSI. 3. Переделать код CE_CrossMA так, чтобы индикатор выдавал сигнал только в момент пересечения средних, а не все время.

mitanq777: Scriptong пишет: Варианта три: 1. На момент запуска советника должен существовать его рыночный ордер, соответствующий сигналу. 2. Необходимо использовать один из индикаторов, которые дают "точечный" сигнал. Например, RSI. 3. Переделать код CE_CrossMA так, чтобы индикатор выдавал сигнал только в момент пересечения средних, а не все время. В коде видно : // - 3 - ======================= Выдача сигналов ======================================== if (LastBar != Time[0]) // Один раз за один бар А можно как то записать сигнал на последнем баре? При загрузке советника сигнал устарел, почему он хранится в глобальной переменной? Как то записывать время срабатывания сигнала и бара и предоставлять советнику или как то обнулять. Как думаете? 1. Вариант не подходит, он и так открывает его сразу. 2. Использовать индикатор, тогда стратегия не будет работать. Нет такого индикатора, чтобы показывал тот же вход. Он будет или позже или раньше. 3. Да. Можно или добавить в условие FastMA > = LowMA. Либо добавить третью MA? например SrMA (средняя). Поможет фильтрануть. Хм.

Scriptong: mitanq777 пишет: При загрузке советника сигнал устарел, почему он хранится в глобальной переменной? Глобальная переменная хранит свое значение, если ее не удалять. В каждом из индикаторов типа CE при окончании его работы производится удаление глобальных переменных. Так что в них всегда находятся актуальные значения.

mitanq777: Кажется я понял. Надо так же сделать как в RSI. 4 переменных. И думаю будет открывать только на пересечении. Вот сделал. Но что то не открывает. Что то не хватает ) // - 2 - ======================= Отображение индикатора на истории ====================== for(i = limit; i >= 0; i--) { FastMA[здесь и латинская] = iMA(NULL, 0, FastMAPeriod, FastMAShift, FastMAMethod, FastMAPrice, i); - в форуме не пишет скобки квадратные почемуто FastMA1[здесь и латинская] = iMA(NULL, 0, FastMAPeriod, FastMAShift, FastMAMethod, FastMAPrice, i+1); SlowMA[здесь и латинская] = iMA(NULL, 0, SlowMAPeriod, SlowMAShift, SlowMAMethod, SlowMAPrice, i); SlowMA1[здесь и латинская] = iMA(NULL, 0, SlowMAPeriod, SlowMAShift, SlowMAMethod, SlowMAPrice, i+1); } // - 2 - ============================ Окончание блока =================================== // - 3 - ======================= Выдача сигналов ======================================== if (LastBar != Time[0]) // Один раз за один бар { if (FastMA[1] > SlowMA[1]&&FastMA1[1] < SlowMA1[1]) GlobalVariableSet(Signal, 1); else if (FastMA[1] < SlowMA[1]&&FastMA1[1] > SlowMA1[1]) GlobalVariableSet(Signal, -1); // Sell else GlobalVariableSet(Signal, 0); // Нет сигнала GlobalVariableSet(STime, Time[0]); // Время последнего обновления LastBar = Time[0]; }

Scriptong: mitanq777 пишет: Вот сделал. Но что то не открывает. Что то не хватает ) Вы сравниваете значения одних и тех же элементов массивов, а нужно - разных. Т. е.: 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 ].

mitanq777: Scriptong пишет: Сначала сверяете значения на первом баре, а потом - на втором. В посте ниже Вы именно так и делаете, но зачем-то массивы убрали. Ну и четыре массива, конечно же, это перебор P. S. Литера i в квадратных скобках воспринимается движком форума как BB-код курсив. Чтобы обойти это ограничение, ставьте пробелы вокруг литеры i. Вот так: [ i ]. спасибо. заработал. но появилась другая проблема. открывает через 3-4 пересечения. открывает 3 раза на пересечении потом пропускает 3-4 пересечения и только потом открывает. подскажите пожалуйста.

Scriptong: mitanq777 пишет: спасибо. заработал. но появилась другая проблема. открывает через 3-4 пересечения. открывает 3 раза на пересечении потом пропускает 3-4 пересечения и только потом открывает. подскажите пожалуйста. С телепатией у меня пока туго. Приведите коды измененного индикатора и советника (если изменяли его). Файлы лучше закачать на какой-нибудь файловый сервер (например, dropmefiles.com), чтобы не выбрасывать на форум простыню исходного кода.

mitanq777: Scriptong пишет: С телепатией у меня пока туго. Приведите коды измененного индикатора и советника (если изменяли его). Файлы лучше закачать на какой-нибудь файловый сервер (например, dropmefiles.com), чтобы не выбрасывать на форум простыню исходного кода. Добрый день Игорь. Спасибо за советы. Разобрался. Я поставил торговлю с 7 до 21. А в тестере забыл про это. Поэтому он не все пересечения открывал. ))) Кстати, тех двух строчек хватило, чтобы работал мартин. Сам в шоке. Открывает на ура удвоенную позицию.

mitanq777: Хм. Странно. Массив убираю. Делаю просто переменные: FastMA = iMA(NULL, 0, FastMAPeriod, FastMAShift, FastMAMethod, FastMAPrice, 1); FastMA1 = iMA(NULL, 0, FastMAPeriod, FastMAShift, FastMAMethod, FastMAPrice, 2); SlowMA = iMA(NULL, 0, SlowMAPeriod, SlowMAShift, SlowMAMethod, SlowMAPrice, 1); SlowMA1 = iMA(NULL, 0, SlowMAPeriod, SlowMAShift, SlowMAMethod, SlowMAPrice, 2); Ошибка SetindexBuffers. И его убираю. Все работает. Но на графике не рисуются линии.......

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

Scriptong: mitanq777 пишет: Дело в том что советник открывает позицию слишком поздно. После пересечения следующая свеча закрывается и еще на следующей после закрытия только открывается ордер. Я понимаю что на текущем баре цена может прыгать и соответственно пересечение. Но хотя бы на открытии следующей возможно открывать ордер? Проверил. Оригинальный CE_CrossMA выдает сигналы вовремя. Их также вовремя обрабатывает комплексный советник. Ни о какой задержке речь не идет: Поэтому, опять же, нужен измененный Вами код. Тогда помочь будет возможно.

mitanq777: Да. вижу. Может у меня как проскальзование иногда происходит. (Вроде в коде на открытие ордера видел 3-ка - проскальзование). Я вот всю голову "сломал" решил сделать тогда, чтобы открывал сразу после сигнала на текущем баре. Стратегия позволяет, даже профит увеличит. Ведь советник откроет ордер с magik - ом своим при сигнале и больше не откроет, даже если сигнал появится еще раз на текущей свече? Подскажите что в коде убрать? Time[0] ?

Scriptong: mitanq777 пишет: Да. вижу. Может у меня как проскальзование иногда происходит. (Вроде в коде на открытие ордера видел 3-ка - проскальзование). Проскальзывание к сигналу не имеет никакого отношения. Разве что в баре будет слишком мало тиков для того, чтобы советник успел открыть позицию. Но на ТФ выше М1 это крайне маловероятно. mitanq777 пишет: Я вот всю голову "сломал" решил сделать тогда, чтобы открывал сразу после сигнала на текущем баре. Давайте конкретнее - о чем именно идет речь? Если речь о том, чтобы открываться на том баре, где пересечение только начинается, то это невозможно, т. к. является подглядыванием в будущее. Если же имеется в виду что-то другое, то, пожалуйста, опишите проблему подробнее.

mitanq777: Scriptong пишет: Давайте конкретнее - о чем именно идет речь? Если речь о том, чтобы открываться на том баре, где пересечение только начинается, то это невозможно, т. к. является подглядыванием в будущее. Если же имеется в виду что-то другое, то, пожалуйста, опишите проблему подробнее. Добрый вечер Игорь! Ситуация такая. Цена изменяется каждый тик. И в течении одного бара она может подниматься и опускаться. Соответственно, если произошло пересечение в данный момент в текущем баре, возможно ли обработать этот тик? То есть записать сигнал и советник откроет позицию? Это уже произошло. Это не будущее, прошлое. Да, пересечение может тоже то быть то не быть в течении одного бара, но вот оно произошло первый раз на текущем баре. Все - это сигнал. А то что будет дальше происходить с ценой уже не важно........ Понимаете?

Scriptong: mitanq777 пишет: Ситуация такая. Цена изменяется каждый тик. И в течении одного бара она может подниматься и опускаться. Соответственно, если произошло пересечение в данный момент в текущем баре, возможно ли обработать этот тик? То есть записать сигнал и советник откроет позицию? Это уже произошло. Это не будущее, прошлое. Да, пересечение может тоже то быть то не быть в течении одного бара, но вот оно произошло первый раз на текущем баре. Все - это сигнал. А то что будет дальше происходить с ценой уже не важно........ Понимаете? Эту ситуацию я понимаю лучше всего. Попробую объяснить, почему лучше не использовать ее. На текущем баре получен сигнал пересечения от какого-либо индикатора (речь не только об МА). ОК, открываем сделку. На следующем тике цена возвращается в положение, где сигнала не было. Но сделку мы уже открыли. Далее происходит следующее - цена разворачивается, формируя противоположный сигнал. Что будем делать? Реагируем на него, закрывая открытую сделку и открывая противоположную? ОК. Но по законам Мерфи, цена вновь разворачивается и снова формирует противоположный сигнал. Думаю, дальше объяснять не нужно - на одном баре мы можем совершить с десяток сделок, ни одна из которых не даст прибыли. А вот истинное положение вещей будет сформировано только по закрытию бара. Это то положение, которые все мы видим в истории. Но в том то и дело, что раньше, чем закрытие бара, об этой истории судить нельзя. Только кажется, что открывая сделку на опережение событий, мы что-то выигрываем. На самом деле таких опережающих сигналов до момента формирования бара существует намного больше, чем тех сигналов, которые реально дадут какой-либо выигрыш. Просто на истории мы не видим всего этого многообразия. Лечится просто - понаблюдайте за развитием цены внутри бара в визуализаторе тестера стратегий МТ4.

mitanq777: Scriptong пишет: Эту ситуацию я понимаю лучше всего. Попробую объяснить, почему лучше не использовать ее. На текущем баре получен сигнал пересечения от какого-либо индикатора (речь не только об МА). ОК, открываем сделку. На следующем тике цена возвращается в положение, где сигнала не было. Но сделку мы уже открыли. Далее происходит следующее - цена разворачивается, формируя противоположный сигнал. Что будем делать? Реагируем на него, закрывая открытую сделку и открывая противоположную? ОК. Но по законам Мерфи, цена вновь разворачивается и снова формирует противоположный сигнал. Думаю, дальше объяснять не нужно - на одном баре мы можем совершить с десяток сделок, ни одна из которых не даст прибыли. А вот истинное положение вещей будет сформировано только по закрытию бара. Это то положение, которые все мы видим в истории. Но в том то и дело, что раньше, чем закрытие бара, об этой истории судить нельзя. Только кажется, что открывая сделку на опережение событий, мы что-то выигрываем. На самом деле таких опережающих сигналов до момента формирования бара существует намного больше, чем тех сигналов, которые реально дадут какой-либо выигрыш. Просто на истории мы не видим всего этого многообразия. Лечится просто - понаблюдайте за развитием цены внутри бара в визуализаторе тестера стратегий МТ4. Так и знал, что Вы так ответите. В тестере смотрел уже очень много раз. Стратегия позволяет. Так вот. Сигнал появляется (пересечение) и открываем ордер. И не важно, что потом цена может развернуться или будет еще раз пересечение на текущем баре. Советник открыл ордер со своим magik и второго ордера он уже не откроет.

Scriptong: mitanq777 пишет: Советник открыл ордер со своим magik и второго ордера он уже не откроет. А как насчет того, что затем в истории пересечения вполне может не быть? То есть на время цена дала сигнал, но потом его отменила. Таких случаев тоже немало. Особенно, когда средние находятся друг возле друга. В итоге от упреждения этого сигнала вреда будет больше, чем выигрыша.

mitanq777: Scriptong пишет: То есть на время цена дала сигнал, но потом его отменила. У меня другие индикаторы фильтруют скачки. Я долго тестировал в тестере. Подгонял параметры. Доделал советника для бинарных опционов. Даже "мартингейл" прикрутил ))) А вот с открытием ордера на новом баре не могу разобраться. То есть на тике открывать (на пересечении например) Подскажите пожалуйста что надо убрать? Пробовал закомментировать вот эти строки: // - 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 - ============================ Окончание блока =================================== Не помогло. Может что в советнике еще надо править?

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

mitanq777: Scriptong пишет: Для проведения многих изменений недостаточно что-то добавить или убрать. Так и в этом случае нужно полностью изменить логику советника и индикаторов. Не на один час работы, если делать хорошо. Для "абы как", может быть, можно и за полчаса управиться. Ясно. Будет повод изучать mql4. Придется Сделать отдельного советника на эти три индикатора, если уж совсем туго будет. В любом случае спасибо за ответы.

Scriptong: mitanq777 пишет: Придется Сделать отдельного советника на эти три индикатора, если уж совсем туго будет. Если есть конкретная стратегия, то, действительно, лучше сделать специальный советник. Комплексный советник - это больше конструктор для исследований. К тому же у него очень много ограничений. Будут проблемы с реализацией, спрашивайте.

mitanq777: Есть такая функция OnTick () но она используется только в советнике. А дело в индикаторе!? Подскажите?

Scriptong: mitanq777 пишет: Есть такая функция OnTick () но она используется только в советнике. А дело в индикаторе!? Подскажите? Функция OnTick - это обработчик события поступления нового тика в обновленном MQL4, аналог функции start, используемой в "старом" MQL4. Сейчас в советниках вместо start лучше использовать OnTick по той простой причине, что этот подход яснее - код советника невозможно перепутать с кодом индикатора, как раньше. В индикаторах теперь вместо функции start используется обработчик событий OnCalculate. Это было лишь объяснение. Сам вопрос я пока не понял. Попробуйте сформулировать его по-другому.



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