if (Close(0) > sl) then DeleteOrder(OrderHandle);
выполняет только
(OpenTime <> Time(0))
и то выставляет иногда 2 абсолютно одинаковых ордера.
привожу код для закрытия/удаления позиции и ее открытия (в обе стороны код аналогичный)
Код: Выделить всё
 // if SELL order exists
 // then close order
  if (OrderHandle <> -1) and (OrderStyle = tp_Sell) then
begin
  if OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES) = true then
   if GetOrderInfo(OrderHandle, info) then
       sl := OrderStopLoss;
       if (Close(0) > sl) then
       DeleteOrder(OrderHandle);
       if OrderClosed(OrderHandle) = true then
       OrderHandle := -1;
end;                  
 // if there is no order
// then open SELL order
begin
    SetCurrencyAndTimeframe(Symbol, TimeFrame2);
    if  (Close(0) < sma22) and (Close(0) < sma11)  then
begin
   SetCurrencyAndTimeframe(Symbol, TimeFrame1);
   if (OrderHandle = -1)  and (OpenTime <> Time(0)) 
   and (sma2 < sma3) and (sma2 > Close(0))
   and (Close(0) > (sma1 + sma2)/2) then
begin
   SendPendingOrder(Symbol, op_SellStop, LotSize, sl,
   tp_s , ep, '', 0, OrderHandle);
   if SendPendingOrder(Symbol, op_SellStop, LotSize, sl,
   tp_s , ep, '', 0, OrderHandle)= true
then
begin
   if OrderSelect(0, SELECT_BY_POS, MODE_TRADES) then
     OrderStyle := tp_Sell;
     OpenTime := Time(0); 
end;
end;
end;
end;