Как заставить советника выжидать время

 

У меня проблема. Иногда советник на одной свече то открывает, то тут же закрывает позицию. Такое может произойти несколько раз за 10 минут. Не могу реализовать способ заставить робота не открывать новые ордера на покупку или продажу чаще чем раз в несколько минут или раз за одну свечу.

Я пытался ввести функцию Sleep(time), которая срабатывала после открытия нового ордера или после закрытия, но не работает.

Пробовал ввести флаг, который показывал, та же это свеча или уже другая.

Подскажите решение, если не сложно

 
Khomtchenko:

У меня проблема. Иногда советник на одной свече то открывает, то тут же закрывает позицию. Такое может произойти несколько раз за 10 минут. Не могу реализовать способ заставить робота не открывать новые ордера на покупку или продажу чаще чем раз в несколько минут или раз за одну свечу.

Я пытался ввести функцию Sleep(time), которая срабатывала после открытия нового ордера или после закрытия, но не работает.

Пробовал ввести флаг, который показывал, та же это свеча или уже другая.

Подскажите решение, если не сложно


  пропиши работу советника только на открытии нового бара...
 

И отрытие позиции не по нулевому бару, а по первому.

 
Vinin:

И отрытие позиции не по нулевому бару, а по первому.


   Именно...
 
Khomtchenko:

У меня проблема. Иногда советник на одной свече то открывает, то тут же закрывает позицию. Такое может произойти несколько раз за 10 минут. Не могу реализовать способ заставить робота не открывать новые ордера на покупку или продажу чаще чем раз в несколько минут или раз за одну свечу.

Я пытался ввести функцию Sleep(time), которая срабатывала после открытия нового ордера или после закрытия, но не работает.

Пробовал ввести флаг, который показывал, та же это свеча или уже другая.

Подскажите решение, если не сложно

if (LastorderTime==0)
{
 for (int ii=0; ii<OrdersHistoryTotal();ii++)
  if (OrderSelect(ii,SELECT_BY_POS,MODE_HISTORY))
       
       if (OrderType()==OP_BUY || OrderType()==OP_SELL)
       if (OrderOpenTime()>LastorderTime )
            {LastorderTime =OrderOpenTime();}
 for (ii=0; ii<OrdersTotal();ii++)
  if (OrderSelect(ii,SELECT_BY_POS,MODE_TRADES))
       if (OrderOpenTime()>LastorderTime() )
         {LastorderTime =OrderOpenTime();}



if ( iTime(Symbol(),PERIOD_H1,Delay)< LastorderTime  ) return(0);

OrderSend(...)
if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
           LastorderTime=iTime(Symbol(),PERIOD_H1,0);

Delay - на сколько часов задержать.

Для минут поменять соответственно

if ( iTime(Symbol(),PERIOD_M1,Delay)< LastorderTime  ) return(0);


LastorderTime=iTime(Symbol(),PERIOD_M1,0);

 

Это дребезжание происходит в области пересечения информационных линий (машек либо иных), по которым принимается решение об открытии и закрытии ордера.

При этом линии то пересеклись, то опять разошлись.

Такое поведение можно сравнить с дребезгом контактов реле.

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

 
avtomat:

Это дребезжание происходит в области пересечения информационных линий (машек либо иных), по которым принимается решение об открытии и закрытии ордера.

При этом линии то пересеклись, то опять разошлись.

Такое поведение можно сравнить с дребезгом контактов реле.

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

Нужно ввести гистерезис.
Причина обращения: