Last Changes ...
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
#include "../Classes/x-saherelm.x-alert.class.mq5"
|
#include "../Classes/x-saherelm.x-alert.class.mq5"
|
||||||
#include "../Classes/x-saherelm.x-data.collector.class.mq5"
|
#include "../Classes/x-saherelm.x-data.collector.class.mq5"
|
||||||
#include "../Classes/x-saherelm.x-guard.class.mq5"
|
#include "../Classes/x-saherelm.x-guard.class.mq5"
|
||||||
|
#include "../Classes/x-saherelm.x-poi.drawer.class.mq5"
|
||||||
#include "../Classes/x-saherelm.x-trade.class.mq5"
|
#include "../Classes/x-saherelm.x-trade.class.mq5"
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -41,6 +42,9 @@ class XCTradeManager : public XCBase
|
|||||||
XTimeTracker timeTracker;
|
XTimeTracker timeTracker;
|
||||||
XCDataCollector *collector;
|
XCDataCollector *collector;
|
||||||
|
|
||||||
|
//
|
||||||
|
XCPOIDrawer *drawer;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Constructor ...
|
// Constructor ...
|
||||||
XCTradeManager(
|
XCTradeManager(
|
||||||
@@ -54,6 +58,9 @@ class XCTradeManager : public XCBase
|
|||||||
guard = _guard;
|
guard = _guard;
|
||||||
trader = _trader;
|
trader = _trader;
|
||||||
|
|
||||||
|
//
|
||||||
|
drawer = new XCPOIDrawer();
|
||||||
|
|
||||||
//
|
//
|
||||||
allowTrade = true;
|
allowTrade = true;
|
||||||
allowLongs = true;
|
allowLongs = true;
|
||||||
@@ -104,6 +111,10 @@ class XCTradeManager : public XCBase
|
|||||||
ZeroMemory(alert);
|
ZeroMemory(alert);
|
||||||
ZeroMemory(trader);
|
ZeroMemory(trader);
|
||||||
|
|
||||||
|
//
|
||||||
|
delete drawer;
|
||||||
|
ZeroMemory(drawer);
|
||||||
|
|
||||||
//
|
//
|
||||||
delete collector;
|
delete collector;
|
||||||
ZeroMemory(collector);
|
ZeroMemory(collector);
|
||||||
@@ -851,10 +862,7 @@ class XCTradeManager : public XCBase
|
|||||||
*
|
*
|
||||||
* @return ( bool )
|
* @return ( bool )
|
||||||
*/
|
*/
|
||||||
bool Execute(
|
bool Execute(XSignal &signal)
|
||||||
XSignal &signal,
|
|
||||||
string conditions //
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
bool result = false;
|
bool result = false;
|
||||||
@@ -921,26 +929,6 @@ class XCTradeManager : public XCBase
|
|||||||
//
|
//
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
//
|
|
||||||
// Draw Signal ...
|
|
||||||
// if (drawSignal)
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// XCSignalObject *iObj;
|
|
||||||
// isExists = drawer.DrawSignal(
|
|
||||||
// signal,
|
|
||||||
// iObj //
|
|
||||||
// );
|
|
||||||
|
|
||||||
// //
|
|
||||||
// if (isExists)
|
|
||||||
// {
|
|
||||||
// //
|
|
||||||
// mObjects.Add(iObj);
|
|
||||||
// ZeroMemory(iObj);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Create Symbol Info Struct ...
|
// Create Symbol Info Struct ...
|
||||||
XTradeSymbolInfo iSymbolInfo;
|
XTradeSymbolInfo iSymbolInfo;
|
||||||
@@ -986,11 +974,11 @@ class XCTradeManager : public XCBase
|
|||||||
|
|
||||||
//
|
//
|
||||||
iTrade.signal = signal;
|
iTrade.signal = signal;
|
||||||
iTrade.conditions = conditions;
|
|
||||||
iTrade.positionID = positionID;
|
iTrade.positionID = positionID;
|
||||||
iTrade.commission = commission;
|
iTrade.commission = commission;
|
||||||
iTrade.signaledAt = signal.time;
|
iTrade.signaledAt = signal.time;
|
||||||
iTrade.executedAt = TimeCurrent();
|
iTrade.executedAt = TimeCurrent();
|
||||||
|
iTrade.conditions = signal.conditions;
|
||||||
|
|
||||||
//
|
//
|
||||||
AddRef(
|
AddRef(
|
||||||
@@ -1054,6 +1042,45 @@ class XCTradeManager : public XCBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle Signal Recieved ...
|
||||||
|
*
|
||||||
|
* @param signal: XSignal
|
||||||
|
*/
|
||||||
|
void HandleSignal(XSignal &signal)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Validate Signal ...
|
||||||
|
if (!signal.IsValid())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Signal ...
|
||||||
|
ENUM_X_SIGNAL_EXECUTION_RESULT signalExecutionResult;
|
||||||
|
bool canExecute = CheckSignal(
|
||||||
|
signal,
|
||||||
|
signalExecutionResult //
|
||||||
|
);
|
||||||
|
if (canExecute) {
|
||||||
|
bool isExecuted = Execute(signal);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Draw Signal Object ...
|
||||||
|
XCSignalObject *signalObj;
|
||||||
|
bool has = drawer.DrawSignal(
|
||||||
|
signal,
|
||||||
|
signalObj,
|
||||||
|
4 //
|
||||||
|
);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
mObjects.Add(signalObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle Position Take Profit ...
|
* Handle Position Take Profit ...
|
||||||
*
|
*
|
||||||
@@ -2169,6 +2196,9 @@ class XCTradeManager : public XCBase
|
|||||||
//
|
//
|
||||||
// Props ...
|
// Props ...
|
||||||
|
|
||||||
|
//
|
||||||
|
CArrayObj mObjects;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool allowTrade;
|
bool allowTrade;
|
||||||
bool allowLongs;
|
bool allowLongs;
|
||||||
|
|||||||
@@ -0,0 +1,143 @@
|
|||||||
|
`
|
||||||
|
//
|
||||||
|
// an Structure for Holds an Specified Symbols
|
||||||
|
// Positions Info ...
|
||||||
|
struct XTradeSymbolInfo
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Properties ...
|
||||||
|
|
||||||
|
//
|
||||||
|
string symbol; // Trading Symbol
|
||||||
|
|
||||||
|
//
|
||||||
|
int longs; // All Long Trades
|
||||||
|
int shorts; // All Short Trades
|
||||||
|
|
||||||
|
//
|
||||||
|
int trades; // All Trades
|
||||||
|
|
||||||
|
//
|
||||||
|
int losses; // All Loosing Trades
|
||||||
|
int profits; // All Winning Trades
|
||||||
|
|
||||||
|
//
|
||||||
|
datetime managedStart; // Managed Start Time
|
||||||
|
|
||||||
|
//
|
||||||
|
int managedSLs; // Managed SL(s)
|
||||||
|
int managedTPs; // Managed TP(s)
|
||||||
|
int managedTrades; // Managed Trades
|
||||||
|
|
||||||
|
//
|
||||||
|
double managedBalance; // Managed Start Balance
|
||||||
|
double managedProfits; // Managed Profit(s)
|
||||||
|
|
||||||
|
//
|
||||||
|
// Constructor ...
|
||||||
|
XTradeSymbolInfo()
|
||||||
|
{
|
||||||
|
Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Tools ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cleanup ...
|
||||||
|
void Clean()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
symbol = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
longs = 0;
|
||||||
|
shorts = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
trades = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
losses = 0;
|
||||||
|
profits = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
managedStart = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
managedSLs = 0;
|
||||||
|
managedTPs = 0;
|
||||||
|
managedTrades = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
managedBalance = 0;
|
||||||
|
managedProfits = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
ZeroMemory(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate ...
|
||||||
|
bool IsValid()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsSpecifiedValid(symbol);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool IsSameAs(XTradeSymbolInfo &item)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid() &&
|
||||||
|
item.IsValid() &&
|
||||||
|
symbol == item.symbol;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
string GetRestrictionDescription(
|
||||||
|
ENUM_XTRADE_RESTRICTION_PERIOD period //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string result = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid() ||
|
||||||
|
!HasRestrictions(period))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result +=
|
||||||
|
"-------------------" + "\n" +
|
||||||
|
"Restrictions: " + "\n" +
|
||||||
|
"-------------------" + "\n" +
|
||||||
|
"Symbol: " + ToXString(symbol) + "\n" +
|
||||||
|
"Period: " + ToXString(period) + "\n" +
|
||||||
|
"Start: " + ToFormatString(managedStart) + "\n" +
|
||||||
|
"Balance: " + ToXString(managedBalance) + "\n" +
|
||||||
|
"-------------------" + "\n" +
|
||||||
|
"Trades: " + ToXString(managedTrades) + "\n" +
|
||||||
|
"SL: " + ToXString(managedSLs) + "\n" +
|
||||||
|
"TP: " + ToXString(managedTPs) + "\n" +
|
||||||
|
"Profit: " + ToXString(managedProfits) + "\n" +
|
||||||
|
"";
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -35,6 +35,11 @@ input long eaMagicNumber = 1694056; // Magic Number
|
|||||||
input int eaSlippage = 10; // Slippgae
|
input int eaSlippage = 10; // Slippgae
|
||||||
input string eaLogSuffix = ""; // Log Suffix
|
input string eaLogSuffix = ""; // Log Suffix
|
||||||
|
|
||||||
|
//
|
||||||
|
// Symbols
|
||||||
|
// [Symbol|period|(ST_04:00_08:30),(TL_10:30_12:00),(NY_16:00_20:00)]
|
||||||
|
input string eaSymbolConfiguration; // Symbol Configurations
|
||||||
|
|
||||||
//
|
//
|
||||||
// Management ...
|
// Management ...
|
||||||
// eaSessions => (ST_04:00_08:30),(TL_10:30_12:00),(NY_16:00_20:00)
|
// eaSessions => (ST_04:00_08:30),(TL_10:30_12:00),(NY_16:00_20:00)
|
||||||
@@ -140,6 +145,10 @@ int OnInit()
|
|||||||
//
|
//
|
||||||
// Setting All Inputs to Expert Adviser Class ...
|
// Setting All Inputs to Expert Adviser Class ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Symbols ...
|
||||||
|
eaExpert.eaSymbolConfiguration = eaSymbolConfiguration;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Management ...
|
// Management ...
|
||||||
eaExpert.eaAllowGuards = eaAllowGuards;
|
eaExpert.eaAllowGuards = eaAllowGuards;
|
||||||
@@ -197,6 +206,7 @@ int OnInit()
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Attach Event Handlers ...
|
// Attach Event Handlers ...
|
||||||
|
eaExpert.AddOnSignalEventHandler(OnSignalTriggered);
|
||||||
eaExpert.AddOnDealsChangedEventHandler(OnDealsChanged);
|
eaExpert.AddOnDealsChangedEventHandler(OnDealsChanged);
|
||||||
eaExpert.AddOnStopLossEventHandler(OnStopLossTriggered);
|
eaExpert.AddOnStopLossEventHandler(OnStopLossTriggered);
|
||||||
eaExpert.AddOnOrdersChangedEventHandler(OnOrdersChanged);
|
eaExpert.AddOnOrdersChangedEventHandler(OnOrdersChanged);
|
||||||
@@ -283,6 +293,16 @@ void OnChartEvent(
|
|||||||
//
|
//
|
||||||
// Event Listeners ...
|
// Event Listeners ...
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trigger OnSignal Event ...
|
||||||
|
*
|
||||||
|
* @param signal: XSignal
|
||||||
|
*/
|
||||||
|
void OnSignalTriggered(XSignal &signal)
|
||||||
|
{
|
||||||
|
eaExpert.HandleOnSignalTriggered(signal);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle StopLoss Triggered Positions ...
|
* Handle StopLoss Triggered Positions ...
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -2702,149 +2702,6 @@ struct XOnTradeHandlerState
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
|
||||||
// an Structure for Holds an Specified Symbols
|
|
||||||
// Positions Info ...
|
|
||||||
struct XTradeSymbolInfo
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Properties ...
|
|
||||||
|
|
||||||
//
|
|
||||||
string symbol; // Trading Symbol
|
|
||||||
|
|
||||||
//
|
|
||||||
int longs; // All Long Trades
|
|
||||||
int shorts; // All Short Trades
|
|
||||||
|
|
||||||
//
|
|
||||||
int trades; // All Trades
|
|
||||||
|
|
||||||
//
|
|
||||||
int losses; // All Loosing Trades
|
|
||||||
int profits; // All Winning Trades
|
|
||||||
|
|
||||||
//
|
|
||||||
datetime managedStart; // Managed Start Time
|
|
||||||
|
|
||||||
//
|
|
||||||
int managedSLs; // Managed SL(s)
|
|
||||||
int managedTPs; // Managed TP(s)
|
|
||||||
int managedTrades; // Managed Trades
|
|
||||||
|
|
||||||
//
|
|
||||||
double managedBalance; // Managed Start Balance
|
|
||||||
double managedProfits; // Managed Profit(s)
|
|
||||||
|
|
||||||
//
|
|
||||||
// Constructor ...
|
|
||||||
XTradeSymbolInfo()
|
|
||||||
{
|
|
||||||
Clean();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Tools ...
|
|
||||||
|
|
||||||
//
|
|
||||||
// Cleanup ...
|
|
||||||
void Clean()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
symbol = NULL;
|
|
||||||
|
|
||||||
//
|
|
||||||
longs = 0;
|
|
||||||
shorts = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
trades = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
losses = 0;
|
|
||||||
profits = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
managedStart = NULL;
|
|
||||||
|
|
||||||
//
|
|
||||||
managedSLs = 0;
|
|
||||||
managedTPs = 0;
|
|
||||||
managedTrades = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
managedBalance = 0;
|
|
||||||
managedProfits = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
ZeroMemory(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Validate ...
|
|
||||||
bool IsValid()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
result = IsSpecifiedValid(symbol);
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
bool IsSameAs(XTradeSymbolInfo &item)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
result = IsValid() &&
|
|
||||||
item.IsValid() &&
|
|
||||||
symbol == item.symbol;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
string GetRestrictionDescription(
|
|
||||||
ENUM_XTRADE_RESTRICTION_PERIOD period //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
string result = NULL;
|
|
||||||
|
|
||||||
//
|
|
||||||
if (!IsValid() ||
|
|
||||||
!HasRestrictions(period))
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result +=
|
|
||||||
"-------------------" + "\n" +
|
|
||||||
"Restrictions: " + "\n" +
|
|
||||||
"-------------------" + "\n" +
|
|
||||||
"Symbol: " + ToXString(symbol) + "\n" +
|
|
||||||
"Period: " + ToXString(period) + "\n" +
|
|
||||||
"Start: " + ToFormatString(managedStart) + "\n" +
|
|
||||||
"Balance: " + ToXString(managedBalance) + "\n" +
|
|
||||||
"-------------------" + "\n" +
|
|
||||||
"Trades: " + ToXString(managedTrades) + "\n" +
|
|
||||||
"SL: " + ToXString(managedSLs) + "\n" +
|
|
||||||
"TP: " + ToXString(managedTPs) + "\n" +
|
|
||||||
"Profit: " + ToXString(managedProfits) + "\n" +
|
|
||||||
"";
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// an Structure for Describe aTrading Session ...
|
// an Structure for Describe aTrading Session ...
|
||||||
struct XTradeSession
|
struct XTradeSession
|
||||||
@@ -2929,18 +2786,37 @@ struct XTradeSession
|
|||||||
//
|
//
|
||||||
// an Structure for Describe an Specified Symbols
|
// an Structure for Describe an Specified Symbols
|
||||||
// Trading Sessions ...
|
// Trading Sessions ...
|
||||||
struct XSymbolSessions
|
struct XSymbolTradeConfig
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Propeties ...
|
// Propeties ...
|
||||||
|
|
||||||
//
|
//
|
||||||
string symbol; // Trading Symbol
|
int longs; // All Long Trades
|
||||||
XTradeSession sessions[]; // Trading Sessions
|
int shorts; // All Short Trades
|
||||||
|
int trades; // All Trades
|
||||||
|
int losses; // All Loosing Trades
|
||||||
|
int profits; // All Winning Trades
|
||||||
|
string symbol; // Trading Symbol
|
||||||
|
int managedSLs; // Managed SL(s)
|
||||||
|
int managedTPs; // Managed TP(s)
|
||||||
|
int managedTrades; // Managed Trades
|
||||||
|
int maxAllowedTPs; // Max Allowed TP(s) in Restrictions Period
|
||||||
|
int maxAllowedSLs; // Max Allowed SL(s) in Restrictions Period
|
||||||
|
int maxAllowedTrades; // Max Allowed Trades in Restrictions Period
|
||||||
|
datetime managedStart; // Managed Start Time
|
||||||
|
double managedBalance; // Managed Start Balance
|
||||||
|
double managedProfits; // Managed Profit(s)
|
||||||
|
ENUM_TIMEFRAMES period; // Trading Period
|
||||||
|
int maxAllowedPositions; // Max Allowed Same Time Trades
|
||||||
|
double maxAllowedSpread; // Max Allowed Spread For Trade
|
||||||
|
XTradeSession sessions[]; // Trading Sessions
|
||||||
|
string closeAllOpenTradesAt; // Close All Open Trades per Day At Specified Time
|
||||||
|
ENUM_XTRADE_RESTRICTION_PERIOD restrictionsPeriod; // Trade Restrictions Period
|
||||||
|
|
||||||
//
|
//
|
||||||
// Constructor ...
|
// Constructor ...
|
||||||
XSymbolSessions()
|
XSymbolTradeConfig()
|
||||||
{
|
{
|
||||||
Clean();
|
Clean();
|
||||||
}
|
}
|
||||||
@@ -2954,12 +2830,84 @@ struct XSymbolSessions
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
symbol = NULL;
|
symbol = NULL;
|
||||||
|
period = NULL;
|
||||||
SpecifiedClean(sessions);
|
SpecifiedClean(sessions);
|
||||||
|
|
||||||
|
//
|
||||||
|
longs = 0;
|
||||||
|
shorts = 0;
|
||||||
|
trades = 0;
|
||||||
|
losses = 0;
|
||||||
|
profits = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
managedStart = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
managedSLs = 0;
|
||||||
|
managedTPs = 0;
|
||||||
|
managedTrades = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
managedBalance = 0;
|
||||||
|
managedProfits = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
maxAllowedTPs = 0;
|
||||||
|
maxAllowedSLs = 0;
|
||||||
|
maxAllowedTrades = 0;
|
||||||
|
maxAllowedSpread = 25;
|
||||||
|
maxAllowedPositions = 5;
|
||||||
|
closeAllOpenTradesAt = "";
|
||||||
|
restrictionsPeriod = XTRADE_RESTRICATION_NONE;
|
||||||
|
|
||||||
//
|
//
|
||||||
ZeroMemory(this);
|
ZeroMemory(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initial ...
|
||||||
|
bool Init(
|
||||||
|
string _symbol = NULL,
|
||||||
|
ENUM_TIMEFRAMES _period = NULL,
|
||||||
|
string _sessionsDescriptor = NULL,
|
||||||
|
double _maxAllowedSpread = 25,
|
||||||
|
int _maxAllowedPositions = 5,
|
||||||
|
string _closeAllOpenTradesAt = NULL,
|
||||||
|
int _maxAllowedTPs = 0,
|
||||||
|
int _maxAllowedSLs = 0,
|
||||||
|
ENUM_XTRADE_RESTRICTION_PERIOD _restrictionsPeriod = XTRADE_RESTRICATION_NONE //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Normalize Symbol ...
|
||||||
|
_symbol = NormalizeSymbol(_symbol);
|
||||||
|
_period = NormalizePeriod(_period);
|
||||||
|
|
||||||
|
//
|
||||||
|
symbol = _symbol;
|
||||||
|
period = _period;
|
||||||
|
maxAllowedTPs = _maxAllowedTPs;
|
||||||
|
maxAllowedSLs = _maxAllowedSLs;
|
||||||
|
maxAllowedSpread = _maxAllowedSpread;
|
||||||
|
restrictionsPeriod = _restrictionsPeriod;
|
||||||
|
maxAllowedPositions = _maxAllowedPositions;
|
||||||
|
closeAllOpenTradesAt = _closeAllOpenTradesAt;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Parse Sessions ...
|
||||||
|
ParseSessions(_sessionsDescriptor);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Validate ...
|
// Validate ...
|
||||||
bool IsValid()
|
bool IsValid()
|
||||||
@@ -3019,6 +2967,96 @@ struct XSymbolSessions
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Parse Sessions ...
|
||||||
|
void ParseSessions(string descriptor)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (!IsSpecifiedValid(descriptor))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool has = false;
|
||||||
|
string _sessions[];
|
||||||
|
int sessionsCount = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Extract Per Symbol Sessions ...
|
||||||
|
sessionsCount = SplitContent(
|
||||||
|
_sessions,
|
||||||
|
descriptor,
|
||||||
|
"," //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Try to Extract Start and End Times Series ...
|
||||||
|
has = IsValidSize(sessionsCount);
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Iterate Sessions ...
|
||||||
|
for (int i = 0; i < sessionsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Ignore unused Cases and Extracts only Content ...
|
||||||
|
string iSessionDescriptorStr = ExtractString(_sessions[i]);
|
||||||
|
has = IsSpecifiedValid(iSessionDescriptorStr);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Extract Session Descriptor Data ...
|
||||||
|
string parts[];
|
||||||
|
int partsCount = SplitContent(
|
||||||
|
parts,
|
||||||
|
iSessionDescriptorStr,
|
||||||
|
"_" //
|
||||||
|
);
|
||||||
|
has = IsValidSize(partsCount) && partsCount == 3;
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string iName = parts[0];
|
||||||
|
string iStart = parts[1];
|
||||||
|
string iEnd = parts[2];
|
||||||
|
has = IsSpecifiedValid(iName) &&
|
||||||
|
IsSpecifiedValid(iStart) &&
|
||||||
|
IsSpecifiedValid(iEnd);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Set Active Session Per Symbols ...
|
||||||
|
XTradeSession session;
|
||||||
|
|
||||||
|
//
|
||||||
|
session.end = iEnd;
|
||||||
|
session.name = iName;
|
||||||
|
session.start = iStart;
|
||||||
|
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
session,
|
||||||
|
sessions //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
session.Clean();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
SpecifiedClean(parts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
SpecifiedClean(_sessions);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,10 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
int eaSlippage; // Slippgae
|
int eaSlippage; // Slippgae
|
||||||
string eaLogSuffix; // Log Suffix
|
string eaLogSuffix; // Log Suffix
|
||||||
|
|
||||||
|
//
|
||||||
|
// Symbol Configurations ...
|
||||||
|
string eaSymbolConfiguration; // Symbol Configurations ...
|
||||||
|
|
||||||
//
|
//
|
||||||
// Management ...
|
// Management ...
|
||||||
bool eaAllowGuards; // Allow Guards
|
bool eaAllowGuards; // Allow Guards
|
||||||
@@ -94,7 +98,7 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
bool eaReportProtector; // Report Protector Actions
|
bool eaReportProtector; // Report Protector Actions
|
||||||
bool eaReportRestrictions; // Report Restrictions
|
bool eaReportRestrictions; // Report Restrictions
|
||||||
bool eaReportAfterTradesBalance; // Report Balance after a Trade Finished
|
bool eaReportAfterTradesBalance; // Report Balance after a Trade Finished
|
||||||
|
|
||||||
//
|
//
|
||||||
// Collector ...
|
// Collector ...
|
||||||
bool eaSaveTrades; // Save Trades
|
bool eaSaveTrades; // Save Trades
|
||||||
@@ -117,6 +121,25 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
//
|
//
|
||||||
// Tools / Actions / Handlers ...
|
// Tools / Actions / Handlers ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Signal Event Handlers ...
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddOnSignalEventHandler(TOnSignal handler)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (handler == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
handler,
|
||||||
|
mOnSignalEventHandlers //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Trade Event Handlers ...
|
// Trade Event Handlers ...
|
||||||
|
|
||||||
@@ -463,7 +486,7 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
eaTrade.AddOnTradeStateChangedEventHandler(mTradeStateChangedEventHandlers[i]);
|
eaTrade.AddOnTradeStateChangedEventHandler(mTradeStateChangedEventHandlers[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Postion Partially Close Event Handlers ...
|
// Postion Partially Close Event Handlers ...
|
||||||
count = ArraySize(mOnPartialCloseEventHandlers);
|
count = ArraySize(mOnPartialCloseEventHandlers);
|
||||||
@@ -536,6 +559,28 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
eaMaxAllowedTrades //
|
eaMaxAllowedTrades //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Parse Symbols ...
|
||||||
|
string symbols[];
|
||||||
|
ENUM_TIMEFRAMES periods[];
|
||||||
|
if (!IsSpecifiedValid(eaSymbolConfiguration))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
_Symbol,
|
||||||
|
symbols //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
_Period,
|
||||||
|
periods //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Here we Apply Symbols,Periods and Configs ...
|
// Here we Apply Symbols,Periods and Configs ...
|
||||||
|
|
||||||
@@ -552,7 +597,12 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Make Instance Signaller Class ...
|
// Make Instance Signaller Class ...
|
||||||
|
|
||||||
|
//
|
||||||
XCXOM1SignallerBase *iDZoneSignaller = NULL;
|
XCXOM1SignallerBase *iDZoneSignaller = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define Signaller ...
|
||||||
iDZoneSignaller = new XCXOM1SignallerBase(
|
iDZoneSignaller = new XCXOM1SignallerBase(
|
||||||
"XDZN",
|
"XDZN",
|
||||||
"XAUUSDb",
|
"XAUUSDb",
|
||||||
@@ -561,6 +611,19 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
iDZoneSignallerConfig);
|
iDZoneSignallerConfig);
|
||||||
if (iDZoneSignaller != NULL)
|
if (iDZoneSignaller != NULL)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
// Attach Signaller OnSignal Event Handlers ...
|
||||||
|
count = ArraySize(mOnSignalEventHandlers);
|
||||||
|
has = IsValidSize(count);
|
||||||
|
if (has)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
iDZoneSignaller.AddOnSignalEventHandler(mOnSignalEventHandlers[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Register Signaller ...
|
// Register Signaller ...
|
||||||
Add(
|
Add(
|
||||||
@@ -671,6 +734,13 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Signal Event Handler ...
|
||||||
|
void HandleOnSignalTriggered(XSignal &signal)
|
||||||
|
{
|
||||||
|
eaTradeManager.HandleSignal(signal);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Trade Event Handlers ...
|
// Trade Event Handlers ...
|
||||||
|
|
||||||
@@ -870,6 +940,9 @@ class XCXOM1EAExpert : public XCBase
|
|||||||
TOnPositionsChanged mPositionsChangedEventHandlers[];
|
TOnPositionsChanged mPositionsChangedEventHandlers[];
|
||||||
TOnTradeStateChanged mTradeStateChangedEventHandlers[];
|
TOnTradeStateChanged mTradeStateChangedEventHandlers[];
|
||||||
|
|
||||||
|
//
|
||||||
|
TOnSignal mOnSignalEventHandlers[]; // Signal Recieved Event Handlers ...
|
||||||
|
|
||||||
//
|
//
|
||||||
XCXOM1SignallerBase *eaSignallers[]; // All Registered Signallers ...
|
XCXOM1SignallerBase *eaSignallers[]; // All Registered Signallers ...
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -145,6 +145,44 @@ class XCXOM1SignallerBase
|
|||||||
ZeroMemory(mHelper);
|
ZeroMemory(mHelper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Signal Event Handlers ...
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddOnSignalEventHandler(TOnSignal handler)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (handler == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
handler,
|
||||||
|
mOnSignalEventHandlers //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void NotifyOnSignalEvent(XSignal &signal)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int count = ArraySize(mOnSignalEventHandlers);
|
||||||
|
bool has = IsValidSize(count) && signal.IsValid();
|
||||||
|
if (!has)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calling Event Handlers ...
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
mOnSignalEventHandlers[i](signal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Actions ...
|
// Actions ...
|
||||||
|
|
||||||
@@ -329,7 +367,7 @@ class XCXOM1SignallerBase
|
|||||||
iDir,
|
iDir,
|
||||||
iReason,
|
iReason,
|
||||||
iConditions.bars[pIdx].time, // From ...
|
iConditions.bars[pIdx].time, // From ...
|
||||||
iConditions.bars[cIdx].time // To
|
iConditions.bars[zIdx].time // To
|
||||||
);
|
);
|
||||||
if (has)
|
if (has)
|
||||||
{
|
{
|
||||||
@@ -339,6 +377,10 @@ class XCXOM1SignallerBase
|
|||||||
iZone,
|
iZone,
|
||||||
zones //
|
zones //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prepare Signal ...
|
||||||
|
PrepareSignal(iZone);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -379,6 +421,10 @@ class XCXOM1SignallerBase
|
|||||||
double iUpper = GetMax(iValues);
|
double iUpper = GetMax(iValues);
|
||||||
double iLower = GetMin(iValues);
|
double iLower = GetMin(iValues);
|
||||||
|
|
||||||
|
//
|
||||||
|
double iZoneUpper = MathMax(iFibUpper, iFibLower);
|
||||||
|
double iZoneLower = MathMin(iFibUpper, iFibLower);
|
||||||
|
|
||||||
//
|
//
|
||||||
has = isFastCrossedOverSlow || isFastCrossedUnderSlow;
|
has = isFastCrossedOverSlow || isFastCrossedUnderSlow;
|
||||||
|
|
||||||
@@ -386,10 +432,6 @@ class XCXOM1SignallerBase
|
|||||||
// Validate Cross Between Zone ...
|
// Validate Cross Between Zone ...
|
||||||
if (has)
|
if (has)
|
||||||
{
|
{
|
||||||
//
|
|
||||||
double iZoneUpper = MathMax(iFibUpper, iFibLower);
|
|
||||||
double iZoneLower = MathMin(iFibUpper, iFibLower);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Validate MA Place ...
|
// Validate MA Place ...
|
||||||
has = iFast >= iZoneLower &&
|
has = iFast >= iZoneLower &&
|
||||||
@@ -471,13 +513,13 @@ class XCXOM1SignallerBase
|
|||||||
symbol,
|
symbol,
|
||||||
period,
|
period,
|
||||||
name, // Signaller Name ...
|
name, // Signaller Name ...
|
||||||
iUpper,
|
iZoneUpper,
|
||||||
iLower,
|
iZoneLower,
|
||||||
iPrice,
|
iPrice,
|
||||||
iDir,
|
iDir,
|
||||||
iReason,
|
iReason,
|
||||||
iConditions.bars[pIdx].time, // From ...
|
iConditions.bars[pIdx].time, // From ...
|
||||||
iConditions.bars[cIdx].time // To
|
iConditions.bars[zIdx].time // To
|
||||||
);
|
);
|
||||||
if (has)
|
if (has)
|
||||||
{
|
{
|
||||||
@@ -487,6 +529,10 @@ class XCXOM1SignallerBase
|
|||||||
iZone,
|
iZone,
|
||||||
zones //
|
zones //
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prepare Signal ...
|
||||||
|
PrepareSignal(iZone);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -518,6 +564,9 @@ class XCXOM1SignallerBase
|
|||||||
//
|
//
|
||||||
XCXOM1Helper *mHelper; // Indicator Helper ...
|
XCXOM1Helper *mHelper; // Indicator Helper ...
|
||||||
|
|
||||||
|
//
|
||||||
|
TOnSignal mOnSignalEventHandlers[]; // Signal Recieved Event Handlers ...
|
||||||
|
|
||||||
//
|
//
|
||||||
int mProcessedTicksCount; // Prcoessed Ticks Count ...
|
int mProcessedTicksCount; // Prcoessed Ticks Count ...
|
||||||
datetime mLastCheckedBarTime; // Last Checked Bar Time ...
|
datetime mLastCheckedBarTime; // Last Checked Bar Time ...
|
||||||
@@ -551,12 +600,12 @@ class XCXOM1SignallerBase
|
|||||||
// zones[i].UpdateByBarIndex(barIndex);
|
// zones[i].UpdateByBarIndex(barIndex);
|
||||||
|
|
||||||
//
|
//
|
||||||
drawer.DrawZone(
|
// drawer.DrawZone(
|
||||||
zones[i],
|
// zones[i],
|
||||||
true, // Draw Price ...
|
// true, // Draw Price ...
|
||||||
true, // Draw Middle ...
|
// true, // Draw Middle ...
|
||||||
true // Draw From ...
|
// true // Draw From ...
|
||||||
);
|
// );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -588,6 +637,75 @@ class XCXOM1SignallerBase
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts iZone to Signal and Notify Signal ...
|
||||||
|
*
|
||||||
|
* @param iZone: XOM1Zone
|
||||||
|
*/
|
||||||
|
void PrepareSignal(XOM1Zone &zone)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Validate Zone ...
|
||||||
|
if (!zone.IsValid())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create Signal ...
|
||||||
|
XSignal signal;
|
||||||
|
|
||||||
|
//
|
||||||
|
signal.time = zone.to;
|
||||||
|
signal.provider = name;
|
||||||
|
signal.symbol = zone.symbol;
|
||||||
|
signal.period = zone.period;
|
||||||
|
signal.mode = X_ORDER_MODE_MARKET;
|
||||||
|
signal.conditions = "XConditions";
|
||||||
|
signal.comment = ToXString(zone.reason);
|
||||||
|
signal.type = zone.IsBullish()
|
||||||
|
? POSITION_TYPE_BUY
|
||||||
|
: POSITION_TYPE_SELL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get Entry ...
|
||||||
|
signal.entry = GetXEntry(zone.symbol, zone.dir);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate SL ...
|
||||||
|
double providedSL = zone.IsBullish()
|
||||||
|
? zone.lower
|
||||||
|
: zone.upper;
|
||||||
|
signal.sl = providedSL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate Risk ...
|
||||||
|
double risk = MathAbs(signal.entry - signal.sl);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate Reward ...
|
||||||
|
double r2r = 2;
|
||||||
|
double reward = risk * r2r;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate TP ...
|
||||||
|
double providedTP = zone.IsBullish()
|
||||||
|
? signal.entry + reward
|
||||||
|
: signal.entry - reward;
|
||||||
|
signal.tp = providedTP;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate Targets ...
|
||||||
|
// TODO: Handle this ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Min Volume ...
|
||||||
|
signal.volume = 0.01;
|
||||||
|
|
||||||
|
//
|
||||||
|
NotifyOnSignalEvent(signal);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
Reference in New Issue
Block a user