Как отследить момент, когда отложенный ордер SELL LIMIT превращается в рыночный?

 

Добрый день. Вопрос таков - Как отследить момент, когда отложенный ордер SELL LIMIT превращается в рыночный? Мне нужно время этого момента. Пробовала такое условие:

 if (Bid==Price_Sell)

{...

Date_Sell=TimeCurrent();

...

Но почему-то в этот цикл не заходит никогда! И время не записывается. Но в тестере стратегий я вижу, что ордер, тем не менее, превращается в рыночный. Всем заранее спасибо за ответ!

Примечание: интересует язык MQL4 

 
anna.vladi:

Добрый день. Вопрос таков - Как отследить момент, когда отложенный ордер SELL LIMIT превращается в рыночный? Мне нужно время этого момента. Пробовала такое условие:

 if (Bid==Price_Sell)

{...

Date_Sell=TimeCurrent();

...

Но почему-то в этот цикл не заходит никогда! И время не записывается. Но в тестере стратегий я вижу, что ордер, тем не менее, превращается в рыночный. Всем заранее спасибо за ответ!

Примечание: интересует язык MQL4 

в реальности - исключительно проверяя OrderType у тикета. В гепах может много чего не сработать это раз. Тик(оба два) который сорвал отложку может быть пропущен это два.. :-)

а так, для тестера - Bid>=Price_Sell
 
Maxim Kuznetsov:
в реальности - исключительно проверяя OrderType у тикета. В гепах может много чего не сработать это раз. Тик(оба два) который сорвал отложку может быть пропущен это два.. :-)

а так, для тестера - Bid>=Price_Sell

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

Или Я не о том думаю? 

 

да, нужно проверять тип ордера и время, чтобы не был закрытым...
(предварительно ордер должен быть выбран OrderSelect)

if (OrderType()<2 && OrderCloseTime()==0)

{...

Date_Sell=TimeCurrent();

...
}
 
anna.vladi:

Добрый день. Вопрос таков - Как отследить момент, когда отложенный ордер SELL LIMIT превращается в рыночный? Мне нужно время этого момента. Пробовала такое условие:

 if (Bid==Price_Sell)

{...

Date_Sell=TimeCurrent();

...

Но почему-то в этот цикл не заходит никогда! И время не записывается. Но в тестере стратегий я вижу, что ордер, тем не менее, превращается в рыночный. Всем заранее спасибо за ответ!

Примечание: интересует язык MQL4 

При открытии отложенного ордера запомнить его тикет, далее отслеживать по этому тикету состояние ордера если сменился тип с SELL_LIMIT  на SELL то сработал отложенный ордер. Вот набросал небольшой пример.

//+------------------------------------------------------------------+
//|                                                 test_pending.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict

input int Magic=123;// Magic
input double Lot=0.1;//Volume
input int Distance=200;

int ticket_b=0;
int ticket_s=0;

bool flag_b=false;
bool flag_s=false;

datetime Date_Sell=0;
datetime Date_Buy=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double price_open=0.0;

   if(total_order(Magic,OP_SELLLIMIT)==0)
     {
      RefreshRates();
      price_open=NormalizeDouble(Bid+Distance*_Point,_Digits);
      ticket_s=OrderSend(_Symbol,OP_SELLLIMIT,Lot,price_open,INT_MAX,0,0,"Test_pending",Magic);
      if(ticket_s<0)Print("Ошибка открытия SELLLIMIT ордера № - ",GetLastError());
      else flag_s=true;
     }
   if(total_order(Magic,OP_BUYLIMIT)==0)
     {
      RefreshRates();
      price_open=NormalizeDouble(Ask-Distance*_Point,_Digits);
      ticket_b=OrderSend(_Symbol,OP_BUYLIMIT,Lot,price_open,INT_MAX,0,0,"Test_pending",Magic);
      if(ticket_b<0)Print("Ошибка открытия BUYLIMIT ордера № - ",GetLastError());
      else flag_b=true;
     }

   if(flag_s && event_pending(ticket_s))
     {
      Date_Sell=TimeCurrent();
      flag_s=false;
      Print("Сработал отложенный ордер SELLLIMIT Date_Sell = ",Date_Sell);
     }

   if(flag_b && event_pending(ticket_b))
     {
      Date_Buy=TimeCurrent();
      flag_b=false;
      Print("Сработал отложенный ордер OP_BUYLIMIT Date_Buy = ",Date_Buy);
     }

  }
