add MQL5Test Workspace Content as BKP Solution ...
This commit is contained in:
@@ -0,0 +1,814 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// ----------------------------------------------
|
||||
// Name: XSCBaseEA
|
||||
// Description: provides all Base EA requirements ...
|
||||
//
|
||||
//
|
||||
// Maintainer:
|
||||
// ------------
|
||||
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||
//
|
||||
//////////////////////////////////////////////////////
|
||||
//
|
||||
// Global Properties ...
|
||||
#property library
|
||||
#property copyright "Copyright 2023, SaherElm IT Center"
|
||||
#property link "https://www.saherelm.ir"
|
||||
#property version "1.00"
|
||||
#property strict
|
||||
|
||||
//
|
||||
// START Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// END Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Import and Inclused requirements ...
|
||||
//
|
||||
|
||||
//
|
||||
// Includes ...
|
||||
#include "../Libraries/x-saherelm.alert.lib.mq5"
|
||||
#include "../Libraries/x-saherelm.common.lib.mq5"
|
||||
#include "../Classes/x-saherelm.xtrade.class.mq5"
|
||||
#include "../Classes/x-saherelm.xaccount.class.mq5"
|
||||
#include "../Classes/x-saherelm.xprovider.class.mq5"
|
||||
#include "../Libraries/x-saherelm.seriallizer.lib.mq5"
|
||||
|
||||
//
|
||||
// END Import and Inclused requirements ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Overrides ...
|
||||
//
|
||||
|
||||
//
|
||||
// END Overrides ...
|
||||
//
|
||||
|
||||
//
|
||||
// a Class for Handle base requirements ...
|
||||
// for indicators ...
|
||||
class XSCBaseEA
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Props ...
|
||||
XSCTrade *mTrader;
|
||||
XSCAccount *mAccount;
|
||||
|
||||
//
|
||||
bool isNewHour;
|
||||
bool isNewDay;
|
||||
bool isNewWeek;
|
||||
bool isNewMonth;
|
||||
bool isNewCandle;
|
||||
|
||||
//
|
||||
bool isInTestMode;
|
||||
|
||||
//
|
||||
bool mWaitsUntilNewCandle;
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
void XSCBaseEA(
|
||||
string symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES period, // Trading Time Frame
|
||||
ulong magic, // Magic Number
|
||||
int slippage, // Slippgae
|
||||
OnStopLoss onStopLossTriggered = NULL, // On StopLoass Triggered Event Handler
|
||||
OnTakeProfit onTakeProfitTriggered = NULL, // On TakeProfit Triggered Event Handler
|
||||
OnDealsChanged onDealsChangedHandler = NULL, // On Deals Changed Event Handler
|
||||
OnOrdersChanged onOrdersChangedHandler = NULL, // On Orders Changed Event Handler
|
||||
OnPositionsChanged onPositionsChangedHandler = NULL, // On Positions Changed Event Handler
|
||||
OnTradeStateChanged onTradeStateChangedHandler = NULL // On Trade State Changed Event Handler
|
||||
)
|
||||
{
|
||||
//
|
||||
mSymbol = symbol;
|
||||
mPeriod = period;
|
||||
|
||||
//
|
||||
mMagic = magic;
|
||||
mSlippage = slippage;
|
||||
|
||||
//
|
||||
mOnStopLossTriggered = onStopLossTriggered;
|
||||
mOnTakeProfitTriggered = onTakeProfitTriggered;
|
||||
mOnDealsChangedHandler = onDealsChangedHandler;
|
||||
mOnOrdersChangedHandler = onOrdersChangedHandler;
|
||||
mOnPositionsChangedHandler = onPositionsChangedHandler;
|
||||
mOnTradeStateChangedHandler = onTradeStateChangedHandler;
|
||||
|
||||
//
|
||||
// Reset Timings ...
|
||||
ResetTiming();
|
||||
|
||||
//
|
||||
InitRequirements();
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
void ~XSCBaseEA()
|
||||
{
|
||||
//
|
||||
delete mTrader;
|
||||
delete mAccount;
|
||||
}
|
||||
|
||||
//
|
||||
// START Properties ...
|
||||
//
|
||||
|
||||
//
|
||||
// Symbol ...
|
||||
string GetSymbol()
|
||||
{
|
||||
return mSymbol;
|
||||
}
|
||||
|
||||
//
|
||||
// Period ...
|
||||
ENUM_TIMEFRAMES GetPeriod()
|
||||
{
|
||||
return mPeriod;
|
||||
}
|
||||
|
||||
//
|
||||
// Tag ...
|
||||
string GetTag()
|
||||
{
|
||||
return mTag;
|
||||
}
|
||||
|
||||
//
|
||||
ulong GetMagic()
|
||||
{
|
||||
return mMagic;
|
||||
}
|
||||
|
||||
//
|
||||
int GetSlippage()
|
||||
{
|
||||
return mSlippage;
|
||||
}
|
||||
|
||||
//
|
||||
// END Properties ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Provided Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Prepare Tag ...
|
||||
virtual void PrepareTag()
|
||||
{
|
||||
mTag = "XEA" + mSymbol + "," + ToString(mPeriod) + (string)mMagic;
|
||||
}
|
||||
|
||||
//
|
||||
// Handle Chart Events ...
|
||||
virtual void OnChartEvent(
|
||||
const int id, // event ID
|
||||
const long &lparam, // long type event parameter
|
||||
const double &dparam, // double type event parameter
|
||||
const string &sparam // string type event parameter
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
// Check any Registered Providers Signalling ...
|
||||
virtual bool SignalCheck(XSignal &signals[]) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// Check for any Custom Guard Actions Guard Actions ...
|
||||
virtual bool CheckGuard(XGuard &guards[]) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// NOTE: you have to call these Functions on Static Classes to Handle Works ...
|
||||
|
||||
//
|
||||
// Handle StopLoss Event ...
|
||||
virtual void OnStopLossTriggered(const XDeal &deal) {}
|
||||
|
||||
//
|
||||
// Handle TakeProfit Event ...
|
||||
virtual void OnTakeProfitTriggered(const XDeal &deal) {}
|
||||
|
||||
//
|
||||
// Handle Deals Changed Event ...
|
||||
virtual void OnDealsChangedHandler(int count) {}
|
||||
|
||||
//
|
||||
// Handle Order Changed Event ...
|
||||
virtual void OnOrdersChangedHandler(int count) {}
|
||||
|
||||
//
|
||||
// Handle Position Changed Event ...
|
||||
virtual void OnPositionsChangedHandler(int count) {}
|
||||
|
||||
//
|
||||
// Handle Trade State Changed ...
|
||||
virtual void OnTradeStateChangedHandler(const XOnTradeHandlerState &state) {}
|
||||
|
||||
//
|
||||
// Implemented Actions ...
|
||||
|
||||
//
|
||||
// OnTick Handler ...
|
||||
void OnTick()
|
||||
{
|
||||
//
|
||||
// First Check Guards ....
|
||||
XGuard guards[];
|
||||
bool hasGuard = CheckGuard(guards);
|
||||
if (hasGuard) {
|
||||
DoGuards(guards);
|
||||
}
|
||||
|
||||
//
|
||||
XSignal signals[];
|
||||
bool hasSignal = SignalCheck(signals);
|
||||
if (hasSignal) {
|
||||
mTrader.ExecuteSignals(signals);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Handle On Trade ...
|
||||
void OnTrade()
|
||||
{
|
||||
//
|
||||
XOnTradeHandlerState state = mTrader.HandleOnTrade();
|
||||
|
||||
//
|
||||
if (
|
||||
!state.hasNewDeal &&
|
||||
!state.hasNewOrder &&
|
||||
!state.hasNewPosition &&
|
||||
!state.hasNewHistoryOrder)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// STATE ...
|
||||
|
||||
//
|
||||
// Notfy Trade State Changed Event ...
|
||||
OnTradeStateChangedHandler(state);
|
||||
|
||||
//
|
||||
// DEALS ...
|
||||
if (state.hasNewDeal)
|
||||
{
|
||||
//
|
||||
// Notfy Deals Changed Event ...
|
||||
OnDealsChangedHandler(state.newDeals);
|
||||
|
||||
//
|
||||
// Retrieve Last Deal ...
|
||||
XDeal deals[];
|
||||
mTrader.GetDeals(deals);
|
||||
int dealsCount = ArraySize(deals);
|
||||
if (dealsCount > 0)
|
||||
{
|
||||
//
|
||||
XDeal lastDeal = deals[0];
|
||||
|
||||
//
|
||||
if (lastDeal.reason == DEAL_REASON_TP)
|
||||
{
|
||||
OnTakeProfitTriggered(lastDeal);
|
||||
}
|
||||
else if (lastDeal.reason == DEAL_REASON_SL)
|
||||
{
|
||||
OnStopLossTriggered(lastDeal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// ORDERS ...
|
||||
if (state.hasNewOrder || state.hasNewHistoryOrder)
|
||||
{
|
||||
//
|
||||
// Notfy Orders Changed Event ...
|
||||
OnOrdersChangedHandler(state.newOrders + state.newHistoryOrders);
|
||||
}
|
||||
|
||||
//
|
||||
// POSITIONS ...
|
||||
if (state.hasNewPosition)
|
||||
{
|
||||
//
|
||||
// Notfy Positions Changed Event ...
|
||||
OnPositionsChangedHandler(state.newPositions);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Retrieve Dept Of Market ...
|
||||
void OnBookEvent(const string &symbol)
|
||||
{
|
||||
//
|
||||
// TODO: Implement this ...
|
||||
}
|
||||
|
||||
//
|
||||
// TOOLS ...
|
||||
//
|
||||
void GetPositions(
|
||||
XPosition &result[], // Hold Result ...
|
||||
string symbol = NULL, // Trading Symbol ...
|
||||
ENUM_POSITION_TYPE type = NULL, // Trading Type ...
|
||||
ENUM_TIMEFRAMES period = NULL // Trading Period ...
|
||||
)
|
||||
{
|
||||
//
|
||||
Clean(result);
|
||||
|
||||
//
|
||||
int positionsCount = mTrader.PositionsCount();
|
||||
if (positionsCount <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
XPosition positions[];
|
||||
mTrader.GetPositions(
|
||||
positions,
|
||||
symbol,
|
||||
period);
|
||||
positionsCount = ArraySize(positions);
|
||||
if (positionsCount <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
if (type == NULL)
|
||||
{
|
||||
//
|
||||
ArrayResize(
|
||||
result,
|
||||
ArraySize(positions));
|
||||
|
||||
//
|
||||
for (int i = 0; i < positionsCount; i++)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
positions[i],
|
||||
result);
|
||||
}
|
||||
|
||||
//
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < positionsCount; i++)
|
||||
{
|
||||
//
|
||||
XPosition iPosition = positions[i];
|
||||
|
||||
//
|
||||
if (type == NULL || iPosition.type == type)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
iPosition,
|
||||
result);
|
||||
}
|
||||
}
|
||||
}
|
||||
void GetPositions(
|
||||
XPosition &result[], // Hold Result ...
|
||||
string symbol = NULL, // Trading Symbol ...
|
||||
ENUM_POSITION_TYPE type = NULL, // Trading Type ...
|
||||
ENUM_TIMEFRAMES period = NULL, // Trading Period ...
|
||||
string provider = NULL // Signal Provider ...
|
||||
)
|
||||
{
|
||||
//
|
||||
Clean(result);
|
||||
|
||||
//
|
||||
bool hasSymbol = !(symbol == NULL || StringLen(symbol) == 0);
|
||||
bool hasProvider = !(provider == NULL || StringLen(provider) == 0);
|
||||
|
||||
//
|
||||
int positionsCount = mTrader.PositionsCount();
|
||||
if (positionsCount <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
XPosition positions[];
|
||||
mTrader.GetPositions(
|
||||
positions,
|
||||
symbol,
|
||||
period);
|
||||
positionsCount = ArraySize(positions);
|
||||
if (positionsCount <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
if (!hasProvider && type == NULL)
|
||||
{
|
||||
//
|
||||
ArrayResize(
|
||||
result,
|
||||
ArraySize(positions));
|
||||
|
||||
//
|
||||
for (int i = 0; i < positionsCount; i++)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
positions[i],
|
||||
result);
|
||||
}
|
||||
|
||||
//
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
if (type == NULL)
|
||||
{
|
||||
//
|
||||
ArrayResize(
|
||||
result,
|
||||
ArraySize(positions));
|
||||
|
||||
//
|
||||
for (int i = 0; i < positionsCount; i++)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
positions[i],
|
||||
result);
|
||||
}
|
||||
|
||||
//
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < positionsCount; i++)
|
||||
{
|
||||
//
|
||||
XPosition iPosition = positions[i];
|
||||
|
||||
//
|
||||
string iProvider = ExtractProvider(iPosition.comment);
|
||||
if (hasProvider && iProvider != provider)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
if (type == NULL || iPosition.type == type)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
iPosition,
|
||||
result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// GUARD Handlers ...
|
||||
|
||||
//
|
||||
// Parse Recievd Guards and Do them ...
|
||||
void DoGuards(XGuard &guards[])
|
||||
{
|
||||
int guardsCount = ArraySize(guards);
|
||||
if (guardsCount <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < guardsCount; i++)
|
||||
{
|
||||
//
|
||||
XGuard iGuard = guards[i];
|
||||
|
||||
//
|
||||
switch (iGuard.action)
|
||||
{
|
||||
//
|
||||
// Hedge In Profit Specified Positions ...
|
||||
case X_GUARD_ACTION_HEDGE:
|
||||
HandleGuardHedgeAction(
|
||||
iGuard.provider,
|
||||
iGuard.symbol,
|
||||
iGuard.type,
|
||||
iGuard.period);
|
||||
break;
|
||||
|
||||
//
|
||||
// Trail Stop Loss in Specified Positions ...
|
||||
case X_GUARD_ACTION_TRAIL_STOP:
|
||||
HandleGuardTrailingStopAction(
|
||||
iGuard.provider,
|
||||
iGuard.symbol,
|
||||
iGuard.type,
|
||||
iGuard.period,
|
||||
iGuard.dblPayLoad);
|
||||
break;
|
||||
|
||||
//
|
||||
// Force Close Specified Positions ...
|
||||
case X_GUARD_ACTION_FORCE_CLOSE:
|
||||
HandleGuardForceCloseAction(
|
||||
iGuard.provider,
|
||||
iGuard.symbol,
|
||||
iGuard.type,
|
||||
iGuard.period);
|
||||
break;
|
||||
|
||||
//
|
||||
// Generate and Place Support Signals ...
|
||||
case X_GUARD_ACTION_ADD_SUPPORT_SIGNAL:
|
||||
HandleGuardAddSupportPositionAction(
|
||||
iGuard.provider,
|
||||
iGuard.symbol,
|
||||
iGuard.type,
|
||||
iGuard.period);
|
||||
break;
|
||||
|
||||
//
|
||||
// Delete All Placed Pending Orders ...
|
||||
case X_GUARD_ACTION_CANCEL_PENDING_ORDERS:
|
||||
HandleGuardCancelPendingOrdersAction(
|
||||
iGuard.provider,
|
||||
iGuard.symbol,
|
||||
iGuard.type,
|
||||
iGuard.period);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Close All Specified Provider's Positions in Profit Summary ...
|
||||
void HandleGuardHedgeAction(
|
||||
string provider, // Positions Provided by Specific Provider
|
||||
string symbol, // Trading Symbol
|
||||
ENUM_POSITION_TYPE type, // Trading Type
|
||||
ENUM_TIMEFRAMES period, // Specified Time Frame
|
||||
double minProfitForHedging = 1 // Specified Profit for Hedge ...
|
||||
)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
// Force Close Specified Set Of Position ...
|
||||
void HandleGuardForceCloseAction(
|
||||
string provider, // Positions Provided by Specific Provider
|
||||
string symbol, // Trading Symbol
|
||||
ENUM_POSITION_TYPE type, // Trading Type
|
||||
ENUM_TIMEFRAMES period, // Specified Time Frame
|
||||
ulong ticket = 0 // Specific Ticket
|
||||
)
|
||||
{
|
||||
//
|
||||
string comment = "";
|
||||
|
||||
//
|
||||
// Close All Positions ...
|
||||
if (ticket == 0)
|
||||
{
|
||||
//
|
||||
XPosition positions[];
|
||||
GetPositions(
|
||||
positions,
|
||||
symbol,
|
||||
type,
|
||||
period,
|
||||
provider);
|
||||
if (ArraySize(positions) <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
comment = provider + " Force Close Guard ...";
|
||||
|
||||
//
|
||||
mTrader.ClosePositions(
|
||||
positions,
|
||||
comment);
|
||||
}
|
||||
//
|
||||
// Close Specific Position ...
|
||||
else
|
||||
{
|
||||
//
|
||||
XPosition position;
|
||||
bool hasPosition = mTrader.GetPosition(
|
||||
position,
|
||||
ticket);
|
||||
|
||||
//
|
||||
if (hasPosition)
|
||||
{
|
||||
//
|
||||
comment = provider + "(" + ToString(ticket) + ")" + " Force Close Guard ...";
|
||||
|
||||
//
|
||||
mTrader.Close(
|
||||
ticket,
|
||||
comment);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (StringLen(comment) > 0)
|
||||
{
|
||||
LogMessage(comment);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Trailing Specified Set Of Positions Stop Losses ...
|
||||
void HandleGuardTrailingStopAction(
|
||||
string provider, // Positions Provided by Specific Provider
|
||||
string symbol, // Trading Symbol
|
||||
ENUM_POSITION_TYPE type, // Trading Type
|
||||
ENUM_TIMEFRAMES period, // Specified Time Frame
|
||||
double sl // Desired SL Value ...
|
||||
)
|
||||
{
|
||||
//
|
||||
// TODO: Implement this ...
|
||||
}
|
||||
|
||||
//
|
||||
// Add Support Signal for Specified Positions ...
|
||||
void HandleGuardAddSupportPositionAction(
|
||||
string provider, // Positions Provided by Specific Provider
|
||||
string symbol, // Trading Symbol
|
||||
ENUM_POSITION_TYPE type, // Trading Type
|
||||
ENUM_TIMEFRAMES period // Specified Time Frame
|
||||
)
|
||||
{
|
||||
//
|
||||
// TODO: Implement this ...
|
||||
}
|
||||
|
||||
//
|
||||
// Cancel all Placed Orders ...
|
||||
void HandleGuardCancelPendingOrdersAction(
|
||||
string provider, // Positions Provided by Specific Provider
|
||||
string symbol, // Trading Symbol
|
||||
ENUM_POSITION_TYPE type, // Trading Type
|
||||
ENUM_TIMEFRAMES period // Specified Time Frame
|
||||
)
|
||||
{
|
||||
//
|
||||
// TODO: Implement this ...
|
||||
}
|
||||
|
||||
//
|
||||
// END Provided Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
string GetTagPrefix()
|
||||
{
|
||||
//
|
||||
string result = "(" + mSymbol + ")(" + ToString(mPeriod) + ")";
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Symbol ...
|
||||
string mSymbol;
|
||||
|
||||
//
|
||||
// Period ...
|
||||
ENUM_TIMEFRAMES mPeriod;
|
||||
|
||||
//
|
||||
// ExpertAdviser MAgic Number ...
|
||||
ulong mMagic;
|
||||
|
||||
//
|
||||
// Slipppage ...
|
||||
int mSlippage;
|
||||
|
||||
//
|
||||
// Tag Identifier ...
|
||||
string mTag;
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
// Define Requirements ...
|
||||
|
||||
//
|
||||
// XSCTrade Event Handlers ...
|
||||
OnStopLoss mOnStopLossTriggered;
|
||||
OnTakeProfit mOnTakeProfitTriggered;
|
||||
OnDealsChanged mOnDealsChangedHandler;
|
||||
OnOrdersChanged mOnOrdersChangedHandler;
|
||||
OnPositionsChanged mOnPositionsChangedHandler;
|
||||
OnTradeStateChanged mOnTradeStateChangedHandler;
|
||||
|
||||
//
|
||||
// Initi Requirements ...
|
||||
void InitRequirements()
|
||||
{
|
||||
//
|
||||
// Account Manager ...
|
||||
mAccount = new XSCAccount();
|
||||
|
||||
//
|
||||
// Trader ...
|
||||
mTrader = new XSCTrade(
|
||||
mSlippage,
|
||||
mMagic);
|
||||
|
||||
//
|
||||
// Attach Event Handlers ...
|
||||
|
||||
//
|
||||
if (mOnStopLossTriggered != NULL)
|
||||
{
|
||||
mTrader.AddOnStopLossEventHandler(mOnStopLossTriggered);
|
||||
}
|
||||
|
||||
//
|
||||
if (mOnTakeProfitTriggered != NULL)
|
||||
{
|
||||
mTrader.AddOnTakeProfitEventHandler(mOnTakeProfitTriggered);
|
||||
}
|
||||
|
||||
//
|
||||
if (mOnDealsChangedHandler != NULL)
|
||||
{
|
||||
mTrader.AddOnDealsChangedEventHandler(mOnDealsChangedHandler);
|
||||
}
|
||||
|
||||
//
|
||||
if (mOnOrdersChangedHandler != NULL)
|
||||
{
|
||||
mTrader.AddOnOrdersChangedEventHandler(mOnOrdersChangedHandler);
|
||||
}
|
||||
|
||||
//
|
||||
if (mOnPositionsChangedHandler != NULL)
|
||||
{
|
||||
mTrader.AddOnPositionsChangedEventHandler(mOnPositionsChangedHandler);
|
||||
}
|
||||
|
||||
//
|
||||
if (mOnTradeStateChangedHandler != NULL)
|
||||
{
|
||||
mTrader.AddOnTradeStateChangedEventHandler(mOnTradeStateChangedHandler);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// START Usefull Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// END Usefull Functions ...
|
||||
//
|
||||
Reference in New Issue
Block a user