Обсуждение статьи "Защита от ложных срабатываний торгового робота" - страница 2

 

Чет перемудрил автор...

Тут даже писать особо не о чем... TF - интервал таймфрейма в секундах 

 

      if(OpBuy && (TimeLocal()>(T+TF)))     //...проверка возможности покупки и кончился ли бар открытия предыдущей сделки

        {

         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"SWT_exp",Magic,0,Green);

         if(ticket>0)

           {  T=TimeLocal();               //...если позиция открыта, присваиваем переменной Т текущее время

     ................................

           }

         else

    ....................................

        }


 

Не углубляясь в статью, изходя из примьера самое простое что я бы использовала  это:

int Time_open=0;


void OnTick(void)

  {

   int l_itime=0;

   l_itime=(int)iTime(_Symbol,_Period,0); //при этом в место _Period можно выбирать любой из PERIOD_M1, PERIOD_M5 ... и так далее, по желанию ограничения времени открытия нового ордера 

   if(l_itime==0)                         //обязательная проверка на ошибки 

      return;

 

   total=OrdersTotal();

   if(total<1)

     {

      if(Time_open!=l_itime)

        {

         ticket=-1;                       //обязательное присвоение начальной величины 

         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);

         if(ticket>0)

            Time_open=l_itime;

        }

     }

  }

 

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

  1. При включении советника найти последний открытый экспертом ордер.
  2. Запомнить время открытия этого ордера.
  3. Сравнить время открытия ордера с временем открытия текущей свечи. Если больше или равно, то новый ордер открывать нельзя.
  4. При последующей работе эксперта обновлять переменную, отвечающую за время открытия последнего ордера.

 
Ihor Herasko:
  1. Запомнить время открытия этого ордера.

Методов много и каждый выбирает свой. Если говорить о том что чтото надо "Запомнить", тогда можно в глобальных переменных клиентского терминала сохранить и переменную "Time_open".

 

P.S.

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

 
Andrey F. Zelinsky:

Ваш "принцип" откровенная неработоспособная ахинея.

Вот что вы предлагаете:

-- вы вводите некую переменную Time_open (секунды)

-- которая даёт возможность отработать сигнал только в пределах: от начала бара +  Time_open

-- если ордер открывается, то диапазон переменной  Time_open сужается 

-- всё это зациклено и в конечном итоге приводит к тому, что любой сигнал может отрабатывать всё ближе и ближе к открытию текущего бара

Ведь задача изначально стояла до боли простой: разрешить в рамках текущего бара входить только один раз.

И вся эта муть в Статьях, куда реально обращаются за правильными работоспособными идеями, решениями, подсказками, советами.

Нельзя такими "статьями" девальвировать ценность раздела. 

Хотя я тебя и недолюбливаю, но согласен сейчас на 100%. 

Статья вообще ни о чём!

Не в обиду автору, допуск делали модераторы. Почему пропустили? ХЗ 

datetime time_open;
...
if(time_open!=Time[0])
{
if(OrderSend()>-1) time_open=Time[0];

}
 
Vasyl Nosal:

Хотя я тебя и недолюбливаю ...

У тебя имя "Василий" -- значит пол вроде как мужской.

В плане "любви" -- по всем вопросам ЛГБД  -- не ко мне.

 
Andrey F. Zelinsky:

У тебя имя "Василий" -- значит пол вроде как мужской.

В плане "любви" -- по всем вопросам ЛГБД  -- не ко мне.

:)))) 

Ну вот. 

 
lilita bogachkova:

Методов много и каждый выбирает свой. Если говорить о том что чтото надо "Запомнить", тогда можно в глобальных переменных клиентского терминала сохранить и переменную "Time_open".

К сожалению, универсальных методов не так уж и много, чтобы между ними можно было выбирать. А вариант с глобальной переменной тоже не универсален, т. к. при запуске советника на другом компьютере, но там же счете, глобальная переменная будет отсутствовать. По этой причине вариант со сканированием истории является универсальным.
 
Ihor Herasko:
[...] вариант со сканированием истории является универсальным.
Да ваш предложенный метод универсален. Но на мой взгляд очень энерго емкий:
1. При отсутсвии открытых позиций надо перебирать и закрытые позиции;
2. Если есть открытие позиции (например хеджирование) но нет позиций открытых на текущем баре тоже надо перебирать закрытые позиции.
Если при инициализации такой подход приемлен то пры постоянной работе эксперта это лишний расход вычислительных  мощностей.

 

Ihor Herasko:
К сожалению, универсальных методов не так уж и много, чтобы между ними можно было выбирать. А вариант с глобальной переменной тоже не универсален, т. к. при запуске советника на другом компьютере, но там же счете, глобальная переменная будет отсутствовать. 

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

int Time_open=0;

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick(void)

  {

   int l_itime=0;

   l_itime=(int)iTime(_Symbol,_Period,0); //при этом в место _Period можно выбирать любой из PERIOD_M1, PERIOD_M5 ... и так далее, по желанию ограничения времени открытия нового ордера 

   if(l_itime==0)                         //обязательная проверка на ошибки 

      return;

//---

   static int counter=0;

   if(IsTradeAllowed())

     {

      if(counter<=0)

        {

         Time_open=l_itime;

         counter++;

        }

     }

   else

      counter=0;

//---

   total=OrdersTotal();


   if(total<1)

     {

      if(Time_open!=l_itime)

        {

         ticket=-1;                       //обязательное присвоение начальной величины 

         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);

         if(ticket>0)

            Time_open=l_itime;

        }

     }

  }

 

Если все таки хочется торговать сразу на текущей свече тогда бы провела проверку на наличие поступления сигнала. Если сигнал отсутсвует эксперту при поступлении сигнала разрешается открывать позиции, это в свою очередь вынуждает работать только с качественным сигналом который не меняется каждый раз при поступлении новой цены торгового инструмента.
 
lilita bogachkova:
Да ваш предложенный метод универсален. Но на мой взгляд очень энерго емкий:
1. При отсутсвии открытых позиций надо перебирать и закрытые позиции;
2. Если есть открытие позиции (например хеджирование) но нет позиций открытых на текущем баре тоже надо перебирать закрытые позиции.

Если при инициализации такой подход приемлен то пры постоянной работе эксперта это лишний расход вычислительных  мощностей.

Вовсе не энергоемкий. Сканирование истории происходит всего один раз - при инициализации эксперта. Далее используется обновление переменной, отвечающей за время открытия последнего ордера на основании списка рабочих ордеров.

Причина обращения: