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

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

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. А в тестере забыл про это. Поэтому он не все пересечения открывал. ))) Кстати, тех двух строчек хватило, чтобы работал мартин. Сам в шоке. Открывает на ура удвоенную позицию.



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