//+------------------------------------------------------------------+
int total_order(int magic,int type)
  {
   int value=0;
   int total=OrdersTotal();
   for(int i=0; i<total; i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderSymbol()!=Symbol())continue;
      if(OrderMagicNumber()!=magic)continue;
      if(OrderType()==type || type==-1)value++;
     }
   return(value);
  }
//+------------------------------------------------------------------+
bool event_pending(int ticket)
  {
   if(OrderSelect(ticket,SELECT_BY_TICKET))
     {
      if(OrderType()==OP_BUY || OrderType()==OP_SELL)return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+


 ....

 

Попробуйте сравнить цену открытия лимитного ордера и цену нового рыночного ордера. Сравнение будет до 2-х минут после открытия рыночного ордера

int i;
double Pp;
string Symb;
//-----------+
void start() {
//-----------------------------------------------+
   double   buy_last_price=-1, sell_last_price=-1;  
   for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {  
      if(OrderType()==0) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice();}  
      if(OrderType()==1) {if(sell_last_price==-1) sell_last_price=OrderOpenPrice();}
      }
//--------------------------------------------------------------------------------------------------------------------------------------------+
   if (sell_last_price >= LastPriceLimitOrdSell() && SecondsOpenLastSell()<2*60)  //Лимитный ордер SellLimit стал рыночным Sell. Ваши условия//
   if (LastPriceLimitOrdBuy() >= buy_last_price && SecondsOpenLastBuy()<2*60)     //Лимитный ордер BuyLimit стал рыночным Buy. Ваши условия//
   }
//-----------------+
//   Start END     |
//-----------------+
void init() {
   Pp=Point;
   Symb=Symbol();
   return;
   }
//+---------------------------------------------------------------+
//|       Возвращает цену последнего установленного ордера        |
//+---------------------------------------------------------------+
   double LastPriceLimitOrdBuy() {
   datetime TimeOPb=0;
   double priceB=0;
   for(i=0;i<OrdersTotal();i++)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUYLIMIT && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
   if (OrderType()!=2||OrderSymbol()!=Symb||OrderMagicNumber()!=Magic) continue;
   if(TimeOPb<OrderOpenTime()) {TimeOPb=OrderOpenTime();priceB=OrderOpenPrice();}
      }
   return (priceB);
   }
   double LastPriceLimitOrdSell() {
   datetime TimeOPs=0;
   double priceS=0;
   for(i=0;i<OrdersTotal();i++)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELLLIMIT && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
   if (OrderType()!=3||OrderSymbol()!=Symb||OrderMagicNumber()!=Magic) continue;
   if(TimeOPs<OrderOpenTime()) {TimeOPs=OrderOpenTime();priceS=OrderOpenPrice();}
      }
   return (priceS);
   }
//+---------------------------------------------------------------+
//| Возвращает количество секунд после последней открытой позиции |
//+---------------------------------------------------------------+
   datetime SecondsOpenLastBuy() {
   datetime TimeOpenB=0;
   for(i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
   if (OrderType()!=0||OrderSymbol()!=Symb||OrderMagicNumber()!=Magic) continue;
   if(TimeOpenB<OrderOpenTime()) TimeOpenB=OrderOpenTime();
      }
   return (TimeCurrent()-TimeOpenB);
   }
   datetime SecondsOpenLastSell() {
   datetime TimeOpenS=0;
   for(i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
   if (OrderType()!=1||OrderSymbol()!=Symb||OrderMagicNumber()!=Magic) continue;
   if(TimeOpenS<OrderOpenTime()) TimeOpenS=OrderOpenTime();
      }
   return (TimeCurrent()-TimeOpenS);
   }
 
Natalya Dzerzhinskaya:

Это выражение так веселит =)

Возвращает цену последней открытой отложенной позиции  

 
Vitaly Muzichenko:

Это выражение так веселит =)

Возвращает цену последней открытой отложенной позиции  

Ну а как обозначить что бы другим было понятно? Ордер то отложенный, а не в штаны наложенный =))
 
Natalya Dzerzhinskaya:
Ну а как обозначить что бы другим было понятно? Ордер то отложенный))
"Последнего установленного ордера", ну а если дело касается не ордеров, тогда "Последней открытой позиции" )
 
Vitaly Muzichenko:
"Последнего установленного ордера"
Логично, готово, исправлено!)
 
Всем большое спасибо!
Причина обращения: