Проблема с сигналами - страница 2

 

Такс, на свой вопрос уже ответ знаю)) если с -1 то не удаляет вообще, а если без него, по попросту ставит ордер и сразу же его удаляет.

//===========================  Открытие позиций  ===================================+  
if ( NumberOfPositions(NULL , OP_SELLSTOP, Magic )<Orders ) 
{ //если  открытых позиций менее Orders
//+=================================================================================+
// Проверка условий для совершения сделки селл 
if (! NumberOfBarOpenLastPos(NULL, 0,OP_SELLSTOP, Magic)  ==0)//запрет неск. поз на одном баре  
{
if( Условие )
       {
     SL=0;TP=0;
      if(StopLoss>0)   SL=Bid+Point*StopLoss;
      if(TakeProfit>0) TP=Bid-Point*TakeProfit;
      lots=LotsCounting(); 
   ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,p2,3,SL,TP,"Продаем- тра-ля-ля",Magic,0,Red);
   if(ticket < 0)
   {
            Print("Ошибка открытия ордера SELL #", GetLastError()); 
            Sleep(10000);  
            prevtime = Time[1]; 
            return (0); 
         } 
       }
     }
  }
//+=================================================================================+
if ( NumberOfPositions(NULL , OP_BUYSTOP, Magic )<Orders ) 
{ //если  открытых позиций менее Orders

  // Проверка условий для совершения сделки бай
if (! NumberOfBarOpenLastPos(NULL, 0,OP_BUYSTOP, Magic)  ==0)  //запрет неск. поз на одном баре
{
if( условие )
       {
      SL=0;TP=0;
      if(StopLoss>0)   SL=Ask-Point*StopLoss;
      if(TakeProfit>0) TP=Ask+Point*TakeProfit;
      lots=LotsCounting();    
   ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,p2,3,SL,TP,"Покупаем- хи-хи ",Magic,0,Green);
   if(ticket < 0) 
   {
            Print("Ошибка открытия ордера BUY #", GetLastError()); 
            Sleep(10000); 
            prevtime = Time[1]; 
            return (0); 
         } 
       }
     }
//+=================================================================================+
 }    //если  открытых позиций менее Orders 
//======================== конец блока открытия позиций ============================+
 
//========================== Закрытие позиций ======================================+
   for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  
   {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))                
      {           
        if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)     
        { 
//+=================================================================================+
//+================================= TrailingStop ==================================+
if(OrderType() == OP_SELL)
   {
if((OrderOpenPrice()-Ask) > (Point*TrailingStop))///ПОСЛЕ ЭТОГО УСЛОВИЯ НЕ ПРОХОДИТ!!!
      { 
if((OrderStopLoss() > (Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
         {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
         }
      }
   }
//+=================================================================================+
if(OrderType() == OP_BUY)
   {
if((Bid-OrderOpenPrice()) > (Point*TrailingStop))///ПОСЛЕ ЭТОГО УСЛОВИЯ НЕ ПРОХОДИТ!!!
      { ///ПОСЛЕ ЭТОГО УСЛОВИЯ НЕ ПРОХОДИТ!!!
if(OrderStopLoss() < Bid-Point*TrailingStop || (OrderStopLoss()==0))
         {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);  
         }
      }
   }
//+================================= TrailingStop ==================================+

//+============================= Удаление залежавшихся =============================+
if (OrderType() == OP_BUYSTOP) 
{ 
      if( условие )     
      {
         OrderDelete(OrderTicket()); // закрываем позицию
                // return(0); // выходим         
      }   
}  

//+=================================================================================+

if (OrderType() == OP_SELLSTOP) 
{ 
      if( условие ) 
      {
         OrderDelete(OrderTicket()); // закрываем позицию
                // return(0); // выходим         
      }   
}

//+=================================================================================+
    }  // Symbol()  
  } // select
} //total 
//============================== Конец блока закрытия ==============================+
   
  return(0);
  }
//ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ Конец функции int start() ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ

Помогите пожалуйста разобраться. Как мне сделать, чтоб советник при сигнале, ставил новый отложенный ордер, а старый удалял? В данной ситуации он просто ставит и удаляет ордера.

