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
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.