375 lines
8.0 KiB
Plaintext
375 lines
8.0 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Indicator
|
|
// -------------------------------------------------
|
|
// Name: XCXSTRCCISignaller ...
|
|
// Description: Class for XSTRCCI Signaller ...
|
|
//
|
|
//
|
|
// Maintainer:
|
|
// ------------
|
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
|
//
|
|
//////////////////////////////////////////////////////
|
|
//
|
|
// Global Properties ...
|
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
|
#property link "https://saherelm.ir"
|
|
#property version "1.00"
|
|
#property description "SaherElm Class for XSTRCCI Signaller"
|
|
#property strict
|
|
|
|
//
|
|
// Imports ...
|
|
#include "../../Classes/x-saherelm.base.class.mq5"
|
|
#include "../../Classes/x-saherelm.x-cobject.class.mq5"
|
|
#include "../Helpers/xstrcci.helper.mq5"
|
|
#include "../Libraries/xstrcci.signaller.lib.mq5"
|
|
|
|
//
|
|
// Definitions ...
|
|
|
|
class XCXSTRCCISignaller : XCBase
|
|
{
|
|
//
|
|
// Public ...
|
|
public:
|
|
//
|
|
// Props ...
|
|
bool useGuards;
|
|
double rfReward;
|
|
bool isPassedBoxes;
|
|
XSTRCCIInputs inputs;
|
|
XCXSTRCCIHelper *helper;
|
|
bool continuesRFTillTarget;
|
|
XSTRCCIStrategyConditions mConditions;
|
|
XSTRCCIStrategyConditions mConditionsCollection[];
|
|
|
|
//
|
|
// Constructor ...
|
|
XCXSTRCCISignaller(
|
|
string _symbol,
|
|
ENUM_TIMEFRAMES _period //
|
|
)
|
|
{
|
|
//
|
|
symbol = _symbol;
|
|
period = _period;
|
|
Init();
|
|
}
|
|
|
|
//
|
|
// Deconstructor ...
|
|
~XCXSTRCCISignaller()
|
|
{
|
|
DeInit();
|
|
}
|
|
|
|
//
|
|
// Properties ...
|
|
|
|
string GetSymbol()
|
|
{
|
|
return symbol;
|
|
}
|
|
|
|
ENUM_TIMEFRAMES GetPeriod()
|
|
{
|
|
return period;
|
|
}
|
|
|
|
//
|
|
// Signaller Tools ...
|
|
|
|
/**
|
|
* Detect Setup Conditions based on Signalling ...
|
|
*
|
|
* @param maxAllowedSLDistanceInPoint: int, Max Allowed SL Distance in Points (if Bigger thn Zero Provided) ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool DetectSignalSetup(
|
|
double tpReward = 3,
|
|
double maxAllowedSLDistanceInPoint = 300 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Detect Trigger Conditions for Specified Signal ...
|
|
*
|
|
* @param conditions: XSTRCCIStrategyConditions instance Reference, Specified Signal Conditions ...
|
|
* @param maxAllowedSetupAge: specified Setup Age for Expiration (if bigger than Zero) ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool DetectSignalTrigger(
|
|
XSTRCCIStrategyConditions &conditions,
|
|
int maxAllowedSetupAge = 60 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = conditions.IsSetuped();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
datetime setupTime = conditions.setupTime;
|
|
ENUM_X_DIRECTION setupDir = conditions.dir;
|
|
|
|
//
|
|
bool isBullish = IsBullish(setupDir);
|
|
bool isBearish = IsBearish(setupDir);
|
|
|
|
//
|
|
int zIndex = 0;
|
|
int cIndex = zIndex + 1;
|
|
int pIndex = cIndex + 1;
|
|
int ppIndex = pIndex + 1;
|
|
|
|
//
|
|
int loopback = 10;
|
|
|
|
//
|
|
double ask = GetAsk(symbol);
|
|
double bid = GetBid(symbol);
|
|
datetime cTime = TimeCurrent();
|
|
double points = GetPoints(symbol);
|
|
|
|
//
|
|
// Check Signal Validation ...
|
|
// IMPORTANT: since all Validations done in SetUp Process ...
|
|
// here we only Execute Signal ...
|
|
|
|
//
|
|
result = isBullish ||
|
|
isBearish;
|
|
|
|
//
|
|
if (result)
|
|
{
|
|
//
|
|
conditions.triggerTime = cTime;
|
|
conditions.type = isBullish
|
|
? X_POSITION_TYPE_LONG
|
|
: X_POSITION_TYPE_SHORT;
|
|
|
|
//
|
|
}
|
|
|
|
//
|
|
// Cleanup ...
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Detect Guards bsed on Signalling Class ...
|
|
*
|
|
* @param guards: XSTRCCIGuard instance Collection, Holds Provided Guards ...
|
|
* @param positions: XPosition instance Collection, Provides Signalling Based Positions for Apply Guards on them ...
|
|
* @param provider: X121SMCStrategySignalProviderData instance Reference, Specified Data for Cycles ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool DetectGuards(
|
|
XSTRCCIGuard &guards[],
|
|
const XPosition &positions[] //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Add Conditions to Conditions Collection if not Exists ...
|
|
*
|
|
* @param maxAllowed: int, Specified Max Allowed Holding Conditions ...
|
|
*
|
|
* @return ( int )
|
|
*/
|
|
int AddConditionsIfNotExists(
|
|
int maxAllowed = 10 //
|
|
)
|
|
{
|
|
//
|
|
int result = 0;
|
|
|
|
//
|
|
bool isSetuped = IsValid(mConditions.setupTime) &&
|
|
HasDirection(mConditions.dir);
|
|
if (!isSetuped)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
int count = ArraySize(mConditionsCollection);
|
|
if (IsValidSize(count))
|
|
{
|
|
//
|
|
// Copy Original Items ...
|
|
XSTRCCIStrategyConditions tmpItems[];
|
|
Copy(
|
|
mConditionsCollection,
|
|
tmpItems //
|
|
);
|
|
|
|
//
|
|
// Prese Item Data ...
|
|
bool isBullish = IsBullish(mConditions.dir);
|
|
|
|
//
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
//
|
|
XSTRCCIStrategyConditions iItem = tmpItems[i];
|
|
|
|
//
|
|
bool canRemove = mConditions.dir == iItem.dir &&
|
|
mConditions.pivot == iItem.pivot;
|
|
if (canRemove)
|
|
{
|
|
//
|
|
ArrayRemove(
|
|
mConditionsCollection,
|
|
i,
|
|
1 //
|
|
);
|
|
}
|
|
}
|
|
|
|
//
|
|
Clean(tmpItems);
|
|
}
|
|
|
|
//
|
|
AddRef(
|
|
mConditions,
|
|
mConditionsCollection //
|
|
);
|
|
|
|
//
|
|
// Remove Olds ...
|
|
CleanupArray(
|
|
mConditionsCollection,
|
|
maxAllowed //
|
|
);
|
|
|
|
//
|
|
result = ArraySize(mConditionsCollection);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Protected ...
|
|
protected:
|
|
//
|
|
|
|
//
|
|
// Private ...
|
|
private:
|
|
//
|
|
// Props ...
|
|
string symbol;
|
|
ENUM_TIMEFRAMES period;
|
|
CArrayObj mObjects;
|
|
CArrayObj mBarObjects;
|
|
|
|
/**
|
|
* Initialize ...
|
|
*/
|
|
void Init()
|
|
{
|
|
//
|
|
rfReward = 2;
|
|
useGuards = false;
|
|
isPassedBoxes = false;
|
|
continuesRFTillTarget = true;
|
|
|
|
//
|
|
inputs.Default();
|
|
|
|
//
|
|
// Configure Indicators ...
|
|
|
|
//
|
|
// XCC ...
|
|
inputs.ccInputs.showCandles = true;
|
|
|
|
//
|
|
// XCT ...
|
|
inputs.ctInputs.showCandleTime = true;
|
|
|
|
//
|
|
// XSTR ...
|
|
inputs.strInputs.showStr = true;
|
|
inputs.strInputs.showVidya = true;
|
|
inputs.strInputs.showStrUpper = false;
|
|
inputs.strInputs.showStrLower = false;
|
|
inputs.strInputs.showStrSMLow = true;
|
|
inputs.strInputs.showStrSMHigh = true;
|
|
|
|
//
|
|
// XOSCS ...
|
|
inputs.oscsInputs.rsiLength = 5;
|
|
inputs.oscsInputs.mfiLength = 5;
|
|
inputs.oscsInputs.rviLength = 5;
|
|
inputs.oscsInputs.cciLength = 5;
|
|
|
|
//
|
|
// Oscillators Views ...
|
|
inputs.showCCI = false;
|
|
inputs.showRSI = false;
|
|
inputs.showMFI = false;
|
|
inputs.showRVI = false;
|
|
inputs.showMACD = false;
|
|
|
|
//
|
|
// XSTRCCI Helper ...
|
|
helper = new XCXSTRCCIHelper();
|
|
helper.Init(
|
|
symbol,
|
|
period,
|
|
inputs //
|
|
);
|
|
}
|
|
|
|
/**
|
|
* DeInitialize ...
|
|
*/
|
|
void DeInit()
|
|
{
|
|
//
|
|
inputs.Clean();
|
|
ZeroMemory(helper);
|
|
|
|
//
|
|
mConditions.Clean();
|
|
Clean(mConditionsCollection);
|
|
|
|
//
|
|
mObjects.Clear();
|
|
mBarObjects.Clear();
|
|
}
|
|
|
|
//
|
|
};
|
|
|
|
// |