237 lines
8.4 KiB
Plaintext
237 lines
8.4 KiB
Plaintext
#include "String.mqh"
|
|
|
|
#define UINT64 ulong
|
|
#define INT64 datetime
|
|
#define UINT uint
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Ñòðóêòóðà òîðãîâîãî îðäåðà |
|
|
//+------------------------------------------------------------------+
|
|
struct TradeOrder
|
|
{
|
|
private:
|
|
ENUM_ORDER_REASON ReasonToInteger( const ENUM_ORDER_REASON Reason ) const
|
|
{
|
|
int Res = 1;
|
|
|
|
switch (Reason)
|
|
{
|
|
case ORDER_REASON_SL:
|
|
Res = 3;
|
|
|
|
break;
|
|
case ORDER_REASON_TP:
|
|
Res = 4;
|
|
|
|
break;
|
|
}
|
|
|
|
return((ENUM_ORDER_REASON)Res);
|
|
}
|
|
|
|
ENUM_ORDER_REASON IntegerToReason( const int Reason ) const
|
|
{
|
|
ENUM_ORDER_REASON Res = ORDER_REASON_CLIENT;
|
|
|
|
switch (Reason)
|
|
{
|
|
case 3:
|
|
Res = ORDER_REASON_SL;
|
|
|
|
break;
|
|
case 4:
|
|
Res = ORDER_REASON_TP;
|
|
|
|
break;
|
|
}
|
|
|
|
return((ENUM_ORDER_REASON)Res);
|
|
}
|
|
|
|
public:
|
|
UINT64 order; // óíèêàëüíûé èäåíòèôèêàòîð îðäåðà
|
|
// wchar_t symbol[32]; // ñèìâîë ïî êîòîðîìó âûñòàâëåí îðäåð
|
|
STRING32 symbol; // ñèìâîë ïî êîòîðîìó âûñòàâëåí îðäåð
|
|
INT64 time_setup; // âðåìÿ ïðè¸ìà îðäåðà îò êëèåíòà â ñèñòåìó
|
|
INT64 time_done; // âðåìÿ ñíÿòèÿ çàâêè
|
|
ENUM_ORDER_TYPE type; // òèï îðäåðà
|
|
ENUM_ORDER_REASON type_reason; // ïðè÷èíà ôîðìèðîâàíèÿ îðäåðà
|
|
double price_order; // öåíà îðäåðà
|
|
double price_trigger; // öåíà èñïîëíåíèÿ îðäåðà
|
|
double price_sl; // öåíà SL â îðäåðå
|
|
double price_tp; // öåíà TP â îðäåðå
|
|
UINT64 volume_initial; // íà÷àëüíûé îáú¸ì çàÿâêè
|
|
UINT64 volume_current; // òåêóùèé îáú¸ì çàÿâêè
|
|
// wchar_t comment[32]; // êîììåíòàðèé ê îðäåðó
|
|
STRING32 comment; // êîììåíòàðèé ê îðäåðó
|
|
ENUM_ORDER_STATE state; // òåêóùåå ñîñòîÿíèå îðäåðà
|
|
UINT digits; // êîëè÷åñòâî çíàêîâ ó òîðãîâîãî ñèìâîëà
|
|
double contract_size; // ðàçìåð êîíòðàêòà
|
|
|
|
bool Set( const ulong Ticket )
|
|
{
|
|
const bool Res = (::HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket);
|
|
|
|
if (Res)
|
|
{
|
|
this.order = Ticket; // óíèêàëüíûé èäåíòèôèêàòîð îðäåðà
|
|
|
|
string Str = ::HistoryOrderGetString(Ticket, ORDER_SYMBOL);
|
|
this.symbol = Str; // ñèìâîë ïî êîòîðîìó âûñòàâëåí îðäåð
|
|
|
|
this.contract_size = ::SymbolInfoDouble(Str, SYMBOL_TRADE_CONTRACT_SIZE); // ðàçìåð êîíòðàêòà
|
|
this.digits = (UINT)::SymbolInfoInteger(Str, SYMBOL_DIGITS); // êîëè÷åñòâî çíàêîâ ó òîðãîâîãî ñèìâîëà
|
|
|
|
Str = ::HistoryOrderGetString(Ticket, ORDER_COMMENT);
|
|
this.comment = Str; // êîììåíòàðèé ê îðäåðó
|
|
|
|
this.time_setup = (INT64)::HistoryOrderGetInteger(Ticket, ORDER_TIME_SETUP); // âðåìÿ ïðè¸ìà îðäåðà îò êëèåíòà â ñèñòåìó
|
|
this.time_done = (INT64)::HistoryOrderGetInteger(Ticket, ORDER_TIME_DONE); // âðåìÿ ñíÿòèÿ çàâêè
|
|
|
|
this.type = (ENUM_ORDER_TYPE)::HistoryOrderGetInteger(Ticket, ORDER_TYPE); // òèï îðäåðà
|
|
this.type_reason = this.ReasonToInteger((ENUM_ORDER_REASON)::HistoryOrderGetInteger(Ticket, ORDER_REASON)); // ïðè÷èíà ôîðìèðîâàíèÿ îðäåðà
|
|
this.state = (ENUM_ORDER_STATE)::HistoryOrderGetInteger(Ticket, ORDER_STATE); // òåêóùåå ñîñòîÿíèå îðäåðà
|
|
|
|
this.price_order = ::HistoryOrderGetDouble(Ticket, ORDER_PRICE_OPEN); // öåíà îðäåðà
|
|
this.price_trigger = 0; // öåíà èñïîëíåíèÿ îðäåðà
|
|
this.price_sl = ::HistoryOrderGetDouble(Ticket, ORDER_SL); // öåíà SL â îðäåðå
|
|
this.price_tp = ::HistoryOrderGetDouble(Ticket, ORDER_TP); // öåíà TP â îðäåðå
|
|
|
|
this.volume_initial = (UINT64)(::HistoryOrderGetDouble(Ticket, ORDER_VOLUME_INITIAL) * this.contract_size * 1000 + 0.1); // íà÷àëüíûé îáú¸ì çàÿâêè
|
|
this.volume_current = (UINT64)(::HistoryOrderGetDouble(Ticket, ORDER_VOLUME_CURRENT) * this.contract_size * 1000 + 0.1); // òåêóùèé îáú¸ì çàÿâêè
|
|
}
|
|
|
|
return(Res);
|
|
}
|
|
|
|
long GetProperty( const ENUM_ORDER_PROPERTY_INTEGER Property ) const
|
|
{
|
|
long Res = 0;
|
|
|
|
switch (Property)
|
|
{
|
|
case ORDER_TICKET:
|
|
Res = (long)this.order;
|
|
|
|
break;
|
|
case ORDER_TIME_SETUP:
|
|
Res = this.time_setup;
|
|
|
|
break;
|
|
case ORDER_TYPE:
|
|
Res = this.type;
|
|
|
|
break;
|
|
case ORDER_STATE:
|
|
Res = this.state;
|
|
|
|
break;
|
|
case ORDER_TIME_DONE:
|
|
Res = this.time_done;
|
|
|
|
break;
|
|
case ORDER_TIME_SETUP_MSC:
|
|
Res = (long)this.time_setup * 1000;
|
|
|
|
break;
|
|
case ORDER_TIME_DONE_MSC:
|
|
Res = (long)this.time_done * 1000;
|
|
|
|
break;
|
|
case ORDER_REASON:
|
|
Res = this.IntegerToReason(this.type_reason);
|
|
|
|
break;
|
|
case ORDER_POSITION_ID:
|
|
Res = (long)this.order;
|
|
|
|
break;
|
|
}
|
|
|
|
return(Res);
|
|
}
|
|
|
|
double GetProperty( const ENUM_ORDER_PROPERTY_DOUBLE Property ) const
|
|
{
|
|
double Res = 0;
|
|
|
|
switch (Property)
|
|
{
|
|
case ORDER_VOLUME_INITIAL:
|
|
Res = (double)this.volume_initial / (this.contract_size ? this.contract_size * 1000 : 1e8);
|
|
|
|
break;
|
|
case ORDER_VOLUME_CURRENT:
|
|
Res = (double)this.volume_current / (this.contract_size ? this.contract_size * 1000 : 1e8);
|
|
|
|
break;
|
|
case ORDER_PRICE_OPEN:
|
|
Res = this.price_order;
|
|
|
|
break;
|
|
case ORDER_SL:
|
|
Res = this.price_sl;
|
|
|
|
break;
|
|
case ORDER_TP:
|
|
Res = this.price_tp;
|
|
|
|
break;
|
|
}
|
|
|
|
return(Res);
|
|
}
|
|
|
|
string GetProperty( const ENUM_ORDER_PROPERTY_STRING Property ) const
|
|
{
|
|
string Res = NULL;
|
|
|
|
switch (Property)
|
|
{
|
|
case ORDER_SYMBOL:
|
|
Res = this.symbol[];
|
|
|
|
break;
|
|
case ORDER_COMMENT:
|
|
Res = this.comment[];
|
|
|
|
break;
|
|
}
|
|
|
|
return(Res);
|
|
}
|
|
|
|
#define TOSTRING(A) #A + " = " + (string)(this.A) + "\n"
|
|
#define TOSTRING2(A) #A + " = " + ::EnumToString(this.A) + " (" + (string)(this.A) + ")\n"
|
|
#define TOSTRING3(A) #A + " = " + this.A[] + "\n"
|
|
|
|
string ToString( void ) const
|
|
{
|
|
return(
|
|
TOSTRING(order) + // óíèêàëüíûé èäåíòèôèêàòîð îðäåðà
|
|
TOSTRING3(symbol) + // ñèìâîë ïî êîòîðîìó âûñòàâëåí îðäåð
|
|
TOSTRING(time_setup) + // âðåìÿ ïðè¸ìà îðäåðà îò êëèåíòà â ñèñòåìó
|
|
TOSTRING(time_done) + // âðåìÿ ñíÿòèÿ çàâêè
|
|
TOSTRING2(type) + // òèï îðäåðà
|
|
TOSTRING2(type_reason) + // ïðè÷èíà ôîðìèðîâàíèÿ îðäåðà
|
|
TOSTRING(price_order) + // öåíà îðäåðà
|
|
TOSTRING(price_trigger) + // öåíà èñïîëíåíèÿ îðäåðà
|
|
TOSTRING(price_sl) + // öåíà SL â îðäåðå
|
|
TOSTRING(price_tp) + // öåíà TP â îðäåðå
|
|
TOSTRING(volume_initial) + // íà÷àëüíûé îáú¸ì çàÿâêè
|
|
TOSTRING(volume_current) + // òåêóùèé îáú¸ì çàÿâêè
|
|
TOSTRING3(comment) + // êîììåíòàðèé ê îðäåðó
|
|
TOSTRING2(state) + // òåêóùåå ñîñòîÿíèå îðäåðà
|
|
TOSTRING(digits) + // êîëè÷åñòâî çíàêîâ ó òîðãîâîãî ñèìâîëà
|
|
TOSTRING(contract_size) // ðàçìåð êîíòðàêòà
|
|
);
|
|
}
|
|
|
|
#undef TOSTRING3
|
|
#undef TOSTRING2
|
|
#undef TOSTRING
|
|
};
|
|
|
|
#undef UINT
|
|
#undef INT64
|
|
#undef UINT64 |