MQL5Book/Experts/p6/OrderSnapshot.mq5
super.admin 1c8e83ce31 convert
2025-05-30 16:09:41 +02:00

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
*/
//+------------------------------------------------------------------+