Где-то тут ошибочка.

 

Не могу найти ошибку. Нужно закрыть ордер когда МА меняет направление.

В тестере-ошибка 4051.

if(OrdersTotal()==1)
   {
   if(MA4>MA3&&MA2<MA1)
   {
   OrderSelect(1,SELECT_BY_POS,MODE_TRADES);
   if(OrderCloseTime()==0) 
   {
   if(OrderType()==OP_SELL)
   {
   ticketSELL=OrderTicket();
   OrderDelete(ticketSELL);
   }
   }
   }
   }
   //==========================================================================
   
   if(OrdersTotal()==1)
   {
   if(MA4<MA3&&MA2>MA1) 
   {
   OrderSelect(1,SELECT_BY_POS,MODE_TRADES);
   if(OrderCloseTime()==0) 
   {
   if(OrderType()==OP_BUY)
   {
   ticketBUY=OrderTicket();
   OrderDelete(ticketBUY);
   }
   }
   }
   }
   

Помогите решить проблему.

Всем заранее спасибо.

P.S. подразумевается что ордер уже открыт.

 
mozg >>:

Не могу найти ошибку. Нужно закрыть ордер когда МА меняет направление.

В тестере-ошибка 4051.

Помогите решить проблему.

Всем заранее спасибо.

P.S. подразумевается что ордер уже открыт.

????? Закрыть открытый ордер или удалить отложенный ? Вы б хелп и учебник прочли, что ли ... И потом, а Вы уверены, что этот единствнный ордер будет имеенно под номером 1 ? Посмотрите примеры с трейлинг стопами - там есть куски кода, показывающие как правильно выделять ордера

Успехов.

 
VladislavVG >>:

Успехов.

Еще не 1 а 0. Нумерация начинается с нуля.

 
TheXpert >>:

Еще не 1 а 0. Нумерация начинается с нуля.

У него написано:

 OrderSelect(1,SELECT_BY_POS,MODE_TRADES); Потому и говорю про номер "1".

ЗЫ ордером с номером ноль вносится депозит на реальных счетах.....

 
VladislavVG писал(а) >>

ЗЫ ордером с номером ноль вносится депозит на реальных счетах.....

Не, здесь Вы ошиблись. TheExpert как раз прав, при единственном открытом ордере обращаться к нему именно через 0 при ...SELECT_BY_POS,MODE_TRADES)

mozg писал(а) >>

.....

Вы же уже вполне опытный программер, соберитесь)

 
Figar0 >>:

Не, здесь Вы ошиблись. TheExpert как раз прав, при единственном открытом ордере обращаться к нему именно через 0 при ...SELECT_BY_POS,MODE_TRADES)

Может быть (лень сейчас проверять, насколько я помню, на реале номер для первого открытого ордера таки будет 1, ордер с номером 0 - это внесение депозита на счет, для демки - да, первый открытый будет с номером ноль) - только я бы все равно так не обращался:  к ордеру с непосредственным указанием номера - просто выбрал бы нужный циклом. А обращение такое - это от топикстартера.

Успехов.

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

 

Да пусть через 0............вот так тогда

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

 if(OrdersTotal()==1)
  {
  if(MA4>MA3&&MA2<MA1)
  {
  OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
  if(OrderCloseTime()==0) 
  {
  if(OrderType()==OP_SELL)
  {
  ticketSELL=OrderTicket();
  OrderDelete(ticketSELL);
  }
  }
  }
  }
................................

Ошибка  4108......не правильный номер тикета. вот так.

 
VladislavVG >>:

Может быть (лень сейчас проверять, насколько я помню, на реале номер для первого открытого ордера таки будет 1, ордер с номером 0 - это внесение депозита на счет, для демки - да, первый открытый будет с номером ноль) - только я бы все равно так не обращался:  к ордеру с непосредственным указанием номера - просто выбрал бы нужный циклом. А обращение такое - это от топикстартера.

Успехов.

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

Зачем запускать цикл когда ордер всего один?

я еще пробовал при открытии сразу присваивал переменной его тикет и потом подставлял его при

Мужики, разобрался........................

  if(OrderType()==OP_SELL)
  {
  ticketSELL=OrderTicket();
  OrderDelete(ticketSELL);
ордер выберается ведь открытый...........а я его пытаюсь удалить OrderDelete(ticketSELL); )))))))))

OrderClose здесь требуется........

всем спасибо.

 
mozg писал(а) >>

Да пусть через 0............вот так тогда

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

if(OrdersTotal()==1)
{
if(MA4>MA3&&MA2<MA1)
{
OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
if(OrderCloseTime()==0)
{
if(OrderType()==OP_SELL)
{
ticketSELL=OrderTicket();
OrderDelete(ticketSELL);
}
}
}
}
................................

Ошибка 4108......не правильный номер тикета. вот так.

Мозг, ОРЕХИ) Что такое удаление ордера на продажу? Ордер не считается, факир был пьян, удалить и забыть?:) Рыночные ордера закрывать нужно вроде как. Да и проверять надо выбор ордера, типа:

if (!OrderSelect(0,SELECT_BY_POS,MODE_TRADES)){
  Print ("Ошибка выбора ордера");
  return;
}
А цикл нужен за тем, что ордер может быть как один, так и не одного, а могут например быть ордера открытые руками или другим советником, надо перебрать все и выбрать "только свои".
Причина обращения: