last ...
This commit is contained in:
Vendored
+47
-9
@@ -48,15 +48,14 @@
|
|||||||
"assignedTo": {
|
"assignedTo": {
|
||||||
"name": "Hadi Khazaee Asl"
|
"name": "Hadi Khazaee Asl"
|
||||||
},
|
},
|
||||||
"category": "X121 Market Conditions",
|
"creation_time": "2024-06-01T00:56:22.059Z",
|
||||||
"creation_time": "2024-05-30T21:38:04.455Z",
|
|
||||||
"description": {
|
"description": {
|
||||||
"content": "- [x] Remove all Unused Indicators and Helpers;\n-- [x] XCHLH;\n-- [x] XCHMA;\n-- [x] XFI;\n-- [x] XTS;\n-- [x] XRSI;\n-- [x] XOBD;\n-- [x] XLH;\n- [x] resolve side affects;\n- [x] Cleanup Market Conditions;\n- [] Merge reading Required Data to XMarket Conditions;",
|
"content": "Indicators:\n- [] XHULL;\n- [] XSSL;\n- [] XAMA;\n- [] XTM;\n\nfor each indicator:\n- [] Buffers;\n- [] Conditions;\n- [] Clean;\n- [] Score;\n- [] Summary;\n",
|
||||||
"mime": "text/markdown"
|
"mime": "text/markdown"
|
||||||
},
|
},
|
||||||
"id": "62",
|
"id": "71",
|
||||||
"references": [],
|
"references": [],
|
||||||
"title": "Cleanup all Old Indicator"
|
"title": "add XHULL/XSSLC/XAMA/XTM Indicators also to X121MarketCycle Calss"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"assignedTo": {
|
"assignedTo": {
|
||||||
@@ -75,7 +74,7 @@
|
|||||||
"category": "X121 Provider",
|
"category": "X121 Provider",
|
||||||
"creation_time": "2024-05-30T21:40:26.010Z",
|
"creation_time": "2024-05-30T21:40:26.010Z",
|
||||||
"description": {
|
"description": {
|
||||||
"content": "implement a Signaller Struct to Describe a Signaller state;\nuse it in X121ProviderDescriptor;\ninside X121Provider use this Struct to Handle Signaller's State;",
|
"content": "- [x] implement a Signaller Struct to Describe a Signaller state;\n- [] use it in X121ProviderDescriptor;\n- [] inside X121Provider use this Struct to Handle Signaller's State;",
|
||||||
"mime": "text/markdown"
|
"mime": "text/markdown"
|
||||||
},
|
},
|
||||||
"id": "63",
|
"id": "63",
|
||||||
@@ -89,7 +88,7 @@
|
|||||||
"category": "XMQL",
|
"category": "XMQL",
|
||||||
"creation_time": "2024-05-30T22:34:15.388Z",
|
"creation_time": "2024-05-30T22:34:15.388Z",
|
||||||
"description": {
|
"description": {
|
||||||
"content": "in this way all class can Has his own Alerts ...",
|
"content": "- [x] in this way all class can Has his own Alerts ...\n- [] preare Alert Prefix for Each Separated Once ...",
|
||||||
"mime": "text/markdown"
|
"mime": "text/markdown"
|
||||||
},
|
},
|
||||||
"id": "69",
|
"id": "69",
|
||||||
@@ -103,15 +102,54 @@
|
|||||||
"category": "X121 Provider",
|
"category": "X121 Provider",
|
||||||
"creation_time": "2024-05-30T21:41:50.930Z",
|
"creation_time": "2024-05-30T21:41:50.930Z",
|
||||||
"description": {
|
"description": {
|
||||||
"content": "Each Market must have their own Pivot Points;",
|
"content": "Each Market must have their own Pivot Points;\n\n- [] Remove Current Support and Resistance;\n- [] add Support and Resistance and also Score Generating in each Market;\n- [] create a General Common Function to Access Support and Resistances;",
|
||||||
"mime": "text/markdown"
|
"mime": "text/markdown"
|
||||||
},
|
},
|
||||||
"id": "64",
|
"id": "64",
|
||||||
"references": [],
|
"references": [],
|
||||||
"title": "Move Support and Resistance Pivots Finders inside X121Market Class"
|
"title": "Move Support and Resistance Pivots Finders inside X121Market Class"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"assignedTo": {
|
||||||
|
"name": "Hadi Khazaee Asl"
|
||||||
|
},
|
||||||
|
"category": "XMQL",
|
||||||
|
"creation_time": "2024-06-01T00:57:10.458Z",
|
||||||
|
"description": {
|
||||||
|
"content": "do r&d about Volume Profiling and Implement it inside X121 Market Cycle;",
|
||||||
|
"mime": "text/markdown"
|
||||||
|
},
|
||||||
|
"id": "72",
|
||||||
|
"references": [],
|
||||||
|
"title": "R&D about Volume Profiling"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"assignedTo": {
|
||||||
|
"name": "Hadi Khazaee Asl"
|
||||||
|
},
|
||||||
|
"category": "XMQL",
|
||||||
|
"creation_time": "2024-06-01T00:58:06.730Z",
|
||||||
|
"id": "73",
|
||||||
|
"references": [],
|
||||||
|
"title": "R&D about indicator Class implementation ..."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"testing": [
|
||||||
|
{
|
||||||
|
"assignedTo": {
|
||||||
|
"name": "Hadi Khazaee Asl"
|
||||||
|
},
|
||||||
|
"category": "X121 Market Conditions",
|
||||||
|
"creation_time": "2024-05-30T21:38:04.455Z",
|
||||||
|
"description": {
|
||||||
|
"content": "- [x] Remove all Unused Indicators and Helpers;\n-- [x] XCHLH;\n-- [x] XCHMA;\n-- [x] XFI;\n-- [x] XTS;\n-- [x] XRSI;\n-- [x] XOBD;\n-- [x] XLH;\n- [x] resolve side affects;\n- [x] Cleanup Market Conditions;\n- [x] Merge reading Required Data to XMarket Conditions;",
|
||||||
|
"mime": "text/markdown"
|
||||||
|
},
|
||||||
|
"id": "62",
|
||||||
|
"references": [],
|
||||||
|
"title": "Cleanup all Old Indicator"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"testing": [],
|
|
||||||
"done": [
|
"done": [
|
||||||
{
|
{
|
||||||
"assignedTo": {
|
"assignedTo": {
|
||||||
|
|||||||
@@ -0,0 +1,154 @@
|
|||||||
|
///////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SaherElm IT Center MQL5 Class Library
|
||||||
|
// ----------------------------------------------
|
||||||
|
// Name: XSCBaseInd
|
||||||
|
// Description: provides Indicator implementation
|
||||||
|
// 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
|
||||||
|
|
||||||
|
//
|
||||||
|
// Imports ...
|
||||||
|
#include <Indicators/Indicator.mqh>
|
||||||
|
|
||||||
|
//
|
||||||
|
// XSCMid Indicator Buffers ...
|
||||||
|
enum ENUM_XSCMID_BUFFERS
|
||||||
|
{
|
||||||
|
XSCMID_MAIN_LINE = 0, // Main Buffer ...
|
||||||
|
XSCMID_STATE_LINE = 1, // State Buffer ...
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
string GetTitle(ENUM_XSCMID_BUFFERS bufferLine)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string result = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
switch (bufferLine)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
case XSCMID_MAIN_LINE:
|
||||||
|
result = "XMID";
|
||||||
|
break;
|
||||||
|
|
||||||
|
//
|
||||||
|
case XSCMID_STATE_LINE:
|
||||||
|
result = "XSTATE";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// XSCMid Indicator Inputs ...
|
||||||
|
struct XSCMidInputs
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Props ...
|
||||||
|
string version;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Constructor ...
|
||||||
|
XSCMidInputs()
|
||||||
|
{
|
||||||
|
Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Tools ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initial Inputs ...
|
||||||
|
bool Init()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cleanup ...
|
||||||
|
void Clean()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Default ...
|
||||||
|
void Default()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate ...
|
||||||
|
bool IsValid()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
true
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve Max Length ...
|
||||||
|
int Max()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// a Simple Indicator ...
|
||||||
|
|
||||||
|
class XSCMid : public CIndicator
|
||||||
|
{
|
||||||
|
|
||||||
|
//
|
||||||
|
// Protected ...
|
||||||
|
protected:
|
||||||
|
//
|
||||||
|
// Private ...
|
||||||
|
private:
|
||||||
|
//
|
||||||
|
// Props ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Inputs ...
|
||||||
|
XSCMidInputs mInputs;
|
||||||
|
};
|
||||||
@@ -0,0 +1,683 @@
|
|||||||
|
///////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SaherElm IT Center MQL5 Class Library
|
||||||
|
// ----------------------------------------------
|
||||||
|
// Name: XSCBaseInd
|
||||||
|
// Description: provides all Indicator 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
|
||||||
|
|
||||||
|
//
|
||||||
|
// Imports ...
|
||||||
|
#include "../Classes/x-saherelm.base.class.mq5"
|
||||||
|
#include "../Libraries/x-saherelm.draw.lib.mq5"
|
||||||
|
#include "../Classes/x-saherelm.xalert.class.mq5"
|
||||||
|
|
||||||
|
//
|
||||||
|
// Definitions ...
|
||||||
|
|
||||||
|
//
|
||||||
|
struct XBuffer
|
||||||
|
{
|
||||||
|
//
|
||||||
|
string title; // Buffer Title
|
||||||
|
string symbol; // Buffer Symbol
|
||||||
|
double values[]; // Buffer Values
|
||||||
|
ENUM_TIMEFRAMES period; // Buffer Period
|
||||||
|
datetime times[]; // Buffer Values Time
|
||||||
|
|
||||||
|
//
|
||||||
|
// Constructor ...
|
||||||
|
XBuffer()
|
||||||
|
{
|
||||||
|
Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Tools ...
|
||||||
|
bool Init(
|
||||||
|
string mTitle // Title
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid(mTitle);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
result = StringToLower(mTitle);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
title = mTitle;
|
||||||
|
// ArraySetAsSeries(values, false);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cleanup ...
|
||||||
|
void Clean()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Clean(values);
|
||||||
|
Clean(times);
|
||||||
|
|
||||||
|
//
|
||||||
|
title = NULL;
|
||||||
|
symbol = NULL;
|
||||||
|
period = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate ...
|
||||||
|
bool IsValid()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
IsValid(title) &&
|
||||||
|
IsValid(period) &&
|
||||||
|
IsValid(symbol)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Owwn ...
|
||||||
|
bool IsOwn(
|
||||||
|
string mTitle // Checking Title
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid(mTitle);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = StringToLower(mTitle);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = this.title == mTitle;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Count Size ...
|
||||||
|
int Count()
|
||||||
|
{
|
||||||
|
return ArraySize(values);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Add Value to Buffer ...
|
||||||
|
int Add(double value)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = -1;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid())
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
datetime time = GetPeriodStartTime(
|
||||||
|
this.symbol,
|
||||||
|
this.period);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Date Exists before ...
|
||||||
|
int timeIDX = FindIndex(
|
||||||
|
time,
|
||||||
|
times //
|
||||||
|
);
|
||||||
|
if (timeIDX >= 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Item Exists ...
|
||||||
|
// Update it ...
|
||||||
|
|
||||||
|
//
|
||||||
|
values[timeIDX] = value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// New Item ...
|
||||||
|
// Add It ...
|
||||||
|
|
||||||
|
//
|
||||||
|
int count = Count();
|
||||||
|
ArrayResize(
|
||||||
|
values,
|
||||||
|
count + 1 //
|
||||||
|
);
|
||||||
|
ArrayResize(
|
||||||
|
times,
|
||||||
|
count + 1 //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
times[count] = time;
|
||||||
|
values[count] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = Count();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get Specified Index Value ...
|
||||||
|
double Get(
|
||||||
|
int index // Specified Index
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double result = EMPTY_VALUE;
|
||||||
|
|
||||||
|
//
|
||||||
|
NormalizeIndex(
|
||||||
|
index,
|
||||||
|
values //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = values[index];
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Remove Specified Index Value ...
|
||||||
|
bool Remove(int index)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
int count = Count();
|
||||||
|
result = IsValidSize(count);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = index > 0 && index < count - 1;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = ArrayRemove(
|
||||||
|
values,
|
||||||
|
index,
|
||||||
|
1 //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
double Get(
|
||||||
|
datetime time = NULL //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double result = EMPTY_VALUE;
|
||||||
|
|
||||||
|
//
|
||||||
|
NormalizeTime(time);
|
||||||
|
|
||||||
|
//
|
||||||
|
datetime iTime = GetPeriodStartTime(
|
||||||
|
this.symbol,
|
||||||
|
this.period,
|
||||||
|
time //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
int timeIDX = FindIndex(
|
||||||
|
iTime,
|
||||||
|
this.times //
|
||||||
|
);
|
||||||
|
if (timeIDX < 0)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = Get(timeIDX);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool Remove(
|
||||||
|
datetime time = NULL //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
NormalizeTime(time);
|
||||||
|
|
||||||
|
//
|
||||||
|
datetime iTime = GetPeriodStartTime(
|
||||||
|
this.symbol,
|
||||||
|
this.period,
|
||||||
|
time //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
int timeIDX = FindIndex(
|
||||||
|
iTime,
|
||||||
|
this.times //
|
||||||
|
);
|
||||||
|
if (timeIDX < 0)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = Remove(timeIDX);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Base Indicator Class ...
|
||||||
|
class XSCBaseInd : public XSCBaseAlert
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Public ...
|
||||||
|
public:
|
||||||
|
//
|
||||||
|
// Props ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Indicators Buffers ...
|
||||||
|
XBuffer mBuffers[];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Constructor(s) ...
|
||||||
|
void XSCBaseInd(
|
||||||
|
string symbol, // Trading Symbol
|
||||||
|
ENUM_TIMEFRAMES period // Trading TimeFrame
|
||||||
|
) : XSCBaseAlert()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
mSymbol = symbol;
|
||||||
|
mPeriod = period;
|
||||||
|
|
||||||
|
//
|
||||||
|
mCalculatedBars = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Deconstructor ...
|
||||||
|
void ~XSCBaseInd() {}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Property Getter(s) / Setter(s) ...
|
||||||
|
|
||||||
|
//
|
||||||
|
string GetSymbol()
|
||||||
|
{
|
||||||
|
return mSymbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
ENUM_TIMEFRAMES GetPeriod()
|
||||||
|
{
|
||||||
|
return mPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Overrides ...
|
||||||
|
|
||||||
|
//
|
||||||
|
virtual string GetTag();
|
||||||
|
|
||||||
|
//
|
||||||
|
virtual string GetToken();
|
||||||
|
|
||||||
|
//
|
||||||
|
virtual void DeInit(int reason); // Indicator DeInitialization
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Inputs ...
|
||||||
|
virtual bool IsValidInputs()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate ...
|
||||||
|
virtual void Calculate() {}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Tools ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve Calculate Bars ...
|
||||||
|
int GetCalculatedBars()
|
||||||
|
{
|
||||||
|
return mCalculatedBars;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Count available Bars ...
|
||||||
|
int CountBars()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
return iBars(
|
||||||
|
mSymbol,
|
||||||
|
mPeriod //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Indicator States ...
|
||||||
|
bool IsValid()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValidInputs();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
IsSpecifiedValid(mSymbol) &&
|
||||||
|
IsSpecifiedValid(mPeriod)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Buffer Registrations ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Count Registered Buffers ...
|
||||||
|
int CountBuffers()
|
||||||
|
{
|
||||||
|
return ArraySize(mBuffers);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve Specified Buffer Index ...
|
||||||
|
int GetBufferIndex(
|
||||||
|
string title // Specified Buffer Title
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = -1;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsSpecifiedValid(title))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int buffersCount = CountBuffers();
|
||||||
|
if (!IsValidSize(buffersCount))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < buffersCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XBuffer iBuffer = mBuffers[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isOwn = iBuffer.IsOwn(title);
|
||||||
|
if (isOwn)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
result = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Contains Specific Buffer or not ...
|
||||||
|
bool HasBuffer(
|
||||||
|
string title // Specified Buffer Title
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
int bufferIndex = GetBufferIndex(title);
|
||||||
|
result = bufferIndex >= 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve Specified Buffer ...
|
||||||
|
bool GetBuffer(
|
||||||
|
string title, // Specified Buffer Title
|
||||||
|
XBuffer &buffer // Hold Result
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
int idx = GetBufferIndex(title);
|
||||||
|
result = idx >= 0;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
buffer = mBuffers[idx];
|
||||||
|
|
||||||
|
//
|
||||||
|
result = buffer.IsValid();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Register Specified Buffer ...
|
||||||
|
bool SetBuffer(
|
||||||
|
XBuffer &buffer // Specified Buffer for Registration
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate buffer ...
|
||||||
|
result = buffer.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Buffer Doesn't Exists before ...
|
||||||
|
int idx = GetBufferIndex(buffer.title);
|
||||||
|
result = idx == -1;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
buffer,
|
||||||
|
mBuffers //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
double GetBufferValue(
|
||||||
|
string mTitle, // Required Buffer Title
|
||||||
|
int index // Bar Index
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double result = EMPTY_VALUE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate State ...
|
||||||
|
if (!IsValid())
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int bufferIDX = GetBufferIndex(mTitle);
|
||||||
|
if (bufferIDX < 0)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Calculate();
|
||||||
|
|
||||||
|
//
|
||||||
|
result = mBuffers[bufferIDX].Get(index);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
double GetBufferValue(
|
||||||
|
string mTitle, // Required Buffer Title
|
||||||
|
datetime time = NULL // Time
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
NormalizeTime(time);
|
||||||
|
double result = EMPTY_VALUE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate State ...
|
||||||
|
if (!IsValid())
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int bufferIDX = GetBufferIndex(mTitle);
|
||||||
|
if (bufferIDX < 0)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Calculate();
|
||||||
|
|
||||||
|
//
|
||||||
|
result = mBuffers[bufferIDX].Get(time);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Protected ...
|
||||||
|
protected:
|
||||||
|
//
|
||||||
|
// Props ...
|
||||||
|
|
||||||
|
//
|
||||||
|
string mSymbol; // Trading Symbol
|
||||||
|
ENUM_TIMEFRAMES mPeriod; // Trading TimeFrame
|
||||||
|
|
||||||
|
//
|
||||||
|
int mCalculatedBars; // Calculated Bars
|
||||||
|
|
||||||
|
//
|
||||||
|
// Tools ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Private ...
|
||||||
|
private:
|
||||||
|
//
|
||||||
|
// Props ...
|
||||||
|
};
|
||||||
@@ -0,0 +1,194 @@
|
|||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Custom.mqh |
|
||||||
|
//| Copyright 2000-2024, MetaQuotes Ltd. |
|
||||||
|
//| https://www.mql5.com |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
#include "Indicator.mqh"
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Class CiCustom. |
|
||||||
|
//| Purpose: Class of custom indicators. |
|
||||||
|
//| Derives from class CIndicator. |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
class CiCustom : public CIndicator
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
int m_num_params; // number of creation parameters
|
||||||
|
MqlParam m_params[]; // creation parameters
|
||||||
|
|
||||||
|
public:
|
||||||
|
CiCustom(void);
|
||||||
|
~CiCustom(void);
|
||||||
|
//--- methods of access to protected data
|
||||||
|
bool NumBuffers(const int buffers);
|
||||||
|
int NumParams(void) const { return(m_num_params); }
|
||||||
|
ENUM_DATATYPE ParamType(const int ind) const;
|
||||||
|
long ParamLong(const int ind) const;
|
||||||
|
double ParamDouble(const int ind) const;
|
||||||
|
string ParamString(const int ind) const;
|
||||||
|
//--- method of identifying
|
||||||
|
virtual int Type(void) const { return(IND_CUSTOM); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//--- methods of tuning
|
||||||
|
virtual bool Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[]);
|
||||||
|
};
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Constructor |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
CiCustom::CiCustom(void) : m_num_params(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Destructor |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
CiCustom::~CiCustom(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Set number of buffers of indicator |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CiCustom::NumBuffers(const int buffers)
|
||||||
|
{
|
||||||
|
bool result=true;
|
||||||
|
//---
|
||||||
|
if(m_buffers_total==0)
|
||||||
|
{
|
||||||
|
m_buffers_total=buffers;
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
if(m_buffers_total!=buffers)
|
||||||
|
{
|
||||||
|
Shutdown();
|
||||||
|
result=CreateBuffers(m_symbol,m_period,buffers);
|
||||||
|
if(result)
|
||||||
|
{
|
||||||
|
//--- create buffers
|
||||||
|
for(int i=0;i<m_buffers_total;i++)
|
||||||
|
((CIndicatorBuffer*)At(i)).Name("LINE "+IntegerToString(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//---
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Get type of specified parameter of creation |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
ENUM_DATATYPE CiCustom::ParamType(const int ind) const
|
||||||
|
{
|
||||||
|
if(ind>=m_num_params)
|
||||||
|
return(WRONG_VALUE);
|
||||||
|
//---
|
||||||
|
return(m_params[ind].type);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Get specified parameter of creatiob as a long value |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
long CiCustom::ParamLong(const int ind) const
|
||||||
|
{
|
||||||
|
if(ind>=m_num_params)
|
||||||
|
return(0);
|
||||||
|
switch(m_params[ind].type)
|
||||||
|
{
|
||||||
|
case TYPE_DOUBLE:
|
||||||
|
case TYPE_FLOAT:
|
||||||
|
case TYPE_STRING:
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
//---
|
||||||
|
return(m_params[ind].integer_value);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Get specified parameter of creation as a double value |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
double CiCustom::ParamDouble(const int ind) const
|
||||||
|
{
|
||||||
|
if(ind>=m_num_params)
|
||||||
|
return(EMPTY_VALUE);
|
||||||
|
switch(m_params[ind].type)
|
||||||
|
{
|
||||||
|
case TYPE_DOUBLE:
|
||||||
|
case TYPE_FLOAT:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return(EMPTY_VALUE);
|
||||||
|
}
|
||||||
|
//---
|
||||||
|
return(m_params[ind].double_value);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Get specified parameter of creation as a string value |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
string CiCustom::ParamString(const int ind) const
|
||||||
|
{
|
||||||
|
if(ind>=m_num_params || m_params[ind].type!=TYPE_STRING)
|
||||||
|
return("");
|
||||||
|
//---
|
||||||
|
return(m_params[ind].string_value);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Initialize the indicator with universal parameters |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CiCustom::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
//--- tune
|
||||||
|
if(m_buffers_total==0)
|
||||||
|
m_buffers_total=256;
|
||||||
|
if(CreateBuffers(symbol,period,m_buffers_total))
|
||||||
|
{
|
||||||
|
//--- string of status of drawing
|
||||||
|
m_name ="Custom "+params[0].string_value;
|
||||||
|
m_status="("+symbol+","+PeriodDescription();
|
||||||
|
for(i=1;i<num_params;i++)
|
||||||
|
{
|
||||||
|
switch(params[i].type)
|
||||||
|
{
|
||||||
|
case TYPE_BOOL:
|
||||||
|
m_status=m_status+","+((params[i].integer_value)?"true":"false");
|
||||||
|
break;
|
||||||
|
case TYPE_CHAR:
|
||||||
|
case TYPE_UCHAR:
|
||||||
|
case TYPE_SHORT:
|
||||||
|
case TYPE_USHORT:
|
||||||
|
case TYPE_INT:
|
||||||
|
case TYPE_UINT:
|
||||||
|
case TYPE_LONG:
|
||||||
|
case TYPE_ULONG:
|
||||||
|
m_status=m_status+","+IntegerToString(params[i].integer_value);
|
||||||
|
break;
|
||||||
|
case TYPE_COLOR:
|
||||||
|
m_status=m_status+","+ColorToString((color)params[i].integer_value);
|
||||||
|
break;
|
||||||
|
case TYPE_DATETIME:
|
||||||
|
m_status=m_status+","+TimeToString(params[i].integer_value);
|
||||||
|
break;
|
||||||
|
case TYPE_FLOAT:
|
||||||
|
case TYPE_DOUBLE:
|
||||||
|
m_status=m_status+","+DoubleToString(params[i].double_value);
|
||||||
|
break;
|
||||||
|
case TYPE_STRING:
|
||||||
|
m_status=m_status+",'"+params[i].string_value+"'";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_status=m_status+") H="+IntegerToString(m_handle);
|
||||||
|
//--- save settings
|
||||||
|
ArrayResize(m_params,num_params);
|
||||||
|
for(i=0;i<num_params;i++)
|
||||||
|
{
|
||||||
|
m_params[i].type =params[i].type;
|
||||||
|
m_params[i].integer_value=params[i].integer_value;
|
||||||
|
m_params[i].double_value =params[i].double_value;
|
||||||
|
m_params[i].string_value =params[i].string_value;
|
||||||
|
}
|
||||||
|
m_num_params=num_params;
|
||||||
|
//--- create buffers
|
||||||
|
for(i=0;i<m_buffers_total;i++)
|
||||||
|
((CIndicatorBuffer*)At(i)).Name("LINE "+IntegerToString(i));
|
||||||
|
//--- ok
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
//--- error
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
@@ -0,0 +1,175 @@
|
|||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Class CiIchimoku. |
|
||||||
|
//| Purpose: Class of the "Ichimoku Kinko Hyo" indicator. |
|
||||||
|
//| Derives from class CIndicator. |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
class CiIchimoku : public CIndicator
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
int m_tenkan_sen;
|
||||||
|
int m_kijun_sen;
|
||||||
|
int m_senkou_span_b;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CiIchimoku(void);
|
||||||
|
~CiIchimoku(void);
|
||||||
|
//--- methods of access to protected data
|
||||||
|
int TenkanSenPeriod(void) const { return (m_tenkan_sen); }
|
||||||
|
int KijunSenPeriod(void) const { return (m_kijun_sen); }
|
||||||
|
int SenkouSpanBPeriod(void) const { return (m_senkou_span_b); }
|
||||||
|
//--- method of creation
|
||||||
|
bool Create(const string symbol, const ENUM_TIMEFRAMES period,
|
||||||
|
const int tenkan_sen, const int kijun_sen, const int senkou_span_b);
|
||||||
|
//--- methods of access to indicator data
|
||||||
|
double TenkanSen(const int index) const;
|
||||||
|
double KijunSen(const int index) const;
|
||||||
|
double SenkouSpanA(const int index) const;
|
||||||
|
double SenkouSpanB(const int index) const;
|
||||||
|
double ChinkouSpan(const int index) const;
|
||||||
|
//--- method of identifying
|
||||||
|
virtual int Type(void) const { return (IND_ICHIMOKU); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//--- methods of tuning
|
||||||
|
virtual bool Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam ¶ms[]);
|
||||||
|
bool Initialize(const string symbol, const ENUM_TIMEFRAMES period,
|
||||||
|
const int tenkan_sen, const int kijun_sen, const int senkou_span_b);
|
||||||
|
};
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Constructor |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
CiIchimoku::CiIchimoku(void) : m_tenkan_sen(-1),
|
||||||
|
m_kijun_sen(-1),
|
||||||
|
m_senkou_span_b(-1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Destructor |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
CiIchimoku::~CiIchimoku(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Create indicator "Ichimoku Kinko Hyo" |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CiIchimoku::Create(const string symbol, const ENUM_TIMEFRAMES period,
|
||||||
|
const int tenkan_sen, const int kijun_sen, const int senkou_span_b)
|
||||||
|
{
|
||||||
|
//--- check history
|
||||||
|
if (!SetSymbolPeriod(symbol, period))
|
||||||
|
return (false);
|
||||||
|
//--- create
|
||||||
|
m_handle = iIchimoku(symbol, period, tenkan_sen, kijun_sen, senkou_span_b);
|
||||||
|
//--- check result
|
||||||
|
if (m_handle == INVALID_HANDLE)
|
||||||
|
return (false);
|
||||||
|
//--- indicator successfully created
|
||||||
|
if (!Initialize(symbol, period, tenkan_sen, kijun_sen, senkou_span_b))
|
||||||
|
{
|
||||||
|
//--- initialization failed
|
||||||
|
IndicatorRelease(m_handle);
|
||||||
|
m_handle = INVALID_HANDLE;
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
//--- ok
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Initialize the indicator with universal parameters |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CiIchimoku::Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam ¶ms[])
|
||||||
|
{
|
||||||
|
return (Initialize(symbol, period, (int)params[0].integer_value, (int)params[1].integer_value, (int)params[2].integer_value));
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Initialize indicator with the special parameters |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CiIchimoku::Initialize(const string symbol, const ENUM_TIMEFRAMES period,
|
||||||
|
const int tenkan_sen, const int kijun_sen, const int senkou_span_b)
|
||||||
|
{
|
||||||
|
if (CreateBuffers(symbol, period, 5))
|
||||||
|
{
|
||||||
|
//--- string of status of drawing
|
||||||
|
m_name = "Ichimoku";
|
||||||
|
m_status = "(" + symbol + "," + PeriodDescription() + "," +
|
||||||
|
IntegerToString(tenkan_sen) + "," + IntegerToString(kijun_sen) + "," +
|
||||||
|
IntegerToString(senkou_span_b) + ") H=" + IntegerToString(m_handle);
|
||||||
|
//--- save settings
|
||||||
|
m_tenkan_sen = tenkan_sen;
|
||||||
|
m_kijun_sen = kijun_sen;
|
||||||
|
m_senkou_span_b = senkou_span_b;
|
||||||
|
//--- create buffers
|
||||||
|
((CIndicatorBuffer *)At(0)).Name("TENKANSEN_LINE");
|
||||||
|
((CIndicatorBuffer *)At(1)).Name("KIJUNSEN_LINE");
|
||||||
|
((CIndicatorBuffer *)At(2)).Name("SENKOUSPANA_LINE");
|
||||||
|
((CIndicatorBuffer *)At(2)).Offset(kijun_sen);
|
||||||
|
((CIndicatorBuffer *)At(3)).Name("SENKOUSPANB_LINE");
|
||||||
|
((CIndicatorBuffer *)At(3)).Offset(kijun_sen);
|
||||||
|
((CIndicatorBuffer *)At(4)).Name("CHIKOUSPAN_LINE");
|
||||||
|
((CIndicatorBuffer *)At(4)).Offset(-kijun_sen);
|
||||||
|
//--- ok
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
//--- error
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Access to TenkanSen buffer of "Ichimoku Kinko Hyo" |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
double CiIchimoku::TenkanSen(const int index) const
|
||||||
|
{
|
||||||
|
CIndicatorBuffer *buffer = At(0);
|
||||||
|
//--- check
|
||||||
|
if (buffer == NULL)
|
||||||
|
return (EMPTY_VALUE);
|
||||||
|
//---
|
||||||
|
return (buffer.At(index));
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Access to KijunSen buffer of "Ichimoku Kinko Hyo" |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
double CiIchimoku::KijunSen(const int index) const
|
||||||
|
{
|
||||||
|
CIndicatorBuffer *buffer = At(1);
|
||||||
|
//--- check
|
||||||
|
if (buffer == NULL)
|
||||||
|
return (EMPTY_VALUE);
|
||||||
|
//---
|
||||||
|
return (buffer.At(index));
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Access to SenkouSpanA buffer of "Ichimoku Kinko Hyo" |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
double CiIchimoku::SenkouSpanA(const int index) const
|
||||||
|
{
|
||||||
|
CIndicatorBuffer *buffer = At(2);
|
||||||
|
//--- check
|
||||||
|
if (buffer == NULL)
|
||||||
|
return (EMPTY_VALUE);
|
||||||
|
//---
|
||||||
|
return (buffer.At(index));
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Access to SenkouSpanB buffer of "Ichimoku Kinko Hyo" |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
double CiIchimoku::SenkouSpanB(const int index) const
|
||||||
|
{
|
||||||
|
CIndicatorBuffer *buffer = At(3);
|
||||||
|
//--- check
|
||||||
|
if (buffer == NULL)
|
||||||
|
return (EMPTY_VALUE);
|
||||||
|
//---
|
||||||
|
return (buffer.At(index));
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Access to ChikouSpan buffer of "Ichimoku Kinko Hyo" |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
double CiIchimoku::ChinkouSpan(const int index) const
|
||||||
|
{
|
||||||
|
CIndicatorBuffer *buffer = At(4);
|
||||||
|
//--- check
|
||||||
|
if (buffer == NULL)
|
||||||
|
return (EMPTY_VALUE);
|
||||||
|
//---
|
||||||
|
return (buffer.At(index));
|
||||||
|
}
|
||||||
@@ -0,0 +1,252 @@
|
|||||||
|
///////////////////////////////////////////////////////
|
||||||
|
// SaherElm IT Center MQL5 Indicator
|
||||||
|
// -------------------------------------------
|
||||||
|
// Name: XMidTest
|
||||||
|
// Description: DONCHAIN Channel ...
|
||||||
|
//
|
||||||
|
// 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 XMidTest Indicator"
|
||||||
|
#property strict
|
||||||
|
|
||||||
|
//
|
||||||
|
// Imports ...
|
||||||
|
#include "../Classes/Indicators/x-saherelm.mid.class.mq5"
|
||||||
|
|
||||||
|
//
|
||||||
|
#define ShortName "XMidTest"
|
||||||
|
|
||||||
|
//
|
||||||
|
#property indicator_chart_window
|
||||||
|
|
||||||
|
//
|
||||||
|
#property indicator_buffers 1
|
||||||
|
#property indicator_plots 1
|
||||||
|
|
||||||
|
//
|
||||||
|
// Variables ...
|
||||||
|
XSCMid *mMid;
|
||||||
|
|
||||||
|
//
|
||||||
|
#property indicator_type1 DRAW_LINE
|
||||||
|
double mainBuffer[];
|
||||||
|
double mainColorBuffer[];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialization ...
|
||||||
|
int OnInit()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Initialize Indicator Class ...
|
||||||
|
bool isInited = InitIndicatorClass();
|
||||||
|
if (!isInited)
|
||||||
|
{
|
||||||
|
return INIT_PARAMETERS_INCORRECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define Index Buffers ...
|
||||||
|
DefineBuffers();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Indicator ShortName ...
|
||||||
|
SetIndicatorName();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Init Succeed ...
|
||||||
|
return INIT_SUCCEEDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// DeInitialization ...
|
||||||
|
void OnDeinit(const int reason)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
|
||||||
|
// REASON_REMOVE 1 Program removed from a chart
|
||||||
|
// REASON_RECOMPILE 2 Program recompiled
|
||||||
|
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
|
||||||
|
// REASON_CHARTCLOSE 4 Chart closed
|
||||||
|
// REASON_PARAMETERS 5 Inputs changed by a user
|
||||||
|
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
|
||||||
|
// REASON_TEMPLATE 7 Another chart template applied
|
||||||
|
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
|
||||||
|
// REASON_CLOSE 9 Terminal closed
|
||||||
|
|
||||||
|
//
|
||||||
|
mMid.DeInit(reason);
|
||||||
|
delete mMid;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculating what we want ...
|
||||||
|
int OnCalculate(
|
||||||
|
const int rates_total, // Total Bars on Chart ...
|
||||||
|
const int prev_calculated, // Total Calculated Bars on Charts ...
|
||||||
|
const datetime &time[], // History of Open Time ...
|
||||||
|
const double &open[], // History of Open Price ...
|
||||||
|
const double &high[], // History of High Price ...
|
||||||
|
const double &low[], // History of Low Price ...
|
||||||
|
const double &close[], // History of Close Price ...
|
||||||
|
const long &tick_volume[], // History of Tick Volumes on Bar ...
|
||||||
|
const long &volume[], // History of Trade Volumes ...
|
||||||
|
const int &spread[] // History of Spread Price ...
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// this counts Available Bars ...
|
||||||
|
int limit;
|
||||||
|
|
||||||
|
//
|
||||||
|
// because in some cases we may have more than one input for
|
||||||
|
// calculation and we must prevent any calculation
|
||||||
|
// untill we pass the biggest input length, here we get max Input length
|
||||||
|
// and then wait until pass it ...
|
||||||
|
int maxLength = mMid.GetInputs().Max();
|
||||||
|
|
||||||
|
//
|
||||||
|
int midCalculatedBars = mMid.GetCalculatedBars();
|
||||||
|
if (midCalculatedBars < 0)
|
||||||
|
{
|
||||||
|
return prev_calculated;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1;
|
||||||
|
|
||||||
|
// //
|
||||||
|
// int midMainCopiedItems = mMid.CopyBufferValueByLine(
|
||||||
|
// XSCMID_MAIN_LINE,
|
||||||
|
// mainBuffer,
|
||||||
|
// 0,
|
||||||
|
// limit //
|
||||||
|
// );
|
||||||
|
// if (midMainCopiedItems <= 0)
|
||||||
|
// {
|
||||||
|
// return prev_calculated;
|
||||||
|
// }
|
||||||
|
|
||||||
|
//
|
||||||
|
// Main Loop ...
|
||||||
|
for (int i = limit - 1; i >= 0 && !IsStopped(); i--)
|
||||||
|
{
|
||||||
|
CalculateBuffers(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return rates_total;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// CUSTOM Functions ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Input Args for Initialization ...
|
||||||
|
bool InitIndicatorClass()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize and Prepare
|
||||||
|
// Inputs of Indicator ...
|
||||||
|
XSCMidInputs inputs;
|
||||||
|
result = inputs.Init();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Instantiate Class ...
|
||||||
|
mMid = new XSCMid(
|
||||||
|
_Symbol,
|
||||||
|
_Period //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Now Initialize Indicator Class using Given Inputs ...
|
||||||
|
result = mMid.Init(
|
||||||
|
inputs //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define Indexes and Styles ...
|
||||||
|
void DefineBuffers()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Start Styling and Indexing Buffers ...
|
||||||
|
|
||||||
|
//
|
||||||
|
string bufferLabel = GetTitle(XSCMID_MAIN_LINE);
|
||||||
|
int mainIDX = mMid.GetBufferIndexByLine(XSCMID_MAIN_LINE);
|
||||||
|
XBuffer mainBufferStruct;
|
||||||
|
mMid.GetBufferByLine(
|
||||||
|
XSCMID_MAIN_LINE,
|
||||||
|
mainBufferStruct //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
int bufferIndex = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
int max = mMid.GetInputs().Max();
|
||||||
|
|
||||||
|
//
|
||||||
|
ArraySetAsSeries(mainBuffer, true);
|
||||||
|
|
||||||
|
//
|
||||||
|
XBufferPlotStyle mainBufferStyle;
|
||||||
|
mainBufferStyle.clr = clrAqua;
|
||||||
|
mainBufferStyle.type = DRAW_LINE;
|
||||||
|
|
||||||
|
//
|
||||||
|
SetIndexBuffer(
|
||||||
|
bufferIndex,
|
||||||
|
mainBuffer,
|
||||||
|
mainBufferStyle,
|
||||||
|
mainColorBuffer,
|
||||||
|
bufferLabel,
|
||||||
|
true,
|
||||||
|
0,
|
||||||
|
max //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Indicator Short Name and also we can define Buffers Labels ...
|
||||||
|
void SetIndicatorName()
|
||||||
|
{
|
||||||
|
IndicatorSetString(INDICATOR_SHORTNAME, ShortName);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void CalculateBuffers(int barIndex)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double iValue = mMid.GetBufferValueByLine(
|
||||||
|
XSCMID_MAIN_LINE,
|
||||||
|
barIndex //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// double iValue = iClose(
|
||||||
|
// _Symbol,
|
||||||
|
// _Period,
|
||||||
|
// barIndex //
|
||||||
|
// );
|
||||||
|
|
||||||
|
mainBuffer[barIndex] = iValue;
|
||||||
|
}
|
||||||
@@ -2930,6 +2930,247 @@ struct XMarketCycle
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Styling Buffers ...
|
||||||
|
|
||||||
|
//
|
||||||
|
struct XBufferPlotStyle
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int width; // Width
|
||||||
|
color clr; // Color
|
||||||
|
uchar arrow; // Arrow Code
|
||||||
|
ENUM_DRAW_TYPE type; // Type
|
||||||
|
ENUM_LINE_STYLE style; // Style
|
||||||
|
|
||||||
|
//
|
||||||
|
// Constructor ...
|
||||||
|
XBufferPlotStyle()
|
||||||
|
{
|
||||||
|
Default();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Tools ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Default ...
|
||||||
|
void Default()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
width = 1;
|
||||||
|
arrow = 0;
|
||||||
|
clr = CLR_NONE;
|
||||||
|
type = DRAW_NONE;
|
||||||
|
style = STYLE_SOLID;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Register a Buffer as Indexed Buffer ...
|
||||||
|
void SetIndexBuffer(
|
||||||
|
int &index, // the Index refrence for Buffer
|
||||||
|
double &buffer[], // Buffer to Set
|
||||||
|
XBufferPlotStyle &style, // Style to Apply to Buffer
|
||||||
|
double &colorBuffer[], // Color Buffer
|
||||||
|
string label = NULL, // Buffer Label
|
||||||
|
bool showData = true, // Show Data on Data Window
|
||||||
|
double empty = -1, // Set 0 or EMPTY_VALUE used for setting Empty Value
|
||||||
|
int drawBegin = -1 // if Set More Than -1 applied
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Set Buffer Index ...
|
||||||
|
SetIndexBuffer(index, buffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Show Date ...
|
||||||
|
PlotIndexSetInteger(index, PLOT_SHOW_DATA, showData);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Buffer Label ...
|
||||||
|
if (IsValid(label))
|
||||||
|
{
|
||||||
|
PlotIndexSetString(index, PLOT_LABEL, label);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (empty == 0 || empty == EMPTY_VALUE)
|
||||||
|
{
|
||||||
|
PlotIndexSetDouble(index, PLOT_EMPTY_VALUE, empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (drawBegin > -1)
|
||||||
|
{
|
||||||
|
PlotIndexSetInteger(index, PLOT_DRAW_BEGIN, drawBegin);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (style.type == DRAW_ARROW)
|
||||||
|
{
|
||||||
|
PlotIndexSetInteger(index, PLOT_ARROW, style.arrow);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
PlotIndexSetInteger(index, PLOT_LINE_STYLE, style.style);
|
||||||
|
PlotIndexSetInteger(index, PLOT_LINE_WIDTH, style.width);
|
||||||
|
|
||||||
|
//
|
||||||
|
string drawTypeStr = EnumToString(style.type);
|
||||||
|
bool hasColorBuffer = Contains("COLOR", drawTypeStr);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!hasColorBuffer)
|
||||||
|
{
|
||||||
|
PlotIndexSetInteger(index, PLOT_LINE_COLOR, style.clr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Since Color Buffers must add as next Index of it's own Buffer
|
||||||
|
// here before applied Color Buffer increase index ...
|
||||||
|
index++;
|
||||||
|
|
||||||
|
//
|
||||||
|
SetIndexBuffer(index, colorBuffer, INDICATOR_COLOR_INDEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Increase Index for Next Buffer ...
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void SetIndexCandleBuffers(
|
||||||
|
int &index, // the Index refrence for Buffer
|
||||||
|
string openLabel, // Open Label
|
||||||
|
double &open[], // Open Buffer
|
||||||
|
string highLabel, // High Label
|
||||||
|
double &high[], // High Buffer
|
||||||
|
string lowLabel, // Low Label
|
||||||
|
double &low[], // Low Buffer
|
||||||
|
string closeLabel, // Close Label
|
||||||
|
double &close[], // Close Buffer
|
||||||
|
bool showData = true, // Show Data on Data Window
|
||||||
|
double empty = -1, // Set 0 or EMPTY_VALUE used for setting Empty Value
|
||||||
|
int drawBegin = -1 // if Set More Than -1 applied
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool hasLabel =
|
||||||
|
//
|
||||||
|
IsValid(openLabel) &&
|
||||||
|
IsValid(highLabel) &&
|
||||||
|
IsValid(lowLabel) &&
|
||||||
|
IsValid(closeLabel)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
string label =
|
||||||
|
!hasLabel
|
||||||
|
? NULL
|
||||||
|
: openLabel + ";" + highLabel + ";" + lowLabel + ";" + closeLabel;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Buffer Index ...
|
||||||
|
SetIndexBuffer(index, open, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Draw Candles Type ...
|
||||||
|
PlotIndexSetInteger(index, PLOT_LINE_STYLE, DRAW_CANDLES);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Show Date ...
|
||||||
|
PlotIndexSetInteger(index, PLOT_SHOW_DATA, showData);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Buffer Label ...
|
||||||
|
if (IsValid(label))
|
||||||
|
{
|
||||||
|
PlotIndexSetString(index, PLOT_LABEL, label);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (empty == 0 || empty == EMPTY_VALUE)
|
||||||
|
{
|
||||||
|
PlotIndexSetDouble(index, PLOT_EMPTY_VALUE, empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (drawBegin > -1)
|
||||||
|
{
|
||||||
|
PlotIndexSetInteger(index, PLOT_DRAW_BEGIN, drawBegin);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
index++;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Buffer Index ...
|
||||||
|
SetIndexBuffer(index, high, INDICATOR_DATA);
|
||||||
|
index++;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Buffer Index ...
|
||||||
|
SetIndexBuffer(index, low, INDICATOR_DATA);
|
||||||
|
index++;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Buffer Index ...
|
||||||
|
SetIndexBuffer(index, close, INDICATOR_DATA);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void SetIndexCandleBuffers(
|
||||||
|
int &index, // the Index refrence for Buffer
|
||||||
|
string openLabel, // Open Label
|
||||||
|
double &open[], // Open Buffer
|
||||||
|
string highLabel, // High Label
|
||||||
|
double &high[], // High Buffer
|
||||||
|
string lowLabel, // Low Label
|
||||||
|
double &low[], // Low Buffer
|
||||||
|
string closeLabel, // Close Label
|
||||||
|
double &close[], // Close Buffer
|
||||||
|
double &colorBuffer[], // Candle Color Buffer
|
||||||
|
bool showData = true, // Show Data on Data Window
|
||||||
|
double empty = -1, // Set 0 or EMPTY_VALUE used for setting Empty Value
|
||||||
|
int drawBegin = -1 // if Set More Than -1 applied
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
SetIndexCandleBuffers(
|
||||||
|
index,
|
||||||
|
openLabel,
|
||||||
|
open,
|
||||||
|
highLabel,
|
||||||
|
high,
|
||||||
|
lowLabel,
|
||||||
|
low,
|
||||||
|
closeLabel,
|
||||||
|
close,
|
||||||
|
showData,
|
||||||
|
empty,
|
||||||
|
drawBegin //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
int mFirstIndex = index - 4;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Draw Candles Type ...
|
||||||
|
PlotIndexSetInteger(mFirstIndex, PLOT_LINE_STYLE, DRAW_COLOR_CANDLES);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Color Buffer ...
|
||||||
|
SetIndexBuffer(index, colorBuffer, INDICATOR_COLOR_INDEX);
|
||||||
|
|
||||||
|
//
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Functions ...
|
// Functions ...
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user