206 lines
16 KiB
Plaintext
206 lines
16 KiB
Plaintext
#include "String.mqh"
|
|
|
|
#define UINT64 ulong
|
|
#define INT64 datetime
|
|
#define UINT uint
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Структура торговой сделки |
|
|
//+------------------------------------------------------------------+
|
|
struct TradeDeal
|
|
{
|
|
UINT64 deal; // уникальный идентификатор записи
|
|
UINT64 order; // идентификатор ордера которому соответствует запись
|
|
INT64 time_create; // время создания записи
|
|
// wchar_t symbol[32]; // символ по которому выставлен ордер
|
|
STRING32 symbol; // символ по которому выставлен ордер
|
|
double price_open; // цена открытия\исполнения
|
|
double price_close; // цена закрытия
|
|
double sl; // стоп-лосс позиции
|
|
double tp; // тейк-профит позиции
|
|
UINT64 volume; // объём исполнения
|
|
double profit; // финансовый результат
|
|
double commission; // коммиссия за выполнение
|
|
double reserve; // резерв
|
|
double storage; // активы
|
|
// wchar_t comment[32]; // комментарий к ордеру
|
|
STRING32 comment; // комментарий к ордеру
|
|
ENUM_DEAL_TYPE action; // идентификатор события
|
|
ENUM_DEAL_ENTRY entry; // вход в позицию или выход
|
|
UINT digits; // количество знаков у торгового символа
|
|
UINT digits_currency; // количество знаков у валюты группы
|
|
double contract_size; // размер контракта
|
|
UINT64 position_id;
|
|
|
|
bool Set( const ulong Ticket )
|
|
{
|
|
const bool Res = (::HistoryDealGetInteger(Ticket, DEAL_TICKET) == Ticket);
|
|
|
|
if (Res)
|
|
{
|
|
this.deal = Ticket; // уникальный идентификатор записи
|
|
|
|
string Str = ::HistoryDealGetString(Ticket, DEAL_SYMBOL);;
|
|
this.symbol = Str; // символ по которому выставлен ордер
|
|
|
|
this.contract_size = ::SymbolInfoDouble(Str, SYMBOL_TRADE_CONTRACT_SIZE); // размер контракта
|
|
this.digits = (UINT)::SymbolInfoInteger(Str, SYMBOL_DIGITS); // количество знаков у торгового символа
|
|
|
|
Str = ::HistoryDealGetString(Ticket, DEAL_COMMENT);
|
|
this.comment = Str; // комментарий к ордеру
|
|
|
|
this.order = ::HistoryDealGetInteger(Ticket, DEAL_ORDER); // идентификатор ордера которому соответствует запись
|
|
this.time_create = (INT64)::HistoryDealGetInteger(Ticket, DEAL_TIME); // время создания записи
|
|
this.price_open = ::HistoryDealGetDouble(Ticket, DEAL_PRICE); // цена открытия\исполнения
|
|
this.price_close = 0; // цена закрытия
|
|
this.sl = ::HistoryDealGetDouble(Ticket, DEAL_SL); // стоп-лосс позиции
|
|
this.tp = ::HistoryDealGetDouble(Ticket, DEAL_TP); // тейк-профит позиции
|
|
this.volume = (UINT64)(::HistoryDealGetDouble(Ticket, DEAL_VOLUME) * this.contract_size * 1000 + 0.1); // объём исполнения
|
|
this.profit = ::HistoryDealGetDouble(Ticket, DEAL_PROFIT); // финансовый результат
|
|
this.commission = ::HistoryDealGetDouble(Ticket, DEAL_COMMISSION); // коммиссия за выполнение
|
|
this.reserve = 0; // резерв
|
|
this.storage = ::HistoryDealGetDouble(Ticket, DEAL_SWAP); // активы
|
|
this.action = (ENUM_DEAL_TYPE)::HistoryDealGetInteger(Ticket, DEAL_TYPE); // идентификатор события
|
|
this.entry = (ENUM_DEAL_ENTRY)::HistoryDealGetInteger(Ticket, DEAL_ENTRY); // вход в позицию или выход
|
|
this.digits_currency = (UINT)::AccountInfoInteger(ACCOUNT_CURRENCY_DIGITS); // количество знаков у валюты группы
|
|
this.position_id = ::HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
|
|
}
|
|
|
|
return(Res);
|
|
}
|
|
|
|
long GetProperty( const ENUM_DEAL_PROPERTY_INTEGER Property ) const
|
|
{
|
|
long Res = 0;
|
|
|
|
switch (Property)
|
|
{
|
|
case DEAL_TICKET:
|
|
Res = (long)this.deal;
|
|
|
|
break;
|
|
case DEAL_ORDER:
|
|
Res = (long)this.order;
|
|
|
|
break;
|
|
case DEAL_TIME:
|
|
Res = this.time_create;
|
|
|
|
break;
|
|
case DEAL_TIME_MSC:
|
|
Res = (long)this.time_create * 1000;
|
|
|
|
break;
|
|
case DEAL_TYPE:
|
|
Res = this.action;
|
|
|
|
break;
|
|
case DEAL_ENTRY:
|
|
Res = this.entry;
|
|
|
|
break;
|
|
case DEAL_POSITION_ID:
|
|
Res = (long)this.position_id;
|
|
|
|
break;
|
|
}
|
|
|
|
return(Res);
|
|
}
|
|
|
|
double GetProperty( const ENUM_DEAL_PROPERTY_DOUBLE Property ) const
|
|
{
|
|
double Res = 0;
|
|
|
|
switch (Property)
|
|
{
|
|
case DEAL_VOLUME:
|
|
Res = (double)this.volume / (this.contract_size ? this.contract_size * 1000 : 1e8);
|
|
|
|
break;
|
|
case DEAL_PRICE:
|
|
Res = this.price_open;
|
|
|
|
break;
|
|
case DEAL_COMMISSION:
|
|
Res = this.commission;
|
|
|
|
break;
|
|
case DEAL_SWAP:
|
|
Res = this.storage;
|
|
|
|
break;
|
|
case DEAL_PROFIT:
|
|
Res = this.profit;
|
|
|
|
break;
|
|
case DEAL_SL:
|
|
Res = this.sl;
|
|
|
|
break;
|
|
case DEAL_TP:
|
|
Res = this.tp;
|
|
|
|
break;
|
|
}
|
|
|
|
return(Res);
|
|
}
|
|
|
|
string GetProperty( const ENUM_DEAL_PROPERTY_STRING Property ) const
|
|
{
|
|
string Res = NULL;
|
|
|
|
switch (Property)
|
|
{
|
|
case DEAL_SYMBOL:
|
|
Res = this.symbol[];
|
|
|
|
break;
|
|
case DEAL_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(deal) + // уникальный идентификатор записи
|
|
TOSTRING(order) + // идентификатор ордера которому соответствует запись
|
|
TOSTRING(time_create) + // время создания записи
|
|
TOSTRING3(symbol) + // символ по которому выставлен ордер
|
|
TOSTRING(price_open) + // цена открытия\исполнения
|
|
TOSTRING(price_close) + // цена закрытия
|
|
TOSTRING(sl) + // стоп-лосс позиции
|
|
TOSTRING(tp) + // тейк-профит позиции
|
|
TOSTRING(volume) + // объём исполнения
|
|
TOSTRING(profit) + // финансовый результат
|
|
TOSTRING(commission) + // коммиссия за выполнение
|
|
TOSTRING(reserve) + // резерв
|
|
TOSTRING(storage) + // активы
|
|
TOSTRING3(comment) + // комментарий к ордеру
|
|
TOSTRING2(action) + // идентификатор события
|
|
TOSTRING2(entry) + // вход в позицию или выход
|
|
TOSTRING(digits) + // количество знаков у торгового символа
|
|
TOSTRING(digits_currency) + // количество знаков у валюты группы
|
|
TOSTRING(contract_size) + // размер контракта
|
|
TOSTRING(position_id)
|
|
);
|
|
}
|
|
|
|
#undef TOSTRING3
|
|
#undef TOSTRING2
|
|
#undef TOSTRING
|
|
};
|
|
|
|
#undef UINT
|
|
#undef INT64
|
|
#undef UINT64 |