Backup ...
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,650 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XSCX121SMCBaseStrategy
|
||||
// Description: provides all based classes for use ...
|
||||
//
|
||||
//
|
||||
// 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
|
||||
|
||||
//
|
||||
// Imports ...
|
||||
|
||||
//
|
||||
#include "../../Classes/x-saherelm.x-alert.class.mq5"
|
||||
#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5"
|
||||
#include "../../Classes/x-saherelm.x-poi.class.mq5"
|
||||
#include "../../Classes/x-saherelm.x-trade.class.mq5"
|
||||
#include "../Classes/x-121.smc.cobjects.class.mq5"
|
||||
#include "../Libraries/x-121.smc.lib.mq5"
|
||||
|
||||
//
|
||||
// Helper(s) ...
|
||||
|
||||
//
|
||||
// XStrategy Class Implementation(s) ...
|
||||
class XCX121SMCBaseStrategy : public XCBaseAlert
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
XCAccount mAccount;
|
||||
|
||||
//
|
||||
// Constructor(s) ...
|
||||
XCX121SMCBaseStrategy(
|
||||
//
|
||||
// Base ...
|
||||
string _symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES _period // Trading TimeFrame
|
||||
)
|
||||
{
|
||||
//
|
||||
mSymbol = _symbol;
|
||||
mPeriod = _period;
|
||||
|
||||
//
|
||||
Init();
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
~XCX121SMCBaseStrategy()
|
||||
{
|
||||
DeInit();
|
||||
}
|
||||
|
||||
//
|
||||
// Getter / Setter (s) ...
|
||||
|
||||
/**
|
||||
* Retrieve Symbol ...
|
||||
*
|
||||
* @return ( string )
|
||||
*/
|
||||
string GetSymbol()
|
||||
{
|
||||
return mSymbol;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve TimeFrame ...
|
||||
*
|
||||
* @return ( ENUM_TIMEFRAMES )
|
||||
*/
|
||||
ENUM_TIMEFRAMES GetPeriod()
|
||||
{
|
||||
return mPeriod;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Strategy is Disabled or not ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsDisabled()
|
||||
{
|
||||
return mForceDisabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Signal Volume ...
|
||||
*
|
||||
* @return ( double )
|
||||
*/
|
||||
double Volume()
|
||||
{
|
||||
return mVolume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Signal Volume ...
|
||||
*
|
||||
* @param value: Double ...
|
||||
*/
|
||||
void Volume(double value)
|
||||
{
|
||||
//
|
||||
if (value < 0.01)
|
||||
{
|
||||
value = 0.01;
|
||||
}
|
||||
|
||||
//
|
||||
mVolume = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Risk/Reward Ratio ...
|
||||
*
|
||||
* @return ( double )
|
||||
*/
|
||||
double R2R()
|
||||
{
|
||||
return mR2R;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Risk/Reward Ratio ...
|
||||
*
|
||||
* @param value: Double ...
|
||||
*/
|
||||
void R2R(double value)
|
||||
{
|
||||
//
|
||||
if (value < 0)
|
||||
{
|
||||
value = 1.5;
|
||||
}
|
||||
|
||||
//
|
||||
mR2R = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Max Allowed Spread ...
|
||||
*
|
||||
* @return ( double )
|
||||
*/
|
||||
double MaxAllowedSpread()
|
||||
{
|
||||
return mMaxAllowedSpread;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Max Allowed Spread ...
|
||||
*
|
||||
* @param value: Double ...
|
||||
*/
|
||||
void MaxAllowedSpread(double value)
|
||||
{
|
||||
mMaxAllowedSpread = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Long Signalling State ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool AllowLong()
|
||||
{
|
||||
return mAllowLong;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Long Signalling State ...
|
||||
*
|
||||
* @param value: Boolean ...
|
||||
*/
|
||||
void AllowLong(bool value)
|
||||
{
|
||||
mAllowLong = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Short Signalling State ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool AllowShort()
|
||||
{
|
||||
return mAllowShort;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Short Signalling State ...
|
||||
*
|
||||
* @param value: Argument 1
|
||||
*/
|
||||
void AllowShort(bool value)
|
||||
{
|
||||
mAllowShort = value;
|
||||
}
|
||||
|
||||
//
|
||||
// Actions ...
|
||||
|
||||
/**
|
||||
* Disable Strategy ...
|
||||
*/
|
||||
void Disable()
|
||||
{
|
||||
mForceDisabled = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable Strategy ...
|
||||
*/
|
||||
void Enable()
|
||||
{
|
||||
mForceDisabled = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register Signal Event Handler ...
|
||||
*
|
||||
* @param handler: an Instance of TOnXSignal ...
|
||||
*/
|
||||
void AddXSignalEventHandler(TOnX121SMCSignal handler)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
handler,
|
||||
mSignalEventHandlers //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Virtual Actions ...
|
||||
|
||||
/**
|
||||
* Destroy All Class Implementations ...
|
||||
*/
|
||||
virtual void Destroy()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle Tick Processing ...
|
||||
*
|
||||
* @param positions: XPosition instance Collection ...
|
||||
*/
|
||||
virtual void HandleTick()
|
||||
{
|
||||
//
|
||||
DoUnwaitedTicksWork();
|
||||
|
||||
//
|
||||
// Check State ...
|
||||
if (IsDisabled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signalling State ...
|
||||
if (!AllowLong() && !AllowShort())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bar Tracker State ...
|
||||
if (!mBarTracker.CanProcessBar())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Retrieve Current Tick and Check it's Time
|
||||
// by Last Issued Tick ...
|
||||
MqlTick cTick;
|
||||
bool hasTick = GetTick(
|
||||
mSymbol,
|
||||
cTick //
|
||||
);
|
||||
bool isSameAsLast = cTick.time == mLastTick.time;
|
||||
if (isSameAsLast)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Update Last Issued Tick ...
|
||||
mLastTick = cTick;
|
||||
|
||||
//
|
||||
// Check Current Processing Tick has Signal or not ...
|
||||
XSignal signal;
|
||||
X121SMCStrategyConditions conditions;
|
||||
bool hasSignal = HasSignal(
|
||||
signal,
|
||||
conditions //
|
||||
);
|
||||
if (!hasSignal)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Waits Until Next Candle if Current Tick has Signal ...
|
||||
mBarTracker.Waits();
|
||||
|
||||
//
|
||||
// Notify Signal Event Handlers ...
|
||||
NotifyOnSignalEventHandlers(
|
||||
signal,
|
||||
conditions //
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for any Guards ...
|
||||
*
|
||||
* @param guards: X121SMCGuard instance Collection ...
|
||||
* @param positions: XPosition instance Collection ...
|
||||
*
|
||||
* @return ( virtual bool )
|
||||
*/
|
||||
virtual bool HandleGuard(
|
||||
X121SMCGuard &guards[],
|
||||
XPosition &positions[] //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Check State ...
|
||||
if (IsDisabled())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signalling State ...
|
||||
if (!AllowLong() && !AllowShort())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bar Tracker State ...
|
||||
if (!mGuardBarTracker.CanProcessBar())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check For Guards ...
|
||||
result = CheckGuard(
|
||||
guards,
|
||||
positions //
|
||||
);
|
||||
|
||||
//
|
||||
// Waits Until Next Candle if Current Tick has Guard ...
|
||||
mGuardBarTracker.Waits();
|
||||
|
||||
//
|
||||
Clean(positions);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check For Signal ...
|
||||
*
|
||||
* @param signal: XSignal instance ...
|
||||
* @param conditions: X121SMCStrategyConditions instance ...
|
||||
*
|
||||
* @return ( virtual bool )
|
||||
*/
|
||||
virtual bool HasSignal(
|
||||
XSignal &signal,
|
||||
X121SMCStrategyConditions &conditions //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
signal.Clean();
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for any Guard Actions ...
|
||||
*
|
||||
* @param guards: X121SMCGuard instance Collection ...
|
||||
*
|
||||
* @return ( virtual bool )
|
||||
*/
|
||||
virtual bool CheckGuard(
|
||||
X121SMCGuard &guards[],
|
||||
const XPosition &positions[] // Positions ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update all Requirements without waiting ...
|
||||
*/
|
||||
virtual void DoUnwaitedTicksWork()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect SL Candidates based on Strategy and Conditions ...
|
||||
*
|
||||
* @param result: Double array reference ...
|
||||
* @param entry: Double, Position Entry Price ...
|
||||
* @param conditions: X121SMCStrategyConditions instance, Provides Configurations ...
|
||||
* @param type: ENUM_X_POSITION_TYPES member, Specified Position Type ...
|
||||
*/
|
||||
virtual void DetectSLCandidates(
|
||||
double &result[],
|
||||
double entry,
|
||||
X121SMCStrategyConditions &conditions,
|
||||
ENUM_X_POSITION_TYPES type //
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Customize Strategy Identifier ...
|
||||
*
|
||||
* @return ( virtual string )
|
||||
*/
|
||||
virtual string GetTag()
|
||||
{
|
||||
return X121SMCStrategyToken;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
MqlTick mLastTick; // Last Issued Tick ...
|
||||
|
||||
//
|
||||
XBarTracker mBarTracker; // Strategy Bar Tracker ...
|
||||
XBarTracker mGuardBarTracker; // Strategy Guard Bar Tracker ...
|
||||
XCBarAnalyser *mBarAnalyser; // Bar Analyser Instance
|
||||
|
||||
//
|
||||
// Actions ...
|
||||
|
||||
/**
|
||||
* Prepare and Normalize Signal for Execution in Strategy ...
|
||||
*
|
||||
* @param signal: XSignal instance ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool PrepareSignal(XSignal &signal)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Check Strategy Is Enables ...
|
||||
result = !IsDisabled();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Validate Signal ...
|
||||
result = signal.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isLong = IsLong(signal.type);
|
||||
|
||||
//
|
||||
// TODO: Implement Signal Preparation Mechanism here ...
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
/**
|
||||
* Notified Signal Event Handler(s) ...
|
||||
*
|
||||
* @param signal: XSignal instance ...
|
||||
* @param conditions: XStrategyConditions instance ...
|
||||
*/
|
||||
void NotifyOnSignalEventHandlers(
|
||||
XSignal &signal,
|
||||
X121SMCStrategyConditions &conditions //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (!signal.IsValid() || !conditions.IsValid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
int count = ArraySize(mSignalEventHandlers);
|
||||
if (!IsValidSize(count))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
mSignalEventHandlers[i](
|
||||
signal,
|
||||
conditions //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
string mSymbol; // Trading Symbol ...
|
||||
ENUM_TIMEFRAMES mPeriod; // Trading TimeFrame ...
|
||||
bool mForceDisabled; // Force Disabled ...
|
||||
bool mAllowLong; // Allow Long Signals
|
||||
bool mAllowShort; // Allow Short Signals
|
||||
double mR2R; // Risk/Rewar Ratio ...
|
||||
double mVolume; // Static Volume Per Trades ...
|
||||
|
||||
//
|
||||
double mMaxAllowedSpread; // Max Allowed Spread ...
|
||||
|
||||
//
|
||||
// On X121 Signal Recieved Event Handler(s) ...
|
||||
TOnX121SMCSignal mSignalEventHandlers[];
|
||||
|
||||
//
|
||||
// Actions ...
|
||||
|
||||
/**
|
||||
* Install all Helpers and Prepare all Configurations for required Indicators ...
|
||||
*/
|
||||
void Init()
|
||||
{
|
||||
//
|
||||
mForceDisabled = false;
|
||||
|
||||
//
|
||||
R2R(1);
|
||||
Volume(0.01);
|
||||
|
||||
//
|
||||
string symbol = Symbol();
|
||||
ENUM_TIMEFRAMES period = Period();
|
||||
|
||||
//
|
||||
// Initialize Bar Tracker ...
|
||||
mBarTracker.Init(
|
||||
symbol,
|
||||
period //
|
||||
);
|
||||
|
||||
//
|
||||
// Initialize Guard Bar Tracker ...
|
||||
mGuardBarTracker.Init(
|
||||
symbol,
|
||||
period //
|
||||
);
|
||||
|
||||
//
|
||||
mBarAnalyser = new XCBarAnalyser();
|
||||
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* De Initialize all Tools ...
|
||||
*/
|
||||
void DeInit()
|
||||
{
|
||||
//
|
||||
ZeroMemory(mBarAnalyser);
|
||||
|
||||
//
|
||||
delete mBarAnalyser;
|
||||
|
||||
//
|
||||
Clean(mSignalEventHandlers);
|
||||
|
||||
//
|
||||
Destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reste Bar Tracker ...
|
||||
*/
|
||||
void ResetBarTracker()
|
||||
{
|
||||
mBarTracker.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
};
|
||||
|
||||
//
|
||||
Binary file not shown.
@@ -0,0 +1,35 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XChartObjects
|
||||
// Description: provides all require Chart Objects ...
|
||||
//
|
||||
//
|
||||
// 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
|
||||
|
||||
//
|
||||
#include "../../Classes/x-saherelm.x-cobject.class.mq5"
|
||||
#include "../Libraries/x-121.smc.lib.mq5"
|
||||
|
||||
//
|
||||
// Definitions ...
|
||||
|
||||
enum ENUM_X121SMC_CHARTOBJECTS
|
||||
{
|
||||
X_121_NONE_OBJ
|
||||
};
|
||||
|
||||
//
|
||||
// Implementations ...
|
||||
Binary file not shown.
@@ -0,0 +1,63 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XC121Panel
|
||||
// Description: provides all based classes for use ...
|
||||
//
|
||||
//
|
||||
// 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
|
||||
|
||||
//
|
||||
// Imports ...
|
||||
#include "../../Classes/x-saherelm.x-app-dialog.class.mq5"
|
||||
|
||||
//
|
||||
// Implementation ...
|
||||
|
||||
//
|
||||
class X121CAppDialog : public XCAppDialog
|
||||
{
|
||||
//
|
||||
public:
|
||||
//
|
||||
// Constructor(s) ...
|
||||
void X121CAppDialog()
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
void ~X121CAppDialog()
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
void Configure()
|
||||
{
|
||||
//
|
||||
// Configure Dialog ...
|
||||
BackgroundColor(clrBlack);
|
||||
}
|
||||
|
||||
//
|
||||
protected:
|
||||
//
|
||||
|
||||
//
|
||||
private:
|
||||
//
|
||||
};
|
||||
|
||||
//
|
||||
Binary file not shown.
@@ -0,0 +1,802 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XC121SMCCycleHelper
|
||||
// Description: provides all based classes for use ...
|
||||
//
|
||||
//
|
||||
// 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
|
||||
|
||||
//
|
||||
// Imports ...
|
||||
#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5"
|
||||
#include "../../Classes/x-saherelm.x-poi.class.mq5"
|
||||
#include "../Libraries/x-121.smc.lib.mq5"
|
||||
|
||||
//
|
||||
// Definitions ...
|
||||
|
||||
//
|
||||
// Implementations ...
|
||||
|
||||
enum ENUM_X_CYCLES
|
||||
{
|
||||
X_CYCLE_NONE,
|
||||
X_CYCLE_TRIGGER,
|
||||
X_CYCLE_DECISION,
|
||||
X_CYCLE_ANALYSE,
|
||||
X_CYCLE_VERIFICATION,
|
||||
X_CYCLE_CONSOLIDATION,
|
||||
X_CYCLE_VISION,
|
||||
};
|
||||
|
||||
string ToString(ENUM_X_CYCLES value)
|
||||
{
|
||||
//
|
||||
string result = EnumToString(value);
|
||||
|
||||
//
|
||||
StringReplace(result, "X_CYCLE_", "");
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
enum ENUM_X_CYCLE_EVENTS
|
||||
{
|
||||
SAR_CHANGE_DETECTED,
|
||||
NEW_PEAK_DETECTED,
|
||||
NEW_VALE_DETECTED,
|
||||
PIVOT_POINT_DETECTED,
|
||||
VWAP_ORDER_CHANGE_ETECTED,
|
||||
VWAP_STATE_CHANGE_DETCTED,
|
||||
CONSOLIDATION_BREAKED_DETECTED,
|
||||
PEAK_PIVOT_STARTED,
|
||||
PEAK_PIVOT_ENDED,
|
||||
VALE_PIVOT_STARTED,
|
||||
VALE_PIVOT_ENDED,
|
||||
};
|
||||
|
||||
class XC121SMCCycleHelper : public XCBase
|
||||
{
|
||||
//
|
||||
public:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// X121 ...
|
||||
XCX121Helper *mX121Helper;
|
||||
|
||||
//
|
||||
// POI Detector ...
|
||||
XCPOIDrawer *mPOIDrawer;
|
||||
XCPOIDetector *mPOIDetector;
|
||||
|
||||
//
|
||||
// Bar Analyser
|
||||
XCBarAnalyser *mBarAnalyser;
|
||||
|
||||
//
|
||||
// Constructor(s) ...
|
||||
XC121SMCCycleHelper()
|
||||
{
|
||||
Default();
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
~XC121SMCCycleHelper()
|
||||
{
|
||||
DeInit();
|
||||
}
|
||||
|
||||
//
|
||||
// Getter/Setter(s) ...
|
||||
|
||||
//
|
||||
int CountConsolidationZones()
|
||||
{
|
||||
return ArraySize(mConsolidationZones);
|
||||
}
|
||||
|
||||
//
|
||||
bool HasConsolidationZones()
|
||||
{
|
||||
return HasChild(mConsolidationZones);
|
||||
}
|
||||
|
||||
//
|
||||
bool GetConsolidationZone(
|
||||
int idx,
|
||||
XConsolidationZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
zone.Clean();
|
||||
|
||||
//
|
||||
result = HasConsolidationZones();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int count = CountConsolidationZones();
|
||||
result = idx >= 0 &&
|
||||
idx < count;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
zone = mConsolidationZones[idx];
|
||||
result = zone.IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool GetLastDirectionalConsolidationZone(
|
||||
ENUM_X_DIRECTION forDir,
|
||||
XConsolidationZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
zone.Clean();
|
||||
|
||||
//
|
||||
result = HasDirection(forDir);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool hasZones = HasConsolidationZones();
|
||||
int zonesCount = CountConsolidationZones();
|
||||
result = hasZones;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = zonesCount - 1; i >= 0; i--)
|
||||
{
|
||||
//
|
||||
XConsolidationZone iZone = mConsolidationZones[i];
|
||||
|
||||
//
|
||||
if (!iZone.IsBreaked())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
if (!HasDirection(iZone.breakDir))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
if (iZone.breakDir != forDir)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
zone = iZone;
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
result = zone.IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool GetActiveConsolidationZone(
|
||||
XConsolidationZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
zone = mActiveConsolidationZone;
|
||||
result = zone.IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int FillConsolidationZones(
|
||||
ENUM_X_DIRECTION forDir,
|
||||
XConsolidationZone &zones[] //
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
Clean(zones);
|
||||
|
||||
//
|
||||
bool hasZones = HasConsolidationZones();
|
||||
if (!hasZones)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int count = CountConsolidationZones();
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
XConsolidationZone iZone = mConsolidationZones[i];
|
||||
|
||||
//
|
||||
bool isDirPassed =
|
||||
(forDir == X_DIRECTION_ALL ||
|
||||
forDir == X_DIRECTION_NONE)
|
||||
? true
|
||||
: forDir == iZone.breakDir;
|
||||
if (isDirPassed)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
iZone,
|
||||
zones //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = ArraySize(zones);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Actions ...
|
||||
|
||||
/**
|
||||
* Initialize ...
|
||||
*
|
||||
* @param symbol: String ...
|
||||
* @param period: ENUM_TIMEFRAMES member ...
|
||||
* @param x121Inputs: X121Inputs instance ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool Init(
|
||||
string symbol,
|
||||
ENUM_TIMEFRAMES period,
|
||||
X121Inputs &x121Inputs,
|
||||
int requiredPOIS = 50 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (requiredPOIS < 10)
|
||||
{
|
||||
requiredPOIS = 10;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsValid(symbol) &&
|
||||
IsValid(period);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
mSymbol = symbol;
|
||||
mPeriod = period;
|
||||
|
||||
//
|
||||
// X121 ...
|
||||
mX121Helper = new XCX121Helper();
|
||||
result = mX121Helper.Init(
|
||||
symbol,
|
||||
period,
|
||||
x121Inputs //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
mPOIDetector = new XCPOIDetector(
|
||||
symbol,
|
||||
period //
|
||||
);
|
||||
mPOIDetector.MaxNumberOfPOIs(requiredPOIS);
|
||||
mPOIDetector.MaxNumberOfRequiredPOIs(requiredPOIS);
|
||||
mPOIDetector.Init();
|
||||
|
||||
//
|
||||
// Initialize Bar Analyser Class Instance ...
|
||||
mBarAnalyser = new XCBarAnalyser();
|
||||
|
||||
//
|
||||
// Initial and Configure POI Drawer if Required ...
|
||||
mPOIDrawer = new XCPOIDrawer();
|
||||
mPOIDrawer.ChartIdentification(0);
|
||||
mPOIDrawer.SubWindowIdentification(0);
|
||||
|
||||
//
|
||||
mPOIDrawer.DemandZoneFill(false);
|
||||
mPOIDrawer.SupplyZoneFill(false);
|
||||
mPOIDrawer.BullishFVGFill(false);
|
||||
mPOIDrawer.BearishFVGFill(false);
|
||||
mPOIDrawer.SupportZoneFill(false);
|
||||
mPOIDrawer.ResistanceZoneFill(false);
|
||||
mPOIDrawer.BullishOrderBlockFill(false);
|
||||
mPOIDrawer.BearishOrderBlockFill(false);
|
||||
|
||||
//
|
||||
// Set Chart Style ...
|
||||
ApplyChartStyle();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve Symbol ...
|
||||
*
|
||||
* @return ( string )
|
||||
*/
|
||||
string GetSymbol()
|
||||
{
|
||||
return mSymbol;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve TimeFrame (Period) ...
|
||||
*
|
||||
* @return ( ENUM_TIMEFRAMES )
|
||||
*/
|
||||
ENUM_TIMEFRAMES GetPeriod()
|
||||
{
|
||||
return mPeriod;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Specified Bar ...
|
||||
*
|
||||
* @param source: XOHCL instance, Source Bar ...
|
||||
* @param bar: XOHCL instance, Dest Bar ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool GetBar(
|
||||
XOHCL &source,
|
||||
XOHCL &bar //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bar.Clean();
|
||||
|
||||
//
|
||||
string symbol = GetSymbol();
|
||||
ENUM_TIMEFRAMES period = GetPeriod();
|
||||
|
||||
//
|
||||
result =
|
||||
IsValid(symbol) &&
|
||||
IsValid(period) &&
|
||||
source.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int index = iBarShift(
|
||||
symbol,
|
||||
period,
|
||||
source.time //
|
||||
);
|
||||
result = bar.Init(
|
||||
symbol,
|
||||
period,
|
||||
index //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
bar.Clean();
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve Specified Bar ...
|
||||
*
|
||||
* @param bar: XOHCL instance ...
|
||||
* @param index: Integer ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool GetBar(
|
||||
XOHCL &bar,
|
||||
int index = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bar.Clean();
|
||||
|
||||
//
|
||||
if (index < 0)
|
||||
{
|
||||
index = 0;
|
||||
}
|
||||
|
||||
//
|
||||
string symbol = GetSymbol();
|
||||
ENUM_TIMEFRAMES period = GetPeriod();
|
||||
|
||||
//
|
||||
result = bar.Init(
|
||||
symbol,
|
||||
period,
|
||||
index //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve Specified Bar ...
|
||||
*
|
||||
* @param bar: XOHCL instance ...
|
||||
* @param time: Datetime ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool GetBar(
|
||||
XOHCL &bar,
|
||||
datetime time = NULL //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int index = GetBarIndex(time);
|
||||
result = GetBar(bar,
|
||||
index //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve Specified Time Bar Index ...
|
||||
*
|
||||
* @param time: DateTime ...
|
||||
*
|
||||
* @return ( int )
|
||||
*/
|
||||
int GetBarIndex(datetime time = NULL)
|
||||
{
|
||||
//
|
||||
int result = -1;
|
||||
|
||||
//
|
||||
time = NormalizeTime(time);
|
||||
|
||||
//
|
||||
string symbol = GetSymbol();
|
||||
ENUM_TIMEFRAMES period = GetPeriod();
|
||||
|
||||
//
|
||||
result = iBarShift(
|
||||
symbol,
|
||||
period,
|
||||
time //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve Cycle Conditions ...
|
||||
*
|
||||
* @param events: ENUM_X_CYCLE_EVENTS member, Array ...
|
||||
* @param conditions: X121SMCCycleConditions instance ...
|
||||
* @param barIndex: Integer ...
|
||||
* @param loopback: Integer ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool GetConditions(
|
||||
ENUM_X_CYCLE_EVENTS &events[],
|
||||
ENUM_XPOI_EVENTS &poiEvents[],
|
||||
X121SMCCycleConditions &conditions,
|
||||
int barIndex = 0,
|
||||
int loopback = 7 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (barIndex < 0)
|
||||
{
|
||||
barIndex = 0;
|
||||
}
|
||||
|
||||
//
|
||||
if (loopback < 5)
|
||||
{
|
||||
loopback = 5;
|
||||
}
|
||||
|
||||
//
|
||||
Clean(events);
|
||||
Clean(poiEvents);
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
result = mX121Helper.GetConditions(
|
||||
conditions.x121Conditions,
|
||||
barIndex,
|
||||
loopback //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
conditions.Clean();
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
mPOIDetector.Update(poiEvents);
|
||||
mPOIDetector.GetState(conditions.state);
|
||||
|
||||
//
|
||||
conditions.symbol = GetSymbol();
|
||||
conditions.period = GetPeriod();
|
||||
conditions.time = TimeCurrent();
|
||||
|
||||
//
|
||||
Update();
|
||||
|
||||
//
|
||||
result = conditions.IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
void Update()
|
||||
{
|
||||
//
|
||||
int czRange = 50; // Consolidation min Range Points ...
|
||||
int czLoopback = 5;
|
||||
int maxAllowed = 20;
|
||||
bool isActiveConsolidationZoneBreaked = false;
|
||||
bool hasActiveConsolidationZone = mActiveConsolidationZone.IsValid();
|
||||
|
||||
//
|
||||
if (hasActiveConsolidationZone)
|
||||
{
|
||||
//
|
||||
isActiveConsolidationZoneBreaked = mActiveConsolidationZone.IsBreaked();
|
||||
|
||||
//
|
||||
if (isActiveConsolidationZoneBreaked)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
mActiveConsolidationZone,
|
||||
mConsolidationZones //
|
||||
);
|
||||
|
||||
//
|
||||
CleanupArray(
|
||||
mConsolidationZones,
|
||||
maxAllowed //
|
||||
);
|
||||
|
||||
//
|
||||
mActiveConsolidationZone.Clean();
|
||||
}
|
||||
else
|
||||
{
|
||||
mActiveConsolidationZone.Update();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
XOHCL mBar;
|
||||
bool hasBar = GetBar(
|
||||
mBar,
|
||||
0 //
|
||||
);
|
||||
if (hasBar)
|
||||
{
|
||||
//
|
||||
double upper = 0;
|
||||
double lower = 0;
|
||||
bool hasConsolidationZone =
|
||||
mBarAnalyser.IsConsolidate(
|
||||
mBar,
|
||||
upper,
|
||||
lower,
|
||||
czLoopback,
|
||||
czRange //
|
||||
);
|
||||
|
||||
//
|
||||
if (hasConsolidationZone)
|
||||
{
|
||||
//
|
||||
mActiveConsolidationZone.Init(
|
||||
GetSymbol(),
|
||||
GetPeriod(),
|
||||
upper,
|
||||
lower,
|
||||
czLoopback //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
mBar.Clean();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Virtuals ...
|
||||
|
||||
/**
|
||||
* Set Default Properties Values ...
|
||||
*/
|
||||
virtual void Default()
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
protected:
|
||||
//
|
||||
|
||||
//
|
||||
private:
|
||||
//
|
||||
// Props ...
|
||||
string mSymbol;
|
||||
ENUM_TIMEFRAMES mPeriod;
|
||||
|
||||
//
|
||||
// CArrayObj mConsolidationObjects;
|
||||
XConsolidationZone mActiveConsolidationZone;
|
||||
XConsolidationZone mConsolidationZones[];
|
||||
|
||||
//
|
||||
// Actions ...
|
||||
|
||||
/**
|
||||
* Release All Resources ...
|
||||
*/
|
||||
void DeInit()
|
||||
{
|
||||
//
|
||||
ZeroMemory(mX121Helper);
|
||||
ZeroMemory(mPOIDetector);
|
||||
ZeroMemory(mBarAnalyser);
|
||||
|
||||
//
|
||||
delete mX121Helper;
|
||||
delete mPOIDetector;
|
||||
delete mBarAnalyser;
|
||||
|
||||
//
|
||||
Clean(mConsolidationZones);
|
||||
mActiveConsolidationZone.Clean();
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply Chart Style ...
|
||||
*/
|
||||
void ApplyChartStyle()
|
||||
{
|
||||
//
|
||||
// Retrieve Current Chart ID ...
|
||||
long chartId = ChartID();
|
||||
|
||||
//
|
||||
ENUM_CHART_MODE mMode = CHART_CANDLES; // chart's mMode
|
||||
bool mShowBidLine = true; // show bid line
|
||||
bool mShowAskLine = true; // show ask line
|
||||
bool mShowGrid = false; // show grids on chart
|
||||
bool mShowVolumes = false; // show volumes
|
||||
bool mShowTradeLevels = true; // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders)
|
||||
bool mAutoScroll = true; // chart autoscroll
|
||||
bool mQuickNavigation = true; // chart quick navigation state
|
||||
color mForeGroundColor = clrWhite; // chart's foreground color
|
||||
color mBackGroundColor = clrBlack; // chart's background color
|
||||
color mUpColor = clrGreen; // Up Color
|
||||
color mDownColor = clrRed; // Down Color
|
||||
color mBullishColor = clrGreen; // Bullish color
|
||||
color mBearishColor = clrRed; // Bearish color
|
||||
color mGridColor = clrGray; // grid color
|
||||
color mBidLineColor = clrGray; // bid line color
|
||||
color mAskLineColor = clrRed; // ask line color
|
||||
color mLineColor = clrLime; // line mMode and doji candlestick color
|
||||
color mStopColor = clrGold; // Color of stop order levels (Stop Loss and Take Profit)
|
||||
color mVolumesColor = clrGreen; // volumes color
|
||||
|
||||
//
|
||||
ChartSetInteger(chartId, CHART_MODE, mMode);
|
||||
ChartSetInteger(chartId, CHART_SHOW_BID_LINE, mShowBidLine);
|
||||
ChartSetInteger(chartId, CHART_SHOW_ASK_LINE, mShowAskLine);
|
||||
ChartSetInteger(chartId, CHART_SHOW_GRID, mShowGrid);
|
||||
ChartSetInteger(chartId, CHART_SHOW_VOLUMES, mShowVolumes);
|
||||
ChartSetInteger(chartId, CHART_SHOW_TRADE_LEVELS, mShowTradeLevels);
|
||||
ChartSetInteger(chartId, CHART_AUTOSCROLL, mAutoScroll);
|
||||
ChartSetInteger(chartId, CHART_QUICK_NAVIGATION, mQuickNavigation);
|
||||
ChartSetInteger(chartId, CHART_COLOR_FOREGROUND, mForeGroundColor);
|
||||
ChartSetInteger(chartId, CHART_COLOR_BACKGROUND, mBackGroundColor);
|
||||
ChartSetInteger(chartId, CHART_COLOR_CHART_UP, mUpColor);
|
||||
ChartSetInteger(chartId, CHART_COLOR_CHART_DOWN, mDownColor);
|
||||
ChartSetInteger(chartId, CHART_COLOR_CANDLE_BULL, mBullishColor);
|
||||
ChartSetInteger(chartId, CHART_COLOR_CANDLE_BEAR, mBearishColor);
|
||||
ChartSetInteger(chartId, CHART_COLOR_GRID, mGridColor);
|
||||
ChartSetInteger(chartId, CHART_COLOR_BID, mBidLineColor);
|
||||
ChartSetInteger(chartId, CHART_COLOR_ASK, mAskLineColor);
|
||||
ChartSetInteger(chartId, CHART_COLOR_STOP_LEVEL, mStopColor);
|
||||
ChartSetInteger(chartId, CHART_COLOR_CHART_LINE, mLineColor);
|
||||
ChartSetInteger(chartId, CHART_COLOR_VOLUME, mVolumesColor);
|
||||
}
|
||||
|
||||
//
|
||||
};
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user