На форуме найти ничего не получается, поиск выдает ошибку. 

 
berezhnuy:

Такс, на свой вопрос уже ответ знаю)) если с -1 то не удаляет вообще, а если без него, по попросту ставит ордер и сразу же его удаляет.

Помогите пожалуйста разобраться. Как мне сделать, чтоб советник при сигнале, ставил новый отложенный ордер, а старый удалял? В данной ситуации он просто ставит и удаляет ордера.

На форуме найти ничего не получается, поиск выдает ошибку.

А какой смысл удалять и снова ставить отложник такого же типа? Чем отличается старый от нового?
 
ну просто если отложник не отработал и появился новый сигнал, то нужно старый отложник удалить
 
berezhnuy:
ну просто если отложник не отработал и появился новый сигнал, то нужно старый отложник удалить
А для чего нужно вы аргументы не привели. Новый ордер у вас того же типа, что и старый?
 
потому-что цена уходит и мне нужно отменять старый отложник и выставлять при получние нового сигнала новый отложник, мне не нужно чтобы отложник весел больше месяца, изза того что цена ушла в другую сторону.
 
berezhnuy:
потому-что цена уходит и мне нужно отменять старый отложник и выставлять при получние нового сигнала новый отложник, мне не нужно чтобы отложник весел больше месяца, изза того что цена ушла в другую сторону.

При получении нового сигнала проверяете соответствует ли направление сигнала типу имеющегося отложника. Если соответствует - модифицируете уровень установки ордера с учётом текущей цены. Если направление сигнала не соответствует типу имеющегося отложника, удаляете его, если этого требует ваша стратегия. Хотя какая бы ни была стратегия вряд ли это обязательно нужно делать. Если вы боитесь его срабатывания не в направлении последнего сигнала, его можно отодвинуть с помощью модификации подальше от текущей цены, а при появлении соответствующего сигнала снова вернуть на расчётную дистанцию от текущей цены.

 

Зачем это мне необходимо.

1. Для начала я хочу понять как мне удалять предыдущую позицию, ну а дальше уже разбираться с модификациями.

2. Поскольку у меня стоит контроль количества ордеров, пока висит не сработанный отложник, все последующие сигналы будут игнорироваться. 

 
berezhnuy:

Зачем это мне необходимо.

1. Для начала я хочу понять как мне удалять предыдущую позицию, ну а дальше уже разбираться с модификациями.

2. Поскольку у меня стоит контроль количества ордеров, пока висит не сработанный отложник, все последующие сигналы будут игнорироваться.


По моему можно удалить сразу все ордера после срабатывания одного из них.

if (OrderType() == OP_BUY)

OrderDelete(OrderTicket());

if (OrderType() == OP_SELL)

OrderDelete(OrderTicket());

 
berezhnuy:

Зачем это мне необходимо.

1. Для начала я хочу понять как мне удалять предыдущую позицию, ну а дальше уже разбираться с модификациями.

2. Поскольку у меня стоит контроль количества ордеров, пока висит не сработанный отложник, все последующие сигналы будут игнорироваться.

Позицию нельзя удалить, её можно закрыть. Удалить можно только отложенный ордер.
 
david2:


По моему можно удалить сразу все ордера после срабатывания одного из них.

if (OrderType() == OP_BUY)

OrderDelete(OrderTicket());

if (OrderType() == OP_SELL)

OrderDelete(OrderTicket());


Точнее так:

if (OrderType() == OP_BUY) 
{

Delete("Buy Stop"); 

Delete("Sell Stop");
} 

if (OrderType() == OP_SELL)
{
Delete("Buy Stop"); 

Delete("Sell Stop");
} 

return(0);



 



void Delete(string ord)
{   
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
         if (OrderSymbol()!=Symbol()) continue;
         
         if (OrderType()==OP_BUYSTOP &&ord==("Buy Stop"))
            OrderDelete(OrderTicket(),CLR_NONE);
         if (OrderType()==OP_SELLSTOP &&ord==("Sell Stop"))
            OrderDelete(OrderTicket(),CLR_NONE);  

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