172 lines
5.6 KiB
MQL5
172 lines
5.6 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| OrderSnapshot.mq5 |
|
|
//| Copyright 2022, MetaQuotes Ltd. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "2022, MetaQuotes Ltd."
|
|
#property link "https://www.mql5.com"
|
|
#property description "Pick up an existing order and monitors its changes in the log"
|
|
|
|
#include "..\..\Include\AutoPtr.mqh"
|
|
#include "..\..\Include\MqlError.mqh"
|
|
#include "..\..\Include\TradeState.mqh"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Expert initialization function |
|
|
//+------------------------------------------------------------------+
|
|
int OnInit()
|
|
{
|
|
if(AccountInfoInteger(ACCOUNT_TRADE_MODE) != ACCOUNT_TRADE_MODE_DEMO)
|
|
{
|
|
Alert("This is a test EA! Run it on a DEMO account only!");
|
|
return INIT_FAILED;
|
|
}
|
|
|
|
if(OrdersTotal() == 0)
|
|
{
|
|
Alert("Please, create a pending order or open/close a position");
|
|
}
|
|
else
|
|
{
|
|
OnTrade(); // self-invocation
|
|
}
|
|
return INIT_SUCCEEDED;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| General trade notification handler |
|
|
//+------------------------------------------------------------------+
|
|
void OnTrade()
|
|
{
|
|
static int count = 0;
|
|
static AutoPtr<OrderState> auto;
|
|
|
|
OrderState *state = auto[];
|
|
|
|
PrintFormat(">>> OnTrade(%d)", count++);
|
|
|
|
if(OrdersTotal() > 0 && state == NULL)
|
|
{
|
|
const ulong ticket = OrderGetTicket(OrdersTotal() - 1);
|
|
auto = new OrderState(ticket);
|
|
PrintFormat("Order picked up: %lld %s", ticket, auto[].isReady() ? "true" : "false");
|
|
auto[].print(); // initial state on acquisition
|
|
}
|
|
else if(state)
|
|
{
|
|
int changes[];
|
|
if(state.getChanges(changes))
|
|
{
|
|
if(ArraySize(changes) > 0)
|
|
{
|
|
Print("Order properties changed:");
|
|
ArrayPrint(changes);
|
|
}
|
|
for(int k = 0; k < ArraySize(changes); ++k)
|
|
{
|
|
switch(OrderState::TradeState::type(changes[k]))
|
|
{
|
|
case PROP_TYPE_INTEGER:
|
|
Print(EnumToString((ENUM_ORDER_PROPERTY_INTEGER)changes[k]), ": ",
|
|
state.stringify(changes[k]), " -> ",
|
|
state.stringifyRaw(changes[k]));
|
|
break;
|
|
case PROP_TYPE_DOUBLE:
|
|
Print(EnumToString((ENUM_ORDER_PROPERTY_DOUBLE)changes[k]), ": ",
|
|
state.stringify(changes[k]), " -> ",
|
|
state.stringifyRaw(changes[k]));
|
|
break;
|
|
case PROP_TYPE_STRING:
|
|
Print(EnumToString((ENUM_ORDER_PROPERTY_STRING)changes[k]), ": ",
|
|
state.stringify(changes[k]), " -> ",
|
|
state.stringifyRaw(changes[k]));
|
|
break;
|
|
}
|
|
}
|
|
state.update();
|
|
}
|
|
|
|
if(_LastError != 0) Print(E2S(_LastError));
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
/*
|
|
example output (run on an account without pending orders,
|
|
create buy-limit order, then set TP, then change its expiration, then remove it)
|
|
|
|
Alert: Please, create a pending order or open/close a position
|
|
>>> OnTrade(0)
|
|
Order picked up: 1311736135 true
|
|
MonitorInterface<ENUM_ORDER_PROPERTY_INTEGER,ENUM_ORDER_PROPERTY_DOUBLE,ENUM_ORDER_PROPERTY_STRING>
|
|
ENUM_ORDER_PROPERTY_INTEGER Count=14
|
|
0 ORDER_TIME_SETUP=2022.04.11 11:42:39
|
|
1 ORDER_TIME_EXPIRATION=1970.01.01 00:00:00
|
|
2 ORDER_TIME_DONE=1970.01.01 00:00:00
|
|
3 ORDER_TYPE=ORDER_TYPE_BUY_LIMIT
|
|
4 ORDER_TYPE_FILLING=ORDER_FILLING_RETURN
|
|
5 ORDER_TYPE_TIME=ORDER_TIME_GTC
|
|
6 ORDER_STATE=ORDER_STATE_STARTED
|
|
7 ORDER_MAGIC=0
|
|
8 ORDER_POSITION_ID=0
|
|
9 ORDER_TIME_SETUP_MSC=2022.04.11 11:42:39'729
|
|
10 ORDER_TIME_DONE_MSC=1970.01.01 00:00:00'000
|
|
11 ORDER_POSITION_BY_ID=0
|
|
12 ORDER_TICKET=1311736135
|
|
13 ORDER_REASON=ORDER_REASON_CLIENT
|
|
ENUM_ORDER_PROPERTY_DOUBLE Count=7
|
|
0 ORDER_VOLUME_INITIAL=0.01
|
|
1 ORDER_VOLUME_CURRENT=0.01
|
|
2 ORDER_PRICE_OPEN=1.087
|
|
3 ORDER_PRICE_CURRENT=1.087
|
|
4 ORDER_PRICE_STOPLIMIT=0.0
|
|
5 ORDER_SL=0.0
|
|
6 ORDER_TP=0.0
|
|
ENUM_ORDER_PROPERTY_STRING Count=3
|
|
0 ORDER_SYMBOL=EURUSD
|
|
1 ORDER_COMMENT=
|
|
2 ORDER_EXTERNAL_ID=
|
|
>>> OnTrade(1)
|
|
Order properties changed:
|
|
10 14
|
|
ORDER_PRICE_CURRENT: 1.087 -> 1.09073
|
|
ORDER_STATE: ORDER_STATE_STARTED -> ORDER_STATE_PLACED
|
|
>>> OnTrade(2)
|
|
>>> OnTrade(3)
|
|
>>> OnTrade(4)
|
|
|
|
>>> OnTrade(5)
|
|
Order properties changed:
|
|
10 13
|
|
ORDER_PRICE_CURRENT: 1.09073 -> 1.09079
|
|
ORDER_TP: 0.0 -> 1.097
|
|
>>> OnTrade(6)
|
|
>>> OnTrade(7)
|
|
|
|
>>> OnTrade(8)
|
|
Order properties changed:
|
|
10
|
|
ORDER_PRICE_CURRENT: 1.09079 -> 1.09082
|
|
>>> OnTrade(9)
|
|
>>> OnTrade(10)
|
|
Order properties changed:
|
|
2 6
|
|
ORDER_TIME_EXPIRATION: 1970.01.01 00:00:00 -> 2022.04.11 00:00:00
|
|
ORDER_TYPE_TIME: ORDER_TIME_GTC -> ORDER_TIME_DAY
|
|
>>> OnTrade(11)
|
|
|
|
>>> OnTrade(12)
|
|
TRADE_ORDER_NOT_FOUND
|
|
>>> OnTrade(13)
|
|
TRADE_ORDER_NOT_FOUND
|
|
>>> OnTrade(14)
|
|
TRADE_ORDER_NOT_FOUND
|
|
>>> OnTrade(15)
|
|
TRADE_ORDER_NOT_FOUND
|
|
>>> OnTrade(16)
|
|
TRADE_ORDER_NOT_FOUND
|
|
>>> OnTrade(17)
|
|
TRADE_ORDER_NOT_FOUND
|
|
|
|
*/
|
|
//+------------------------------------------------------------------+
|