Помогите найти ошибочку!

 
//+-----Блок обработки открытых ордеров-----------------------------------+
  if ((OrdersTotal()>=1)&&(Bar<iBars(NULL,PERIOD_H1)))  
  {  
  for(int i=0;i<OrdersTotal();i++)
  OrderSelect(i,SELECT_BY_POS);
  cmd=OrderType();
  if (cmd<2)
  {
  if(cmd==OP_BUY) 
  price=Bid;
  else  
  price=Ask;
  OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
  if (OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE)!=true)
  {
  error=GetLastError(); Print("LastError = ",error); 
  }
  if(error==135) RefreshRates();
  }
  if(OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE)==true)
  {
  Bar=iBars(NULL,PERIOD_H1);
  }
  }  
  

Суть этого блока; закрывать ордер при появлении нового бара на часовом графике. Вот только он закрывает его сразу после открытия. Где собака зарыта?
 
может быть в переменной Bar? Где ее обьявлять чтоб она сохраняла свое значение?
 
bool t()
 {
  static datetime time=0;
  if(time==0)
     time=iTime(NULL,PERIOD_H1,0);
  if(time!=iTime(NULL,PERIOD_H1,0)) {
     time=iTime(NULL,PERIOD_H1,0);
     return(true);
    }
  return(false);
 }

int start()
  {
   if(t()) {
      // ваши действия, когда бар уже сформировался
     }

   // 
   return(0);
  }
 
  OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
  if (OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE)!=true)
Это вызов функции OrderClose() дважды.
 
WWer >>:
Это вызов функции OrderClose() дважды.

if ((OrdersTotal()>=1)&&(Bar<iBars(NULL,PERIOD_H1)))  
  {  
  for(int i=0;i<OrdersTotal();i++)
  OrderSelect(i,SELECT_BY_POS);
  cmd=OrderType();
  if (cmd<2)
  {
  if(cmd==OP_BUY) 
  price=Bid;
  else  
  price=Ask;
  bool Info=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
  if (Info!=true)
  {
  error=GetLastError(); Print("LastError = ",error); 
  }
  if(error==135) RefreshRates();
  }
  if(Info==true)
  {
  Bar=iBars(NULL,PERIOD_H1);
  }
  return(0);
  }  
  
Вот так? не помогло.

 

и еще эта функция теоретически не должна открывать больше 1 позиции

if (OrdersTotal()!=1)
  {
  OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-Stop*Point,Bid+Teik*Point);                                       
  if (OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-Stop*Point,Bid+Teik*Point)!=true) Sleep(1000);
  }
  return(0);
но она открывает 2

кто подскажет где ошибочка?

 
mozg >>:

и еще эта функция теоретически не должна открывать больше 1 позиции

if (OrdersTotal()!=1)
  {
  OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-Stop*Point,Bid+Teik*Point);                                       
  if (OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-Stop*Point,Bid+Teik*Point)!=true) Sleep(1000);
  }
  return(0);
но она открывает 2

кто подскажет где ошибочка?

Я ведь уже писал, что вы дважды вызываете функцию (в операторе if она тоже вызывается), поэтому и открывается 2 ордера.

 
все понял-спасибо за то что носом ткнули.
 
с колличеством ордеров разобрались-а с закрытием ни как, так и закрывает сразу после открытия.
 
mozg >>:
с колличеством ордеров разобрались-а с закрытием ни как, так и закрывает сразу после открытия.


Упрощенный вариант (если ордер один):
bool t()
 {
  static datetime time=0;
  if(time==0)
     time=iTime(NULL,PERIOD_H1,0);
  if(time!=iTime(NULL,PERIOD_H1,0)) {
     time=iTime(NULL,PERIOD_H1,0);
     return(true);
    }
  return(false);
 }

int start()
  {
   if(t()) {
      OrderSelect(0,SELECT_BY_POS);
      if(cmd==OP_BUY) 
         price=Bid;
      else if(cmd==OP_SELL)
         price=Ask;
      OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
     }

   // 
   return(0);
  }

Можно и еще проще:

if(OrdersTotal()>0) {
OrderSelect(0,SELECT_BY_POS);
if(cmd==OP_BUY) 
   price=Bid;
else if(cmd==OP_SELL)
   price=Ask;
if(iBarShift(NULL,PERIOD_H1,OrderOpenTime())>0);
   OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
}
 

Я сделал все через статическую переменную static int Bar

if ((OrdersTotal()>=1)&&(Bar<iBars(NULL,PERIOD_H1)))  
  {  
  for(int i=0;i<OrdersTotal();i++)
  OrderSelect(i,SELECT_BY_POS);
  cmd=OrderType();
  if (cmd<2)
  {
  if(cmd==OP_BUY) 
  price=Bid;
  else  
  price=Ask;
  bool Info=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
  if (Info!=true)
  {
  error=GetLastError(); Print("LastError = ",error); 
  }
  if(error==135) RefreshRates();
  }
  if(Info==true)
  {
  Bar=iBars(NULL,PERIOD_H1);
  }
  return(0);
  }  
Коментарии приветствуються!

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