Add files via upload

This commit is contained in:
amirghadiri1987
2025-02-07 19:08:31 +03:30
committed by GitHub
parent c33ac55f2f
commit a9340e5d4e
85 changed files with 15214 additions and 0 deletions
Binary file not shown.
@@ -0,0 +1,201 @@
#include "String.mqh"
//+------------------------------------------------------------------+
//| Структура для статистики торговли |
//+------------------------------------------------------------------+
struct ExpTradeSummarySingle
{
public:
int Offset1[10];
int bars;
int ticks;
STRING32 symbol;
double initial_deposit; // начальный депозит
double withdrawal; // снято средств
double profit; // общая прибыль (+)
double grossprofit; // общий плюс
double grossloss; // общий минус
double maxprofit; // максимально прибыльная сделка
double minprofit; // максимально убыточная сделка
double conprofitmax; // прибыль максимальной последовательности прибыльных сделок
double maxconprofit; // максимальная прибыль среди последовательностей
double conlossmax; // убыток максимальной последовательности убыточных сделок
double maxconloss; // максимальный убыток среди последовательностей
double balance_min; // минимальное значение баланса (для расчёта абсолютной просадки)
double maxdrawdown; // максимальная просадка по балансу
double drawdownpercent; // отношение максимальной просадки по балансу к её пику
double reldrawdown; // максимальная относительная просадка по балансу в деньгах
double reldrawdownpercent; // максимальная относительная просадка по балансу в процентах
double equity_min; // минимальное значение equity (для расчёта абсолютной просадки по equity)
double maxdrawdown_e; // максимальная просадка по equity
double drawdownpercent_e; // отношение максимальной просадки по equity к её пику (+)
double reldrawdown_e; // максимальная относительная просадка по equity в деньгах
double reldrawdownpercnt_e; // максимальная относительная просадка по equity в процентах
double expected_payoff; // матожидание выигрыша (+)
double profit_factor; // показатель прибыльности (+)
double recovery_factor; // фактор восстановления (+)
double sharpe_ratio; // коэффициент Шарпа (+)
double margin_level; // минимальный уровень маржи
double custom_fitness; // пользовательский фитнесс - результат OnTester (+)
int deals; // общее количество сделок
int trades; // количество сделок out/inout
int profittrades; // количество прибыльных
int losstrades; // количество убыточных
int shorttrades; // количество шортов
int longtrades; // количество лонгов
int winshorttrades; // количество прибыльных шортов
int winlongtrades; // количество прибыльных лонгов
int conprofitmax_trades; // максимальная последовательность прибыльных сделок
int maxconprofit_trades; // последовательность максимальной прибыли
int conlossmax_trades; // максимальная последовательность убыточных сделок
int maxconloss_trades; // последовательность максимального убытка
int avgconwinners; // среднее количество последовательных прибыльных сделок
int avgconloosers; // среднее количество последовательных убыточных сделок
#define TOSTRING(A) #A + " = " + (string)(A) + "\n"
#define TOSTRING3(A) #A + " = " + this.A[] + "\n"
string ToString( void ) const
{
return(
TOSTRING(bars) +
TOSTRING(ticks) +
TOSTRING3(symbol) +
TOSTRING(initial_deposit) + // начальный депозит
TOSTRING(withdrawal) + // снято средств
TOSTRING(profit) + // общая прибыль (+)
TOSTRING(grossprofit) + // общий плюс
TOSTRING(grossloss) + // общий минус
TOSTRING(maxprofit) + // максимально прибыльная сделка
TOSTRING(minprofit) + // максимально убыточная сделка
TOSTRING(conprofitmax) + // прибыль максимальной последовательности прибыльных сделок
TOSTRING(maxconprofit) + // максимальная прибыль среди последовательностей
TOSTRING(conlossmax) + // убыток максимальной последовательности убыточных сделок
TOSTRING(maxconloss) + // максимальный убыток среди последовательностей
TOSTRING(balance_min) + // минимальное значение баланса (для расчёта абсолютной просадки)
TOSTRING(maxdrawdown) + // максимальная просадка по балансу
TOSTRING(drawdownpercent) + // отношение максимальной просадки по балансу к её пику
TOSTRING(reldrawdown) + // максимальная относительная просадка по балансу в деньгах
TOSTRING(reldrawdownpercent) + // максимальная относительная просадка по балансу в процентах
TOSTRING(equity_min) + // минимальное значение equity (для расчёта абсолютной просадки по equity)
TOSTRING(maxdrawdown_e) + // максимальная просадка по equity
TOSTRING(drawdownpercent_e) + // отношение максимальной просадки по equity к её пику (+)
TOSTRING(reldrawdown_e) + // максимальная относительная просадка по equity в деньгах
TOSTRING(reldrawdownpercnt_e) + // максимальная относительная просадка по equity в процентах
TOSTRING(expected_payoff) + // матожидание выигрыша (+)
TOSTRING(profit_factor) + // показатель прибыльности (+)
TOSTRING(recovery_factor) + // фактор восстановления (+)
TOSTRING(sharpe_ratio) + // коэффициент Шарпа (+)
TOSTRING(margin_level) + // минимальный уровень маржи
TOSTRING(custom_fitness) + // пользовательский фитнесс - результат OnTester (+)
TOSTRING(deals) + // общее количество сделок
TOSTRING(trades) + // количество сделок out/inout
TOSTRING(profittrades) + // количество прибыльных
TOSTRING(losstrades) + // количество убыточных
TOSTRING(shorttrades) + // количество шортов
TOSTRING(longtrades) + // количество лонгов
TOSTRING(winshorttrades) + // количество прибыльных шортов
TOSTRING(winlongtrades) + // количество прибыльных лонгов
TOSTRING(conprofitmax_trades) + // максимальная последовательность прибыльных сделок
TOSTRING(maxconprofit_trades) + // последовательность максимальной прибыли
TOSTRING(conlossmax_trades) + // максимальная последовательность убыточных сделок
TOSTRING(maxconloss_trades) + // последовательность максимального убытка
TOSTRING(avgconwinners) + // среднее количество последовательных прибыльных сделок
TOSTRING(avgconloosers) // среднее количество последовательных убыточных сделок
);
}
#undef TOSTRING3
#undef TOSTRING
double TesterStatistics( const ENUM_STATISTICS Statistic_ID ) const
{
switch (Statistic_ID)
{
case STAT_INITIAL_DEPOSIT:
return(this.initial_deposit);
case STAT_WITHDRAWAL:
return(this.withdrawal);
case STAT_PROFIT:
return(this.profit);
case STAT_GROSS_PROFIT:
return(this.grossprofit);
case STAT_GROSS_LOSS:
return(-this.grossloss);
case STAT_MAX_PROFITTRADE:
return(this.maxprofit);
case STAT_MAX_LOSSTRADE:
return(-this.minprofit);
case STAT_CONPROFITMAX:
return(this.maxconprofit);
case STAT_CONPROFITMAX_TRADES:
return(this.maxconprofit_trades);
case STAT_MAX_CONWINS:
return(this.conprofitmax);
case STAT_MAX_CONPROFIT_TRADES:
return(this.conprofitmax_trades);
case STAT_CONLOSSMAX:
return(-this.conlossmax);
case STAT_CONLOSSMAX_TRADES:
return(this.conlossmax_trades);
case STAT_MAX_CONLOSSES:
return(-this.maxconloss);
case STAT_MAX_CONLOSS_TRADES:
return(this.maxconloss_trades);
case STAT_BALANCEMIN:
return(this.balance_min);
case STAT_BALANCE_DD:
return(this.maxdrawdown);
case STAT_BALANCEDD_PERCENT:
return(this.drawdownpercent);
case STAT_BALANCE_DDREL_PERCENT:
return(this.reldrawdownpercent);
case STAT_BALANCE_DD_RELATIVE:
return(this.reldrawdown);
case STAT_EQUITYMIN:
return(this.equity_min);
case STAT_EQUITY_DD:
return(this.maxdrawdown_e);
case STAT_EQUITYDD_PERCENT:
return(this.drawdownpercent_e);
case STAT_EQUITY_DDREL_PERCENT:
return(this.reldrawdownpercnt_e);
case STAT_EQUITY_DD_RELATIVE:
return(this.reldrawdown_e);
case STAT_EXPECTED_PAYOFF:
return(this.expected_payoff);
case STAT_PROFIT_FACTOR:
return(this.profit_factor);
case STAT_RECOVERY_FACTOR:
return(this.recovery_factor);
case STAT_SHARPE_RATIO:
return(this.sharpe_ratio);
case STAT_MIN_MARGINLEVEL:
return(this.margin_level);
case STAT_CUSTOM_ONTESTER:
return(this.custom_fitness);
case STAT_DEALS:
return(this.deals);
case STAT_TRADES:
return(this.trades);
case STAT_PROFIT_TRADES:
return(this.profittrades);
case STAT_LOSS_TRADES:
return(this.losstrades);
case STAT_SHORT_TRADES:
return(this.shorttrades);
case STAT_LONG_TRADES:
return(this.longtrades);
case STAT_PROFIT_SHORTTRADES:
return(this.winshorttrades);
case STAT_PROFIT_LONGTRADES:
return(this.winlongtrades);
case STAT_PROFITTRADES_AVGCON:
return(this.avgconwinners);
case STAT_LOSSTRADES_AVGCON:
return(this.avgconloosers);
}
return(0);
}
};
Binary file not shown.
Binary file not shown.
+50
View File
@@ -0,0 +1,50 @@
#ifndef __STRING__
#define __STRING__
#define NULL_CHAR (short)0xFFFF
#define DEFINE_STRING(A) \
struct STRING##A \
{ \
public : \
short Array[A]; \
\
public: \
void operator =( const string &Str ) \
{ \
::ArrayInitialize(Array, 0); \
this.Array[0] = NULL_CHAR; \
::StringToShortArray(Str, this.Array); \
\
return; \
} \
\
template <typename T> \
void operator =( const T &Str ) \
{ \
const string StrTmp = Str[]; \
this = StrTmp; \
\
return; \
} \
\
string operator []( const int = 0 ) const \
{ \
return((this.Array[0] == NULL_CHAR) \
? NULL : \
::ShortArrayToString(this.Array)); \
} \
};
DEFINE_STRING(16)
DEFINE_STRING(32)
DEFINE_STRING(64)
DEFINE_STRING(128)
DEFINE_STRING(80)
#undef DEFINE_STRING
#undef NULL_CHAR
#endif // __STRING__
@@ -0,0 +1,44 @@
#define UINT64 ulong
#define INT64 datetime
//+------------------------------------------------------------------+
//| Ñòðóêòóðà ðåçóëüòàòîâ äëÿ ïîçèöèè |
//+------------------------------------------------------------------+
struct TesterPositionProfit
{
private:
string LengthToString( const datetime Length ) const
{
const int Days = (int)(Length / (24 * 3600));
return(((Days) ? (string)Days + "d ": "") + ::TimeToString(Length, TIME_SECONDS));
}
public:
UINT64 id; // id ïîçèöèè
double mfe; // MFE
double mae; // MAE
double profit; // ïðèáûëü
INT64 lifetime; // âðåìÿ æèçíè ïîçèöèè â ñåêóíäàõ
UINT64 reserve[3];
#define TOSTRING(A) #A + " = " + (string)(this.A) + "\n"
#define TOSTRING2(A) #A + " = " + this.LengthToString(A) + "\n"
string ToString( void ) const
{
return(
TOSTRING(id) + // id ïîçèöèè
TOSTRING(mfe) + // MFE
TOSTRING(mae) + // MAE
TOSTRING(profit) + // ïðèáûëü
TOSTRING2(lifetime) // âðåìÿ æèçíè ïîçèöèè â ñåêóíäàõ
);
}
#undef TOSTRING2
#undef TOSTRING
};
#undef INT64
#undef UINT64
@@ -0,0 +1,29 @@
#define __int64 datetime
//+------------------------------------------------------------------+
//| Ñòðóêòóðà äëÿ ãðàôèêà òåñòèðîâàíèÿ |
//+------------------------------------------------------------------+
struct TesterTradeState
{
// __int64 datetime; // òåêóùåå òåñòîâîå âðåìÿ
__int64 time; // òåêóùåå òåñòîâîå âðåìÿ
double balance; // òåêóùèé áàëàíñ
double equity; // òåêóùèé equity
double value; // òåêóùåå ðàññ÷èòàííîå çíà÷åíèå íàãðóçêè íà äåïîçèò
#define TOSTRING(A) #A + " = " + (string)(this.A) + "\n"
string ToString( void ) const
{
return(
TOSTRING(time) + // òåêóùåå òåñòîâîå âðåìÿ
TOSTRING(balance) + // òåêóùèé áàëàíñ
TOSTRING(equity) + // òåêóùèé equity
TOSTRING(value) // òåêóùåå ðàññ÷èòàííîå çíà÷åíèå íàãðóçêè íà äåïîçèò
);
}
#undef TOSTRING
};
#undef __int64
Binary file not shown.
+237
View File
@@ -0,0 +1,237 @@
#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