forked from rosh/MQL5Book
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
| |
| |
*/
| |
//+------------------------------------------------------------------+
|