В чем секрет: советник работает на демо и тестируется по ценам открытия правильно, а при включении "Все тики" начинает вести себя иногда некорректно

 

В чем секрет? советник работает на демо и тестируется по ценам открытия правильно, а при включении "Все тики" начинает вести себя иногда некорректно:

открывая одновременно две позиции или наоборот не открывая ни одной

что это может быть?

 
"Секрет" в кривом советнике...
 
komposter:
"Секрет" в кривом советнике...

смешно... все мысли почепнуты с этого сайта
 
S4kam:
все мысли почепнуты с этого сайта
А это гарантирует "правильность" советника?
 
komposter:
S4kam:
все мысли почепнуты с этого сайта
А это гарантирует "правильность" советника?


Ответ с подвохом, собственно как и вопрос

В общем мне нужна помощь, представляю блок открытия сделки, чего-то здесь надо добавить, чтоб на тиках он не ошибался

if (_prevTime != curTime && DayOfYear()<345 && OrdersTotal()<3)
{
for (int f=0; f<20; f++)
{
if (DayOfWeek()==_Day[f])
if (TimeToStr(iTime(_Para[f], 0,0),TIME_MINUTES)==_Time[f])
{
if (_Oper[f]==OP_BUY && _prevTime != curTime)
{
_Tick=OrderSend(_Para[f], _Oper[f], _Lots, Ask,3, 0,Open[0]+takebuy*Point, "expert comment",256,0,CLR_NONE);
_prevTime = curTime;
}
if (_Oper[f]==OP_SELL && _prevTime != curTime)
{
_Tick=OrderSend(_Para[f], _Oper[f], _Lots, Bid,3, 0,Open[0]-takesell*Point, "expert comment",256,0, CLR_NONE);
_prevTime = curTime;
}
}
}
}

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


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

то что в коде устанавливается тейк - на это не обращайте внимания - по умолчанию это 1000 пунктов, тейк берется по условию

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

И самое главное, я прошу, чтобы мне сказали как этого избежать, а не просто констатировали факт, что делается в моем коде 
 
Не особо вдаваясь в логику принятия решений (ну, очень запутано, массивы времени, цен, что в них?), могу сказать, что у тебя нет ограничений на количество ордеров внутри цикла (а есть только в начале), поэтому он и все 20 может тебе выставить.
Привязка ко времени - тоже не лучший вариант, в данную минуту может не быть тика вообще. Давать рекомендации, не зная логики, очень трудно.
 
S4kam:
klerk:
при тестировании по ценам открытия советник открывается в начале бара и, если что-то произошло в середине бара (сработал стоп, профит), то он больше не открывается. А при моделировании всех тиков, если в середине бара у тебя сработал стоп или профит, то советник открывает еще одну позицию и так до тех пор, пока не кончится текущий бар.

И самое главное, я прошу, чтобы мне сказали как этого избежать, а не просто констатировали факт, что делается в моем коде 

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

if (_prevTime != curTime && DayOfYear()<345 && OrdersTotal()<3&&JustOpen==0)
{
      for (int f=0; f<20; f++)
      {
         if (DayOfWeek()==_Day[f])
              if (TimeToStr(iTime(_Para[f],0,0),TIME_MINUTES)==_Time[f])
              {
                  if (_Oper[f]==OP_BUY && _prevTime != curTime)
                  {
                      _Tick=OrderSend(_Para[f],_Oper[f],_Lots,Ask,3,0,Open[0]+takebuy*Point, "expert comment",256,0,CLR_NONE);
                      _prevTime = curTime;
                      JustOpen=iTime(_Para[f],0,0);
                   }
                  if (_Oper[f]==OP_SELL && _prevTime != curTime)
                  {
                       _Tick=OrderSend(_Para[f],_Oper[f],_Lots,Bid,3,0,Open[0]-takesell*Point, "expert comment",256,0,CLR_NONE);
                       _prevTime = curTime;
                       JustOpen=iTime(_Para[f],0,0);
                   }
              }
      }
}
а при закрытии, если текущий бар не равен JustOpen, то обнулять его, если равен, то обнулить при переходе на следующий бар.
 
Roger:
Не особо вдаваясь в логику принятия решений (ну, очень запутано, массивы времени, цен, что в них?), могу сказать, что у тебя нет ограничений на количество ордеров внутри цикла (а есть только в начале), поэтому он и все 20 может тебе выставить.
Привязка ко времени - тоже не лучший вариант, в данную минуту может не быть тика вообще. Давать рекомендации, не зная логики, очень трудно.

Спасибо - это был правильный ответ
Причина обращения: