forked from Princeec13/mql5
158 lines
5.5 KiB
MQL5
158 lines
5.5 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| OTCTypes.mqh |
|
|
//| Copyright 2025, OTC Escape EA |
|
|
//| https://www.yoursite.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2025, OTC Escape EA"
|
|
#property link "https://www.yoursite.com"
|
|
#property version "1.00"
|
|
#property strict
|
|
|
|
#include <Object.mqh>
|
|
#include <Trade\Trade.mqh>
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Enumeration for Market Regimes |
|
|
//+------------------------------------------------------------------+
|
|
enum E_MARKET_REGIME
|
|
{
|
|
REGIME_STABLE_RANGING,
|
|
REGIME_STABLE_TRENDING,
|
|
REGIME_VOLATILE_RANGING,
|
|
REGIME_VOLATILE_TRENDING,
|
|
REGIME_QUIET_TRENDING,
|
|
REGIME_QUIET_RANGING,
|
|
REGIME_UNDEFINED
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Struct for a set of performance metrics |
|
|
//+------------------------------------------------------------------+
|
|
struct SMetricSet
|
|
{
|
|
int total_trades;
|
|
int total_wins;
|
|
int total_losses;
|
|
double gross_profit;
|
|
double gross_loss;
|
|
double net_profit;
|
|
double profit_factor;
|
|
double win_rate;
|
|
double total_sl_pips;
|
|
double total_tp_pips;
|
|
double avg_sl;
|
|
double avg_tp;
|
|
|
|
void Reset()
|
|
{
|
|
total_trades = 0;
|
|
total_wins = 0;
|
|
total_losses = 0;
|
|
gross_profit = 0.0;
|
|
gross_loss = 0.0;
|
|
net_profit = 0.0;
|
|
profit_factor = 0.0;
|
|
win_rate = 0.0;
|
|
total_sl_pips = 0.0;
|
|
total_tp_pips = 0.0;
|
|
avg_sl = 0.0;
|
|
avg_tp = 0.0;
|
|
}
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Struct for detailed performance metrics per regime |
|
|
//+------------------------------------------------------------------+
|
|
struct SPerformanceMetrics
|
|
{
|
|
SMetricSet buy_metrics;
|
|
SMetricSet sell_metrics;
|
|
SMetricSet total_metrics;
|
|
double max_drawdown;
|
|
double cumulative_balance;
|
|
double peak_balance;
|
|
|
|
SPerformanceMetrics() : max_drawdown(0), cumulative_balance(0), peak_balance(0) {}
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Trade Record Structure |
|
|
//+------------------------------------------------------------------+
|
|
class STradeRecord : public CObject
|
|
{
|
|
public:
|
|
long ticket;
|
|
ENUM_ORDER_TYPE trade_type;
|
|
double entry_price;
|
|
double exit_price;
|
|
double lot_size;
|
|
double stop_loss;
|
|
double take_profit;
|
|
double profit;
|
|
datetime entry_time;
|
|
datetime exit_time;
|
|
double spread;
|
|
double volatility;
|
|
double trend_strength;
|
|
E_MARKET_REGIME market_regime;
|
|
|
|
STradeRecord() : ticket(0), trade_type((ENUM_ORDER_TYPE)-1), entry_price(0), exit_price(0), lot_size(0), stop_loss(0), take_profit(0), profit(0), entry_time(0), exit_time(0), spread(0), volatility(0), trend_strength(0), market_regime(REGIME_UNDEFINED) {}
|
|
|
|
virtual bool Save(const int handle)
|
|
{
|
|
if(handle == INVALID_HANDLE) return false;
|
|
if(FileWriteLong(handle, ticket) <= 0) return false;
|
|
if(FileWriteInteger(handle, (int)trade_type) <= 0) return false;
|
|
if(FileWriteDouble(handle, entry_price) <= 0) return false;
|
|
if(FileWriteDouble(handle, exit_price) <= 0) return false;
|
|
if(FileWriteDouble(handle, lot_size) <= 0) return false;
|
|
if(FileWriteDouble(handle, stop_loss) <= 0) return false;
|
|
if(FileWriteDouble(handle, take_profit) <= 0) return false;
|
|
if(FileWriteDouble(handle, profit) <= 0) return false;
|
|
if(FileWriteLong(handle, entry_time) <= 0) return false;
|
|
if(FileWriteLong(handle, exit_time) <= 0) return false;
|
|
if(FileWriteDouble(handle, spread) <= 0) return false;
|
|
if(FileWriteDouble(handle, volatility) <= 0) return false;
|
|
if(FileWriteDouble(handle, trend_strength) <= 0) return false;
|
|
if(FileWriteInteger(handle, (int)market_regime) <= 0) return false;
|
|
return true;
|
|
}
|
|
|
|
virtual bool Load(const int handle)
|
|
{
|
|
if(handle == INVALID_HANDLE) return false;
|
|
ticket = FileReadLong(handle);
|
|
trade_type = (ENUM_ORDER_TYPE)FileReadInteger(handle);
|
|
entry_price = FileReadDouble(handle);
|
|
exit_price = FileReadDouble(handle);
|
|
lot_size = FileReadDouble(handle);
|
|
stop_loss = FileReadDouble(handle);
|
|
take_profit = FileReadDouble(handle);
|
|
profit = FileReadDouble(handle);
|
|
entry_time = FileReadLong(handle);
|
|
exit_time = FileReadLong(handle);
|
|
spread = FileReadDouble(handle);
|
|
volatility = FileReadDouble(handle);
|
|
trend_strength = FileReadDouble(handle);
|
|
market_regime = (E_MARKET_REGIME)FileReadInteger(handle);
|
|
return !FileIsEnding(handle);
|
|
}
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Market State Structure |
|
|
//+------------------------------------------------------------------+
|
|
struct SMarketState
|
|
{
|
|
double volatility;
|
|
double trend_strength;
|
|
E_MARKET_REGIME regime;
|
|
ENUM_ORDER_TYPE trade_direction;
|
|
double optimal_sl;
|
|
double optimal_tp;
|
|
|
|
SMarketState() : volatility(0), trend_strength(0), regime(REGIME_UNDEFINED), trade_direction((ENUM_ORDER_TYPE)-1), optimal_sl(0), optimal_tp(0) {}
|
|
void Reset() { volatility=0; trend_strength=0; regime=REGIME_UNDEFINED; trade_direction=(ENUM_ORDER_TYPE)-1; optimal_sl=0; optimal_tp=0; }
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|