Добрый день. Вопрос таков - Как отследить момент, когда отложенный ордер SELL LIMIT превращается в рыночный? Мне нужно время этого момента. Пробовала такое условие:
if (Bid==Price_Sell)
{...
Date_Sell=TimeCurrent();
...
}
Но почему-то в этот цикл не заходит никогда! И время не записывается. Но в тестере стратегий я вижу, что ордер, тем не менее, превращается в рыночный. Всем заранее спасибо за ответ!
Примечание: интересует язык MQL4
а так, для тестера - Bid>=Price_Sell
в реальности - исключительно проверяя OrderType у тикета. В гепах может много чего не сработать это раз. Тик(оба два) который сорвал отложку может быть пропущен это два.. :-)
а так, для тестера - Bid>=Price_Sell
А если проверять время открытия последней позиции и время установки последнего ордера, если позиция новее, значит сработала отложка, и это время использовать в качестве момента исполнения?
Или Я не о том думаю?
да, нужно проверять тип ордера и время, чтобы не был закрытым...
(предварительно ордер должен быть выбран OrderSelect)
{...
Date_Sell=TimeCurrent();
...
}
Добрый день. Вопрос таков - Как отследить момент, когда отложенный ордер 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-х минут после открытия рыночного ордера
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);
}
Это выражение так веселит =)
Возвращает цену последней открытой отложенной позиции
Это выражение так веселит =)
Возвращает цену последней открытой отложенной позиции
Ну а как обозначить что бы другим было понятно? Ордер то отложенный))
"Последнего установленного ордера"
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день. Вопрос таков - Как отследить момент, когда отложенный ордер SELL LIMIT превращается в рыночный? Мне нужно время этого момента. Пробовала такое условие:
if (Bid==Price_Sell)
{...
Date_Sell=TimeCurrent();
...
}
Но почему-то в этот цикл не заходит никогда! И время не записывается. Но в тестере стратегий я вижу, что ордер, тем не менее, превращается в рыночный. Всем заранее спасибо за ответ!
Примечание: интересует язык MQL4