CleanUp Workspace after Backup all Contents Even X121 Setup ...
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,504 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
// SaherElm IT Center MQL5 Indicator
|
||||
// -------------------------------------------
|
||||
// Name: XMGTD
|
||||
// Description: Mega Trend ...
|
||||
//
|
||||
// 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 XMGTD Indicator"
|
||||
#property strict
|
||||
|
||||
//
|
||||
#define ShortName "XMGTD"
|
||||
|
||||
//
|
||||
// Imports ...
|
||||
#include "../Libraries/x-saherelm.common.lib.mq5"
|
||||
|
||||
//
|
||||
// Inputs ...
|
||||
|
||||
//
|
||||
input group "Market";
|
||||
input int length = 14; // Length
|
||||
input double coeff = 2.0; // Coefficient
|
||||
input double multiplier = 3.0; // Multiplier
|
||||
input ENUM_APPLIED_PRICE appliedTo = PRICE_CLOSE; // Applied To
|
||||
|
||||
//
|
||||
input group "Presentation";
|
||||
input bool show = true; // Show
|
||||
input bool showSTR = false; // Show STR
|
||||
input bool showHTD = false; // Show HTR
|
||||
input bool showATSL = false; // Show ATSL
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
|
||||
//
|
||||
#property indicator_chart_window
|
||||
|
||||
//
|
||||
#property indicator_buffers 13
|
||||
#property indicator_plots 6
|
||||
|
||||
//
|
||||
#define mainBufferIndex 0
|
||||
double mainBuffer[];
|
||||
|
||||
//
|
||||
#define mainBufferColorIndex 1
|
||||
double mainBufferColor[];
|
||||
|
||||
//
|
||||
#define hideColorIDX 0
|
||||
#define bullColorIDX 1
|
||||
#define bearColorIDX 2
|
||||
|
||||
//
|
||||
#property indicator_label1 "XMGTD"
|
||||
#property indicator_type1 DRAW_COLOR_LINE
|
||||
#property indicator_color1 CLR_NONE, clrGreen, clrDarkRed
|
||||
#property indicator_style1 STYLE_DOT
|
||||
#property indicator_width1 1
|
||||
|
||||
//
|
||||
#define atslBufferIndex 2
|
||||
#define atslBufferPlotIndex 1
|
||||
double atslBuffer[];
|
||||
|
||||
//
|
||||
#define atslBufferColorIndex 3
|
||||
double atslBufferColor[];
|
||||
|
||||
//
|
||||
#property indicator_label2 "XATSL"
|
||||
#property indicator_type2 DRAW_COLOR_LINE
|
||||
#property indicator_color2 CLR_NONE, clrGreen, clrDarkRed
|
||||
#property indicator_style2 STYLE_DOT
|
||||
#property indicator_width2 1
|
||||
|
||||
//
|
||||
#define htdBufferIndex 4
|
||||
#define htdBufferPlotIndex 2
|
||||
double htdBuffer[];
|
||||
|
||||
//
|
||||
#define htdBufferColorIndex 5
|
||||
double htdBufferColor[];
|
||||
|
||||
//
|
||||
#property indicator_label3 "XHTD"
|
||||
#property indicator_type3 DRAW_COLOR_LINE
|
||||
#property indicator_color3 CLR_NONE, clrGreen, clrDarkRed
|
||||
#property indicator_style3 STYLE_DOT
|
||||
#property indicator_width3 1
|
||||
|
||||
//
|
||||
#define hlBufferIndex 6
|
||||
double hlBuffer[];
|
||||
|
||||
//
|
||||
#define wmaBufferIndex 7
|
||||
double wmaBuffer[];
|
||||
|
||||
//
|
||||
#define tmpBufferIndex 8
|
||||
double tmpBuffer[];
|
||||
|
||||
//
|
||||
#define diffBufferIndex 9
|
||||
double diffBuffer[];
|
||||
|
||||
//
|
||||
#define upBufferIndex 10
|
||||
double upBuffer[];
|
||||
|
||||
//
|
||||
#define downBufferIndex 11
|
||||
double downBuffer[];
|
||||
|
||||
//
|
||||
#define directionBufferIndex 12
|
||||
double directionBuffer[];
|
||||
|
||||
//
|
||||
// Variables ...
|
||||
|
||||
//
|
||||
int maPeriod;
|
||||
double kpi;
|
||||
|
||||
//
|
||||
// Event Handlers ...
|
||||
|
||||
//
|
||||
// Initialization ...
|
||||
int OnInit()
|
||||
{
|
||||
//
|
||||
// Validate Inputs ...
|
||||
if (!ValidateInputs())
|
||||
{
|
||||
return INIT_PARAMETERS_INCORRECT;
|
||||
}
|
||||
|
||||
//
|
||||
maPeriod = int(length < 1 ? 1 : length);
|
||||
double n1 = 2.0 * double(maPeriod - 1);
|
||||
kpi = 2.0 / (n1 + 1);
|
||||
|
||||
//
|
||||
// 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
|
||||
}
|
||||
|
||||
//
|
||||
// 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 ...
|
||||
)
|
||||
{
|
||||
//
|
||||
ArraySetAsSeries(high, true);
|
||||
ArraySetAsSeries(low, true);
|
||||
ArraySetAsSeries(close, true);
|
||||
|
||||
//
|
||||
if (rates_total < maPeriod)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
int limit = rates_total - prev_calculated;
|
||||
if (limit > 1)
|
||||
{
|
||||
//
|
||||
limit = rates_total - 2;
|
||||
|
||||
//
|
||||
ArrayInitialize(atslBuffer, EMPTY_VALUE);
|
||||
ArrayInitialize(hlBuffer, 0);
|
||||
ArrayInitialize(diffBuffer, 0);
|
||||
ArrayInitialize(wmaBuffer, 0);
|
||||
ArrayInitialize(tmpBuffer, 0);
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = limit; i >= 0 && !IsStopped(); i--)
|
||||
{
|
||||
//
|
||||
hlBuffer[i] = high[i] - low[i];
|
||||
|
||||
//
|
||||
double href = 0;
|
||||
double lref = 0;
|
||||
|
||||
//
|
||||
double sma = MAOnArray(hlBuffer, 0, maPeriod, 0, MODE_SMA, i);
|
||||
double hiLo = fmin(hlBuffer[i], sma);
|
||||
|
||||
//
|
||||
href = (low[i] <= high[i + 1] ? high[i] - close[i + 1] : (hlBuffer[i] - close[i + 1] + high[i + 1]) / 2);
|
||||
lref = (high[i] >= low[i + 1] ? close[i + 1] - low[i] : (close[i + 1] - low[i + 1] + hlBuffer[i]) / 2);
|
||||
|
||||
//
|
||||
diffBuffer[i] = fmax(hiLo, fmax(href, lref));
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = limit; i >= 0 && !IsStopped(); i--)
|
||||
{
|
||||
//
|
||||
if (i == rates_total - 2)
|
||||
{
|
||||
wmaBuffer[i] = MAOnArray(diffBuffer, 0, maPeriod, 0, MODE_EMA, i);
|
||||
}
|
||||
else
|
||||
{
|
||||
wmaBuffer[i] = (diffBuffer[i] - wmaBuffer[i + 1]) * kpi + wmaBuffer[i + 1];
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = limit; i >= 0 && !IsStopped(); i--)
|
||||
{
|
||||
//
|
||||
double loss = wmaBuffer[i] * coeff;
|
||||
if (close[i] > tmpBuffer[i + 1] && close[i + 1] > tmpBuffer[i + 1])
|
||||
{
|
||||
//
|
||||
tmpBuffer[i] = fmax(tmpBuffer[i + 1], close[i] - loss);
|
||||
|
||||
//
|
||||
atslBuffer[i] = tmpBuffer[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
if (close[i] < tmpBuffer[i + 1] && close[i + 1] < tmpBuffer[i + 1])
|
||||
{
|
||||
//
|
||||
tmpBuffer[i] = fmin(tmpBuffer[i + 1], close[i] + loss);
|
||||
|
||||
//
|
||||
atslBuffer[i] = tmpBuffer[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
if (close[i] > tmpBuffer[i + 1])
|
||||
{
|
||||
//
|
||||
tmpBuffer[i] = close[i] - loss;
|
||||
|
||||
//
|
||||
atslBuffer[i] = tmpBuffer[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
tmpBuffer[i] = close[i] + loss;
|
||||
|
||||
//
|
||||
atslBuffer[i] = tmpBuffer[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Define Color Buffer ...
|
||||
double clrValue = !showATSL
|
||||
? hideColorIDX
|
||||
: atslBuffer[i] > close[i]
|
||||
? bearColorIDX
|
||||
: bullColorIDX;
|
||||
atslBufferColor[i] = clrValue;
|
||||
}
|
||||
|
||||
//
|
||||
return rates_total;
|
||||
}
|
||||
|
||||
//
|
||||
// Custom Functions ...
|
||||
|
||||
//
|
||||
// Validate Input Args for Initialization ...
|
||||
bool ValidateInputs()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = length >= 2 &&
|
||||
coeff > 0;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Set Indicator Short Name and also we can define Buffers Labels ...
|
||||
void SetIndicatorName()
|
||||
{
|
||||
IndicatorSetString(INDICATOR_SHORTNAME, ShortName);
|
||||
}
|
||||
|
||||
//
|
||||
// Define Indexes and Styles ...
|
||||
|
||||
//
|
||||
void DefineBuffers()
|
||||
{
|
||||
//
|
||||
// Main ...
|
||||
ENUM_DRAW_TYPE mainDrawType = show ? DRAW_COLOR_LINE : DRAW_NONE;
|
||||
|
||||
//
|
||||
ArraySetAsSeries(mainBuffer, true);
|
||||
ArraySetAsSeries(mainBufferColor, true);
|
||||
PlotIndexSetInteger(mainBufferIndex, PLOT_SHOW_DATA, show);
|
||||
SetIndexBuffer(mainBufferIndex, mainBuffer, INDICATOR_DATA);
|
||||
PlotIndexSetInteger(mainBufferIndex, PLOT_DRAW_TYPE, mainDrawType);
|
||||
SetIndexBuffer(mainBufferColorIndex, mainBufferColor, INDICATOR_COLOR_INDEX);
|
||||
|
||||
//
|
||||
// XATSL ...
|
||||
ENUM_DRAW_TYPE atslDrawType = showATSL ? DRAW_COLOR_LINE : DRAW_NONE;
|
||||
|
||||
//
|
||||
ArraySetAsSeries(atslBuffer, true);
|
||||
ArraySetAsSeries(atslBufferColor, true);
|
||||
SetIndexBuffer(atslBufferIndex, atslBuffer, INDICATOR_DATA);
|
||||
SetIndexBuffer(atslBufferColorIndex, atslBufferColor, INDICATOR_COLOR_INDEX);
|
||||
PlotIndexSetInteger(atslBufferPlotIndex, PLOT_SHOW_DATA, showATSL);
|
||||
PlotIndexSetInteger(atslBufferPlotIndex, PLOT_DRAW_TYPE, atslDrawType);
|
||||
|
||||
//
|
||||
// XHTD ...
|
||||
ENUM_DRAW_TYPE htdDrawType = showHTD ? DRAW_COLOR_LINE : DRAW_NONE;
|
||||
|
||||
//
|
||||
SetIndexBuffer(htdBufferIndex, htdBuffer, INDICATOR_DATA);
|
||||
SetIndexBuffer(htdBufferColorIndex, htdBufferColor, INDICATOR_COLOR_INDEX);
|
||||
PlotIndexSetInteger(htdBufferPlotIndex, PLOT_SHOW_DATA, showHTD);
|
||||
PlotIndexSetInteger(htdBufferPlotIndex, PLOT_DRAW_TYPE, htdDrawType);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(hlBuffer, true);
|
||||
SetIndexBuffer(hlBufferIndex, hlBuffer, INDICATOR_CALCULATIONS);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(wmaBuffer, true);
|
||||
SetIndexBuffer(wmaBufferIndex, wmaBuffer, INDICATOR_CALCULATIONS);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(tmpBuffer, true);
|
||||
SetIndexBuffer(tmpBufferIndex, tmpBuffer, INDICATOR_CALCULATIONS);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(diffBuffer, true);
|
||||
SetIndexBuffer(diffBufferIndex, diffBuffer, INDICATOR_CALCULATIONS);
|
||||
|
||||
//
|
||||
SetIndexBuffer(upBufferIndex, upBuffer, INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(downBufferIndex, downBuffer, INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(directionBufferIndex, directionBuffer, INDICATOR_CALCULATIONS);
|
||||
}
|
||||
|
||||
//
|
||||
// Hull Handler ...
|
||||
double workHull[][2];
|
||||
double iHull(
|
||||
double price,
|
||||
double period,
|
||||
int r,
|
||||
int bars,
|
||||
int instanceNo = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (ArrayRange(workHull, 0) != bars)
|
||||
{
|
||||
ArrayResize(workHull, bars);
|
||||
}
|
||||
|
||||
//
|
||||
int HmaPeriod = (int)MathMax(period, 2);
|
||||
int HalfPeriod = (int)MathFloor(HmaPeriod / 2);
|
||||
int HullPeriod = (int)MathFloor(MathSqrt(HmaPeriod));
|
||||
double hma, hmw, weight;
|
||||
instanceNo *= 2;
|
||||
|
||||
//
|
||||
workHull[r][instanceNo] = price;
|
||||
|
||||
//
|
||||
hmw = HalfPeriod;
|
||||
hma = hmw * price;
|
||||
for (int k = 1; k < HalfPeriod && (r - k) >= 0; k++)
|
||||
{
|
||||
//
|
||||
weight = HalfPeriod - k;
|
||||
hmw += weight;
|
||||
hma += weight * workHull[r - k][instanceNo];
|
||||
}
|
||||
workHull[r][instanceNo + 1] = 2.0 * hma / hmw;
|
||||
|
||||
//
|
||||
hmw = HmaPeriod;
|
||||
hma = hmw * price;
|
||||
for (int k = 1; k < period && (r - k) >= 0; k++)
|
||||
{
|
||||
//
|
||||
weight = HmaPeriod - k;
|
||||
hmw += weight;
|
||||
hma += weight * workHull[r - k][instanceNo];
|
||||
}
|
||||
workHull[r][instanceNo + 1] -= hma / hmw;
|
||||
|
||||
//
|
||||
hmw = HullPeriod;
|
||||
hma = hmw * workHull[r][instanceNo + 1];
|
||||
for (int k = 1; k < HullPeriod && (r - k) >= 0; k++)
|
||||
{
|
||||
//
|
||||
weight = HullPeriod - k;
|
||||
hmw += weight;
|
||||
hma += weight * workHull[r - k][1 + instanceNo];
|
||||
}
|
||||
|
||||
//
|
||||
return (hma / hmw);
|
||||
}
|
||||
|
||||
//
|
||||
double getPrice(ENUM_APPLIED_PRICE price, const double &open[], const double &close[], const double &high[], const double &low[], int i, int bars)
|
||||
{
|
||||
switch (price)
|
||||
{
|
||||
case PRICE_CLOSE:
|
||||
return (close[i]);
|
||||
case PRICE_OPEN:
|
||||
return (open[i]);
|
||||
case PRICE_HIGH:
|
||||
return (high[i]);
|
||||
case PRICE_LOW:
|
||||
return (low[i]);
|
||||
case PRICE_MEDIAN:
|
||||
return ((high[i] + low[i]) / 2.0);
|
||||
case PRICE_TYPICAL:
|
||||
return ((high[i] + low[i] + close[i]) / 3.0);
|
||||
case PRICE_WEIGHTED:
|
||||
return ((high[i] + low[i] + close[i] + close[i]) / 4.0);
|
||||
// case PRICE_AVERAGE: return((high[i]+low[i]+close[i]+open[i])/4.0);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
//
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,444 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XSCXEMRNGStrategy
|
||||
// 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 "../Helpers/x-saherelm.xtm.helper.mq5"
|
||||
#include "../Helpers/x-saherelm.xstr.helper.mq5"
|
||||
#include "../Classes/x-saherelm.xstrategy.class.mq5"
|
||||
|
||||
//
|
||||
string XEMRNGStartegyToken = "XEMRNG";
|
||||
|
||||
//
|
||||
class XSCXEMRNGStrategy : public XSCBaseStrategy
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Constructor(s) ...
|
||||
void XSCXEMRNGStrategy(
|
||||
//
|
||||
// Base ...
|
||||
string _symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES _period, // Trading TimeFrame
|
||||
double _volume, // Voluem
|
||||
double _r2r, // Risk/Reward Ratio
|
||||
int _slippage, // Trader Slippage
|
||||
long _magicNumber, // Trader Magic Number
|
||||
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
|
||||
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
|
||||
double _tpPoint = 0, // TP As Point
|
||||
double _slPoint = 0, // SL As Point
|
||||
bool _allowLong = true,
|
||||
bool _allowShort = true,
|
||||
int _maxAllowedLongs = 0,
|
||||
int _maxAllowedShorts = 0 //
|
||||
) : XSCBaseStrategy(_symbol,
|
||||
_period,
|
||||
_volume,
|
||||
_r2r,
|
||||
_slippage,
|
||||
_magicNumber,
|
||||
_useTPSLAsPoint,
|
||||
_forceMaxTPSLAsPoint,
|
||||
_tpPoint,
|
||||
_slPoint,
|
||||
_allowLong,
|
||||
_allowShort,
|
||||
_maxAllowedLongs,
|
||||
_maxAllowedShorts //
|
||||
)
|
||||
{
|
||||
//
|
||||
ConfigureRequirements();
|
||||
|
||||
//
|
||||
SetAlertPrefix(GetTag());
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
void ~XSCXEMRNGStrategy()
|
||||
{
|
||||
delete mTMHelper;
|
||||
delete mSTRHelper;
|
||||
}
|
||||
|
||||
//
|
||||
// Getter / Setter (s) ...
|
||||
|
||||
//
|
||||
// Overrides ...
|
||||
|
||||
//
|
||||
// Customize Strategy Identifier ...
|
||||
string GetTag() override
|
||||
{
|
||||
return XEMRNGStartegyToken;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Conditions For Signal ...
|
||||
bool HasSignal(
|
||||
XSignal &signal //
|
||||
) override
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
signal.Clean();
|
||||
|
||||
//
|
||||
double sl = 0;
|
||||
double tp = 0;
|
||||
double risk = 0;
|
||||
double entry = 0;
|
||||
double reward = 0;
|
||||
double r2r = R2R();
|
||||
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
|
||||
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
|
||||
|
||||
//
|
||||
int start = 0;
|
||||
int count = 5;
|
||||
|
||||
//
|
||||
double tms[];
|
||||
ArraySetAsSeries(tms, true);
|
||||
mTMHelper.CopyMain(
|
||||
start,
|
||||
count,
|
||||
tms //
|
||||
);
|
||||
|
||||
//
|
||||
XSTRConditions strConditions;
|
||||
result = mSTRHelper.GetConditions(
|
||||
strConditions,
|
||||
start,
|
||||
count //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
1 //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double hh5 = cBar.FindHighest(
|
||||
5,
|
||||
MODE_HIGH //
|
||||
);
|
||||
double ll5 = cBar.FindLowest(
|
||||
5,
|
||||
MODE_LOW //
|
||||
);
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
result = cBar.GetPreviousBar(pBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool hasLong = false;
|
||||
bool hasShort = false;
|
||||
|
||||
//
|
||||
XOHCL tmpHSW[];
|
||||
XOHCL tmpLSW[];
|
||||
|
||||
//
|
||||
bool useHammer = true;
|
||||
bool useMorningStar = false;
|
||||
bool useBullishEngulfing = true;
|
||||
bool useBullishMaurubozu = true;
|
||||
|
||||
//
|
||||
bool useShootingStar = true;
|
||||
bool useEveningStar = false;
|
||||
bool useBearishEngulfing = true;
|
||||
bool useBearishMaurubozu = true;
|
||||
|
||||
//
|
||||
// Long ...
|
||||
|
||||
//
|
||||
bool isHammer = !useHammer
|
||||
? false
|
||||
: cBar.IsHammer();
|
||||
bool isMorningStar = !useMorningStar
|
||||
? false
|
||||
: cBar.IsMorningStar();
|
||||
bool isBullishMarubozu = !useBullishEngulfing
|
||||
? false
|
||||
: cBar.IsBullishMarubozu();
|
||||
bool isBullishEngulfing = !useBullishMaurubozu
|
||||
? false
|
||||
: cBar.IsBullishEngulfing();
|
||||
|
||||
//
|
||||
bool isBullishTrend = cBar.HasBullishTrend(
|
||||
tmpHSW,
|
||||
tmpLSW,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
// Find Swing Low Above of EMA ...
|
||||
// Find Swing High Above of EMA ...
|
||||
// Fins Swing Low Below of EMA ...
|
||||
// Detect Bullish Pattern ...
|
||||
hasLong =
|
||||
//
|
||||
cBar.IsBullish()
|
||||
//
|
||||
&&
|
||||
//
|
||||
isBullishTrend
|
||||
//
|
||||
&&
|
||||
//
|
||||
cBar.close > tms[1]
|
||||
//
|
||||
&&
|
||||
//
|
||||
ll5 < tms[1]
|
||||
//
|
||||
&&
|
||||
//
|
||||
strConditions.isTrendSwitchedToBullish
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
isHammer
|
||||
//
|
||||
||
|
||||
//
|
||||
isMorningStar
|
||||
//
|
||||
||
|
||||
//
|
||||
isBullishMarubozu
|
||||
//
|
||||
||
|
||||
//
|
||||
isBullishEngulfing
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
if (hasLong)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_BUY;
|
||||
|
||||
//
|
||||
sl = tmpLSW[ArraySize(tmpLSW) - 1].low;
|
||||
}
|
||||
|
||||
//
|
||||
// Short ...
|
||||
bool isShootingStar = !useShootingStar
|
||||
? false
|
||||
: cBar.IsShootingStar();
|
||||
bool isEveningStar = !useEveningStar
|
||||
? false
|
||||
: cBar.IsEveningStar();
|
||||
bool isBearishEngulfing = !useBearishEngulfing
|
||||
? false
|
||||
: cBar.IsBearishEngulfing();
|
||||
bool isBearishMaurubozu = !useBearishMaurubozu
|
||||
? false
|
||||
: cBar.IsBearishMarubozu();
|
||||
|
||||
//
|
||||
bool isBearishTrend = cBar.HasBearishTrend(
|
||||
tmpHSW,
|
||||
tmpLSW,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
hasShort =
|
||||
//
|
||||
cBar.IsBearish()
|
||||
//
|
||||
&&
|
||||
//
|
||||
isBearishTrend
|
||||
//
|
||||
&&
|
||||
//
|
||||
cBar.close < tms[1]
|
||||
//
|
||||
&&
|
||||
//
|
||||
hh5 > tms[1]
|
||||
//
|
||||
&&
|
||||
//
|
||||
strConditions.isTrendSwitchedToBearish
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
isShootingStar
|
||||
//
|
||||
||
|
||||
//
|
||||
isEveningStar
|
||||
//
|
||||
||
|
||||
//
|
||||
isBearishEngulfing
|
||||
//
|
||||
||
|
||||
//
|
||||
isBearishMaurubozu
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
if (hasShort)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_SELL;
|
||||
|
||||
//
|
||||
sl = tmpHSW[ArraySize(tmpHSW) - 1].high;
|
||||
}
|
||||
|
||||
//
|
||||
result = hasLong || hasShort;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
entry = GetEntry(mSymbol, type);
|
||||
CalculateTPSLByPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
|
||||
//
|
||||
result = signal.Prepare(
|
||||
mSymbol,
|
||||
GetTag(),
|
||||
mPeriod,
|
||||
type,
|
||||
mode,
|
||||
entry,
|
||||
mVolume,
|
||||
sl,
|
||||
tp //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
XTMInputs mTMInputs; // Tren Magic Inputs ...
|
||||
XSCXTMHelper *mTMHelper; // Trend Magic Helper Class ...
|
||||
|
||||
//
|
||||
XSTRInputs mSTRInputs; // Super Trend Inputs ...
|
||||
XSCXSTRHelper *mSTRHelper; // Super Trend Helper Class ...
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
|
||||
//
|
||||
// Set Default TM Inputs ...
|
||||
void ConfigureRequirements()
|
||||
{
|
||||
//
|
||||
mTMInputs.maShift = 0;
|
||||
mTMInputs.maPeriod = 100;
|
||||
mTMInputs.maMethod = MODE_EMA;
|
||||
mTMInputs.maAppliedTo = PRICE_CLOSE;
|
||||
|
||||
//
|
||||
mTMInputs.showLine = true;
|
||||
|
||||
//
|
||||
mTMHelper = new XSCXTMHelper();
|
||||
|
||||
//
|
||||
mTMHelper.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
mTMInputs //
|
||||
);
|
||||
|
||||
//
|
||||
mSTRInputs.length = 14;
|
||||
mSTRInputs.multiplier = 3.5;
|
||||
mSTRInputs.appliedTo = PRICE_CLOSE;
|
||||
|
||||
//
|
||||
mSTRInputs.showTrends = true;
|
||||
mSTRInputs.fillTrends = false;
|
||||
|
||||
//
|
||||
mSTRHelper = new XSCXSTRHelper();
|
||||
mSTRHelper.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
mSTRInputs //
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
@@ -1,823 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XSCXOBVGStrategy
|
||||
// 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 "../Helpers/x-saherelm.xosc.helper.mq5"
|
||||
#include "../Classes/x-saherelm.xstrategy.class.mq5"
|
||||
|
||||
//
|
||||
string XOBVGStartegyToken = "XOBVG";
|
||||
|
||||
//
|
||||
class XSCXOBVGStrategy : public XSCBaseStrategy
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Constructor(s) ...
|
||||
void XSCXOBVGStrategy(
|
||||
//
|
||||
// Base ...
|
||||
string _symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES _period, // Trading TimeFrame
|
||||
ENUM_TIMEFRAMES _analyzingPeriod, // Analyzing Period
|
||||
double _volume, // Voluem
|
||||
double _r2r, // Risk/Reward Ratio
|
||||
int _slippage, // Trader Slippage
|
||||
long _magicNumber, // Trader Magic Number
|
||||
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
|
||||
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
|
||||
double _tpPoint = 0, // TP As Point
|
||||
double _slPoint = 0, // SL As Point
|
||||
bool _allowLong = true,
|
||||
bool _allowShort = true,
|
||||
int _maxAllowedLongs = 0,
|
||||
int _maxAllowedShorts = 0 //
|
||||
) : XSCBaseStrategy(_symbol,
|
||||
_period,
|
||||
_volume,
|
||||
_r2r,
|
||||
_slippage,
|
||||
_magicNumber,
|
||||
_useTPSLAsPoint,
|
||||
_forceMaxTPSLAsPoint,
|
||||
_tpPoint,
|
||||
_slPoint,
|
||||
_allowLong,
|
||||
_allowShort,
|
||||
_maxAllowedLongs,
|
||||
_maxAllowedShorts //
|
||||
)
|
||||
{
|
||||
//
|
||||
mAnalyzingPeriod = _analyzingPeriod;
|
||||
|
||||
//
|
||||
SetAlertPrefix(GetTag());
|
||||
|
||||
//
|
||||
PrepareRequirements();
|
||||
|
||||
//
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
isFVGTouched = false;
|
||||
|
||||
//
|
||||
oBar.Clean();
|
||||
oBullishOrderBlock.Clean();
|
||||
oBearishOrderBlock.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
void ~XSCXOBVGStrategy()
|
||||
{
|
||||
delete oscHelper;
|
||||
}
|
||||
|
||||
//
|
||||
// Getter / Setter (s) ...
|
||||
|
||||
//
|
||||
ENUM_TIMEFRAMES AnalyzingPeriod()
|
||||
{
|
||||
return mAnalyzingPeriod;
|
||||
}
|
||||
|
||||
//
|
||||
void AnalyzingPeriod(ENUM_TIMEFRAMES value)
|
||||
{
|
||||
mAnalyzingPeriod = value;
|
||||
}
|
||||
|
||||
//
|
||||
// Overrides ...
|
||||
|
||||
//
|
||||
// Customize Strategy Identifier ...
|
||||
string GetTag() override
|
||||
{
|
||||
return XOBVGStartegyToken;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Conditions For Signal ...
|
||||
bool HasSignal(
|
||||
XSignal &signal //
|
||||
) override
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
signal.Clean();
|
||||
|
||||
//
|
||||
double sl = 0;
|
||||
double tp = 0;
|
||||
double risk = 0;
|
||||
double entry = 0;
|
||||
double reward = 0;
|
||||
double r2r = R2R();
|
||||
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
|
||||
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
|
||||
|
||||
//
|
||||
bool hasLong = false;
|
||||
bool hasShort = false;
|
||||
|
||||
//
|
||||
// For Trend ...
|
||||
XOHCL tmpHSW[];
|
||||
XOHCL tmpLSW[];
|
||||
|
||||
//
|
||||
// For Verifications ...
|
||||
|
||||
//
|
||||
bool useHammer = true;
|
||||
bool useMorningStar = false;
|
||||
bool useBullishEngulfing = true;
|
||||
bool useBullishMaurubozu = true;
|
||||
|
||||
//
|
||||
bool useShootingStar = true;
|
||||
bool useEveningStar = false;
|
||||
bool useBearishEngulfing = true;
|
||||
bool useBearishMaurubozu = true;
|
||||
|
||||
//
|
||||
// Bar On Trading Period ...
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
1 //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// 3 Bar LL and HH ...
|
||||
double ll3 = cBar.FindLowest(
|
||||
3,
|
||||
MODE_LOW //
|
||||
);
|
||||
double hh3 = cBar.FindHighest(
|
||||
3,
|
||||
MODE_HIGH //
|
||||
);
|
||||
|
||||
//
|
||||
double atr = oscHelper.GetATR(1);
|
||||
|
||||
//
|
||||
// Check OB Finder Bar ...
|
||||
result = oBar.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
// Init OB Finder Bar ...
|
||||
result = oBar.Init(
|
||||
mSymbol,
|
||||
mAnalyzingPeriod,
|
||||
1 //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
bool hasBullishOrderBlock = oBullishOrderBlock.IsValid();
|
||||
bool hasBearishOrderBlock = oBearishOrderBlock.IsValid();
|
||||
|
||||
//
|
||||
// Here we Have to Check Order Block Age ...
|
||||
|
||||
//
|
||||
if (hasBullishOrderBlock)
|
||||
{
|
||||
//
|
||||
int age = oBullishOrderBlock.Index();
|
||||
result = age <= 26;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
oBar.Clean();
|
||||
oBullishOrderBlock.Clean();
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
fvgTouchDate = NULL;
|
||||
isFVGTouched = false;
|
||||
|
||||
//
|
||||
RemoveDraws();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (hasBearishOrderBlock)
|
||||
{
|
||||
//
|
||||
int age = oBearishOrderBlock.Index();
|
||||
result = age <= 26;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
oBar.Clean();
|
||||
oBearishOrderBlock.Clean();
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
fvgTouchDate = NULL;
|
||||
isFVGTouched = false;
|
||||
|
||||
//
|
||||
RemoveDraws();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
hasBullishOrderBlock = oBullishOrderBlock.IsValid();
|
||||
hasBearishOrderBlock = oBearishOrderBlock.IsValid();
|
||||
result =
|
||||
//
|
||||
hasBullishOrderBlock
|
||||
//
|
||||
||
|
||||
//
|
||||
hasBearishOrderBlock
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
// Detect Order Blocks ...
|
||||
hasBullishOrderBlock = oBar.HasBullishOrderBlock(oBullishOrderBlock);
|
||||
hasBearishOrderBlock = oBar.HasBearishOrderBlock(oBearishOrderBlock);
|
||||
|
||||
//
|
||||
// Check OB Detected ...
|
||||
result =
|
||||
//
|
||||
hasBullishOrderBlock
|
||||
//
|
||||
||
|
||||
//
|
||||
hasBearishOrderBlock
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
oBar.Clean();
|
||||
oBullishOrderBlock.Clean();
|
||||
oBearishOrderBlock.Clean();
|
||||
|
||||
//
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
fvgTouchDate = NULL;
|
||||
isFVGTouched = false;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Long ...
|
||||
if (hasBullishOrderBlock)
|
||||
{
|
||||
//
|
||||
DrawBullishOrderBlock(
|
||||
oBullishOrderBlock,
|
||||
ChartID() //
|
||||
);
|
||||
|
||||
//
|
||||
// Detect an FVG Inside Order Block in Trading Period ...
|
||||
result = FindBullishFVGInsideOrderBlock();
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
oBar.Clean();
|
||||
oBullishOrderBlock.Clean();
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
fvgTouchDate = NULL;
|
||||
isFVGTouched = false;
|
||||
|
||||
//
|
||||
RemoveDraws();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Now We Have to Waits Until Price reached the FVG ...
|
||||
if (!isFVGTouched)
|
||||
{
|
||||
//
|
||||
isFVGTouched = ll3 < fvgUpper;
|
||||
fvgTouchDate = TimeCurrent();
|
||||
}
|
||||
|
||||
//
|
||||
result = isFVGTouched;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Now we Have to Wait for Pressure ...
|
||||
|
||||
//
|
||||
bool isHammer = !useHammer
|
||||
? false
|
||||
: cBar.IsHammer();
|
||||
bool isMorningStar = !useMorningStar
|
||||
? false
|
||||
: cBar.IsMorningStar();
|
||||
bool isBullishMarubozu = !useBullishEngulfing
|
||||
? false
|
||||
: cBar.IsBullishMarubozu();
|
||||
bool isBullishEngulfing = !useBullishMaurubozu
|
||||
? false
|
||||
: cBar.IsBullishEngulfing();
|
||||
|
||||
//
|
||||
bool isBullishTrend = oBar.HasBullishTrend(
|
||||
tmpHSW,
|
||||
tmpLSW,
|
||||
false //
|
||||
);
|
||||
|
||||
//
|
||||
hasLong =
|
||||
//
|
||||
true // isBullishTrend
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
isHammer
|
||||
//
|
||||
||
|
||||
//
|
||||
isMorningStar
|
||||
//
|
||||
||
|
||||
//
|
||||
isBullishMarubozu
|
||||
//
|
||||
||
|
||||
//
|
||||
isBullishEngulfing
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
result = hasLong;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
// Check FVG Touch Date ...
|
||||
int cTimeSec = (int)TimeCurrent();
|
||||
int tTimeSec = (int)fvgTouchDate;
|
||||
int periodSec = PeriodSeconds(mPeriod);
|
||||
int touchAge = (cTimeSec - tTimeSec) / periodSec;
|
||||
if (touchAge >= 10)
|
||||
{
|
||||
//
|
||||
oBar.Clean();
|
||||
oBullishOrderBlock.Clean();
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
fvgTouchDate = NULL;
|
||||
isFVGTouched = false;
|
||||
|
||||
//
|
||||
RemoveDraws();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
type = POSITION_TYPE_BUY;
|
||||
sl = cBar.low - atr;
|
||||
}
|
||||
|
||||
//
|
||||
// Short ...
|
||||
if (hasBearishOrderBlock)
|
||||
{
|
||||
//
|
||||
DrawBearishOrderBlock(
|
||||
oBearishOrderBlock,
|
||||
ChartID() //
|
||||
);
|
||||
|
||||
//
|
||||
// Detect an FVG Inside Order Block in Trading Period ...
|
||||
result = FindBearishFVGInsideOrderBlock();
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
oBar.Clean();
|
||||
oBearishOrderBlock.Clean();
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
fvgTouchDate = NULL;
|
||||
isFVGTouched = false;
|
||||
|
||||
//
|
||||
RemoveDraws();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Now We Have to Waits Until Price reached the FVG ...
|
||||
if (!isFVGTouched)
|
||||
{
|
||||
//
|
||||
isFVGTouched = hh3 > fvgLower;
|
||||
fvgTouchDate = TimeCurrent();
|
||||
}
|
||||
|
||||
//
|
||||
result = isFVGTouched;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Now we Have to Wait for Pressure ...
|
||||
|
||||
//
|
||||
// Short ...
|
||||
bool isShootingStar = !useShootingStar
|
||||
? false
|
||||
: cBar.IsShootingStar();
|
||||
bool isEveningStar = !useEveningStar
|
||||
? false
|
||||
: cBar.IsEveningStar();
|
||||
bool isBearishEngulfing = !useBearishEngulfing
|
||||
? false
|
||||
: cBar.IsBearishEngulfing();
|
||||
bool isBearishMaurubozu = !useBearishMaurubozu
|
||||
? false
|
||||
: cBar.IsBearishMarubozu();
|
||||
|
||||
//
|
||||
bool isBearishTrend = oBar.HasBearishTrend(
|
||||
tmpHSW,
|
||||
tmpLSW,
|
||||
false //
|
||||
);
|
||||
|
||||
//
|
||||
hasShort =
|
||||
//
|
||||
true // isBearishTrend
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
isShootingStar
|
||||
//
|
||||
||
|
||||
//
|
||||
isEveningStar
|
||||
//
|
||||
||
|
||||
//
|
||||
isBearishEngulfing
|
||||
//
|
||||
||
|
||||
//
|
||||
isBearishMaurubozu
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
result = hasShort;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
// Check FVG Touch Date ...
|
||||
int cTimeSec = (int)TimeCurrent();
|
||||
int tTimeSec = (int)fvgTouchDate;
|
||||
int periodSec = PeriodSeconds(mPeriod);
|
||||
int touchAge = (cTimeSec - tTimeSec) / periodSec;
|
||||
if (touchAge >= 10)
|
||||
{
|
||||
//
|
||||
oBar.Clean();
|
||||
oBearishOrderBlock.Clean();
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
fvgTouchDate = NULL;
|
||||
isFVGTouched = false;
|
||||
|
||||
//
|
||||
RemoveDraws();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
type = POSITION_TYPE_SELL;
|
||||
sl = cBar.high + atr;
|
||||
}
|
||||
|
||||
//
|
||||
result = hasLong || hasShort;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
entry = GetEntry(mSymbol, type);
|
||||
CalculateTPSLByPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
|
||||
//
|
||||
result = signal.Prepare(
|
||||
mSymbol,
|
||||
GetTag(),
|
||||
mPeriod,
|
||||
type,
|
||||
mode,
|
||||
entry,
|
||||
mVolume,
|
||||
sl,
|
||||
tp //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
ENUM_TIMEFRAMES mAnalyzingPeriod; // Analyzing Period
|
||||
|
||||
//
|
||||
XOSCInputs oscInputs;
|
||||
XSCXOSCHelper *oscHelper;
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
XOHCL oBar;
|
||||
XOHCL oBullishOrderBlock;
|
||||
XOHCL oBearishOrderBlock;
|
||||
|
||||
//
|
||||
double fvgUpper;
|
||||
double fvgLower;
|
||||
bool isFVGTouched;
|
||||
datetime fvgTouchDate;
|
||||
|
||||
//
|
||||
void PrepareRequirements()
|
||||
{
|
||||
//
|
||||
oscInputs.Default();
|
||||
oscHelper = new XSCXOSCHelper();
|
||||
oscHelper.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
oscInputs //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
bool FindBullishFVGInsideOrderBlock()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = oBullishOrderBlock.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int totalBars = iBars(
|
||||
mSymbol,
|
||||
mPeriod //
|
||||
);
|
||||
int maxAllowed = totalBars / 10;
|
||||
|
||||
//
|
||||
for (int i = 0; i < maxAllowed; i++)
|
||||
{
|
||||
//
|
||||
XOHCL iBar;
|
||||
result = iBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
i //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
result = iBar.HasBullishFVG(
|
||||
fvgUpper,
|
||||
fvgLower //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// Check FVG has Correlation by OB ...
|
||||
result =
|
||||
//
|
||||
// Full Inside ...
|
||||
(fvgUpper <= oBullishOrderBlock.high &&
|
||||
fvgLower >= oBullishOrderBlock.low)
|
||||
//
|
||||
||
|
||||
//
|
||||
(fvgUpper > oBullishOrderBlock.high &&
|
||||
fvgLower >= oBullishOrderBlock.low &&
|
||||
fvgLower <= oBullishOrderBlock.high)
|
||||
//
|
||||
||
|
||||
//
|
||||
(fvgUpper > oBullishOrderBlock.low &&
|
||||
fvgUpper <= oBullishOrderBlock.high &&
|
||||
fvgLower < oBullishOrderBlock.low)
|
||||
//
|
||||
;
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
DrawBullishFVG(
|
||||
iBar,
|
||||
fvgUpper,
|
||||
fvgLower,
|
||||
ChartID() //
|
||||
);
|
||||
|
||||
//
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool FindBearishFVGInsideOrderBlock()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = oBearishOrderBlock.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int totalBars = iBars(
|
||||
mSymbol,
|
||||
mPeriod //
|
||||
);
|
||||
int maxAllowed = totalBars / 10;
|
||||
|
||||
//
|
||||
for (int i = 0; i < maxAllowed; i++)
|
||||
{
|
||||
//
|
||||
XOHCL iBar;
|
||||
result = iBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
i //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
result = iBar.HasBearishFVG(
|
||||
fvgUpper,
|
||||
fvgLower //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// Check FVG has Correlation by OB ...
|
||||
result =
|
||||
//
|
||||
// Full Inside ...
|
||||
(fvgUpper <= oBearishOrderBlock.high &&
|
||||
fvgLower >= oBearishOrderBlock.low)
|
||||
//
|
||||
||
|
||||
//
|
||||
(fvgUpper > oBearishOrderBlock.high &&
|
||||
fvgLower >= oBearishOrderBlock.low &&
|
||||
fvgLower <= oBearishOrderBlock.high)
|
||||
//
|
||||
||
|
||||
//
|
||||
(fvgUpper > oBearishOrderBlock.low &&
|
||||
fvgUpper <= oBearishOrderBlock.high &&
|
||||
fvgLower < oBearishOrderBlock.low)
|
||||
//
|
||||
;
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
DrawBearishFVG(
|
||||
iBar,
|
||||
fvgUpper,
|
||||
fvgLower,
|
||||
ChartID() //
|
||||
);
|
||||
|
||||
//
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
@@ -1,742 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XSCXPVFMCStrategy
|
||||
// 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 "../Helpers/x-saherelm.xhk.helper.mq5"
|
||||
#include "../Helpers/x-saherelm.xmc.helper.mq5"
|
||||
#include "../Helpers/x-saherelm.xtd.helper.mq5"
|
||||
#include "../Helpers/x-saherelm.xpv.helper.mq5"
|
||||
#include "../Helpers/x-saherelm.xvlm.helper.mq5"
|
||||
#include "../Helpers/x-saherelm.xosc.helper.mq5"
|
||||
#include "../Classes/x-saherelm.xstrategy.class.mq5"
|
||||
|
||||
//
|
||||
string XPVFMCStartegyToken = "XPVFMC";
|
||||
|
||||
//
|
||||
class XSCXPVFMCStrategy : public XSCBaseStrategy
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Constructor(s) ...
|
||||
void XSCXPVFMCStrategy(
|
||||
//
|
||||
// Base ...
|
||||
string _symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES _period, // Trading TimeFrame
|
||||
double _volume, // Voluem
|
||||
double _r2r, // Risk/Reward Ratio
|
||||
int _slippage, // Trader Slippage
|
||||
long _magicNumber, // Trader Magic Number
|
||||
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
|
||||
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
|
||||
double _tpPoint = 0, // TP As Point
|
||||
double _slPoint = 0, // SL As Point
|
||||
bool _allowLong = true,
|
||||
bool _allowShort = true,
|
||||
int _maxAllowedLongs = 0,
|
||||
int _maxAllowedShorts = 0 //
|
||||
) : XSCBaseStrategy(_symbol,
|
||||
_period,
|
||||
_volume,
|
||||
_r2r,
|
||||
_slippage,
|
||||
_magicNumber,
|
||||
_useTPSLAsPoint,
|
||||
_forceMaxTPSLAsPoint,
|
||||
_tpPoint,
|
||||
_slPoint,
|
||||
_allowLong,
|
||||
_allowShort,
|
||||
_maxAllowedLongs,
|
||||
_maxAllowedShorts //
|
||||
)
|
||||
{
|
||||
//
|
||||
SetAlertPrefix(GetTag());
|
||||
|
||||
//
|
||||
PrepareRequirements();
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
void ~XSCXPVFMCStrategy()
|
||||
{
|
||||
//
|
||||
delete mcHelper;
|
||||
delete pvHelper;
|
||||
delete tdHelper;
|
||||
delete hkHelper;
|
||||
delete oscHelper;
|
||||
delete vlmHelper;
|
||||
}
|
||||
|
||||
//
|
||||
// Getter / Setter (s) ...
|
||||
|
||||
//
|
||||
// Overrides ...
|
||||
|
||||
//
|
||||
// Customize Strategy Identifier ...
|
||||
string GetTag() override
|
||||
{
|
||||
return XPVFMCStartegyToken;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Conditions For Signal ...
|
||||
bool HasSignal(
|
||||
XSignal &signal //
|
||||
) override
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
signal.Clean();
|
||||
|
||||
//
|
||||
double sl = 0;
|
||||
double tp = 0;
|
||||
double risk = 0;
|
||||
double entry = 0;
|
||||
double reward = 0;
|
||||
double r2r = R2R();
|
||||
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
|
||||
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
|
||||
|
||||
//
|
||||
bool hasLong = false;
|
||||
bool hasShort = false;
|
||||
|
||||
//
|
||||
// XMC ...
|
||||
XMCConditions mcConditions;
|
||||
result = mcHelper.GetConditions(mcConditions);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XPV ...
|
||||
XPVConditions pvConditions;
|
||||
result = pvHelper.GetConditions(pvConditions);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XTD ...
|
||||
XTDConditions tdConditions;
|
||||
result = tdHelper.GetConditions(tdConditions);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XHK ...
|
||||
XHKConditions hkConditions;
|
||||
result = hkHelper.GetConditions(hkConditions);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XVLM ...
|
||||
XVLMConditions vlmConditions;
|
||||
result = vlmHelper.GetConditions(vlmConditions);
|
||||
|
||||
//
|
||||
double atr = oscHelper.GetATR(1);
|
||||
|
||||
//
|
||||
double rsis[];
|
||||
ArraySetAsSeries(rsis, true);
|
||||
oscHelper.CopyRSI(
|
||||
0,
|
||||
3,
|
||||
rsis //
|
||||
);
|
||||
|
||||
//
|
||||
double points = GetPoints(mSymbol);
|
||||
|
||||
//
|
||||
int zIndex = 0;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
// For Trend ...
|
||||
XOHCL tmpHSW[];
|
||||
XOHCL tmpLSW[];
|
||||
|
||||
//
|
||||
// For Verifications ...
|
||||
|
||||
//
|
||||
// Bar On Trading Period ...
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
cIndex //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
// //
|
||||
// // Find Lowest Low and Highest High ...
|
||||
// double hh3 = cBar.FindHighest(
|
||||
// 3,
|
||||
// MODE_HIGH //
|
||||
// );
|
||||
// double ll3 = cBar.FindLowest(
|
||||
// 3,
|
||||
// MODE_LOW //
|
||||
// );
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
result = cBar.GetPreviousBar(pBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool hasBullishPattern = HasBullishPattern(cBar);
|
||||
bool isBullishTrend = cBar.HasBullishTrend(
|
||||
tmpHSW,
|
||||
tmpLSW,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
bool hasBearishPattern = HasBearishPattern(cBar);
|
||||
|
||||
//
|
||||
bool isBearishTrend = cBar.HasBearishTrend(
|
||||
tmpHSW,
|
||||
tmpLSW,
|
||||
false //
|
||||
);
|
||||
|
||||
//
|
||||
// Check Support Exists or Find ...
|
||||
bool hasSupport = support.IsValid();
|
||||
if (!hasSupport)
|
||||
{
|
||||
//
|
||||
hasSupport =
|
||||
//
|
||||
cBar.HasSupport(support)
|
||||
//
|
||||
&&
|
||||
//
|
||||
MathAbs(pvConditions.fib3s[cIndex] - support.high) <= 10 * points
|
||||
//
|
||||
;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Resistance Exists or Find ...
|
||||
bool hasResistance = resistance.IsValid();
|
||||
if (!hasResistance)
|
||||
{
|
||||
//
|
||||
hasResistance =
|
||||
//
|
||||
cBar.HasResistance(resistance)
|
||||
//
|
||||
&&
|
||||
//
|
||||
MathAbs(pvConditions.fib3s[cIndex] - resistance.low) <= 10 * points
|
||||
//
|
||||
;
|
||||
}
|
||||
|
||||
//
|
||||
if (hasSupport)
|
||||
{
|
||||
//
|
||||
DrawSupport(
|
||||
support,
|
||||
ChartID() //
|
||||
);
|
||||
|
||||
//
|
||||
supportTime = cBar.time;
|
||||
|
||||
//
|
||||
// Check Price is Around Support ...
|
||||
double priceDiff = MathMin(
|
||||
MathAbs(cBar.low - support.high),
|
||||
MathAbs(cBar.high - support.high)) /
|
||||
points;
|
||||
result =
|
||||
//
|
||||
priceDiff <= 50
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
CheckSupportValidation();
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (result && !isSupportTested)
|
||||
{
|
||||
isSupportTested = true;
|
||||
}
|
||||
|
||||
//
|
||||
// Long ...
|
||||
hasLong =
|
||||
//
|
||||
(
|
||||
//
|
||||
isBullishTrend
|
||||
//
|
||||
||
|
||||
//
|
||||
hasBullishPattern
|
||||
//
|
||||
)
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
(tdConditions.isSwitchedToBullish &&
|
||||
hkConditions.isSMHKBullish)
|
||||
//
|
||||
||
|
||||
//
|
||||
(hkConditions.isSMHKSwitchedToBullish &&
|
||||
tdConditions.isBullish)
|
||||
//
|
||||
||
|
||||
//
|
||||
(mcConditions.isFastCrossedOverSlow &&
|
||||
mcConditions.isSlowOverVerifier)
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (hasLong)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_BUY;
|
||||
XOHCL swingLow;
|
||||
bool hasSwing = cBar.FindLastSwingLow(swingLow);
|
||||
if (!hasSwing)
|
||||
{
|
||||
sl = support.high - (50 * points);
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
DrawSwingLow(swingLow, ChartID());
|
||||
sl = swingLow.low - atr;
|
||||
RemoveSwingLow(swingLow);
|
||||
swingLow.Clean();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// //
|
||||
// if (hasResistance)
|
||||
// {
|
||||
// //
|
||||
// DrawResistance(
|
||||
// support,
|
||||
// ChartID() //
|
||||
// );
|
||||
|
||||
// //
|
||||
// supportTime = cBar.time;
|
||||
|
||||
// //
|
||||
// // Check Price is Around Support ...
|
||||
// double priceDiff = MathMin(
|
||||
// MathAbs(cBar.low - support.high),
|
||||
// MathAbs(cBar.high - support.high)) /
|
||||
// points;
|
||||
// result =
|
||||
// //
|
||||
// priceDiff <= 50
|
||||
// //
|
||||
// ;
|
||||
// if (!result)
|
||||
// {
|
||||
// //
|
||||
// CheckResistanceValidation();
|
||||
// return result;
|
||||
// }
|
||||
|
||||
// //
|
||||
// if (result && !isResistanceTested)
|
||||
// {
|
||||
// isResistanceTested = true;
|
||||
// }
|
||||
// }
|
||||
|
||||
//
|
||||
result = hasLong || hasShort;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
CheckSupportValidation();
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (hasSupport)
|
||||
{
|
||||
//
|
||||
isSupportTested = false;
|
||||
supportTime = NULL;
|
||||
RemoveSupport(support);
|
||||
support.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
if (hasResistance)
|
||||
{
|
||||
//
|
||||
isResistanceTested = false;
|
||||
resistanceTime = NULL;
|
||||
RemoveResistance(resistance);
|
||||
resistance.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
entry = GetEntry(mSymbol, type);
|
||||
CalculateTPSLByPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
|
||||
//
|
||||
result = signal.Prepare(
|
||||
mSymbol,
|
||||
GetTag(),
|
||||
mPeriod,
|
||||
type,
|
||||
mode,
|
||||
entry,
|
||||
mVolume,
|
||||
sl,
|
||||
tp //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
XOHCL support;
|
||||
XOHCL resistance;
|
||||
|
||||
//
|
||||
// XMC ...
|
||||
XMCInputs mcInputs;
|
||||
XSCXMCHelper *mcHelper;
|
||||
|
||||
//
|
||||
XTDInputs tdInputs;
|
||||
XSCXTDHelper *tdHelper;
|
||||
|
||||
//
|
||||
// XPV ...
|
||||
XPVInputs pvInputs;
|
||||
XSCXPVHelper *pvHelper;
|
||||
|
||||
//
|
||||
// XOSC ...
|
||||
XOSCInputs oscInputs;
|
||||
XSCXOSCHelper *oscHelper;
|
||||
|
||||
//
|
||||
// XVLM ...
|
||||
XVLMInputs vlmInputs;
|
||||
XSCXVLMHelper *vlmHelper;
|
||||
|
||||
//
|
||||
// XHK ...
|
||||
XHKInputs hkInputs;
|
||||
XSCXHKHelper *hkHelper;
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
void PrepareRequirements()
|
||||
{
|
||||
//
|
||||
support.Clean();
|
||||
supportTime = NULL;
|
||||
isSupportTested = false;
|
||||
|
||||
//
|
||||
resistance.Clean();
|
||||
resistanceTime = NULL;
|
||||
isResistanceTested = false;
|
||||
|
||||
//
|
||||
// Prepare XTD ...
|
||||
tdInputs.Default();
|
||||
|
||||
//
|
||||
tdHelper = new XSCXTDHelper();
|
||||
tdHelper.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
tdInputs //
|
||||
);
|
||||
|
||||
//
|
||||
// Preparing XHK ...
|
||||
hkInputs.Default();
|
||||
hkInputs.smoothingLength = 14;
|
||||
|
||||
//
|
||||
hkInputs.drawHikenAshi = false;
|
||||
hkInputs.drawSmoothedHikenAshi = true;
|
||||
|
||||
//
|
||||
hkHelper = new XSCXHKHelper();
|
||||
hkHelper.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
hkInputs //
|
||||
);
|
||||
|
||||
//
|
||||
// Preparing XMC ...
|
||||
mcInputs.Default();
|
||||
|
||||
//
|
||||
mcInputs.showSar = false;
|
||||
mcInputs.showFastMa = true;
|
||||
mcInputs.showSlowMa = true;
|
||||
mcInputs.showVerifierMa = true;
|
||||
|
||||
//
|
||||
mcHelper = new XSCXMCHelper();
|
||||
mcHelper.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
mcInputs //
|
||||
);
|
||||
|
||||
//
|
||||
// Preparing XPV ...
|
||||
pvInputs.Default();
|
||||
|
||||
//
|
||||
pvInputs.showPeaksAndVales = true;
|
||||
pvInputs.showLevels = false;
|
||||
pvInputs.showConsolidations = false;
|
||||
pvInputs.showFibo1Levels = false;
|
||||
pvInputs.showFibo2Levels = false;
|
||||
pvInputs.showFibo3Levels = true;
|
||||
pvInputs.showFibo4Levels = false;
|
||||
pvInputs.showFibo5Levels = false;
|
||||
|
||||
//
|
||||
pvHelper = new XSCXPVHelper();
|
||||
pvHelper.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
pvInputs //
|
||||
);
|
||||
|
||||
//
|
||||
// Preparing XOSC ...
|
||||
oscInputs.Default();
|
||||
oscHelper = new XSCXOSCHelper();
|
||||
oscHelper.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
oscInputs //
|
||||
);
|
||||
|
||||
//
|
||||
// Preparing XVLM ...
|
||||
vlmInputs.Default();
|
||||
vlmHelper = new XSCXVLMHelper();
|
||||
vlmHelper.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
vlmInputs //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
bool isSupportTested;
|
||||
datetime supportTime;
|
||||
void CheckSupportValidation()
|
||||
{
|
||||
//
|
||||
if (!isSupportTested)
|
||||
{
|
||||
//
|
||||
if (support.IsValid() && IsValid(supportTime))
|
||||
{
|
||||
//
|
||||
int age = (int)(((int)(TimeToSeconds(TimeCurrent()) - TimeToSeconds(supportTime))) / PeriodSeconds(mPeriod));
|
||||
if (age >= 50)
|
||||
{
|
||||
//
|
||||
isSupportTested = false;
|
||||
supportTime = NULL;
|
||||
RemoveSupport(support);
|
||||
support.Clean();
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL cBar;
|
||||
bool isInited = cBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
1 //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
double points = GetPoints(mSymbol);
|
||||
|
||||
//
|
||||
// Find Price Distance ...
|
||||
double highDiff = MathAbs(cBar.high - support.high);
|
||||
double lowDiff = MathAbs(cBar.low - support.high);
|
||||
|
||||
//
|
||||
bool isBreaked = MathMax(highDiff, lowDiff) >= 100 * points;
|
||||
if (!isBreaked)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
isSupportTested = false;
|
||||
RemoveSupport(support);
|
||||
supportTime = NULL;
|
||||
support.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
bool isResistanceTested;
|
||||
datetime resistanceTime;
|
||||
void CheckResistanceValidation()
|
||||
{
|
||||
//
|
||||
if (!isResistanceTested)
|
||||
{
|
||||
//
|
||||
if (resistance.IsValid() && IsValid(resistanceTime))
|
||||
{
|
||||
//
|
||||
int age = (int)(((int)(TimeToSeconds(TimeCurrent()) - TimeToSeconds(resistanceTime))) / PeriodSeconds(mPeriod));
|
||||
if (age >= 50)
|
||||
{
|
||||
//
|
||||
isResistanceTested = false;
|
||||
resistanceTime = NULL;
|
||||
RemoveResistance(resistance);
|
||||
resistance.Clean();
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL cBar;
|
||||
bool isInited = cBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
1 //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
double points = GetPoints(mSymbol);
|
||||
|
||||
//
|
||||
// Find Price Distance ...
|
||||
double highDiff = MathAbs(cBar.high - resistance.low);
|
||||
double lowDiff = MathAbs(cBar.low - resistance.low);
|
||||
|
||||
//
|
||||
bool isBreaked = MathMax(highDiff, lowDiff) >= 100 * points;
|
||||
if (!isBreaked)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
isResistanceTested = false;
|
||||
RemoveResistance(resistance);
|
||||
resistanceTime = NULL;
|
||||
resistance.Clean();
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
@@ -1,723 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XSCXSRBRStrategy
|
||||
// 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.xstrategy.class.mq5"
|
||||
|
||||
//
|
||||
string XSRBRStartegyToken = "XSRBR";
|
||||
|
||||
//
|
||||
class XSCXSRBRStrategy : public XSCBaseStrategy
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Constructor(s) ...
|
||||
void XSCXSRBRStrategy(
|
||||
//
|
||||
// Base ...
|
||||
string _symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES _period, // Trading TimeFrame
|
||||
ENUM_TIMEFRAMES _analyzingPeriod, // Analyzing Timeframe
|
||||
double _volume, // Voluem
|
||||
double _r2r, // Risk/Reward Ratio
|
||||
int _slippage, // Trader Slippage
|
||||
long _magicNumber, // Trader Magic Number
|
||||
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
|
||||
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
|
||||
double _tpPoint = 0, // TP As Point
|
||||
double _slPoint = 0, // SL As Point
|
||||
bool _allowLong = true,
|
||||
bool _allowShort = true,
|
||||
int _maxAllowedLongs = 0,
|
||||
int _maxAllowedShorts = 0,
|
||||
ENUM_X_SIGNALLING_DIRECTION _signallingDirection = X_SIGNALLING_TREND_DIRECTION // Signalling in Which Direction
|
||||
) : XSCBaseStrategy(_symbol,
|
||||
_period,
|
||||
_volume,
|
||||
_r2r,
|
||||
_slippage,
|
||||
_magicNumber,
|
||||
_useTPSLAsPoint,
|
||||
_forceMaxTPSLAsPoint,
|
||||
_tpPoint,
|
||||
_slPoint,
|
||||
_allowLong,
|
||||
_allowShort,
|
||||
_maxAllowedLongs,
|
||||
_maxAllowedShorts //
|
||||
)
|
||||
{
|
||||
//
|
||||
mAnalyzingPeriod = _analyzingPeriod;
|
||||
mSignallingDirection = _signallingDirection;
|
||||
|
||||
//
|
||||
SetAlertPrefix(GetTag());
|
||||
}
|
||||
|
||||
//
|
||||
// Getter / Setter (s) ...
|
||||
|
||||
//
|
||||
ENUM_X_SIGNALLING_DIRECTION SignallingDirection()
|
||||
{
|
||||
return mSignallingDirection;
|
||||
}
|
||||
|
||||
//
|
||||
void SignallingDirection(ENUM_X_SIGNALLING_DIRECTION value)
|
||||
{
|
||||
mSignallingDirection = value;
|
||||
}
|
||||
|
||||
//
|
||||
// Overrides ...
|
||||
|
||||
//
|
||||
// Customize Strategy Identifier ...
|
||||
string GetTag() override
|
||||
{
|
||||
return XSRBRStartegyToken;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Conditions For Signal ...
|
||||
bool HasSignal(
|
||||
XSignal &signal //
|
||||
) override
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
double _threshold = 5;
|
||||
double threshold = GetPoints(mSymbol) * _threshold;
|
||||
|
||||
//
|
||||
signal.Clean();
|
||||
|
||||
//
|
||||
double sl = 0;
|
||||
double tp = 0;
|
||||
double risk = 0;
|
||||
double entry = 0;
|
||||
double reward = 0;
|
||||
double r2r = R2R();
|
||||
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
|
||||
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
|
||||
|
||||
//
|
||||
// Check Signalling Direction ...
|
||||
result = mSignallingDirection != X_SIGNALLING_NONE;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Conditions Exists ...
|
||||
result = HasRequirements();
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
// Prepare Conditions ...
|
||||
result = PrepareRequirements();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Implement Signalling Conditions ...
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
1 //
|
||||
);
|
||||
|
||||
//
|
||||
// Check Analyzing Period Contains a Trend or not ...
|
||||
|
||||
//
|
||||
// Detecting Trend ...
|
||||
bool isInBullishTrend = false;
|
||||
bool isInBearishTrend = false;
|
||||
|
||||
//
|
||||
// Verify Pressure for Signals ...
|
||||
bool verifyPressure = true;
|
||||
bool checkTrensByMethod2 = false;
|
||||
|
||||
//
|
||||
bool checkHammer = false;
|
||||
bool checkMorningStar = false;
|
||||
bool checkBullishEngulfing = true;
|
||||
|
||||
//
|
||||
bool checkShootingStar = false;
|
||||
bool checkEveningStar = false;
|
||||
bool checkBearishEngulfing = true;
|
||||
|
||||
//
|
||||
isInBullishTrend = bar.HasBullishTrend(
|
||||
highSwingBars,
|
||||
lowSwingBars,
|
||||
checkTrensByMethod2 //
|
||||
);
|
||||
if (!isInBullishTrend)
|
||||
{
|
||||
//
|
||||
isInBearishTrend = bar.HasBearishTrend(
|
||||
highSwingBars,
|
||||
lowSwingBars,
|
||||
checkTrensByMethod2 //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Only Looks For Signals if aTrend Detected ...
|
||||
result = isInBullishTrend || isInBearishTrend;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
ResetRequirements();
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (isInBullishTrend)
|
||||
{
|
||||
//
|
||||
DrawBullishTrend(
|
||||
cBar,
|
||||
highSwingBars,
|
||||
lowSwingBars,
|
||||
ChartID(),
|
||||
true,
|
||||
true //
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
DrawBearishTrend(
|
||||
cBar,
|
||||
highSwingBars,
|
||||
lowSwingBars,
|
||||
ChartID(),
|
||||
true,
|
||||
true //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Here We have to Decide Trend or Reversal Act ...
|
||||
|
||||
//
|
||||
// Check Trend Direction Signal ...
|
||||
if (mSignallingDirection == X_SIGNALLING_BOTH_DIRECTIONS ||
|
||||
mSignallingDirection == X_SIGNALLING_TREND_DIRECTION)
|
||||
{
|
||||
//
|
||||
if (isInBullishTrend)
|
||||
{
|
||||
//
|
||||
// Find Long Signals ...
|
||||
// since we are in Bullish Trend and
|
||||
// we must do Trend Trading ...
|
||||
|
||||
//
|
||||
// In Trend Trading we must Waits for :
|
||||
// - Support Rejection;
|
||||
|
||||
//
|
||||
// Support Rejecting Hppens when Price Go Down of Support area and
|
||||
// Go Up or
|
||||
// Price Recive a Candlestic Pattern ...
|
||||
|
||||
//
|
||||
// this Moving Up Make us Ready for Reciving a
|
||||
// Candlestick Pattern which Prove us Buyers Pressure ...
|
||||
// - Hammer;
|
||||
// - Morning Star;
|
||||
// - Bullish Engulfing;
|
||||
|
||||
//
|
||||
XOHCL tmpSWH[];
|
||||
XOHCL tmpSWL[];
|
||||
|
||||
//
|
||||
bool isSupportRejected = IsSupportRejected(support, verifyPressure, checkHammer, checkMorningStar, checkBullishEngulfing);
|
||||
bool isResistanceBreaked = IsResistanceBreaked(resistance, verifyPressure, checkHammer, checkMorningStar, checkBullishEngulfing);
|
||||
|
||||
//
|
||||
bool isBullishTrend = cBar.HasBullishTrend(
|
||||
tmpSWH,
|
||||
tmpSWL,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isBullishTrend
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
isSupportRejected
|
||||
//
|
||||
||
|
||||
//
|
||||
isResistanceBreaked
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_BUY;
|
||||
|
||||
//
|
||||
if (isSupportRejected)
|
||||
{
|
||||
//
|
||||
sl = support.low - threshold;
|
||||
RemoveSupport(support);
|
||||
support.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
if (isResistanceBreaked)
|
||||
{
|
||||
//
|
||||
sl = resistance.low - threshold;
|
||||
RemoveResistance(resistance);
|
||||
resistance.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
RemoveDraws(XTLSBullishTrendToken);
|
||||
RemoveDraws(XTLSBearishTrendToken);
|
||||
}
|
||||
}
|
||||
else if (isInBearishTrend)
|
||||
{
|
||||
//
|
||||
// Find Short Signals ...
|
||||
// since we are in Bearish Trend and
|
||||
// we must do Trend Trading ...
|
||||
|
||||
//
|
||||
XOHCL tmpSWH[];
|
||||
XOHCL tmpSWL[];
|
||||
|
||||
//
|
||||
bool isSupportBreaked = IsSupportBreaked(support, verifyPressure, checkShootingStar, checkEveningStar, checkBearishEngulfing);
|
||||
bool isResistanceRejected = IsResistanceRejected(resistance, verifyPressure, checkShootingStar, checkEveningStar, checkBearishEngulfing);
|
||||
|
||||
//
|
||||
bool isBearishTrend = cBar.HasBearishTrend(
|
||||
tmpSWH,
|
||||
tmpSWL,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isBearishTrend
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
isSupportBreaked
|
||||
//
|
||||
||
|
||||
//
|
||||
isResistanceRejected
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_SELL;
|
||||
|
||||
//
|
||||
if (isSupportBreaked)
|
||||
{
|
||||
//
|
||||
sl = support.high + threshold;
|
||||
RemoveSupport(support);
|
||||
support.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
if (isResistanceRejected)
|
||||
{
|
||||
//
|
||||
sl = resistance.high + threshold;
|
||||
RemoveResistance(resistance);
|
||||
resistance.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
RemoveDraws(XTLSBullishTrendToken);
|
||||
RemoveDraws(XTLSBearishTrendToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Trend Reversal Direction Signal ...
|
||||
if (!result &&
|
||||
(mSignallingDirection == X_SIGNALLING_BOTH_DIRECTIONS ||
|
||||
mSignallingDirection == X_SIGNALIING_TREND_REVERSAL_DIRECTION))
|
||||
{
|
||||
//
|
||||
if (isInBullishTrend)
|
||||
{
|
||||
//
|
||||
// Find Short Signals ...
|
||||
// since we are in Bullish Trend and
|
||||
// we must do Trend Reversal Trading ...
|
||||
|
||||
//
|
||||
XOHCL tmpSWH[];
|
||||
XOHCL tmpSWL[];
|
||||
|
||||
//
|
||||
bool isSupportBreaked = IsSupportBreaked(support, verifyPressure, checkShootingStar, checkEveningStar, checkBearishEngulfing);
|
||||
bool isResistanceRejected = IsResistanceRejected(resistance, verifyPressure, checkShootingStar, checkEveningStar, checkBearishEngulfing);
|
||||
|
||||
//
|
||||
bool isBearishTrend = cBar.HasBearishTrend(
|
||||
tmpSWH,
|
||||
tmpSWL,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
true // isBearishTrend
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
isSupportBreaked
|
||||
//
|
||||
||
|
||||
//
|
||||
isResistanceRejected
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_SELL;
|
||||
|
||||
//
|
||||
if (isSupportBreaked)
|
||||
{
|
||||
//
|
||||
sl = support.high + threshold;
|
||||
RemoveSupport(support);
|
||||
support.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
if (isResistanceRejected)
|
||||
{
|
||||
//
|
||||
sl = resistance.high + threshold;
|
||||
RemoveResistance(resistance);
|
||||
resistance.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
RemoveDraws(XTLSBullishTrendToken);
|
||||
RemoveDraws(XTLSBearishTrendToken);
|
||||
}
|
||||
}
|
||||
else if (isInBearishTrend)
|
||||
{
|
||||
//
|
||||
// Find Long Signals ...
|
||||
// since we are in Bearish Trend and
|
||||
// we must do Trend Reversal Trading ...
|
||||
|
||||
//
|
||||
XOHCL tmpSWH[];
|
||||
XOHCL tmpSWL[];
|
||||
|
||||
//
|
||||
bool isSupportRejected = IsSupportRejected(support, verifyPressure, checkHammer, checkMorningStar, checkBullishEngulfing);
|
||||
bool isResistanceBreaked = IsResistanceBreaked(resistance, verifyPressure, checkHammer, checkMorningStar, checkBullishEngulfing);
|
||||
|
||||
//
|
||||
bool isBullishTrend = cBar.HasBullishTrend(
|
||||
tmpSWH,
|
||||
tmpSWL,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
true // isBullishTrend
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
isSupportRejected
|
||||
//
|
||||
||
|
||||
//
|
||||
isResistanceBreaked
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_BUY;
|
||||
|
||||
//
|
||||
if (isSupportRejected)
|
||||
{
|
||||
//
|
||||
sl = support.low - threshold;
|
||||
RemoveSupport(support);
|
||||
support.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
if (isResistanceBreaked)
|
||||
{
|
||||
//
|
||||
sl = resistance.low - threshold;
|
||||
RemoveResistance(resistance);
|
||||
resistance.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
RemoveDraws(XTLSBullishTrendToken);
|
||||
RemoveDraws(XTLSBearishTrendToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Make Sure Signal Exists ...
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
RemoveDraws(XTLSBullishTrendToken);
|
||||
RemoveDraws(XTLSBearishTrendToken);
|
||||
|
||||
//
|
||||
ResetRequirements();
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
entry = GetEntry(mSymbol, type);
|
||||
CalculateTPSLByPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
|
||||
//
|
||||
result = signal.Prepare(
|
||||
mSymbol,
|
||||
GetTag(),
|
||||
mPeriod,
|
||||
type,
|
||||
mode,
|
||||
entry,
|
||||
mVolume,
|
||||
sl,
|
||||
tp //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
ENUM_TIMEFRAMES mAnalyzingPeriod; // Analyzing Period
|
||||
ENUM_X_SIGNALLING_DIRECTION mSignallingDirection; // Signalling Direction
|
||||
|
||||
//
|
||||
XOHCL bar;
|
||||
|
||||
//
|
||||
// Pivots ...
|
||||
XOHCL support;
|
||||
XOHCL resistance;
|
||||
|
||||
//
|
||||
XOHCL lowSwingBars[];
|
||||
XOHCL highSwingBars[];
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
|
||||
//
|
||||
// Check Requirements Exists or not ...
|
||||
bool HasRequirements()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
bar.IsValid() &&
|
||||
support.IsValid() &&
|
||||
resistance.IsValid()
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Prepare Requirements ...
|
||||
bool PrepareRequirements()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (support.IsValid())
|
||||
{
|
||||
RemoveSupport(support);
|
||||
}
|
||||
|
||||
//
|
||||
// Finding Analyzing Bar ...
|
||||
result = bar.Init(
|
||||
mSymbol,
|
||||
mAnalyzingPeriod,
|
||||
1 //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find Support Bar based on Analyzing Bar ...
|
||||
result = bar.HasSupport(
|
||||
support //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
DrawSupport(support, ChartID(), 5);
|
||||
|
||||
//
|
||||
if (resistance.IsValid())
|
||||
{
|
||||
RemoveResistance(resistance);
|
||||
}
|
||||
|
||||
//
|
||||
// Find Resistance Bar based on Analyzing Bar ...
|
||||
result = bar.HasResistance(
|
||||
resistance //
|
||||
);
|
||||
|
||||
//
|
||||
DrawResistance(resistance, ChartID(), 5);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Reset Reqirements ...
|
||||
void ResetRequirements()
|
||||
{
|
||||
//
|
||||
if (IsSupportBreaked(support, false))
|
||||
{
|
||||
//
|
||||
RemoveSupport(support);
|
||||
support.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
if (IsResistanceBreaked(resistance, false))
|
||||
{
|
||||
//
|
||||
RemoveResistance(resistance);
|
||||
resistance.Clean();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
@@ -1,446 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XSCXEMRNGStrategy
|
||||
// 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
|
||||
|
||||
//
|
||||
// TODO: Complete this ...
|
||||
|
||||
//
|
||||
/// Imports ...
|
||||
#include "../Helpers/x-saherelm.xtm.helper.mq5"
|
||||
#include "../Helpers/x-saherelm.xstr.helper.mq5"
|
||||
#include "../Classes/x-saherelm.xstrategy.class.mq5"
|
||||
|
||||
//
|
||||
string XEMRNGStartegyToken = "XEMRNG";
|
||||
|
||||
//
|
||||
class XSCXEMRNGStrategy : public XSCBaseStrategy
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Constructor(s) ...
|
||||
void XSCXEMRNGStrategy(
|
||||
//
|
||||
// Base ...
|
||||
string _symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES _period, // Trading TimeFrame
|
||||
double _volume, // Voluem
|
||||
double _r2r, // Risk/Reward Ratio
|
||||
int _slippage, // Trader Slippage
|
||||
long _magicNumber, // Trader Magic Number
|
||||
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
|
||||
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
|
||||
double _tpPoint = 0, // TP As Point
|
||||
double _slPoint = 0, // SL As Point
|
||||
bool _allowLong = true,
|
||||
bool _allowShort = true,
|
||||
int _maxAllowedLongs = 0,
|
||||
int _maxAllowedShorts = 0 //
|
||||
) : XSCBaseStrategy(_symbol,
|
||||
_period,
|
||||
_volume,
|
||||
_r2r,
|
||||
_slippage,
|
||||
_magicNumber,
|
||||
_useTPSLAsPoint,
|
||||
_forceMaxTPSLAsPoint,
|
||||
_tpPoint,
|
||||
_slPoint,
|
||||
_allowLong,
|
||||
_allowShort,
|
||||
_maxAllowedLongs,
|
||||
_maxAllowedShorts //
|
||||
)
|
||||
{
|
||||
//
|
||||
ConfigureRequirements();
|
||||
|
||||
//
|
||||
SetAlertPrefix(GetTag());
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
void ~XSCXEMRNGStrategy()
|
||||
{
|
||||
delete mTMHelper;
|
||||
}
|
||||
|
||||
//
|
||||
// Getter / Setter (s) ...
|
||||
|
||||
//
|
||||
// Overrides ...
|
||||
|
||||
//
|
||||
// Customize Strategy Identifier ...
|
||||
string GetTag() override
|
||||
{
|
||||
return XEMRNGStartegyToken;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Conditions For Signal ...
|
||||
bool HasSignal(
|
||||
XSignal &signal //
|
||||
) override
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
signal.Clean();
|
||||
|
||||
//
|
||||
double sl = 0;
|
||||
double tp = 0;
|
||||
double risk = 0;
|
||||
double entry = 0;
|
||||
double reward = 0;
|
||||
double r2r = R2R();
|
||||
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
|
||||
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
|
||||
|
||||
//
|
||||
int start = 0;
|
||||
int count = 5;
|
||||
|
||||
//
|
||||
double tms[];
|
||||
ArraySetAsSeries(tms, true);
|
||||
mTMHelper.CopyMain(
|
||||
start,
|
||||
count,
|
||||
tms //
|
||||
);
|
||||
|
||||
//
|
||||
XSTRConditions strConditions;
|
||||
result = mSTRHelper.GetConditions(
|
||||
strConditions,
|
||||
start,
|
||||
count //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
1 //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double hh5 = cBar.FindHighest(
|
||||
5,
|
||||
MODE_HIGH //
|
||||
);
|
||||
double ll5 = cBar.FindLowest(
|
||||
5,
|
||||
MODE_LOW //
|
||||
);
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
result = cBar.GetPreviousBar(pBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool hasLong = false;
|
||||
bool hasShort = false;
|
||||
|
||||
//
|
||||
XOHCL tmpHSW[];
|
||||
XOHCL tmpLSW[];
|
||||
|
||||
//
|
||||
bool useHammer = true;
|
||||
bool useMorningStar = false;
|
||||
bool useBullishEngulfing = true;
|
||||
bool useBullishMaurubozu = true;
|
||||
|
||||
//
|
||||
bool useShootingStar = true;
|
||||
bool useEveningStar = false;
|
||||
bool useBearishEngulfing = true;
|
||||
bool useBearishMaurubozu = true;
|
||||
|
||||
//
|
||||
// Long ...
|
||||
|
||||
//
|
||||
bool isHammer = !useHammer
|
||||
? false
|
||||
: cBar.IsHammer();
|
||||
bool isMorningStar = !useMorningStar
|
||||
? false
|
||||
: cBar.IsMorningStar();
|
||||
bool isBullishMarubozu = !useBullishEngulfing
|
||||
? false
|
||||
: cBar.IsBullishMarubozu();
|
||||
bool isBullishEngulfing = !useBullishMaurubozu
|
||||
? false
|
||||
: cBar.IsBullishEngulfing();
|
||||
|
||||
//
|
||||
bool isBullishTrend = cBar.HasBullishTrend(
|
||||
tmpHSW,
|
||||
tmpLSW,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
// Find Swing Low Above of EMA ...
|
||||
// Find Swing High Above of EMA ...
|
||||
// Fins Swing Low Below of EMA ...
|
||||
// Detect Bullish Pattern ...
|
||||
hasLong =
|
||||
//
|
||||
cBar.IsBullish()
|
||||
//
|
||||
&&
|
||||
//
|
||||
isBullishTrend
|
||||
//
|
||||
&&
|
||||
//
|
||||
cBar.close > tms[1]
|
||||
//
|
||||
&&
|
||||
//
|
||||
ll5 < tms[1]
|
||||
//
|
||||
&&
|
||||
//
|
||||
strConditions.isTrendSwitchedToBullish
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
isHammer
|
||||
//
|
||||
||
|
||||
//
|
||||
isMorningStar
|
||||
//
|
||||
||
|
||||
//
|
||||
isBullishMarubozu
|
||||
//
|
||||
||
|
||||
//
|
||||
isBullishEngulfing
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
if (hasLong)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_BUY;
|
||||
|
||||
//
|
||||
sl = tmpLSW[ArraySize(tmpLSW) - 1].low;
|
||||
}
|
||||
|
||||
//
|
||||
// Short ...
|
||||
bool isShootingStar = !useShootingStar
|
||||
? false
|
||||
: cBar.IsShootingStar();
|
||||
bool isEveningStar = !useEveningStar
|
||||
? false
|
||||
: cBar.IsEveningStar();
|
||||
bool isBearishEngulfing = !useBearishEngulfing
|
||||
? false
|
||||
: cBar.IsBearishEngulfing();
|
||||
bool isBearishMaurubozu = !useBearishMaurubozu
|
||||
? false
|
||||
: cBar.IsBearishMarubozu();
|
||||
|
||||
//
|
||||
bool isBearishTrend = cBar.HasBearishTrend(
|
||||
tmpHSW,
|
||||
tmpLSW,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
hasShort =
|
||||
//
|
||||
cBar.IsBearish()
|
||||
//
|
||||
&&
|
||||
//
|
||||
isBearishTrend
|
||||
//
|
||||
&&
|
||||
//
|
||||
cBar.close < tms[1]
|
||||
//
|
||||
&&
|
||||
//
|
||||
hh5 > tms[1]
|
||||
//
|
||||
&&
|
||||
//
|
||||
strConditions.isTrendSwitchedToBearish
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
isShootingStar
|
||||
//
|
||||
||
|
||||
//
|
||||
isEveningStar
|
||||
//
|
||||
||
|
||||
//
|
||||
isBearishEngulfing
|
||||
//
|
||||
||
|
||||
//
|
||||
isBearishMaurubozu
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
if (hasShort)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_SELL;
|
||||
|
||||
//
|
||||
sl = tmpHSW[ArraySize(tmpHSW) - 1].high;
|
||||
}
|
||||
|
||||
//
|
||||
result = hasLong || hasShort;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
entry = GetEntry(mSymbol, type);
|
||||
CalculateTPSLByPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
|
||||
//
|
||||
result = signal.Prepare(
|
||||
mSymbol,
|
||||
GetTag(),
|
||||
mPeriod,
|
||||
type,
|
||||
mode,
|
||||
entry,
|
||||
mVolume,
|
||||
sl,
|
||||
tp //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
XTMInputs mTMInputs; // Tren Magic Inputs ...
|
||||
XSCXTMHelper *mTMHelper; // Trend Magic Helper Class ...
|
||||
|
||||
//
|
||||
XSTRInputs mSTRInputs; // Super Trend Inputs ...
|
||||
XSCXSTRHelper *mSTRHelper; // Super Trend Helper Class ...
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
|
||||
//
|
||||
// Set Default TM Inputs ...
|
||||
void ConfigureRequirements()
|
||||
{
|
||||
//
|
||||
mTMInputs.maShift = 0;
|
||||
mTMInputs.maPeriod = 100;
|
||||
mTMInputs.maMethod = MODE_EMA;
|
||||
mTMInputs.maAppliedTo = PRICE_CLOSE;
|
||||
|
||||
//
|
||||
mTMInputs.showLine = true;
|
||||
|
||||
//
|
||||
mTMHelper = new XSCXTMHelper();
|
||||
|
||||
//
|
||||
mTMHelper.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
mTMInputs //
|
||||
);
|
||||
|
||||
//
|
||||
mSTRInputs.length = 14;
|
||||
mSTRInputs.multiplier = 3.5;
|
||||
mSTRInputs.appliedTo = PRICE_CLOSE;
|
||||
|
||||
//
|
||||
mSTRInputs.showTrends = true;
|
||||
mSTRInputs.fillTrends = false;
|
||||
|
||||
//
|
||||
mSTRHelper = new XSCXSTRHelper();
|
||||
mSTRHelper.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
mSTRInputs //
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,384 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center XNNTest MQL5 Expert Advisor
|
||||
// -------------------------------------------------
|
||||
// Name: XNNTest
|
||||
// Description: an Exper Advisor which used RSI and MA
|
||||
// to Analyse Market ...
|
||||
//
|
||||
// Maintainer:
|
||||
// ------------
|
||||
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||
//
|
||||
//////////////////////////////////////////////////////x
|
||||
//
|
||||
// Global Properties ...
|
||||
#property copyright "Copyright 2023, SaherElm IT Center"
|
||||
#property link "https://saherelm.ir"
|
||||
#property version "1.00"
|
||||
#property description "SaherElm XNNTest"
|
||||
#property strict
|
||||
|
||||
//
|
||||
// Imports ...
|
||||
#include "../Classes/x-saherelm.xtrade.class.mq5"
|
||||
|
||||
//
|
||||
#define ShortName "XNNTest"
|
||||
|
||||
//
|
||||
// Inputs ...
|
||||
input group "Weights";
|
||||
input double w0 = 0.5;
|
||||
input double w1 = 0.5;
|
||||
input double w2 = 0.5;
|
||||
input double w3 = 0.5;
|
||||
input double w4 = 0.5;
|
||||
input double w5 = 0.5;
|
||||
input double w6 = 0.5;
|
||||
input double w7 = 0.5;
|
||||
input double w8 = 0.5;
|
||||
input double w9 = 0.5;
|
||||
|
||||
//
|
||||
input double eaVolume = 0.01;
|
||||
|
||||
//
|
||||
// Variables ...
|
||||
int barsTotal;
|
||||
|
||||
//
|
||||
string eaSymbol;
|
||||
ENUM_TIMEFRAMES eaPeriod;
|
||||
|
||||
//
|
||||
// This is our Data Provider ...
|
||||
int rsiHandler = INVALID_HANDLE;
|
||||
double rsi[];
|
||||
|
||||
//
|
||||
double nnInputs[]; // Storing Inputs
|
||||
double nnWeights[]; // Storing Weights;
|
||||
|
||||
//
|
||||
double nnOutput; // Output Neuron Value
|
||||
|
||||
//
|
||||
XSCTrade *mTrader;
|
||||
|
||||
//
|
||||
// Initialization ...
|
||||
int OnInit()
|
||||
{
|
||||
//
|
||||
if (!InitialEA())
|
||||
{
|
||||
return INIT_PARAMETERS_INCORRECT;
|
||||
}
|
||||
|
||||
//
|
||||
// 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
|
||||
|
||||
//
|
||||
// De Initialize XSampleEA Providers ...
|
||||
IndicatorRelease(rsiHandler);
|
||||
ArrayFree(rsi);
|
||||
ArrayFree(nnInputs);
|
||||
ArrayFree(nnWeights);
|
||||
}
|
||||
|
||||
//
|
||||
// On Tick Handler ...
|
||||
void OnTick()
|
||||
{
|
||||
//
|
||||
XPosition positions[];
|
||||
|
||||
//
|
||||
XPosition longs[];
|
||||
int longsCount = 0;
|
||||
|
||||
//
|
||||
XPosition shorts[];
|
||||
int shortsCount = 0;
|
||||
|
||||
//
|
||||
int positionsCount = mTrader.GetPositions(
|
||||
positions //
|
||||
);
|
||||
if (IsValidSize(positionsCount))
|
||||
{
|
||||
//
|
||||
ExtractPositions(
|
||||
positions,
|
||||
longs,
|
||||
shorts //
|
||||
);
|
||||
|
||||
//
|
||||
longsCount = ArraySize(longs);
|
||||
shortsCount = ArraySize(shorts);
|
||||
}
|
||||
|
||||
//
|
||||
if (longsCount == 0 && shortsCount == 0)
|
||||
{
|
||||
//
|
||||
double longEntry = GetEntry(eaSymbol, POSITION_TYPE_BUY);
|
||||
mTrader.Buy(
|
||||
eaSymbol,
|
||||
eaPeriod,
|
||||
eaVolume,
|
||||
longEntry //
|
||||
);
|
||||
|
||||
//
|
||||
double shortEntry = GetEntry(eaSymbol, POSITION_TYPE_SELL);
|
||||
mTrader.Sell(
|
||||
eaSymbol,
|
||||
eaPeriod,
|
||||
eaVolume,
|
||||
shortEntry //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
return;
|
||||
// int rsiCopiedData = CopyBuffer(
|
||||
// rsiHandler,
|
||||
// 0, // Line Index
|
||||
// 1, // BarIndex
|
||||
// 10, // Count
|
||||
// rsi // Buffer
|
||||
// );
|
||||
// if (rsiCopiedData < 0)
|
||||
// {
|
||||
// //
|
||||
// // Ignore Moving Forward when there isn't any Copied Data ...
|
||||
// return;
|
||||
// }
|
||||
|
||||
// //
|
||||
// // Normalize Input Data ...
|
||||
// double lower = 0;
|
||||
// double upper = 1;
|
||||
|
||||
// //
|
||||
// double max = rsi[ArrayMaximum(rsi)];
|
||||
// double min = rsi[ArrayMinimum(rsi)];
|
||||
|
||||
// //
|
||||
// ArrayFree(nnInputs);
|
||||
// ArrayResize(nnInputs, 10);
|
||||
|
||||
// //
|
||||
// for (int i = 0; i < ArraySize(rsi); i++)
|
||||
// {
|
||||
// nnInputs[i] = ((rsi[i] - min) * (upper - lower) / (max - min)) + lower;
|
||||
// }
|
||||
|
||||
// //
|
||||
// // Calculating Output ...
|
||||
// nnOutput = CalculateNeuron(
|
||||
// nnInputs,
|
||||
// nnWeights //
|
||||
// );
|
||||
|
||||
// //
|
||||
// // Now we Can Use NN Output for Placing Trades ...
|
||||
|
||||
// //
|
||||
// bool canBuy = nnOutput < 0.5;
|
||||
// bool canSell = nnOutput >= 0.5;
|
||||
|
||||
// //
|
||||
// XPosition positions[];
|
||||
// XPosition longs[];
|
||||
// XPosition shorts[];
|
||||
// int positionsCount = mTrader.GetPositions(
|
||||
// positions //
|
||||
// );
|
||||
// if (IsValidSize(positionsCount))
|
||||
// {
|
||||
// //
|
||||
// ExtractPositions(
|
||||
// positions,
|
||||
// longs,
|
||||
// shorts //
|
||||
// );
|
||||
|
||||
// //
|
||||
// if (canBuy)
|
||||
// {
|
||||
// //
|
||||
// mTrader.Close(shorts, "Opposit");
|
||||
|
||||
// //
|
||||
// if (ArraySize(longs) > 0)
|
||||
// {
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// else if (canSell)
|
||||
// {
|
||||
// //
|
||||
// mTrader.Close(longs, "Opposit");
|
||||
|
||||
// //
|
||||
// if (ArraySize(shorts) > 0)
|
||||
// {
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// //
|
||||
// double mEntry =
|
||||
// canBuy
|
||||
// ? GetEntry(eaSymbol, POSITION_TYPE_BUY)
|
||||
// : GetEntry(eaSymbol, POSITION_TYPE_SELL);
|
||||
|
||||
// //
|
||||
// if (canBuy)
|
||||
// {
|
||||
// //
|
||||
// mTrader.Buy(
|
||||
// eaSymbol,
|
||||
// eaPeriod,
|
||||
// eaVolume,
|
||||
// mEntry //
|
||||
// );
|
||||
// }
|
||||
// else if (canSell)
|
||||
// {
|
||||
// //
|
||||
// mTrader.Sell(
|
||||
// eaSymbol,
|
||||
// eaPeriod,
|
||||
// eaVolume,
|
||||
// mEntry //
|
||||
// );
|
||||
// }
|
||||
}
|
||||
|
||||
//
|
||||
// Custom Functions ...
|
||||
|
||||
//
|
||||
bool InitialEA()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
eaSymbol = _Symbol;
|
||||
eaPeriod = _Period;
|
||||
|
||||
//
|
||||
// Initialize RSI Handler ...
|
||||
rsiHandler = iRSI(
|
||||
eaSymbol,
|
||||
eaPeriod,
|
||||
14,
|
||||
PRICE_CLOSE //
|
||||
);
|
||||
result = rsiHandler != INVALID_HANDLE;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
mTrader = new XSCTrade(
|
||||
1,
|
||||
78692110 //
|
||||
);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(rsi, true);
|
||||
|
||||
//
|
||||
ArrayResize(nnWeights, 10);
|
||||
|
||||
//
|
||||
// Filling Weights Buffer ...
|
||||
nnWeights[0] = w0;
|
||||
nnWeights[1] = w1;
|
||||
nnWeights[2] = w2;
|
||||
nnWeights[3] = w3;
|
||||
nnWeights[4] = w4;
|
||||
nnWeights[5] = w5;
|
||||
nnWeights[6] = w6;
|
||||
nnWeights[7] = w7;
|
||||
nnWeights[8] = w8;
|
||||
nnWeights[9] = w9;
|
||||
|
||||
//
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Activation Function ...
|
||||
double Activate(double neuron)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
result = 1 / (1 + exp(-neuron));
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Calculating Neuron ...
|
||||
// NET Inputs ...
|
||||
double CalculateNeuron(
|
||||
double &x[], // Inputs
|
||||
double &w[] // Weights
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
double netInput = 0;
|
||||
for (int i = 0; i < ArraySize(x); i++)
|
||||
{
|
||||
//
|
||||
netInput += x[i] * w[i];
|
||||
}
|
||||
|
||||
//
|
||||
// Change The Shape of Sigmoid Graph for Smoothing ...
|
||||
netInput *= 0.4;
|
||||
|
||||
//
|
||||
// Calculate Activated Result ...
|
||||
result = Activate(netInput);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,678 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// ----------------------------------------------
|
||||
// Name: XADXTD
|
||||
// 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 "../Classes/x-saherelm.base.class.mq5"
|
||||
|
||||
//
|
||||
// Indicator Buffers ...
|
||||
enum ENUM_XADXTD_BUFFERS
|
||||
{
|
||||
XADXTD_STRENGTH_LINE = 0, // Strenght Buffer ...
|
||||
XADXTD_BULL_LINE = 1, // Bull Buffer ...
|
||||
XADXTD_BEAR_LINE = 2, // Bear Buffer ...
|
||||
};
|
||||
|
||||
//
|
||||
string GetTitle(ENUM_XADXTD_BUFFERS bufferLine)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
switch (bufferLine)
|
||||
{
|
||||
//
|
||||
case XADXTD_STRENGTH_LINE:
|
||||
result = "XStrength";
|
||||
break;
|
||||
|
||||
//
|
||||
case XADXTD_BULL_LINE:
|
||||
result = "XBull";
|
||||
break;
|
||||
|
||||
//
|
||||
case XADXTD_BEAR_LINE:
|
||||
result = "XBear";
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XADXTD Indicator Inputs ...
|
||||
struct XADXTDInputs
|
||||
{
|
||||
//
|
||||
// Props ...
|
||||
string version;
|
||||
|
||||
//
|
||||
// Market ...
|
||||
|
||||
//
|
||||
int length; // Length
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
XADXTDInputs()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Initial Inputs ...
|
||||
bool Init(
|
||||
int _length = 21 // Length
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
this.length = _length;
|
||||
|
||||
//
|
||||
result = IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
length = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Default ...
|
||||
void Default()
|
||||
{
|
||||
//
|
||||
length = 21;
|
||||
}
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
bool IsValid()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
length > 0
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Retrieve Max Length ...
|
||||
int Max()
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
int values[1] = {
|
||||
length //
|
||||
};
|
||||
|
||||
//
|
||||
result = GetMax(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Define Conditions ...
|
||||
struct XADXTDConditions
|
||||
{
|
||||
//
|
||||
// Common ...
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
datetime time;
|
||||
|
||||
//
|
||||
// Buffers ...
|
||||
double strength[];
|
||||
double bullp[];
|
||||
double bearp[];
|
||||
|
||||
//
|
||||
// Conditions ...
|
||||
|
||||
//
|
||||
bool isStrong;
|
||||
bool isBullish;
|
||||
bool isBearish;
|
||||
bool isSwitchedToBullish;
|
||||
bool isSwitchedToBearish;
|
||||
bool isStrongSwitchedToBullish;
|
||||
bool isStrongSwitchedToBearish;
|
||||
|
||||
//
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(strength);
|
||||
Clean(bullp);
|
||||
Clean(bearp);
|
||||
|
||||
//
|
||||
ArraySetAsSeries(strength, true);
|
||||
ArraySetAsSeries(bullp, true);
|
||||
ArraySetAsSeries(bearp, true);
|
||||
|
||||
//
|
||||
isStrong = false;
|
||||
isBullish = false;
|
||||
isBearish = false;
|
||||
isSwitchedToBullish = false;
|
||||
isSwitchedToBearish = false;
|
||||
isStrongSwitchedToBullish = false;
|
||||
isStrongSwitchedToBearish = false;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
bullishScore = 0;
|
||||
bearishScore = 0;
|
||||
|
||||
//
|
||||
if (isBullish)
|
||||
{
|
||||
//
|
||||
bullishScore++;
|
||||
if (isStrong)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
}
|
||||
if (isBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
if (isStrong)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
if (isSwitchedToBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
if (isStrong)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
}
|
||||
if (isSwitchedToBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
if (isStrong)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
if (isStrongSwitchedToBullish)
|
||||
{
|
||||
bullishScore++;
|
||||
}
|
||||
if (isStrongSwitchedToBearish)
|
||||
{
|
||||
bearishScore++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
bool onlyCommons = false,
|
||||
bool onlyConditions = false,
|
||||
bool includeScores = true,
|
||||
bool ignoreFalseConditions = true,
|
||||
string separator = "\n" //
|
||||
)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
string scoresStr =
|
||||
//
|
||||
"Scores: " + separator +
|
||||
"---------------" + separator +
|
||||
"Bullish: " + ToString(bullishScore) + separator +
|
||||
"Bearish: " + ToString(bearishScore) + separator +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
string commonStr = GenerateSpecifiedCommonSummary(
|
||||
this,
|
||||
separator,
|
||||
includeScores //
|
||||
);
|
||||
|
||||
//
|
||||
string conditionsStr =
|
||||
//
|
||||
ToString("isStrong", isStrong, ignoreFalseConditions, separator) +
|
||||
ToString("isBullish", isBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isBearish", isBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isSwitchedToBullish", isSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isSwitchedToBearish", isSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||
ToString("isStrongSwitchedToBullish", isStrongSwitchedToBullish, ignoreFalseConditions, separator) +
|
||||
ToString("isStrongSwitchedToBearish", isStrongSwitchedToBearish, ignoreFalseConditions, separator) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
"[" + GetTag() + "]" + separator +
|
||||
(onlyConditions
|
||||
? ""
|
||||
: commonStr) +
|
||||
(!includeScores
|
||||
? ""
|
||||
: scoresStr) +
|
||||
" " + separator +
|
||||
(onlyCommons
|
||||
? ""
|
||||
: conditionsStr) +
|
||||
""
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetTag()
|
||||
{
|
||||
return "XADXTD";
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Indicator Class ...
|
||||
|
||||
class XSCXADXTDHelper : public XSCBase
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Constructor(s) ...
|
||||
void XSCXADXTDHelper(
|
||||
string symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES period // Trading TimeFrame
|
||||
)
|
||||
{
|
||||
//
|
||||
mSymbol = symbol;
|
||||
mPeriod = period;
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
void ~XSCXADXTDHelper() {}
|
||||
|
||||
//
|
||||
// Initialize Indicator ...
|
||||
bool Init(
|
||||
XADXTDInputs &inputs // Indicator Properties
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = inputs.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Set Inputs ...
|
||||
this.mInputs = inputs;
|
||||
|
||||
//
|
||||
// Validate Indicator State ...
|
||||
result = this.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = DefineBuffers();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
handler = iADX(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
mInputs.length //
|
||||
);
|
||||
result = handler != INVALID_HANDLE;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XADXTDInputs GetInputs()
|
||||
{
|
||||
return mInputs;
|
||||
}
|
||||
|
||||
//
|
||||
bool SetInputs(
|
||||
XADXTDInputs &inputs // Indicator Properties
|
||||
)
|
||||
{
|
||||
return Init(inputs);
|
||||
}
|
||||
|
||||
//
|
||||
// Get Tag ...
|
||||
string GetTag()
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
result = GetToken();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Get Token ...
|
||||
string GetToken()
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
result = GetSpecificToken(this);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GetSymbol()
|
||||
{
|
||||
return mSymbol;
|
||||
}
|
||||
|
||||
//
|
||||
ENUM_TIMEFRAMES GetPeriod()
|
||||
{
|
||||
return mPeriod;
|
||||
}
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
bool IsValid()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
mInputs.IsValid() &&
|
||||
IsSpecifiedValid(mPeriod) &&
|
||||
IsSpecifiedValid(mSymbol)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// De Initialize Class ...
|
||||
void DeInit(int reason)
|
||||
{
|
||||
//
|
||||
IndicatorRelease(handler);
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
int CopyData(
|
||||
ENUM_XADXTD_BUFFERS line,
|
||||
double &dest[],
|
||||
int start = 0,
|
||||
int count = 1 //
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
int mLine = -1;
|
||||
switch (line)
|
||||
{
|
||||
//
|
||||
case XADXTD_STRENGTH_LINE:
|
||||
mLine = MAIN_LINE;
|
||||
break;
|
||||
|
||||
//
|
||||
case XADXTD_BULL_LINE:
|
||||
mLine = PLUSDI_LINE;
|
||||
break;
|
||||
|
||||
//
|
||||
case XADXTD_BEAR_LINE:
|
||||
mLine = MINUSDI_LINE;
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
if (mLine == -1 || handler == INVALID_HANDLE)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = CopyBuffer(
|
||||
handler,
|
||||
mLine,
|
||||
start,
|
||||
count,
|
||||
dest //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool GetConditions(
|
||||
XADXTDConditions &conditions, //
|
||||
int barIndex = 0, //
|
||||
int loopback = 3 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = true;
|
||||
|
||||
//
|
||||
if (loopback < 3)
|
||||
{
|
||||
loopback = 3;
|
||||
}
|
||||
|
||||
//
|
||||
conditions.Clean();
|
||||
|
||||
//
|
||||
conditions.symbol = mSymbol;
|
||||
conditions.period = mPeriod;
|
||||
conditions.time = TimeCurrent();
|
||||
|
||||
//
|
||||
int zIndex = barIndex;
|
||||
int cIndex = zIndex + 1;
|
||||
int pIndex = cIndex + 1;
|
||||
int ppIndex = pIndex + 1;
|
||||
|
||||
//
|
||||
CopyData(
|
||||
XADXTD_STRENGTH_LINE,
|
||||
conditions.strength,
|
||||
zIndex,
|
||||
loopback //
|
||||
);
|
||||
CopyData(
|
||||
XADXTD_BULL_LINE,
|
||||
conditions.bullp,
|
||||
zIndex,
|
||||
loopback //
|
||||
);
|
||||
CopyData(
|
||||
XADXTD_BEAR_LINE,
|
||||
conditions.bearp,
|
||||
zIndex,
|
||||
loopback //
|
||||
);
|
||||
|
||||
//
|
||||
// Calculate Conditions ...
|
||||
|
||||
//
|
||||
bool isStrong = conditions.strength[cIndex] >= 20;
|
||||
|
||||
//
|
||||
bool isBullish = conditions.bullp[cIndex] > conditions.bearp[cIndex];
|
||||
bool isBearish = conditions.bearp[cIndex] > conditions.bullp[cIndex];
|
||||
|
||||
//
|
||||
bool isBullishPrev = conditions.bullp[pIndex] > conditions.bearp[pIndex];
|
||||
bool isBearishPrev = conditions.bearp[pIndex] > conditions.bullp[pIndex];
|
||||
|
||||
//
|
||||
bool isSwitchedToBullish = isBullish &&
|
||||
!isBullishPrev;
|
||||
bool isSwitchedToBearish = isBearish &&
|
||||
!isBearishPrev;
|
||||
|
||||
//
|
||||
bool isStrongSwitchedToBullish = isStrong &&
|
||||
isSwitchedToBullish;
|
||||
bool isStrongSwitchedToBearish = isStrong &&
|
||||
isSwitchedToBearish;
|
||||
|
||||
//
|
||||
conditions.isStrong = isStrong;
|
||||
conditions.isBullish = isBullish;
|
||||
conditions.isBearish = isBearish;
|
||||
conditions.isSwitchedToBullish = isSwitchedToBullish;
|
||||
conditions.isSwitchedToBearish = isSwitchedToBearish;
|
||||
conditions.isStrongSwitchedToBullish = isStrongSwitchedToBullish;
|
||||
conditions.isStrongSwitchedToBearish = isStrongSwitchedToBearish;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Props ...
|
||||
int handler;
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
bool DefineBuffers()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
// Props ...
|
||||
//
|
||||
string mSymbol; // Symbol
|
||||
ENUM_TIMEFRAMES mPeriod; // TimeFrame
|
||||
|
||||
//
|
||||
XADXTDInputs mInputs; // Properties
|
||||
};
|
||||
|
||||
//
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,766 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XSCXOBVGStrategy
|
||||
// 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 "../Helpers/x-saherelm.xtm.helper.mq5"
|
||||
#include "../Helpers/x-saherelm.xstr.helper.mq5"
|
||||
#include "../Classes/x-saherelm.xstrategy.class.mq5"
|
||||
|
||||
//
|
||||
string XOBVGStartegyToken = "XOBVG";
|
||||
|
||||
//
|
||||
class XSCXOBVGStrategy : public XSCBaseStrategy
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Constructor(s) ...
|
||||
void XSCXOBVGStrategy(
|
||||
//
|
||||
// Base ...
|
||||
string _symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES _period, // Trading TimeFrame
|
||||
ENUM_TIMEFRAMES _hindPeriod, // Hind Period
|
||||
ENUM_TIMEFRAMES _mediestPeriod, // Mediest Period
|
||||
double _volume, // Voluem
|
||||
double _r2r, // Risk/Reward Ratio
|
||||
int _slippage, // Trader Slippage
|
||||
long _magicNumber, // Trader Magic Number
|
||||
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
|
||||
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
|
||||
double _tpPoint = 0, // TP As Point
|
||||
double _slPoint = 0, // SL As Point
|
||||
bool _allowLong = true,
|
||||
bool _allowShort = true,
|
||||
int _maxAllowedLongs = 0,
|
||||
int _maxAllowedShorts = 0 //
|
||||
) : XSCBaseStrategy(_symbol,
|
||||
_period,
|
||||
_volume,
|
||||
_r2r,
|
||||
_slippage,
|
||||
_magicNumber,
|
||||
_useTPSLAsPoint,
|
||||
_forceMaxTPSLAsPoint,
|
||||
_tpPoint,
|
||||
_slPoint,
|
||||
_allowLong,
|
||||
_allowShort,
|
||||
_maxAllowedLongs,
|
||||
_maxAllowedShorts //
|
||||
)
|
||||
{
|
||||
//
|
||||
mHindPeriod = _hindPeriod;
|
||||
mMediestPeriod = _mediestPeriod;
|
||||
|
||||
//
|
||||
SetAlertPrefix(GetTag());
|
||||
|
||||
//
|
||||
hindBar.Clean();
|
||||
hindBullishOrderBlock.Clean();
|
||||
hindBearishOrderBlock.Clean();
|
||||
|
||||
//
|
||||
medBar.Clean();
|
||||
medBullishOrderBlock.Clean();
|
||||
medBearishOrderBlock.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
void ~XSCXOBVGStrategy()
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
// Getter / Setter (s) ...
|
||||
|
||||
//
|
||||
ENUM_TIMEFRAMES HindPeriod()
|
||||
{
|
||||
return mHindPeriod;
|
||||
}
|
||||
|
||||
//
|
||||
void HindPeriod(ENUM_TIMEFRAMES value)
|
||||
{
|
||||
mHindPeriod = value;
|
||||
}
|
||||
|
||||
//
|
||||
ENUM_TIMEFRAMES MediestPeriod()
|
||||
{
|
||||
return mMediestPeriod;
|
||||
}
|
||||
|
||||
//
|
||||
void MediestPeriod(ENUM_TIMEFRAMES value)
|
||||
{
|
||||
mMediestPeriod = value;
|
||||
}
|
||||
|
||||
//
|
||||
// Overrides ...
|
||||
|
||||
//
|
||||
// Customize Strategy Identifier ...
|
||||
string GetTag() override
|
||||
{
|
||||
return XOBVGStartegyToken;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Conditions For Signal ...
|
||||
bool HasSignal(
|
||||
XSignal &signal //
|
||||
) override
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
signal.Clean();
|
||||
|
||||
//
|
||||
double sl = 0;
|
||||
double tp = 0;
|
||||
double risk = 0;
|
||||
double entry = 0;
|
||||
double reward = 0;
|
||||
double r2r = R2R();
|
||||
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
|
||||
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
|
||||
|
||||
//
|
||||
bool hasLong = false;
|
||||
bool hasShort = false;
|
||||
|
||||
//
|
||||
XOHCL tmpHSW[];
|
||||
XOHCL tmpLSW[];
|
||||
|
||||
//
|
||||
bool useHammer = true;
|
||||
bool useMorningStar = false;
|
||||
bool useBullishEngulfing = true;
|
||||
bool useBullishMaurubozu = true;
|
||||
|
||||
//
|
||||
bool useShootingStar = true;
|
||||
bool useEveningStar = false;
|
||||
bool useBearishEngulfing = true;
|
||||
bool useBearishMaurubozu = true;
|
||||
|
||||
//
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
1 //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double ll3 = cBar.FindLowest(
|
||||
3,
|
||||
MODE_LOW //
|
||||
);
|
||||
double hh3 = cBar.FindHighest(
|
||||
3,
|
||||
MODE_HIGH //
|
||||
);
|
||||
|
||||
//
|
||||
result = hindBar.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
result = hindBar.Init(
|
||||
mSymbol,
|
||||
mHindPeriod,
|
||||
1 //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
bool hasBullishOrderBlock = hindBullishOrderBlock.IsValid();
|
||||
bool hasBearishOrderBlock = hindBearishOrderBlock.IsValid();
|
||||
result =
|
||||
//
|
||||
hasBullishOrderBlock
|
||||
//
|
||||
||
|
||||
//
|
||||
hasBearishOrderBlock
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
hasBullishOrderBlock = hindBar.HasBullishOrderBlock(hindBullishOrderBlock);
|
||||
hasBearishOrderBlock = hindBar.HasBearishOrderBlock(hindBearishOrderBlock);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
hasBullishOrderBlock
|
||||
//
|
||||
||
|
||||
//
|
||||
hasBearishOrderBlock
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
hindBar.Clean();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (hasBullishOrderBlock)
|
||||
{
|
||||
//
|
||||
DrawBullishOrderBlock(
|
||||
hindBullishOrderBlock,
|
||||
ChartID() //
|
||||
);
|
||||
|
||||
//
|
||||
// Try to Detect and Order Block Inside this ...
|
||||
// in Mediest ...
|
||||
result = medBar.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
result = medBar.Init(
|
||||
mSymbol,
|
||||
mMediestPeriod,
|
||||
1 //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
medBar.Clean();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = medBar.HasBullishOrderBlock(medBullishOrderBlock);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
medBar.Clean();
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
DrawBullishOrderBlock(
|
||||
medBullishOrderBlock,
|
||||
ChartID() //
|
||||
);
|
||||
|
||||
//
|
||||
// Check Order Block Is Inside HINDOB ...
|
||||
result =
|
||||
//
|
||||
(medBullishOrderBlock.low >= hindBullishOrderBlock.low &&
|
||||
medBullishOrderBlock.low <= hindBullishOrderBlock.high)
|
||||
//
|
||||
||
|
||||
//
|
||||
(medBullishOrderBlock.high <= hindBullishOrderBlock.high &&
|
||||
medBullishOrderBlock.high >= hindBullishOrderBlock.low)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
// Check Price ...
|
||||
result =
|
||||
//
|
||||
ll3 < medBullishOrderBlock.high &&
|
||||
ll3 > hindBullishOrderBlock.low
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
hindBar.Clean();
|
||||
hindBullishOrderBlock.Clean();
|
||||
hindBearishOrderBlock.Clean();
|
||||
|
||||
//
|
||||
medBar.Clean();
|
||||
medBullishOrderBlock.Clean();
|
||||
medBearishOrderBlock.Clean();
|
||||
|
||||
//
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
|
||||
//
|
||||
RemoveDraws();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
hasLong = result;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// Detect and FVG Inside ...
|
||||
result = medBar.HasBullishFVG(
|
||||
fvgUpper,
|
||||
fvgLower //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
hindBar.Clean();
|
||||
hindBullishOrderBlock.Clean();
|
||||
hindBearishOrderBlock.Clean();
|
||||
|
||||
//
|
||||
medBar.Clean();
|
||||
medBullishOrderBlock.Clean();
|
||||
medBearishOrderBlock.Clean();
|
||||
|
||||
//
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
|
||||
//
|
||||
RemoveDraws();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
DrawBullishFVG(
|
||||
medBar,
|
||||
fvgUpper,
|
||||
fvgLower,
|
||||
ChartID() //
|
||||
);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
(fvgLower >= hindBullishOrderBlock.low &&
|
||||
fvgLower <= hindBullishOrderBlock.high)
|
||||
//
|
||||
||
|
||||
//
|
||||
(fvgUpper <= hindBullishOrderBlock.high &&
|
||||
fvgUpper >= hindBullishOrderBlock.low)
|
||||
//
|
||||
;
|
||||
//
|
||||
// Check Price ...
|
||||
result =
|
||||
//
|
||||
ll3 < fvgUpper &&
|
||||
ll3 > hindBullishOrderBlock.low
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
hindBar.Clean();
|
||||
hindBullishOrderBlock.Clean();
|
||||
hindBearishOrderBlock.Clean();
|
||||
|
||||
//
|
||||
medBar.Clean();
|
||||
medBullishOrderBlock.Clean();
|
||||
medBearishOrderBlock.Clean();
|
||||
|
||||
//
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
|
||||
//
|
||||
RemoveDraws();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
hasLong = result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (hasBearishOrderBlock)
|
||||
{
|
||||
//
|
||||
DrawBearishOrderBlock(
|
||||
hindBearishOrderBlock,
|
||||
ChartID() //
|
||||
);
|
||||
|
||||
//
|
||||
// Try to Detect and Order Block Inside this ...
|
||||
// in Mediest ...
|
||||
result = medBar.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
result = medBar.Init(
|
||||
mSymbol,
|
||||
mMediestPeriod,
|
||||
1 //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
medBar.Clean();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = medBar.HasBearishOrderBlock(medBearishOrderBlock);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
medBar.Clean();
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
DrawBearishOrderBlock(
|
||||
medBearishOrderBlock,
|
||||
ChartID() //
|
||||
);
|
||||
|
||||
//
|
||||
// Check Order Block Is Inside HINDOB ...
|
||||
result =
|
||||
//
|
||||
(medBullishOrderBlock.low >= hindBearishOrderBlock.low &&
|
||||
medBearishOrderBlock.low <= hindBearishOrderBlock.high)
|
||||
//
|
||||
||
|
||||
//
|
||||
(medBearishOrderBlock.high <= hindBearishOrderBlock.high &&
|
||||
medBearishOrderBlock.high >= hindBearishOrderBlock.low)
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
// Detect and FVG Inside ...
|
||||
result = medBar.HasBearishFVG(
|
||||
fvgUpper,
|
||||
fvgLower //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
hindBar.Clean();
|
||||
hindBullishOrderBlock.Clean();
|
||||
hindBearishOrderBlock.Clean();
|
||||
|
||||
//
|
||||
medBar.Clean();
|
||||
medBullishOrderBlock.Clean();
|
||||
medBearishOrderBlock.Clean();
|
||||
|
||||
//
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
|
||||
//
|
||||
RemoveDraws();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
DrawBearishFVG(
|
||||
medBar,
|
||||
fvgUpper,
|
||||
fvgLower,
|
||||
ChartID() //
|
||||
);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
(fvgLower >= hindBearishOrderBlock.low &&
|
||||
fvgLower <= hindBearishOrderBlock.high)
|
||||
//
|
||||
||
|
||||
//
|
||||
(fvgUpper <= hindBearishOrderBlock.high &&
|
||||
fvgUpper >= hindBearishOrderBlock.low)
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
hindBar.Clean();
|
||||
hindBullishOrderBlock.Clean();
|
||||
hindBearishOrderBlock.Clean();
|
||||
|
||||
//
|
||||
medBar.Clean();
|
||||
medBullishOrderBlock.Clean();
|
||||
medBearishOrderBlock.Clean();
|
||||
|
||||
//
|
||||
fvgUpper = 0;
|
||||
fvgLower = 0;
|
||||
|
||||
//
|
||||
RemoveDraws();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = hasLong || hasShort;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (hasLong)
|
||||
{
|
||||
//
|
||||
// Long ...
|
||||
|
||||
//
|
||||
bool isHammer = !useHammer
|
||||
? false
|
||||
: cBar.IsHammer();
|
||||
bool isMorningStar = !useMorningStar
|
||||
? false
|
||||
: cBar.IsMorningStar();
|
||||
bool isBullishMarubozu = !useBullishEngulfing
|
||||
? false
|
||||
: cBar.IsBullishMarubozu();
|
||||
bool isBullishEngulfing = !useBullishMaurubozu
|
||||
? false
|
||||
: cBar.IsBullishEngulfing();
|
||||
|
||||
//
|
||||
bool isBullishTrend = cBar.HasBullishTrend(
|
||||
tmpHSW,
|
||||
tmpLSW,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
// Find Swing Low Above of EMA ...
|
||||
// Find Swing High Above of EMA ...
|
||||
// Fins Swing Low Below of EMA ...
|
||||
// Detect Bullish Pattern ...
|
||||
hasLong =
|
||||
//
|
||||
true
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
isHammer
|
||||
//
|
||||
||
|
||||
//
|
||||
isMorningStar
|
||||
//
|
||||
||
|
||||
//
|
||||
isBullishMarubozu
|
||||
//
|
||||
||
|
||||
//
|
||||
isBullishEngulfing
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
if (hasLong)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_BUY;
|
||||
|
||||
//
|
||||
// sl = tmpLSW[ArraySize(tmpLSW) - 1].low;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (hasShort)
|
||||
{
|
||||
//
|
||||
// Short ...
|
||||
bool isShootingStar = !useShootingStar
|
||||
? false
|
||||
: cBar.IsShootingStar();
|
||||
bool isEveningStar = !useEveningStar
|
||||
? false
|
||||
: cBar.IsEveningStar();
|
||||
bool isBearishEngulfing = !useBearishEngulfing
|
||||
? false
|
||||
: cBar.IsBearishEngulfing();
|
||||
bool isBearishMaurubozu = !useBearishMaurubozu
|
||||
? false
|
||||
: cBar.IsBearishMarubozu();
|
||||
|
||||
//
|
||||
bool isBearishTrend = cBar.HasBearishTrend(
|
||||
tmpHSW,
|
||||
tmpLSW,
|
||||
true //
|
||||
);
|
||||
|
||||
//
|
||||
hasShort =
|
||||
//
|
||||
false
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
isShootingStar
|
||||
//
|
||||
||
|
||||
//
|
||||
isEveningStar
|
||||
//
|
||||
||
|
||||
//
|
||||
isBearishEngulfing
|
||||
//
|
||||
||
|
||||
//
|
||||
isBearishMaurubozu
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
if (hasShort)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_SELL;
|
||||
|
||||
//
|
||||
// sl = tmpHSW[ArraySize(tmpHSW) - 1].high;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = hasLong || hasShort;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
entry = GetEntry(mSymbol, type);
|
||||
CalculateTPSLByPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
|
||||
//
|
||||
result = signal.Prepare(
|
||||
mSymbol,
|
||||
GetTag(),
|
||||
mPeriod,
|
||||
type,
|
||||
mode,
|
||||
entry,
|
||||
mVolume,
|
||||
sl,
|
||||
tp //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
ENUM_TIMEFRAMES mHindPeriod; // Hind Period
|
||||
ENUM_TIMEFRAMES mMediestPeriod; // Mediest Period
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
XOHCL hindBar;
|
||||
XOHCL hindBullishOrderBlock;
|
||||
XOHCL hindBearishOrderBlock;
|
||||
|
||||
//
|
||||
XOHCL medBar;
|
||||
XOHCL medBullishOrderBlock;
|
||||
XOHCL medBearishOrderBlock;
|
||||
|
||||
//
|
||||
double fvgUpper;
|
||||
double fvgLower;
|
||||
};
|
||||
|
||||
//
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,792 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XSCXSRBRStrategy
|
||||
// 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.xstrategy.class.mq5"
|
||||
|
||||
//
|
||||
string XSRBRStartegyToken = "XSRBR";
|
||||
|
||||
//
|
||||
class XSCXSRBRStrategy : public XSCBaseStrategy
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Constructor(s) ...
|
||||
void XSCXSRBRStrategy(
|
||||
//
|
||||
// Base ...
|
||||
string _symbol, // Trading Symbol
|
||||
ENUM_TIMEFRAMES _period, // Trading TimeFrame
|
||||
double _volume, // Voluem
|
||||
double _r2r, // Risk/Reward Ratio
|
||||
int _slippage, // Trader Slippage
|
||||
long _magicNumber, // Trader Magic Number
|
||||
bool _allowLong = true,
|
||||
bool _allowShort = true,
|
||||
int _maxAllowedLongs = 0,
|
||||
int _maxAllowedShorts = 0 //
|
||||
) : XSCBaseStrategy(_symbol,
|
||||
_period,
|
||||
_volume,
|
||||
_r2r,
|
||||
_slippage,
|
||||
_magicNumber,
|
||||
_allowLong,
|
||||
_allowShort,
|
||||
_maxAllowedLongs,
|
||||
_maxAllowedShorts //
|
||||
)
|
||||
{
|
||||
//
|
||||
mThreshold = 5;
|
||||
mVerificationsStep = 21;
|
||||
mConditionsValidationAge = 20;
|
||||
|
||||
//
|
||||
SetAlertPrefix(XSRBRStartegyToken);
|
||||
}
|
||||
|
||||
//
|
||||
// Getter / Setter (s) ...
|
||||
|
||||
//
|
||||
double Treshold()
|
||||
{
|
||||
return mThreshold;
|
||||
}
|
||||
|
||||
//
|
||||
void Treshold(double value)
|
||||
{
|
||||
//
|
||||
if (value < 0)
|
||||
{
|
||||
value = 0;
|
||||
}
|
||||
|
||||
//
|
||||
mThreshold = value;
|
||||
}
|
||||
|
||||
//
|
||||
int VerificationsStep()
|
||||
{
|
||||
return mVerificationsStep;
|
||||
}
|
||||
|
||||
//
|
||||
void VerificationsStep(int value)
|
||||
{
|
||||
//
|
||||
if (value < 5)
|
||||
{
|
||||
value = 5;
|
||||
}
|
||||
|
||||
//
|
||||
mVerificationsStep = value;
|
||||
}
|
||||
|
||||
//
|
||||
int ConditionsValidationAge()
|
||||
{
|
||||
return mConditionsValidationAge;
|
||||
}
|
||||
|
||||
//
|
||||
void ConditionsValidationAge(int value)
|
||||
{
|
||||
//
|
||||
if (value < 0)
|
||||
{
|
||||
value = 0;
|
||||
}
|
||||
|
||||
//
|
||||
mConditionsValidationAge = value;
|
||||
}
|
||||
|
||||
//
|
||||
bool DarwSupportAndResistances()
|
||||
{
|
||||
return mDarwSupportAndResistances;
|
||||
}
|
||||
|
||||
//
|
||||
void DarwSupportAndResistances(bool value)
|
||||
{
|
||||
//
|
||||
mDarwSupportAndResistances = value;
|
||||
|
||||
//
|
||||
if (!value)
|
||||
{
|
||||
//
|
||||
supportPivot.Remove();
|
||||
resistancePivot.Remove();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Overrides ...
|
||||
|
||||
//
|
||||
// Customize Strategy Identifier ...
|
||||
string GetTag() override
|
||||
{
|
||||
return XSRBRStartegyToken;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Conditions For Signal ...
|
||||
bool HasSignal(
|
||||
XSignal &signal //
|
||||
) override
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Try to Detect Trend ...
|
||||
result = trendDetector.HasTrend();
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
result = trendDetector.FindTrend(
|
||||
mSymbol,
|
||||
mPeriod //
|
||||
);
|
||||
|
||||
//
|
||||
if (!result ||
|
||||
(!trendDetector.isUpTrend && !trendDetector.isDownTrend))
|
||||
{
|
||||
//
|
||||
trendDetector.Clean();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check Resistance Exists or not ...
|
||||
// if Not, Try to Find One ...
|
||||
if (!resistancePivot.isResistance)
|
||||
{
|
||||
//
|
||||
result = resistancePivot.FindLastResistance(
|
||||
mSymbol,
|
||||
mPeriod //
|
||||
);
|
||||
|
||||
//
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
resistancePivot.Clean();
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
if (DarwSupportAndResistances())
|
||||
{
|
||||
resistancePivot.Draw(ChartID());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check Support Exists or not ...
|
||||
// if Not, try to Find One ...
|
||||
if (!supportPivot.isSupport)
|
||||
{
|
||||
//
|
||||
result = supportPivot.FindLastSupport(
|
||||
mSymbol,
|
||||
mPeriod //
|
||||
);
|
||||
|
||||
//
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
supportPivot.Clean();
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
if (DarwSupportAndResistances())
|
||||
{
|
||||
supportPivot.Draw(ChartID());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Retrieve Bar 1 ...
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
1 //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
CheckConditionLife();
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
signal.Clean();
|
||||
|
||||
//
|
||||
double sl = 0;
|
||||
double tp = 0;
|
||||
double risk = 0;
|
||||
double entry = 0;
|
||||
double reward = 0;
|
||||
double r2r = R2R();
|
||||
ENUM_POSITION_TYPE type;
|
||||
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
|
||||
|
||||
//
|
||||
bool isSupportBreaked = supportPivot.IsBreaked();
|
||||
bool isSupportRejected = supportPivot.IsRejected();
|
||||
|
||||
//
|
||||
bool isResistancetBreaked = resistancePivot.IsBreaked();
|
||||
bool isResistancetRejected = resistancePivot.IsRejected();
|
||||
|
||||
//
|
||||
bool isBarBullishPattern =
|
||||
//
|
||||
cBar.IsBullish() &&
|
||||
cBar.HasStrongBody() &&
|
||||
(cBar.IsHammer() ||
|
||||
cBar.IsBullishEngulf())
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
bool isBarBearishPattern =
|
||||
//
|
||||
cBar.IsBearish() &&
|
||||
cBar.HasStrongBody() &&
|
||||
(cBar.IsShootingStar() ||
|
||||
cBar.IsBearishEngulf())
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Up Trend ...
|
||||
if (trendDetector.isUpTrend)
|
||||
{
|
||||
//
|
||||
// During Up Trend ...
|
||||
// Supports Must Rejected ...
|
||||
// Resistance Must Breaked ...
|
||||
|
||||
//
|
||||
// Check Trend Trading ...
|
||||
// Check Based Support ...
|
||||
bool hasSupportLong =
|
||||
//
|
||||
isSupportRejected &&
|
||||
isBarBullishPattern
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Check Trend Trading ...
|
||||
// Check Based On Resistance ...
|
||||
bool hasResistanceLong =
|
||||
//
|
||||
isResistancetBreaked &&
|
||||
isBarBullishPattern
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Check Trend Reversal Trading ...
|
||||
// Check Based Support ...
|
||||
bool hasSupportShort =
|
||||
//
|
||||
isSupportBreaked &&
|
||||
isBarBearishPattern
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Check Trend Reversal Trading ...
|
||||
// Check Based On Resistance ...
|
||||
bool hasResistanceShort =
|
||||
//
|
||||
isResistancetRejected &&
|
||||
isBarBearishPattern
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Check Trend Trading ...
|
||||
bool hasLong =
|
||||
//
|
||||
hasSupportLong ||
|
||||
hasResistanceLong
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Check Trend Reversal Trading ...
|
||||
bool hasShort =
|
||||
//
|
||||
hasSupportShort ||
|
||||
hasResistanceShort
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Filling Signal ...
|
||||
if (hasLong)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_BUY;
|
||||
entry = GetEntry(
|
||||
_Symbol,
|
||||
type //
|
||||
);
|
||||
|
||||
//
|
||||
if (hasSupportLong)
|
||||
{
|
||||
//
|
||||
sl = supportPivot.price;
|
||||
if (supportPivot._threshold > 0)
|
||||
{
|
||||
//
|
||||
double threshold = GetPoints(_Symbol) * supportPivot._threshold;
|
||||
sl -= threshold;
|
||||
}
|
||||
|
||||
//
|
||||
CalculateTPSLBtPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
}
|
||||
else if (hasResistanceLong)
|
||||
{
|
||||
//
|
||||
sl = resistancePivot.price;
|
||||
if (resistancePivot._threshold > 0)
|
||||
{
|
||||
//
|
||||
double threshold = GetPoints(_Symbol) * resistancePivot._threshold;
|
||||
sl -= threshold;
|
||||
}
|
||||
|
||||
//
|
||||
CalculateTPSLBtPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
result = signal.Prepare(
|
||||
_Symbol,
|
||||
"XSUPRES",
|
||||
_Period,
|
||||
type,
|
||||
mode,
|
||||
entry,
|
||||
mVolume,
|
||||
sl,
|
||||
tp //
|
||||
);
|
||||
}
|
||||
else if (hasShort)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_SELL;
|
||||
entry = GetEntry(
|
||||
_Symbol,
|
||||
type //
|
||||
);
|
||||
|
||||
//
|
||||
if (hasSupportShort)
|
||||
{
|
||||
//
|
||||
sl = supportPivot.price;
|
||||
if (supportPivot._threshold > 0)
|
||||
{
|
||||
//
|
||||
double threshold = GetPoints(_Symbol) * supportPivot._threshold;
|
||||
sl += threshold;
|
||||
}
|
||||
|
||||
//
|
||||
CalculateTPSLBtPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
}
|
||||
else if (hasResistanceShort)
|
||||
{
|
||||
//
|
||||
sl = resistancePivot.price;
|
||||
if (resistancePivot._threshold > 0)
|
||||
{
|
||||
//
|
||||
double threshold = GetPoints(_Symbol) * resistancePivot._threshold;
|
||||
sl += threshold;
|
||||
}
|
||||
|
||||
//
|
||||
CalculateTPSLBtPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
result = signal.Prepare(
|
||||
_Symbol,
|
||||
"XSUPRES",
|
||||
_Period,
|
||||
type,
|
||||
mode,
|
||||
entry,
|
||||
mVolume,
|
||||
sl,
|
||||
tp //
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Down Trend ...
|
||||
else if (trendDetector.isDownTrend)
|
||||
{
|
||||
//
|
||||
// During Down Trend ...
|
||||
// Supports Must Breaked ...
|
||||
// Resistance Must Rejected ...
|
||||
|
||||
//
|
||||
// Check Trend Reversal Trading ...
|
||||
// Check Based Support ...
|
||||
bool hasSupportLong =
|
||||
//
|
||||
isSupportRejected &&
|
||||
isBarBullishPattern
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Check Trend Reversal Trading ...
|
||||
// Check Based On Resistance ...
|
||||
bool hasResistanceLong =
|
||||
//
|
||||
isResistancetBreaked &&
|
||||
isBarBullishPattern
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Check Trend Trading ...
|
||||
// Check Based Support ...
|
||||
bool hasSupportShort =
|
||||
//
|
||||
isSupportBreaked &&
|
||||
isBarBearishPattern
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Check Trend Trading ...
|
||||
// Check Based On Resistance ...
|
||||
bool hasResistanceShort =
|
||||
//
|
||||
isResistancetRejected &&
|
||||
isBarBearishPattern
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Check Trend Reversal Trading ...
|
||||
bool hasLong =
|
||||
//
|
||||
hasSupportLong ||
|
||||
hasResistanceLong
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Check Trend Trading ...
|
||||
bool hasShort =
|
||||
//
|
||||
hasSupportShort ||
|
||||
hasResistanceShort
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Filling Signal ...
|
||||
if (hasLong)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_BUY;
|
||||
entry = GetEntry(
|
||||
_Symbol,
|
||||
type //
|
||||
);
|
||||
|
||||
//
|
||||
if (hasSupportLong)
|
||||
{
|
||||
//
|
||||
sl = supportPivot.price;
|
||||
if (supportPivot._threshold > 0)
|
||||
{
|
||||
//
|
||||
double threshold = GetPoints(_Symbol) * supportPivot._threshold;
|
||||
sl -= threshold;
|
||||
}
|
||||
|
||||
//
|
||||
CalculateTPSLBtPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
}
|
||||
else if (hasResistanceLong)
|
||||
{
|
||||
//
|
||||
sl = resistancePivot.price;
|
||||
if (resistancePivot._threshold > 0)
|
||||
{
|
||||
//
|
||||
double threshold = GetPoints(_Symbol) * resistancePivot._threshold;
|
||||
sl -= threshold;
|
||||
}
|
||||
|
||||
//
|
||||
CalculateTPSLBtPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
result = signal.Prepare(
|
||||
_Symbol,
|
||||
"XSUPRES",
|
||||
_Period,
|
||||
type,
|
||||
mode,
|
||||
entry,
|
||||
mVolume,
|
||||
sl,
|
||||
tp //
|
||||
);
|
||||
}
|
||||
else if (hasShort)
|
||||
{
|
||||
//
|
||||
type = POSITION_TYPE_SELL;
|
||||
entry = GetEntry(
|
||||
_Symbol,
|
||||
type //
|
||||
);
|
||||
|
||||
//
|
||||
if (hasSupportShort)
|
||||
{
|
||||
//
|
||||
sl = supportPivot.price;
|
||||
if (supportPivot._threshold > 0)
|
||||
{
|
||||
//
|
||||
double threshold = GetPoints(_Symbol) * supportPivot._threshold;
|
||||
sl += threshold;
|
||||
}
|
||||
|
||||
//
|
||||
CalculateTPSLBtPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
}
|
||||
else if (hasResistanceShort)
|
||||
{
|
||||
//
|
||||
sl = resistancePivot.price;
|
||||
if (resistancePivot._threshold > 0)
|
||||
{
|
||||
//
|
||||
double threshold = GetPoints(_Symbol) * resistancePivot._threshold;
|
||||
sl += threshold;
|
||||
}
|
||||
|
||||
//
|
||||
CalculateTPSLBtPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
result = signal.Prepare(
|
||||
_Symbol,
|
||||
"XSUPRES",
|
||||
_Period,
|
||||
type,
|
||||
mode,
|
||||
entry,
|
||||
mVolume,
|
||||
sl,
|
||||
tp //
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (!result)
|
||||
{
|
||||
CheckConditionLife();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Notify Signal Execution ...
|
||||
void OnSignalExecuted(XSignal &signal) override
|
||||
{
|
||||
ResetConditions();
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Pivots Detecting ...
|
||||
double mThreshold; // Pivots Edge's Threshold ...
|
||||
int mVerificationsStep; // Pivots Verification Steps ...
|
||||
int mConditionsValidationAge; // How Many Bars a Support or Resistance is Valid ...
|
||||
|
||||
//
|
||||
XPivot supportPivot;
|
||||
XPivot resistancePivot;
|
||||
|
||||
//
|
||||
bool mDarwSupportAndResistances; // Draw Last Found Support and Resistance
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
// Check Conditions Time Life ...
|
||||
void CheckConditionLife()
|
||||
{
|
||||
//
|
||||
datetime cTime = TimeCurrent();
|
||||
datetime lTime =
|
||||
//
|
||||
supportPivot.time < resistancePivot.time
|
||||
? supportPivot.time
|
||||
: resistancePivot.time
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
bool canReset =
|
||||
//
|
||||
(
|
||||
//
|
||||
(((int)cTime - (int)lTime) / PeriodSeconds(mPeriod)) > mConditionsValidationAge
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
if (canReset)
|
||||
{
|
||||
ResetConditions();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Reset Conditions ...
|
||||
void ResetConditions()
|
||||
{
|
||||
//
|
||||
trendDetector.Clean();
|
||||
|
||||
//
|
||||
supportPivot.Remove();
|
||||
supportPivot.Clean();
|
||||
|
||||
//
|
||||
resistancePivot.Remove();
|
||||
resistancePivot.Clean();
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
@@ -1,619 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center XSAMPLE MQL5 Expert Advisor
|
||||
// -------------------------------------------------
|
||||
// Name: XSAMPLE
|
||||
// Description: an Exper Advisor which used RSI and MA
|
||||
// to Analyse Market ...
|
||||
//
|
||||
// Maintainer:
|
||||
// ------------
|
||||
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||
//
|
||||
//////////////////////////////////////////////////////x
|
||||
//
|
||||
// Global Properties ...
|
||||
#property copyright "Copyright 2023, SaherElm IT Center"
|
||||
#property link "https://saherelm.ir"
|
||||
#property version "1.00"
|
||||
#property description "SaherElm XSAMPLE"
|
||||
#property strict
|
||||
|
||||
//
|
||||
#include "../Libraries/x-saherelm.draw.lib.mq5"
|
||||
#include "../Classes/x-saherelm.xalert.class.mq5"
|
||||
#include "../Classes/x-saherelm.xtrade.class.mq5"
|
||||
#include "../Libraries/x-saherelm.common.lib.mq5"
|
||||
|
||||
//
|
||||
#define ShortName "XSAMPLE"
|
||||
|
||||
//
|
||||
int pivotLifeTime = 20;
|
||||
int pivotBreakoutsLifeTime = 10;
|
||||
ENUM_TIMEFRAMES destPEriod = PERIOD_H4;
|
||||
|
||||
//
|
||||
int xAge = 0;
|
||||
|
||||
//
|
||||
double lastHH = 0;
|
||||
double lastUpper = 0;
|
||||
double lastDestHH = 0;
|
||||
|
||||
//
|
||||
double lastLL = 0;
|
||||
double lastLower = 0;
|
||||
double lastDestLL = 0;
|
||||
|
||||
//
|
||||
datetime lastTime = NULL;
|
||||
datetime lastDestTime = NULL;
|
||||
|
||||
//
|
||||
XSCAlert *mAlert;
|
||||
XSCTrade *mTrader;
|
||||
|
||||
//
|
||||
XBarTracker xBarTracker;
|
||||
XMarketCycle xDestCycle;
|
||||
|
||||
//
|
||||
// Initialization ...
|
||||
int OnInit()
|
||||
{
|
||||
//
|
||||
drawPrefix = ShortName;
|
||||
|
||||
//
|
||||
if (!InitialEA())
|
||||
{
|
||||
return INIT_PARAMETERS_INCORRECT;
|
||||
}
|
||||
|
||||
//
|
||||
// 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
|
||||
|
||||
//
|
||||
// De Initialize XSampleEA Providers ...
|
||||
}
|
||||
|
||||
//
|
||||
// On Tick Handler ...
|
||||
void OnTick()
|
||||
{
|
||||
//
|
||||
if (!xBarTracker.IsNewBar())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
xDestCycle.Update(0);
|
||||
|
||||
//
|
||||
Analyze();
|
||||
|
||||
//
|
||||
ManxAge();
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
|
||||
//
|
||||
bool InitialEA()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
mAlert = new XSCAlert();
|
||||
mAlert.SetLogAlerts(true);
|
||||
mAlert.SetPrefix(ShortName);
|
||||
mAlert.SetEnableAlerts(true);
|
||||
mAlert.SetPushAlerts(false);
|
||||
mAlert.SetMailAlerts(false);
|
||||
mAlert.SetTerminalAlerts(false);
|
||||
|
||||
//
|
||||
mTrader = new XSCTrade(
|
||||
10,
|
||||
78692110,
|
||||
0,
|
||||
0,
|
||||
0 //
|
||||
);
|
||||
|
||||
//
|
||||
result = xBarTracker.Init(
|
||||
_Symbol,
|
||||
_Period //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = xDestCycle.Init(
|
||||
_Symbol,
|
||||
_Period,
|
||||
X_MARKET_CYCLE_MEDIUM,
|
||||
X_PERIOD_MANUALLY,
|
||||
destPEriod,
|
||||
"DEST" //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
void Analyze()
|
||||
{
|
||||
//
|
||||
XOHCL cBar;
|
||||
cBar.Init(
|
||||
_Symbol,
|
||||
_Period,
|
||||
1 //
|
||||
);
|
||||
|
||||
//
|
||||
if (IsLookingForBoundary())
|
||||
{
|
||||
FindBoundary();
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
double longSLPrice = 0;
|
||||
double shortSLPrice = 0;
|
||||
|
||||
// //
|
||||
// xAge = 0;
|
||||
// if (IsValid(lastTime))
|
||||
// {
|
||||
// //
|
||||
// xAge = iBarShift(
|
||||
// _Symbol,
|
||||
// _Period,
|
||||
// lastTime //
|
||||
// );
|
||||
// }
|
||||
|
||||
// //
|
||||
// if (xAge > pivotBreakoutsLifeTime)
|
||||
// {
|
||||
// //
|
||||
// lastHH = cBar.FindHighest(
|
||||
// xAge - 1,
|
||||
// MODE_HIGH //
|
||||
// );
|
||||
|
||||
// //
|
||||
// lastLL = cBar.FindLowest(
|
||||
// xAge - 1,
|
||||
// MODE_LOW //
|
||||
// );
|
||||
|
||||
// //
|
||||
// DrawPivot(lastLL, clrAqua, "PVB_L_", true);
|
||||
// DrawPivot(lastHH, clrMagenta, "PVB_H_", true);
|
||||
// }
|
||||
|
||||
//
|
||||
// Detect Breakouts for Long ...
|
||||
// - Upper Must Breaked as Resistance ...
|
||||
// - Lower Must Rejects as Support ...
|
||||
|
||||
// //
|
||||
// bool isSupRejected = cBar.IsSupportRejected(lastLower);
|
||||
// bool isResBreaked = cBar.IsResistanceBreaked(lastUpper);
|
||||
// bool isLastLLRejectedAsSupport = cBar.IsSupportRejected(lastDestLL);
|
||||
// bool isLastHHBreakedAsResistance = cBar.IsResistanceBreaked(lastDestHH);
|
||||
|
||||
// //
|
||||
// bool hasLong =
|
||||
// //
|
||||
// cBar.HasStrongBody() &&
|
||||
// (
|
||||
// //
|
||||
// (isLastLLRejectedAsSupport
|
||||
// //
|
||||
// ||
|
||||
// //
|
||||
// isLastHHBreakedAsResistance)
|
||||
// //
|
||||
// ||
|
||||
// //
|
||||
// (cBar.GetMid() > MathMax(lastLower, lastUpper) &&
|
||||
// (isResBreaked
|
||||
// //
|
||||
// ||
|
||||
// //
|
||||
// isSupRejected))
|
||||
// //
|
||||
// )
|
||||
// //
|
||||
// ;
|
||||
|
||||
// //
|
||||
// if (hasLong)
|
||||
// {
|
||||
// //
|
||||
// longSLPrice = isResBreaked
|
||||
// ? lastUpper
|
||||
// : isLastHHBreakedAsResistance
|
||||
// ? lastDestHH
|
||||
// : isSupRejected
|
||||
// ? lastLower
|
||||
// : lastDestLL;
|
||||
// }
|
||||
|
||||
//
|
||||
// Detect Breakouts for Long ...
|
||||
// - Upper Must Rejects as Resistance ...
|
||||
// - Lower Must Breaked as Support ...
|
||||
|
||||
// //
|
||||
// bool isResRejected = cBar.IsResistanceRejected(lastUpper);
|
||||
// bool isSupBreaked = cBar.IsSupportBreaked(lastLower);
|
||||
// bool isLastLLBreadedAsSupport = cBar.IsSupportBreaked(lastDestLL);
|
||||
// bool isLastHHRejectedAsResistance = cBar.IsResistanceRejected(lastDestHH);
|
||||
|
||||
// //
|
||||
// bool hasShort =
|
||||
// //
|
||||
// cBar.HasStrongBody() &&
|
||||
// (
|
||||
// //
|
||||
// (isLastLLBreadedAsSupport
|
||||
// //
|
||||
// ||
|
||||
// //
|
||||
// isLastHHRejectedAsResistance)
|
||||
// //
|
||||
// ||
|
||||
// //
|
||||
// (cBar.GetMid() < MathMin(lastLower, lastUpper) &&
|
||||
// (isSupBreaked
|
||||
// //
|
||||
// ||
|
||||
// //
|
||||
// isResRejected))
|
||||
// //
|
||||
// )
|
||||
// //
|
||||
// ;
|
||||
|
||||
// //
|
||||
// if (hasShort)
|
||||
// {
|
||||
// //
|
||||
// shortSLPrice = isSupBreaked
|
||||
// ? lastLower
|
||||
// : isLastLLBreadedAsSupport
|
||||
// ? lastDestLL
|
||||
// : isResRejected
|
||||
// ? lastUpper
|
||||
// : lastDestHH;
|
||||
// }
|
||||
|
||||
//
|
||||
//
|
||||
bool hasLong = false;
|
||||
bool hasShort = false;
|
||||
|
||||
//
|
||||
bool hasSignal = hasLong || hasShort;
|
||||
if (hasSignal)
|
||||
{
|
||||
//
|
||||
double slPrice =
|
||||
hasLong
|
||||
? longSLPrice
|
||||
: shortSLPrice;
|
||||
// double slPrice =
|
||||
// hasLong
|
||||
// ? shortSLPrice
|
||||
// : longSLPrice;
|
||||
|
||||
//
|
||||
ENUM_POSITION_TYPE mType =
|
||||
hasLong
|
||||
? POSITION_TYPE_BUY
|
||||
: POSITION_TYPE_SELL
|
||||
//
|
||||
;
|
||||
// ENUM_POSITION_TYPE mType =
|
||||
// hasLong
|
||||
// ? POSITION_TYPE_BUY
|
||||
// : POSITION_TYPE_SELL
|
||||
// //
|
||||
// ;
|
||||
|
||||
//
|
||||
double mEntry = GetEntry(
|
||||
_Symbol,
|
||||
mType //
|
||||
);
|
||||
|
||||
//
|
||||
double priceToRisk = PointToPrice(30, _Symbol);
|
||||
double priceToReward = PointToPrice(30, _Symbol);
|
||||
|
||||
//
|
||||
double mSL = 0;
|
||||
double mTP = 0;
|
||||
CalculateTPSL(
|
||||
mSL,
|
||||
mTP,
|
||||
mType,
|
||||
mEntry,
|
||||
1,
|
||||
slPrice,
|
||||
0,
|
||||
priceToRisk,
|
||||
priceToReward //
|
||||
);
|
||||
|
||||
//
|
||||
// Ignore Zero TP SL ...
|
||||
if (mTP > 0 && mSL > 0)
|
||||
{
|
||||
//
|
||||
XSignal signal;
|
||||
bool isPrepared = signal.Prepare(
|
||||
_Symbol,
|
||||
"X92",
|
||||
_Period,
|
||||
mType,
|
||||
X_ORDER_MODE_MARKET,
|
||||
mEntry,
|
||||
0.01,
|
||||
mSL,
|
||||
mTP //
|
||||
);
|
||||
|
||||
//
|
||||
if (isPrepared)
|
||||
{
|
||||
//
|
||||
ENUM_X_SIGNAL_EXECUTION_RESULT state;
|
||||
bool isExecuted = mTrader.ExecuteSignal(
|
||||
signal,
|
||||
state //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
bool resetLast =
|
||||
xAge > pivotLifeTime || hasSignal;
|
||||
|
||||
//
|
||||
if (resetLast)
|
||||
{
|
||||
//
|
||||
lastUpper = 0;
|
||||
lastLower = 0;
|
||||
|
||||
//
|
||||
RemoveDraws();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
void ManxAge()
|
||||
{
|
||||
//
|
||||
return;
|
||||
double profit = mTrader.Profit();
|
||||
if (profit > 50 || profit < -100)
|
||||
{
|
||||
//
|
||||
string comment = "EQM Hedge: " + ToString(profit);
|
||||
|
||||
//
|
||||
int numberOfClosed = mTrader.Close(comment);
|
||||
if (numberOfClosed > 0)
|
||||
{
|
||||
mAlert.Alert(comment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
bool IsLookingForBoundary()
|
||||
{
|
||||
//
|
||||
bool result = lastUpper == 0 && lastLower == 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
void FindBoundary()
|
||||
{
|
||||
//
|
||||
int zIndex = 0;
|
||||
int cIndex = 1;
|
||||
int pIndex = 2;
|
||||
int ppIndex = 3;
|
||||
|
||||
//
|
||||
// Detect Inside Bar ...
|
||||
XOHCL cBar;
|
||||
cBar.Init(
|
||||
_Symbol,
|
||||
_Period,
|
||||
1 //
|
||||
);
|
||||
|
||||
//
|
||||
XOHCL cDestBar = xDestCycle.GetBar(1);
|
||||
|
||||
//
|
||||
if (cDestBar.time != lastDestTime) {
|
||||
//
|
||||
lastDestLL = cDestBar.low;
|
||||
lastDestHH = cDestBar.high;
|
||||
|
||||
//
|
||||
lastDestTime = cDestBar.time;
|
||||
|
||||
//
|
||||
DrawPivot(lastUpper, clrOrangeRed, "Pvt_");
|
||||
DrawPivot(lastLower, clrLimeGreen, "Pvt_");
|
||||
}
|
||||
|
||||
//
|
||||
// if (cDestBar.IsInsideBar())
|
||||
// {
|
||||
// //
|
||||
// lastUpper = cDestBar.high;
|
||||
// lastLower = cDestBar.low;
|
||||
|
||||
// //
|
||||
// lastTime = TimeCurrent();
|
||||
|
||||
// //
|
||||
// DrawPivot(lastUpper, clrOrangeRed, "Pvt_");
|
||||
// DrawPivot(lastLower, clrLimeGreen, "Pvt_");
|
||||
// }
|
||||
|
||||
// //
|
||||
// if (lastUpper != cDestBar.high && lastLower != cDestBar.low)
|
||||
// {
|
||||
// //
|
||||
// lastDestHH = cDestBar.high;
|
||||
// lastDestLL = cDestBar.low;
|
||||
|
||||
// //
|
||||
// DrawPivot(lastDestLL, clrYellow, "LDST_LL_", true);
|
||||
// DrawPivot(lastDestHH, clrYellow, "LDST_HH_", true);
|
||||
|
||||
// //
|
||||
// lastDestTime = TimeCurrent();
|
||||
// }
|
||||
|
||||
//
|
||||
DrawFibo();
|
||||
}
|
||||
|
||||
//
|
||||
void DrawPivot(
|
||||
double price,
|
||||
color clr,
|
||||
string prefix,
|
||||
bool forceRemove = false //
|
||||
)
|
||||
{
|
||||
//
|
||||
long chartID = ChartID();
|
||||
datetime time1 = iTime(
|
||||
_Symbol,
|
||||
_Period,
|
||||
2 //
|
||||
);
|
||||
datetime time = iTime(
|
||||
_Symbol,
|
||||
_Period,
|
||||
0 //
|
||||
);
|
||||
|
||||
//
|
||||
string pPrefix = prefix + "P_" +
|
||||
ToString(price);
|
||||
|
||||
//
|
||||
if (IsDrawExists(prefix) && forceRemove)
|
||||
{
|
||||
RemoveDraws(prefix);
|
||||
}
|
||||
|
||||
//
|
||||
if (IsDrawExists(pPrefix))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
DrawTrendLine(
|
||||
chartID,
|
||||
pPrefix,
|
||||
0,
|
||||
time1,
|
||||
price,
|
||||
time,
|
||||
price,
|
||||
clr,
|
||||
STYLE_SOLID,
|
||||
2,
|
||||
false,
|
||||
false,
|
||||
true //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
void DrawFibo()
|
||||
{
|
||||
//
|
||||
if (!IsValid(lastDestTime) || lastDestHH == 0 || lastDestLL == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
string name = "LDST_FIb";
|
||||
|
||||
//
|
||||
datetime time1 = TimeCurrent();
|
||||
datetime time0 = lastDestTime;
|
||||
|
||||
//
|
||||
RemoveDraw(name);
|
||||
|
||||
//
|
||||
DrawFibonacci(
|
||||
ChartID(),
|
||||
name,
|
||||
0,
|
||||
time0,
|
||||
lastDestHH,
|
||||
time1,
|
||||
lastDestLL,
|
||||
clrAquamarine,
|
||||
STYLE_DOT //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1,387 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center XTest MQL5 Expert Advisor
|
||||
// -------------------------------------------------
|
||||
// Name: XTestPivotsEA
|
||||
// Description: an Exper Advisor which used XTestSetup
|
||||
// to Analyse Market ...
|
||||
//
|
||||
// Maintainer:
|
||||
// ------------
|
||||
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||
//
|
||||
//////////////////////////////////////////////////////x
|
||||
//
|
||||
// Global Properties ...
|
||||
#property copyright "Copyright 2023, SaherElm IT Center"
|
||||
#property link "https://saherelm.ir"
|
||||
#property version "1.00"
|
||||
#property description "SaherElm XTestPivotsEA"
|
||||
#property strict
|
||||
|
||||
//
|
||||
#define ShortName "XTestPivotsEA"
|
||||
|
||||
//
|
||||
// Imports ...
|
||||
#include "../Helpers/x-saherelm.xct.helper.mq5"
|
||||
#include "../Helpers/x-saherelm.xcc.helper.mq5"
|
||||
#include "../Strategies/x-saherelm.xsrbr.strategy.mq5"
|
||||
|
||||
//
|
||||
// Inputs ...
|
||||
long mMagicNumber = 78692110; // Magic Number
|
||||
int mSlippage = 10; // Slippgae
|
||||
|
||||
//
|
||||
double eaVolume = 0.01;
|
||||
double eaAllowLong = true;
|
||||
double eaAllowShort = true;
|
||||
|
||||
//
|
||||
// Variables ...
|
||||
XSCXCTHelper *mCTHelper;
|
||||
XSCXCCHelper *mCCHelper;
|
||||
|
||||
//
|
||||
XSCBaseStrategy *strategies[];
|
||||
|
||||
//
|
||||
// Event Handlers ...
|
||||
|
||||
//
|
||||
// Initialization ...
|
||||
int OnInit()
|
||||
{
|
||||
//
|
||||
if (!ValidateInputs())
|
||||
{
|
||||
return INIT_PARAMETERS_INCORRECT;
|
||||
}
|
||||
|
||||
//
|
||||
if (!InitialEA())
|
||||
{
|
||||
return INIT_FAILED;
|
||||
}
|
||||
|
||||
//
|
||||
// EventSetTimer(1);
|
||||
// EventSetMillisecondTimer(100);
|
||||
|
||||
//
|
||||
// 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
|
||||
|
||||
//
|
||||
// De Initialize XSampleEA Providers ...
|
||||
delete mCTHelper;
|
||||
delete mCCHelper;
|
||||
|
||||
//
|
||||
// EventKillTimer();
|
||||
|
||||
//
|
||||
Clean(strategies);
|
||||
}
|
||||
|
||||
//
|
||||
// On Tick Handler ...
|
||||
void OnTick()
|
||||
{
|
||||
HandleStrategiesOnTick();
|
||||
}
|
||||
|
||||
//
|
||||
// On Timer ...
|
||||
void OnTimer()
|
||||
{
|
||||
//
|
||||
// HandleStrategiesOnTick();
|
||||
}
|
||||
|
||||
//
|
||||
// Custom Functions ...
|
||||
|
||||
//
|
||||
// Validate Inputs ...
|
||||
bool ValidateInputs()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Initialize all Requirements ...
|
||||
bool InitialEA()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Bar Timer ...
|
||||
XCTInputs ctInputs;
|
||||
ctInputs.Default();
|
||||
mCTHelper = new XSCXCTHelper();
|
||||
result = mCTHelper.Init(
|
||||
_Symbol,
|
||||
_Period,
|
||||
ctInputs //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Bar Styles ...
|
||||
XCCInputs ccInputs;
|
||||
ccInputs.Default();
|
||||
mCCHelper = new XSCXCCHelper();
|
||||
result = mCCHelper.Init(
|
||||
_Symbol,
|
||||
_Period,
|
||||
ccInputs //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XSymbolParser symbolParser;
|
||||
|
||||
//
|
||||
bool drawAreas = false;
|
||||
|
||||
//
|
||||
// EURUSD ...
|
||||
string eurusdSymbol = "EURUSDb"; // symbolParser.GetEURUSDSymbol();
|
||||
if (IsValid(eurusdSymbol))
|
||||
{
|
||||
//
|
||||
// MAGIC NUMBER ...
|
||||
long magicNumber = mMagicNumber + 1;
|
||||
|
||||
// //
|
||||
// // Register XSRBR on EURUSD in M5 ...
|
||||
// XSCXSRBRStrategy *eurusdM5SRBRStrategy;
|
||||
// eurusdM5SRBRStrategy = new XSCXSRBRStrategy(
|
||||
// eurusdSymbol,
|
||||
// PERIOD_M5,
|
||||
// eaVolume,
|
||||
// 1.5, // R2R ...
|
||||
// mSlippage,
|
||||
// magicNumber,
|
||||
// eaAllowLong,
|
||||
// eaAllowShort,
|
||||
// 0, // Max Longs
|
||||
// 0 // Max Shorts
|
||||
// );
|
||||
// eurusdM5SRBRStrategy.SetAlertLogAlerts(true);
|
||||
// eurusdM5SRBRStrategy.SetAlertEnableAlerts(true);
|
||||
// eurusdM5SRBRStrategy.DarwSupportAndResistances(drawAreas);
|
||||
// RegisterStrategy(eurusdM5SRBRStrategy);
|
||||
|
||||
// //
|
||||
// // Register XSRBR on EURUSD in M10 ...
|
||||
// XSCXSRBRStrategy *eurusdM10SRBRStrategy;
|
||||
// eurusdM10SRBRStrategy = new XSCXSRBRStrategy(
|
||||
// eurusdSymbol,
|
||||
// PERIOD_M10,
|
||||
// eaVolume,
|
||||
// 1.5, // R2R ...
|
||||
// mSlippage,
|
||||
// magicNumber,
|
||||
// eaAllowLong,
|
||||
// eaAllowShort,
|
||||
// 0, // Max Longs
|
||||
// 0 // Max Shorts
|
||||
// );
|
||||
// eurusdM10SRBRStrategy.SetAlertLogAlerts(true);
|
||||
// eurusdM10SRBRStrategy.SetAlertEnableAlerts(true);
|
||||
// eurusdM10SRBRStrategy.DarwSupportAndResistances(drawAreas);
|
||||
// RegisterStrategy(eurusdM10SRBRStrategy);
|
||||
}
|
||||
|
||||
// //
|
||||
// // XAUUSD ...
|
||||
// string xauusdSymbol = "XAUUSDb";
|
||||
// if (IsValid(xauusdSymbol))
|
||||
// {
|
||||
// //
|
||||
// // MAGIC NUMBER ...
|
||||
// long magicNumber = mMagicNumber + 2;
|
||||
|
||||
// //
|
||||
// // Register XSRBR on XAUUSD in M5 ...
|
||||
// XSCXSRBRStrategy *xauusdM5SRBRStrategy;
|
||||
// xauusdM5SRBRStrategy = new XSCXSRBRStrategy(
|
||||
// xauusdSymbol,
|
||||
// PERIOD_M15,
|
||||
// eaVolume,
|
||||
// 1.5, // R2R ...
|
||||
// mSlippage,
|
||||
// magicNumber,
|
||||
// eaAllowLong,
|
||||
// eaAllowShort,
|
||||
// 0, // Max Longs
|
||||
// 0 // Max Shorts
|
||||
// );
|
||||
// xauusdM5SRBRStrategy.SetAlertLogAlerts(true);
|
||||
// xauusdM5SRBRStrategy.SetAlertEnableAlerts(true);
|
||||
// xauusdM5SRBRStrategy.DarwSupportAndResistances(drawAreas);
|
||||
// RegisterStrategy(xauusdM5SRBRStrategy);
|
||||
// }
|
||||
|
||||
//
|
||||
// GBPUSD ...
|
||||
string gbpusdSymbol = "GBPUSDb";
|
||||
if (IsValid(gbpusdSymbol))
|
||||
{
|
||||
//
|
||||
// MAGIC NUMBER ...
|
||||
long magicNumber = mMagicNumber + 3;
|
||||
|
||||
// //
|
||||
// // Register XSRBR on XAUUSD in M5 ...
|
||||
// XSCXSRBRStrategy *gbpusdM15SRBRStrategy;
|
||||
// gbpusdM15SRBRStrategy = new XSCXSRBRStrategy(
|
||||
// gbpusdSymbol,
|
||||
// PERIOD_M15,
|
||||
// eaVolume,
|
||||
// 1.5, // R2R ...
|
||||
// mSlippage,
|
||||
// magicNumber,
|
||||
// eaAllowLong,
|
||||
// eaAllowShort,
|
||||
// 0, // Max Longs
|
||||
// 0 // Max Shorts
|
||||
// );
|
||||
// gbpusdM15SRBRStrategy.SetAlertLogAlerts(true);
|
||||
// gbpusdM15SRBRStrategy.SetAlertEnableAlerts(true);
|
||||
// gbpusdM15SRBRStrategy.DarwSupportAndResistances(drawAreas);
|
||||
// RegisterStrategy(gbpusdM15SRBRStrategy);
|
||||
|
||||
//
|
||||
// Register XSRBR on XAUUSD in M5 ...
|
||||
// XSCXSRBRStrategy *gbpusdM30SRBRStrategy;
|
||||
// gbpusdM30SRBRStrategy = new XSCXSRBRStrategy(
|
||||
// gbpusdSymbol,
|
||||
// PERIOD_M30,
|
||||
// eaVolume,
|
||||
// 1.5, // R2R ...
|
||||
// mSlippage,
|
||||
// magicNumber,
|
||||
// eaAllowLong,
|
||||
// eaAllowShort,
|
||||
// 0, // Max Longs
|
||||
// 0 // Max Shorts
|
||||
// );
|
||||
// gbpusdM30SRBRStrategy.SetAlertLogAlerts(true);
|
||||
// gbpusdM30SRBRStrategy.SetAlertEnableAlerts(true);
|
||||
// gbpusdM30SRBRStrategy.DarwSupportAndResistances(drawAreas);
|
||||
// RegisterStrategy(gbpusdM30SRBRStrategy);
|
||||
}
|
||||
|
||||
//
|
||||
// USDJPY ...
|
||||
string usdjpySymbol = "USDJPYb";
|
||||
if (IsValid(usdjpySymbol))
|
||||
{
|
||||
//
|
||||
// MAGIC NUMBER ...
|
||||
long magicNumber = mMagicNumber + 3;
|
||||
|
||||
// //
|
||||
// // Register XSRBR on XAUUSD in M5 ...
|
||||
// XSCXSRBRStrategy *usdjpyM5SRBRStrategy;
|
||||
// usdjpyM5SRBRStrategy = new XSCXSRBRStrategy(
|
||||
// usdjpySymbol,
|
||||
// PERIOD_M5,
|
||||
// eaVolume,
|
||||
// 1.5, // R2R ...
|
||||
// mSlippage,
|
||||
// magicNumber,
|
||||
// eaAllowLong,
|
||||
// eaAllowShort,
|
||||
// 0, // Max Longs
|
||||
// 0 // Max Shorts
|
||||
// );
|
||||
// usdjpyM5SRBRStrategy.SetAlertLogAlerts(true);
|
||||
// usdjpyM5SRBRStrategy.SetAlertEnableAlerts(true);
|
||||
// usdjpyM5SRBRStrategy.DarwSupportAndResistances(drawAreas);
|
||||
// RegisterStrategy(usdjpyM5SRBRStrategy);
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Register Strategy ...
|
||||
void RegisterStrategy(XSCBaseStrategy *strategy)
|
||||
{
|
||||
//
|
||||
if (strategy == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
ArrayResize(
|
||||
strategies,
|
||||
ArraySize(strategies) + 1 //
|
||||
);
|
||||
|
||||
//
|
||||
strategies[ArraySize(strategies) - 1] = strategy;
|
||||
}
|
||||
|
||||
//
|
||||
// Call All Registered Strategis Tick Handler Functions ...
|
||||
void HandleStrategiesOnTick()
|
||||
{
|
||||
//
|
||||
int count = ArraySize(strategies);
|
||||
if (!IsValidSize(count))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
// Call Tick Handler Function ...
|
||||
strategies[i].HandleTick();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Custom Testing Functions ...
|
||||
|
||||
//
|
||||
@@ -1,263 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center XZoneTest MQL5 Expert Advisor
|
||||
// -------------------------------------------------
|
||||
// Name: XZoneTest
|
||||
// Description: an Exper Advisor which used RSI and MA
|
||||
// to Analyse Market ...
|
||||
//
|
||||
// Maintainer:
|
||||
// ------------
|
||||
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||
//
|
||||
//////////////////////////////////////////////////////x
|
||||
//
|
||||
// Global Properties ...
|
||||
#property copyright "Copyright 2023, SaherElm IT Center"
|
||||
#property link "https://saherelm.ir"
|
||||
#property version "1.00"
|
||||
#property description "SaherElm XZoneTest"
|
||||
#property strict
|
||||
|
||||
//
|
||||
#include "../Classes/x-saherelm.xczone.class.mq5"
|
||||
|
||||
//
|
||||
#define ShortName "XZoneTest"
|
||||
|
||||
//
|
||||
// Inputs ...
|
||||
input int zoneRange = 21;
|
||||
input ENUM_TIMEFRAMES zonePeriod = PERIOD_M1;
|
||||
|
||||
//
|
||||
// Variables ...
|
||||
int barsTotal;
|
||||
|
||||
//
|
||||
// Initialization ...
|
||||
int OnInit()
|
||||
{
|
||||
//
|
||||
if (!InitialEA())
|
||||
{
|
||||
return INIT_PARAMETERS_INCORRECT;
|
||||
}
|
||||
|
||||
//
|
||||
// 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
|
||||
|
||||
//
|
||||
// De Initialize XSampleEA Providers ...
|
||||
}
|
||||
|
||||
//
|
||||
// On Tick Handler ...
|
||||
void OnTick()
|
||||
{
|
||||
//
|
||||
int bars = iBars(
|
||||
_Symbol,
|
||||
zonePeriod //
|
||||
);
|
||||
if (barsTotal == bars)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
barsTotal = bars;
|
||||
|
||||
//
|
||||
datetime startTime = iTime(
|
||||
_Symbol,
|
||||
zonePeriod,
|
||||
zoneRange + 1 //
|
||||
);
|
||||
datetime endTime = iTime(
|
||||
_Symbol,
|
||||
zonePeriod,
|
||||
1 //
|
||||
);
|
||||
|
||||
//
|
||||
MqlTick ticks[];
|
||||
CopyTicksRange(
|
||||
_Symbol,
|
||||
ticks,
|
||||
COPY_TICKS_ALL,
|
||||
startTime * 1000,
|
||||
endTime * 1000 //
|
||||
);
|
||||
|
||||
//
|
||||
double highs[];
|
||||
CopyHigh(
|
||||
_Symbol,
|
||||
zonePeriod,
|
||||
startTime,
|
||||
endTime,
|
||||
highs //
|
||||
);
|
||||
double iHigh = highs[ArrayMaximum(highs)];
|
||||
|
||||
//
|
||||
double lows[];
|
||||
CopyLow(
|
||||
_Symbol,
|
||||
zonePeriod,
|
||||
startTime,
|
||||
endTime,
|
||||
lows //
|
||||
);
|
||||
double iLow = lows[ArrayMinimum(lows)];
|
||||
|
||||
//
|
||||
double iSize = iHigh - iLow;
|
||||
|
||||
//
|
||||
CArrayObj zones;
|
||||
int zCount = 10;
|
||||
for (int i = 0; i < zCount; i++)
|
||||
{
|
||||
//
|
||||
double iH = iHigh - iSize * i / zCount;
|
||||
double iL = iHigh - iSize * (i + 1) / zCount;
|
||||
|
||||
//
|
||||
XSCZone *iZone = new XSCZone();
|
||||
iZone.high = iH;
|
||||
iZone.low = iL;
|
||||
|
||||
//
|
||||
zones.Add(iZone);
|
||||
}
|
||||
|
||||
//
|
||||
// Fill Ticks ...
|
||||
for (int i = 0; i < ArraySize(ticks); i++)
|
||||
{
|
||||
//
|
||||
MqlTick iTick = ticks[i];
|
||||
|
||||
//
|
||||
for (int j = 0; j < zones.Total(); j++)
|
||||
{
|
||||
//
|
||||
XSCZone *jZone = zones.At(j);
|
||||
|
||||
//
|
||||
bool isInRange = iTick.bid >= jZone.low && iTick.bid <= jZone.high;
|
||||
if (isInRange)
|
||||
{
|
||||
//
|
||||
jZone.ticks++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Sorting Zones ...
|
||||
zones.Sort();
|
||||
|
||||
//
|
||||
CArrayObj mChartObjects;
|
||||
for (int i = 0; i < zones.Total(); i++)
|
||||
{
|
||||
//
|
||||
XSCZone *iZone = zones.At(i);
|
||||
|
||||
//
|
||||
string iZoneName = "Zone " + IntegerToString(i);
|
||||
|
||||
//
|
||||
// Create Zone Rectangle ...
|
||||
CChartObjectRectangle *iRect = new CChartObjectRectangle();
|
||||
iRect.Create(
|
||||
0,
|
||||
iZoneName,
|
||||
0,
|
||||
startTime,
|
||||
iZone.high,
|
||||
endTime,
|
||||
iZone.low //
|
||||
);
|
||||
iRect.Fill(true);
|
||||
|
||||
//
|
||||
// Create Zone Label ...
|
||||
CChartObjectLabel *iLabel = new CChartObjectLabel();
|
||||
iLabel.Create(
|
||||
0,
|
||||
iZoneName + "_lbl",
|
||||
0,
|
||||
startTime,
|
||||
iZone.high //
|
||||
);
|
||||
iLabel.Color(clrWhite);
|
||||
|
||||
//
|
||||
// Calculate TickPercent ...
|
||||
double iZoneTickPercent = (double)iZone.ticks / ArraySize(ticks) * 100;
|
||||
iZoneTickPercent = NormalizeDouble(iZoneTickPercent, 2);
|
||||
string iZoneTickPercentStr = (string)iZoneTickPercent + "%";
|
||||
|
||||
//
|
||||
iLabel.Description(iZoneTickPercentStr);
|
||||
|
||||
//
|
||||
if (iZone.ticks > ArraySize(ticks) * 0.15)
|
||||
{
|
||||
iRect.Color(clrOrangeRed);
|
||||
}
|
||||
else if (iZone.ticks > ArraySize(ticks) * 0.10)
|
||||
{
|
||||
iRect.Color(clrOrange);
|
||||
}
|
||||
else
|
||||
{
|
||||
iRect.Color(clrLightGray);
|
||||
}
|
||||
|
||||
//
|
||||
// mChartObjects.Add(iRect);
|
||||
// mChartObjects.Add(iLabel);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
|
||||
//
|
||||
bool InitialEA()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1,202 +0,0 @@
|
||||
//
|
||||
// Filter Long Conditions ...
|
||||
bool FilterLongConditions(
|
||||
X121SetupConditions &conditions, // Conditions
|
||||
int pusher, // Pushers
|
||||
string provider // Provider
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Generating Conditions Score ...
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
conditions.GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
bool isGBPUSD = symbolParser.IsGBPUSD(conditions.symbol);
|
||||
|
||||
//
|
||||
bool isM5Period = conditions.period == PERIOD_M5;
|
||||
bool isM15Period = conditions.period == PERIOD_M15;
|
||||
bool isH1Period = conditions.period == PERIOD_H1;
|
||||
bool isH4Period = conditions.period == PERIOD_H4;
|
||||
|
||||
//
|
||||
// Set Default Result to True ...
|
||||
result = true;
|
||||
|
||||
//
|
||||
// Global Conditions ...
|
||||
result =
|
||||
//
|
||||
result &&
|
||||
//
|
||||
!(
|
||||
//
|
||||
(
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isClosedUnderKijunSen &&
|
||||
conditions.ichConditions.isTenkanSenOverKijunSen
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isTenkanSenUnderKijunSen
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isSenkouSpanAOverB &&
|
||||
!conditions.ichConditions.isSenkouSpanAOverLast
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isSenkouSpanAUnderB &&
|
||||
conditions.ichConditions.isSenkouSpanAUnderLast
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isSenkouSpanAOverB &&
|
||||
!conditions.ichConditions.isSenkouSpanAOverLast &&
|
||||
conditions.ichConditions.isTenkanSenCrossedOverKijunSen &&
|
||||
//
|
||||
// XVLM ...
|
||||
conditions.vlmConditions.isVolumeUnderLast
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isClosedOverKijunSen &&
|
||||
conditions.ichConditions.isTenkanSenOverKijunSen &&
|
||||
conditions.ichConditions.isSenkouSpanAUnderB
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
// XPV ...
|
||||
!conditions.pvConditions.isSCBullish &&
|
||||
!conditions.pvConditions.isSCHHBullish &&
|
||||
!conditions.pvConditions.isSCLLBullish &&
|
||||
!conditions.pvConditions.isMCBullish &&
|
||||
!conditions.pvConditions.isMCHHBullish &&
|
||||
!conditions.pvConditions.isMCLLBullish &&
|
||||
!conditions.pvConditions.isLCBullish &&
|
||||
!conditions.pvConditions.isLCHHBullish &&
|
||||
!conditions.pvConditions.isLCLLBullish &&
|
||||
!conditions.pvConditions.isHCBullish &&
|
||||
!conditions.pvConditions.isHCHHBullish &&
|
||||
!conditions.pvConditions.isHCLLBullish &&
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isClosedOverKijunSen &&
|
||||
(conditions.ichConditions.isTenkanSenOverKijunSen ||
|
||||
conditions.ichConditions.isTenkanSenCrossedOverKijunSen)
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
(
|
||||
//
|
||||
// XPV ...
|
||||
conditions.pvConditions.isNewPeak &&
|
||||
conditions.pvConditions.isNewPeakOverLast &&
|
||||
conditions.pvConditions.isFiboIncreased &&
|
||||
conditions.pvConditions.isCloseOverFib1 &&
|
||||
conditions.pvConditions.isCloseOverFib2 &&
|
||||
conditions.pvConditions.isCloseOverFib3 &&
|
||||
conditions.pvConditions.isCloseOverFib4 &&
|
||||
conditions.pvConditions.isCloseOverFib5
|
||||
//
|
||||
)
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
// XSCORES ...
|
||||
bearishScore < 5 &&
|
||||
bullishScore > bearishScore * 10
|
||||
//
|
||||
)
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
(
|
||||
//
|
||||
// XPV ...
|
||||
conditions.pvConditions.isSCBullish &&
|
||||
conditions.pvConditions.isSCHHBullish &&
|
||||
conditions.pvConditions.isSCLLBullish &&
|
||||
conditions.pvConditions.isMCBullish &&
|
||||
conditions.pvConditions.isMCHHBullish &&
|
||||
conditions.pvConditions.isMCLLBullish &&
|
||||
conditions.pvConditions.isLCBullish &&
|
||||
conditions.pvConditions.isLCHHBullish &&
|
||||
conditions.pvConditions.isLCLLBullish &&
|
||||
conditions.pvConditions.isHCBullish &&
|
||||
conditions.pvConditions.isHCHHBullish &&
|
||||
conditions.pvConditions.isHCLLBullish
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Apply Filter ...
|
||||
// Based On Symbol and Period ...
|
||||
// if necessary ...
|
||||
if (isGBPUSD)
|
||||
{
|
||||
//
|
||||
// MEDIUM ...
|
||||
if (isH1Period)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
@@ -1,222 +0,0 @@
|
||||
//
|
||||
// Filter Short Conditions ...
|
||||
bool FilterShortConditions(
|
||||
X121SetupConditions &conditions, // Conditions
|
||||
int pusher, // Pushers
|
||||
string provider // Provider
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Generating Conditions Score ...
|
||||
double bullishScore = 0;
|
||||
double bearishScore = 0;
|
||||
conditions.GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
bool isGBPUSD = symbolParser.IsGBPUSD(conditions.symbol);
|
||||
|
||||
//
|
||||
bool isM5Period = conditions.period == PERIOD_M5;
|
||||
bool isM15Period = conditions.period == PERIOD_M15;
|
||||
bool isH1Period = conditions.period == PERIOD_H1;
|
||||
bool isH4Period = conditions.period == PERIOD_H4;
|
||||
|
||||
//
|
||||
// Set Default Result to True ...
|
||||
result = true;
|
||||
|
||||
//
|
||||
// Global Conditions ...
|
||||
result =
|
||||
//
|
||||
result &&
|
||||
//
|
||||
!(
|
||||
//
|
||||
(
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isClosedOverKijunSen &&
|
||||
conditions.ichConditions.isTenkanSenUnderKijunSen
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isTenkanSenOverKijunSen
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isSenkouSpanAUnderB &&
|
||||
!conditions.ichConditions.isSenkouSpanAUnderLast
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
// XPV ...
|
||||
conditions.pvConditions.isNewVale &&
|
||||
conditions.pvConditions.isNewValeUnderLast &&
|
||||
conditions.pvConditions.isFiboDecreased &&
|
||||
conditions.pvConditions.isSCBearish &&
|
||||
!conditions.pvConditions.isMCBearish &&
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isClosedOverKijunSen &&
|
||||
//
|
||||
// XHK ...
|
||||
conditions.hkConditions.isHKSwitchedToBearish &&
|
||||
conditions.hkConditions.isSMHKSwitchedToBearish
|
||||
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
// XPV ...
|
||||
conditions.pvConditions.isNewVale &&
|
||||
conditions.pvConditions.isNewValeUnderLast &&
|
||||
conditions.pvConditions.isFiboDecreased &&
|
||||
!conditions.pvConditions.isSCBearish &&
|
||||
!conditions.pvConditions.isSCHHBearish &&
|
||||
//
|
||||
// XVLM ...
|
||||
conditions.vlmConditions.isVolumeBearish &&
|
||||
!conditions.vlmConditions.isVolumeOverLast
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
(
|
||||
//
|
||||
// XPV ...
|
||||
conditions.pvConditions.isNewVale &&
|
||||
conditions.pvConditions.isNewValeUnderLast &&
|
||||
conditions.pvConditions.isFiboDecreased &&
|
||||
conditions.pvConditions.isCloseUnderFib1 &&
|
||||
conditions.pvConditions.isCloseUnderFib2 &&
|
||||
conditions.pvConditions.isCloseUnderFib3 &&
|
||||
conditions.pvConditions.isCloseUnderFib4 &&
|
||||
conditions.pvConditions.isCloseUnderFib5
|
||||
//
|
||||
)
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
(
|
||||
//
|
||||
(
|
||||
//
|
||||
// XVLM ...
|
||||
conditions.vlmConditions.isVolumeBearish &&
|
||||
conditions.vlmConditions.isVolumeOverLast
|
||||
//
|
||||
)
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
(
|
||||
//
|
||||
conditions.pvConditions.isSCBearish &&
|
||||
conditions.pvConditions.isSCHHBearish &&
|
||||
conditions.pvConditions.isSCLLBearish &&
|
||||
conditions.pvConditions.isMCBearish &&
|
||||
conditions.pvConditions.isMCHHBearish &&
|
||||
conditions.pvConditions.isMCLLBearish &&
|
||||
conditions.pvConditions.isLCBearish &&
|
||||
conditions.pvConditions.isLCHHBearish &&
|
||||
conditions.pvConditions.isLCLLBearish &&
|
||||
conditions.pvConditions.isHCBearish &&
|
||||
conditions.pvConditions.isHCHHBearish &&
|
||||
conditions.pvConditions.isHCLLBearish &&
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isClosedUnderKijunSen &&
|
||||
conditions.ichConditions.isTenkanSenUnderKijunSen &&
|
||||
conditions.ichConditions.isSenkouSpanAUnderB &&
|
||||
conditions.ichConditions.isSenkouSpanAUnderLast &&
|
||||
conditions.ichConditions.isFutureSenkouSpanAUnderB &&
|
||||
conditions.ichConditions.isFutureSenkouSpanAUnderLast &&
|
||||
conditions.ichConditions.isSenkouSpanACrossedUnderLast
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
// XICH ...
|
||||
conditions.ichConditions.isSenkouSpanACrossedUnderB
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
// XRL ...
|
||||
conditions.rlConditions.isFastBearish &&
|
||||
conditions.rlConditions.isSlowBearish &&
|
||||
conditions.rlConditions.isFastOverSlow &&
|
||||
conditions.rlConditions.isVerifierBearish
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
//
|
||||
&&
|
||||
//
|
||||
// XSCORES ...
|
||||
bullishScore < 5 &&
|
||||
bearishScore > bullishScore * 10
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Apply Filter ...
|
||||
// Based On Symbol and Period ...
|
||||
// if necessary ...
|
||||
if (isGBPUSD)
|
||||
{
|
||||
//
|
||||
// MEDIUM ...
|
||||
if (isH1Period)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
@@ -1,194 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| 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);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
Binary file not shown.
@@ -1,136 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Trend.mqh |
|
||||
//| Copyright 2000-2024, MetaQuotes Ltd. |
|
||||
//| https://www.mql5.com |
|
||||
//+------------------------------------------------------------------+
|
||||
#include "Indicator.mqh"
|
||||
//+------------------------------------------------------------------+
|
||||
//| Class CiADX. |
|
||||
//| Purpose: Class of the "Average Directional Index" indicator. |
|
||||
//| Derives from class CIndicator. |
|
||||
//+------------------------------------------------------------------+
|
||||
class CiADX : public CIndicator
|
||||
{
|
||||
protected:
|
||||
int m_ma_period;
|
||||
|
||||
public:
|
||||
CiADX(void);
|
||||
~CiADX(void);
|
||||
//--- methods of access to protected data
|
||||
int MaPeriod(void) const { return (m_ma_period); }
|
||||
//--- method of creation
|
||||
bool Create(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
|
||||
//--- methods of access to indicator data
|
||||
double Main(const int index) const;
|
||||
double Plus(const int index) const;
|
||||
double Minus(const int index) const;
|
||||
//--- method of identifying
|
||||
virtual int Type(void) const { return (IND_ADX); }
|
||||
|
||||
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 ma_period);
|
||||
};
|
||||
//+------------------------------------------------------------------+
|
||||
//| Constructor |
|
||||
//+------------------------------------------------------------------+
|
||||
CiADX::CiADX(void) : m_ma_period(-1)
|
||||
{
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Destructor |
|
||||
//+------------------------------------------------------------------+
|
||||
CiADX::~CiADX(void)
|
||||
{
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Create the "Average Directional Index" indicator |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CiADX::Create(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period)
|
||||
{
|
||||
//--- check history
|
||||
if (!SetSymbolPeriod(symbol, period))
|
||||
return (false);
|
||||
//--- create
|
||||
m_handle = iADX(symbol, period, ma_period);
|
||||
//--- check result
|
||||
if (m_handle == INVALID_HANDLE)
|
||||
return (false);
|
||||
//--- indicator successfully created
|
||||
if (!Initialize(symbol, period, ma_period))
|
||||
{
|
||||
//--- initialization failed
|
||||
IndicatorRelease(m_handle);
|
||||
m_handle = INVALID_HANDLE;
|
||||
return (false);
|
||||
}
|
||||
//--- ok
|
||||
return (true);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Initialize the indicator with universal parameters |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CiADX::Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam ¶ms[])
|
||||
{
|
||||
return (Initialize(symbol, period, (int)params[0].integer_value));
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Initialize indicator with the special parameters |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CiADX::Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period)
|
||||
{
|
||||
if (CreateBuffers(symbol, period, 3))
|
||||
{
|
||||
//--- string of status of drawing
|
||||
m_name = "ADX";
|
||||
m_status = "(" + symbol + "," + PeriodDescription() + "," + IntegerToString(ma_period) + ") H=" + IntegerToString(m_handle);
|
||||
//--- save settings
|
||||
m_ma_period = ma_period;
|
||||
//--- create buffers
|
||||
((CIndicatorBuffer *)At(0)).Name("MAIN_LINE");
|
||||
((CIndicatorBuffer *)At(1)).Name("PLUS_LINE");
|
||||
((CIndicatorBuffer *)At(2)).Name("MINUS_LINE");
|
||||
//--- ok
|
||||
return (true);
|
||||
}
|
||||
//--- error
|
||||
return (false);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Access to Main buffer of "Average Directional Index" |
|
||||
//+------------------------------------------------------------------+
|
||||
double CiADX::Main(const int index) const
|
||||
{
|
||||
CIndicatorBuffer *buffer = At(0);
|
||||
//--- check
|
||||
if (buffer == NULL)
|
||||
return (EMPTY_VALUE);
|
||||
//---
|
||||
return (buffer.At(index));
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Access to Plus buffer of "Average Directional Index" |
|
||||
//+------------------------------------------------------------------+
|
||||
double CiADX::Plus(const int index) const
|
||||
{
|
||||
CIndicatorBuffer *buffer = At(1);
|
||||
//--- check
|
||||
if (buffer == NULL)
|
||||
return (EMPTY_VALUE);
|
||||
//---
|
||||
return (buffer.At(index));
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Access to Minus buffer of "Average Directional Index" |
|
||||
//+------------------------------------------------------------------+
|
||||
double CiADX::Minus(const int index) const
|
||||
{
|
||||
CIndicatorBuffer *buffer = At(2);
|
||||
//--- check
|
||||
if (buffer == NULL)
|
||||
return (EMPTY_VALUE);
|
||||
//---
|
||||
return (buffer.At(index));
|
||||
}
|
||||
@@ -1,175 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| 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));
|
||||
}
|
||||
@@ -1,115 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| DCC_Piercing.mq5 |
|
||||
//| Rajesh Nait, Copyright 2023 |
|
||||
//| https://www.mql5.com/en/users/rajeshnait/seller |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Rajesh Nait, Copyright 2023"
|
||||
#property link "https://www.mql5.com/en/users/rajeshnait/seller"
|
||||
#property version "1.00"
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 2
|
||||
#property indicator_plots 2
|
||||
|
||||
//--- plot Bullish Marubozu
|
||||
#property indicator_label1 "+DCCP"
|
||||
#property indicator_type1 DRAW_ARROW
|
||||
#property indicator_color1 clrSnow
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 1
|
||||
//--- plot Bearish Marubozu
|
||||
#property indicator_label2 "-DCCP"
|
||||
#property indicator_type2 DRAW_ARROW
|
||||
#property indicator_color2 clrSnow
|
||||
#property indicator_style2 STYLE_SOLID
|
||||
#property indicator_width2 1
|
||||
|
||||
|
||||
//--- input parameters
|
||||
input group "Bearish"
|
||||
input uchar InpBullishDCCPCode = 217; // BullishDCCP: code for style DRAW_ARROW (font Wingdings)
|
||||
input int InpBullishDCCPShift = 10; // BullishDCCP: vertical shift of arrows in pixels
|
||||
input group "Bullish"
|
||||
input uchar InpBearishDCCPCode = 218; // BearishDCCP: code for style DRAW_ARROW (font Wingdings)
|
||||
input int InpBearishDCCPShift =10; // BearishDCCP: vertical shift of arrows in pixels
|
||||
//--- indicator buffers
|
||||
double BullishDCCPBuffer[];
|
||||
double BearishDCCPBuffer[];
|
||||
int min_rates_total;
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit() {
|
||||
min_rates_total=2;
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0,BullishDCCPBuffer,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,BearishDCCPBuffer,INDICATOR_DATA);
|
||||
|
||||
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
|
||||
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
|
||||
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
|
||||
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
|
||||
|
||||
PlotIndexSetInteger(0,PLOT_ARROW,InpBullishDCCPCode);
|
||||
PlotIndexSetInteger(1,PLOT_ARROW,InpBearishDCCPCode);
|
||||
|
||||
ArraySetAsSeries(BullishDCCPBuffer,true);
|
||||
ArraySetAsSeries(BearishDCCPBuffer,true);
|
||||
|
||||
//--- set the vertical shift of arrows in pixels
|
||||
PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,InpBullishDCCPShift);
|
||||
PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-InpBearishDCCPShift);
|
||||
//--- set as an empty value 0.0
|
||||
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
|
||||
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
|
||||
//---
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[]) {
|
||||
//---
|
||||
if(rates_total<min_rates_total)
|
||||
return(0);
|
||||
|
||||
int limit;
|
||||
|
||||
if(prev_calculated>rates_total || prev_calculated<=0) {
|
||||
limit=rates_total-min_rates_total;
|
||||
} else {
|
||||
limit=rates_total-prev_calculated;
|
||||
}
|
||||
ArraySetAsSeries(open,true);
|
||||
ArraySetAsSeries(high,true);
|
||||
ArraySetAsSeries(low,true);
|
||||
ArraySetAsSeries(close,true);
|
||||
|
||||
//---
|
||||
|
||||
for(int i=limit; i>=0 && !IsStopped(); i--) {
|
||||
BullishDCCPBuffer[i]=0.0;
|
||||
BearishDCCPBuffer[i]=0.0;
|
||||
|
||||
|
||||
BearishDCCPBuffer[0]=0.0;
|
||||
if(open[i]>close[i] && open[i+1]<close[i+1] && open[i]>close[i+1])
|
||||
BearishDCCPBuffer[i]=high[i];
|
||||
|
||||
BullishDCCPBuffer[0]=0.0;
|
||||
if(open[i]<close[i] && open[i+1]>close[i+1] && open[i]<close[i+1])
|
||||
BullishDCCPBuffer[i]=low[i];
|
||||
|
||||
}
|
||||
//--- return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -1,99 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Dominant.mq5 |
|
||||
//| Copyright 2024, Rajesh Kumar Nait |
|
||||
//| https://www.mql5.com/en/users/rajeshnait/seller |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2024, Rajesh Kumar Nait"
|
||||
#property link "https://www.mql5.com/en/users/rajeshnait/seller"
|
||||
#property version "1.00"
|
||||
#property indicator_chart_window
|
||||
#property indicator_plots 0
|
||||
string prefix="c_";
|
||||
input int total = 1000; // Number of Bars
|
||||
input color clr = clrSnow; // Adjust color as required
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit() {
|
||||
//--- indicator buffers mapping
|
||||
|
||||
//---
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnDeinit(const int reason) {
|
||||
ObjectsDeleteAll(0,prefix);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[]) {
|
||||
//---
|
||||
ArraySetAsSeries(open,true);
|
||||
ArraySetAsSeries(high,true);
|
||||
ArraySetAsSeries(low,true);
|
||||
ArraySetAsSeries(close,true);
|
||||
ArraySetAsSeries(time,true);
|
||||
|
||||
if(rates_total<total) {
|
||||
Print("Required Bars not available");
|
||||
return(rates_total);
|
||||
}
|
||||
|
||||
for(int i=1; i<total; i++) {
|
||||
//bullish
|
||||
if(open[i]<close[i] && open[i+1]<close[i+1] && open[i]>=close[i+1] && low[i]<close[i+1] && high[i+1]>open[i])
|
||||
crearFlecha(prefix+"Bull_Dominanat"+IntegerToString(i),time[i],low[i+1],clr,225,ANCHOR_TOP);
|
||||
|
||||
if(open[i]>close[i] && open[i+1]>close[i+1] && open[i]<=close[i+1] && high[i]>close[i+1] && low[i+1]<open[i])
|
||||
crearFlecha(prefix+"Bear_Dominanat"+IntegerToString(i),time[i],high[i+1],clr,226,ANCHOR_BOTTOM);
|
||||
}
|
||||
|
||||
//--- return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| CREATE ARROWS
|
||||
//+------------------------------------------------------------------+
|
||||
bool crearFlecha(string nameAux, datetime timeAux, double priceAux, color clrAux, int code, ENUM_ARROW_ANCHOR anchorAux) {
|
||||
const long chart_ID=0; // chart's ID
|
||||
const string name=nameAux; // arrow name
|
||||
const int sub_window=0; // subwindow index
|
||||
datetime time=timeAux; // anchor point time
|
||||
double price=priceAux; // anchor point price
|
||||
const int arrow_code=code; // arrow code
|
||||
const ENUM_ARROW_ANCHOR anchor=anchorAux; // anchor point position
|
||||
const color clr_=clrAux; // arrow color
|
||||
const ENUM_LINE_STYLE style=STYLE_SOLID; // border line style
|
||||
const int width=1; // arrow size
|
||||
const bool back=true; // in the background
|
||||
const bool selection=false; // highlight to move
|
||||
const bool hidden=true; // hidden in the object list
|
||||
const long z_order=0; // priority for mouse click
|
||||
|
||||
ObjectCreate(chart_ID,name,OBJ_ARROW,sub_window,time,price);
|
||||
ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,arrow_code);
|
||||
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchorAux);
|
||||
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr_);
|
||||
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
|
||||
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
|
||||
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
|
||||
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
|
||||
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
|
||||
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
|
||||
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
|
||||
return(true);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -1,105 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Fair_Value_Gap.mq5 |
|
||||
//| Copyright 2024, Rajesh Kumar Nait |
|
||||
//| https://www.mql5.com/en/users/rajeshnait/seller |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2024, Rajesh Kumar Nait"
|
||||
#property link "https://www.mql5.com/en/users/rajeshnait/seller"
|
||||
#property version "1.00"
|
||||
#property indicator_chart_window
|
||||
#property indicator_plots 0
|
||||
|
||||
|
||||
//--- input parameters
|
||||
input color InpColorToUP = clrLime; // Color of the gap up
|
||||
input color InpColorToDN = clrDeepPink; // Color of the gap down
|
||||
input int maxbars = 300;// how many bars to Look back
|
||||
|
||||
string prefix;
|
||||
double price;
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit() {
|
||||
//--- indicator buffers mapping
|
||||
prefix=MQLInfoString(MQL_PROGRAM_NAME)+"_";
|
||||
//---
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator deinitialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnDeinit(const int reason) {
|
||||
ObjectsDeleteAll(0,prefix);
|
||||
ChartRedraw();
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[]) {
|
||||
//---
|
||||
if(rates_total<4) return 0;
|
||||
price = close[0];
|
||||
ArraySetAsSeries(open,true);
|
||||
ArraySetAsSeries(high,true);
|
||||
ArraySetAsSeries(low,true);
|
||||
ArraySetAsSeries(close,true);
|
||||
ArraySetAsSeries(time,true);
|
||||
int limit=rates_total-prev_calculated;
|
||||
if(limit>1) {
|
||||
limit=rates_total-5;
|
||||
}
|
||||
for(int i=maxbars; i>=0 && !IsStopped(); i--) {
|
||||
if(low[i]-high[i+2]>=Point()) {
|
||||
|
||||
double up=fmin(high[i],low[i]);
|
||||
double dn=fmax(high[i+2],low[i+2]);
|
||||
|
||||
DrawArea(i,up,dn,time,InpColorToUP,1);
|
||||
|
||||
}
|
||||
if(low[i+2]-high[i]>=Point()) {
|
||||
|
||||
double up=fmin(high[i+2],low[i+2]);
|
||||
double dn=fmax(high[i],low[i]);
|
||||
DrawArea(i,up,dn,time,InpColorToDN,0);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//--- return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
void DrawArea(const int index, const double price_up,const double price_dn,const datetime &time[],const color color_area,const char dir) {
|
||||
string name=prefix+(dir>0 ? "up_" : "dn_")+TimeToString(time[index]);
|
||||
|
||||
if(ObjectFind(0,name)<0 )
|
||||
ObjectCreate(0,name,OBJ_RECTANGLE,0,0,0,0);
|
||||
ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
|
||||
ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
|
||||
ObjectSetInteger(0,name,OBJPROP_FILL,true);
|
||||
ObjectSetInteger(0,name,OBJPROP_BACK,true);
|
||||
ObjectSetString(0,name,OBJPROP_TOOLTIP,"\n");
|
||||
//---
|
||||
ObjectSetInteger(0,name,OBJPROP_COLOR,color_area);
|
||||
ObjectSetInteger(0,name,OBJPROP_TIME,0,time[index+2]);
|
||||
ObjectSetInteger(0,name,OBJPROP_TIME,1,time[index]);
|
||||
ObjectSetDouble(0,name,OBJPROP_PRICE,0,price_up);
|
||||
ObjectSetDouble(0,name,OBJPROP_PRICE,1,price_dn);
|
||||
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -1,111 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Geometric Moving Average.mq5 |
|
||||
//| Copyright 2024, Rosh Jardine |
|
||||
//| https://www.mql5.com/en/users/roshjardine |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2024, Lyn Astara"
|
||||
#property link "https://www.mql5.com/en/users/roshjardine"
|
||||
#property version "1.00"
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 1
|
||||
#property indicator_plots 1
|
||||
//--- plot GeoMALine
|
||||
#property indicator_label1 "GeoMALine"
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_color1 clrRed
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 1
|
||||
|
||||
input int InputGeoMAPeriod = 7;
|
||||
input int InputGeoMAShift = 0;
|
||||
input ENUM_APPLIED_PRICE InputAppliedPriceEnum = PRICE_CLOSE;
|
||||
//--- indicator buffers
|
||||
double GeoMALineBuffer[];
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0,GeoMALineBuffer,INDICATOR_DATA);
|
||||
IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
|
||||
/*** setting values of the indicator that won't be visible on a chart ***/
|
||||
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
||||
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InputGeoMAPeriod);
|
||||
//--- line shifts when drawing
|
||||
PlotIndexSetInteger(0,PLOT_SHIFT,InputGeoMAShift);
|
||||
string short_name = "GeoMA-"+EnumToString(InputAppliedPriceEnum)+"("+IntegerToString(InputGeoMAPeriod)+")";
|
||||
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
|
||||
/*const double x = double(1)/double(4);
|
||||
double t = MathPow(90,x);
|
||||
Print("t=",DoubleToString(t,4));*/
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[])
|
||||
{
|
||||
double p_t = 0.0; double p_0 = 0.0; static const double x = double(1)/double(InputGeoMAPeriod);
|
||||
if (rates_total<=0) { return(0); }
|
||||
|
||||
if (prev_calculated<=0)
|
||||
{
|
||||
p_t = GET_APPLIED_PRICE(open[0],low[0],high[0],close[0]);
|
||||
GeoMALineBuffer[0] = EMPTY_VALUE;
|
||||
for (int i=1; i<InputGeoMAPeriod; i++)
|
||||
{
|
||||
p_t *= GET_APPLIED_PRICE(open[i],low[i],high[i],close[i]);
|
||||
}
|
||||
GeoMALineBuffer[InputGeoMAPeriod-1] = MathPow(p_t,x);
|
||||
for (int i=InputGeoMAPeriod; i<rates_total; i++)
|
||||
{
|
||||
p_0 = p_t/GET_APPLIED_PRICE(open[i-InputGeoMAPeriod],low[i-InputGeoMAPeriod],high[i-InputGeoMAPeriod],close[i-InputGeoMAPeriod]);
|
||||
p_t = p_0*GET_APPLIED_PRICE(open[i],low[i],high[i],close[i]);
|
||||
GeoMALineBuffer[i] = MathPow(p_t,x);
|
||||
}
|
||||
return(rates_total);
|
||||
}
|
||||
for (int i=prev_calculated; i<=rates_total-1; i++)
|
||||
{
|
||||
p_0 = p_t/GET_APPLIED_PRICE(open[i-InputGeoMAPeriod],low[i-InputGeoMAPeriod],high[i-InputGeoMAPeriod],close[i-InputGeoMAPeriod]);
|
||||
p_t = p_0*GET_APPLIED_PRICE(open[i],low[i],high[i],close[i]);
|
||||
GeoMALineBuffer[i] = MathPow(p_t,x);
|
||||
}
|
||||
//--- return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
double GET_APPLIED_PRICE(const double ParamOpenPriceDouble,const double ParamLowPriceDouble,
|
||||
const double ParamHighPriceDouble,const double ParamClosePriceDouble)
|
||||
{
|
||||
//+----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
/*** close price as the default ***/
|
||||
double PriceResultDouble = ParamClosePriceDouble;
|
||||
int AppliedPriceInt = int(InputAppliedPriceEnum);
|
||||
//+----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
switch(AppliedPriceInt)
|
||||
{
|
||||
case 1 : PriceResultDouble = ParamOpenPriceDouble; break;
|
||||
case 2 : PriceResultDouble = ParamLowPriceDouble; break;
|
||||
case 3 : PriceResultDouble = ParamHighPriceDouble; break;
|
||||
case 4 : PriceResultDouble = ParamClosePriceDouble; break;
|
||||
/*** Median price ***/
|
||||
case 5 : PriceResultDouble = (ParamHighPriceDouble + ParamLowPriceDouble)/2; break;
|
||||
/*** Typical price ***/
|
||||
case 6 : PriceResultDouble = (ParamHighPriceDouble + ParamLowPriceDouble + ParamClosePriceDouble)/3; break;
|
||||
/*** Weighted price ***/
|
||||
default : PriceResultDouble = (ParamHighPriceDouble + ParamLowPriceDouble + ParamClosePriceDouble + ParamClosePriceDouble)/4; break;
|
||||
}
|
||||
return(PriceResultDouble);
|
||||
}
|
||||
@@ -1,110 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Harmonic Moving Average.mq5 |
|
||||
//| Copyright 2024, Rosh Jardine |
|
||||
//| https://www.mql5.com/en/users/roshjardine |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2024, Rosh Jardine"
|
||||
#property link "https://www.mql5.com/en/users/roshjardine"
|
||||
#property version "1.00"
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 1
|
||||
#property indicator_plots 1
|
||||
//--- plot HMALine
|
||||
#property indicator_label1 "HMALine"
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_color1 clrRed
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 1
|
||||
|
||||
input int InputHMAPeriod = 7;
|
||||
input int InputHMAShift = 0;
|
||||
input ENUM_APPLIED_PRICE InputAppliedPriceEnum = PRICE_CLOSE;
|
||||
//--- indicator buffers
|
||||
double HMALineBuffer[];
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0,HMALineBuffer,INDICATOR_DATA);
|
||||
IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
|
||||
/*** setting values of the indicator that won't be visible on a chart ***/
|
||||
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
||||
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InputHMAShift);
|
||||
//--- line shifts when drawing
|
||||
PlotIndexSetInteger(0,PLOT_SHIFT,InputHMAShift);
|
||||
string short_name = "HMA-"+EnumToString(InputAppliedPriceEnum)+"("+IntegerToString(InputHMAPeriod)+")";
|
||||
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[])
|
||||
{
|
||||
if (rates_total<=0) { return(0); }
|
||||
|
||||
if (prev_calculated<=0)
|
||||
{
|
||||
double rsd = 0.0;
|
||||
for (int i=0; i<InputHMAPeriod; i++)
|
||||
{
|
||||
rsd += double(1/GET_APPLIED_PRICE(open[i],low[i],high[i],close[i]));
|
||||
HMALineBuffer[i] = 0.0;
|
||||
}
|
||||
HMALineBuffer[InputHMAPeriod-1] = InputHMAPeriod/rsd;
|
||||
|
||||
for (int i=InputHMAPeriod; i<rates_total; i++)
|
||||
{
|
||||
double lrs = InputHMAPeriod/HMALineBuffer[i-1];
|
||||
double vlfr = 1/GET_APPLIED_PRICE(open[i-InputHMAPeriod],low[i-InputHMAPeriod],high[i-InputHMAPeriod],close[i-InputHMAPeriod]);
|
||||
HMALineBuffer[i] = InputHMAPeriod/(lrs-vlfr+(1/GET_APPLIED_PRICE(open[i],low[i],high[i],close[i])));
|
||||
}
|
||||
return(rates_total);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i=prev_calculated; i<=rates_total-1; i++)
|
||||
{
|
||||
double lrs = double(InputHMAPeriod)/HMALineBuffer[i-1];
|
||||
double vlfr = 1/GET_APPLIED_PRICE(open[i-InputHMAPeriod],low[i-InputHMAPeriod],high[i-InputHMAPeriod],close[i-InputHMAPeriod]);
|
||||
HMALineBuffer[i] = InputHMAPeriod/(lrs-vlfr+(1/GET_APPLIED_PRICE(open[i],low[i],high[i],close[i])));
|
||||
}
|
||||
return(rates_total);
|
||||
}
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
double GET_APPLIED_PRICE(const double ParamOpenPriceDouble,const double ParamLowPriceDouble,
|
||||
const double ParamHighPriceDouble,const double ParamClosePriceDouble)
|
||||
{
|
||||
//+----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
/*** close price as the default ***/
|
||||
double PriceResultDouble = ParamClosePriceDouble;
|
||||
int AppliedPriceInt = int(InputAppliedPriceEnum);
|
||||
//+----------------------------------------------------------------------------------------------------------------------------------------+
|
||||
switch(AppliedPriceInt)
|
||||
{
|
||||
case 1 : PriceResultDouble = ParamOpenPriceDouble; break;
|
||||
case 2 : PriceResultDouble = ParamLowPriceDouble; break;
|
||||
case 3 : PriceResultDouble = ParamHighPriceDouble; break;
|
||||
case 4 : PriceResultDouble = ParamClosePriceDouble; break;
|
||||
/*** Median price ***/
|
||||
case 5 : PriceResultDouble = (ParamHighPriceDouble + ParamLowPriceDouble)/2; break;
|
||||
/*** Typical price ***/
|
||||
case 6 : PriceResultDouble = (ParamHighPriceDouble + ParamLowPriceDouble + ParamClosePriceDouble)/3; break;
|
||||
/*** Weighted price ***/
|
||||
default : PriceResultDouble = (ParamHighPriceDouble + ParamLowPriceDouble + ParamClosePriceDouble + ParamClosePriceDouble)/4; break;
|
||||
}
|
||||
return(PriceResultDouble);
|
||||
}
|
||||
Binary file not shown.
@@ -1,96 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Marubozu.mq5 |
|
||||
//| Rajesh Nait, Copyright 2023 |
|
||||
//| https://www.mql5.com/en/users/rajeshnait/seller |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Rajesh Nait, Copyright 2023"
|
||||
#property link "https://www.mql5.com/en/users/rajeshnait/seller"
|
||||
#property version "1.00"
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 2
|
||||
#property indicator_plots 2
|
||||
|
||||
//--- plot Bullish Marubozu
|
||||
#property indicator_label1 "+M"
|
||||
#property indicator_type1 DRAW_ARROW
|
||||
#property indicator_color1 clrLimeGreen
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 1
|
||||
//--- plot Bearish Marubozu
|
||||
#property indicator_label2 "-M"
|
||||
#property indicator_type2 DRAW_ARROW
|
||||
#property indicator_color2 clrDeepPink
|
||||
#property indicator_style2 STYLE_SOLID
|
||||
#property indicator_width2 1
|
||||
|
||||
//--- input parameters
|
||||
input group "Bullish Marubozu"
|
||||
sinput uchar InpBullishMarubozuCode = 167; // Bullish Marubozu: code for style DRAW_ARROW (font Wingdings)
|
||||
sinput int InpBullishMarubozuShift = 10; // Bullish Marubozu: vertical shift of arrows in pixels
|
||||
input group "Bearish Marubozu"
|
||||
sinput uchar InpBearishMarubozuCode = 167; // Bearish Marubozu: code for style DRAW_ARROW (font Wingdings)
|
||||
sinput int InpBearishMarubozuShift = 10; // Bearish Marubozu: vertical shift of arrows in pixels
|
||||
//--- indicator buffers
|
||||
double BullishMarubozuBuffer[];
|
||||
double BearishMarubozuBuffer[];
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit() {
|
||||
//--- indicator buffers mapping
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0,BullishMarubozuBuffer,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,BearishMarubozuBuffer,INDICATOR_DATA);
|
||||
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
|
||||
PlotIndexSetInteger(0,PLOT_ARROW,InpBullishMarubozuCode);
|
||||
PlotIndexSetInteger(1,PLOT_ARROW,InpBearishMarubozuCode);
|
||||
//--- set the vertical shift of arrows in pixels
|
||||
PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,InpBullishMarubozuShift);
|
||||
PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-InpBearishMarubozuShift);
|
||||
//--- set as an empty value 0.0
|
||||
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
|
||||
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
|
||||
//---
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[]) {
|
||||
//---
|
||||
if(rates_total<3)
|
||||
return(0);
|
||||
//---
|
||||
int limit=prev_calculated-1;
|
||||
if(prev_calculated==0) {
|
||||
limit=1;
|
||||
BullishMarubozuBuffer[0]=0.0;
|
||||
BearishMarubozuBuffer[0]=0.0;
|
||||
}
|
||||
for(int i=limit; i<rates_total; i++) {
|
||||
BullishMarubozuBuffer[i]=0.0;
|
||||
BearishMarubozuBuffer[i]=0.0;
|
||||
if(i>0) {
|
||||
|
||||
if(open[i]==high[i] && close[i]==low[i]) {
|
||||
BearishMarubozuBuffer[i]=high[i];
|
||||
}
|
||||
|
||||
if(close[i]==high[i] && open[i]==low[i]) {
|
||||
BullishMarubozuBuffer[i]=low[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
//--- return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -1,133 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| MinChangeSignal.mq5 |
|
||||
//| Copyright 2013, Rone. |
|
||||
//| rone.sergey@gmail.com |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2013, Rone."
|
||||
#property link "rone.sergey@gmail.com"
|
||||
#property version "1.00"
|
||||
#property description "The signal is formed if the changes sum calculated on the last bar "
|
||||
#property description "is less, than the smallest of sums calculated on the specified number of previous bars."
|
||||
//---
|
||||
#property indicator_separate_window
|
||||
#property indicator_buffers 3
|
||||
#property indicator_plots 3
|
||||
//--- plot CurrentChange
|
||||
#property indicator_label1 "Current Change Sum"
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_color1 clrBlue
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 2
|
||||
//--- plot MinChange
|
||||
#property indicator_label2 "Min Change Sum"
|
||||
#property indicator_type2 DRAW_LINE
|
||||
#property indicator_color2 clrRed
|
||||
#property indicator_style2 STYLE_SOLID
|
||||
#property indicator_width2 2
|
||||
//--- plot Signal
|
||||
#property indicator_label3 "Signal"
|
||||
#property indicator_type3 DRAW_ARROW
|
||||
#property indicator_color3 clrLime
|
||||
#property indicator_style3 STYLE_SOLID
|
||||
#property indicator_width3 3
|
||||
//--- input parameters
|
||||
input int InpChangesPeriod = 4; // Changes Period
|
||||
input int InpCheckPeriod = 10; // Check Period
|
||||
input bool InpAbsChange = false; // Abs Change
|
||||
//--- indicator buffers
|
||||
double CurrentSumBuffer[];
|
||||
double MinSumBuffer[];
|
||||
double SignalBuffer[];
|
||||
//---
|
||||
int changes_period;
|
||||
int check_period;
|
||||
int min_required_bars;
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit() {
|
||||
//---
|
||||
if ( InpChangesPeriod < 1 || InpCheckPeriod < 2 ) {
|
||||
changes_period = 3;
|
||||
check_period = 10;
|
||||
printf("Incorrect input value InpChangesPeriod = %d or/and InpCheckPeriod =%d. "
|
||||
"Indicator will use values %d and %d respectively.", InpChangesPeriod, InpCheckPeriod,
|
||||
changes_period, check_period);
|
||||
} else {
|
||||
changes_period = InpChangesPeriod;
|
||||
check_period = InpCheckPeriod;
|
||||
}
|
||||
min_required_bars = changes_period + check_period + 1;
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0, CurrentSumBuffer, INDICATOR_DATA);
|
||||
SetIndexBuffer(1, MinSumBuffer, INDICATOR_DATA);
|
||||
SetIndexBuffer(2, SignalBuffer, INDICATOR_DATA);
|
||||
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
|
||||
PlotIndexSetInteger(2, PLOT_ARROW, 159);
|
||||
//---
|
||||
for ( int plot = 0; plot < 3; plot++ ) {
|
||||
PlotIndexSetInteger(plot, PLOT_DRAW_BEGIN, min_required_bars - 1);
|
||||
PlotIndexSetInteger(plot, PLOT_SHIFT, 0);
|
||||
PlotIndexSetDouble(plot, PLOT_EMPTY_VALUE, EMPTY_VALUE);
|
||||
}
|
||||
//---
|
||||
IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
|
||||
IndicatorSetString(INDICATOR_SHORTNAME, "Min Price Change ("+(string)changes_period
|
||||
+", "+(string)check_period+")");
|
||||
//---
|
||||
return(0);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const int begin,
|
||||
const double &price[])
|
||||
{
|
||||
//---
|
||||
int change_start_bar, check_start_bar, signal_start_bar;
|
||||
//---
|
||||
if ( rates_total < min_required_bars ) {
|
||||
Print("Not enough bars for calculations.");
|
||||
return(0);
|
||||
}
|
||||
//---
|
||||
if ( prev_calculated > rates_total || prev_calculated <= 0 ) {
|
||||
change_start_bar = changes_period;
|
||||
check_start_bar = change_start_bar + check_period;
|
||||
signal_start_bar = check_start_bar + 1;
|
||||
} else {
|
||||
change_start_bar = prev_calculated - 1;
|
||||
check_start_bar = change_start_bar;
|
||||
signal_start_bar = change_start_bar;
|
||||
}
|
||||
//---
|
||||
for ( int bar = change_start_bar; bar < rates_total; bar++ ) {
|
||||
double sum = 0.0;
|
||||
|
||||
for ( int shift = bar - changes_period + 1; shift <= bar; shift++ ) {
|
||||
if ( InpAbsChange ) {
|
||||
sum += MathAbs(price[shift] - price[shift-1]);
|
||||
} else {
|
||||
sum += price[shift] - price[shift-1];
|
||||
}
|
||||
}
|
||||
CurrentSumBuffer[bar] = MathAbs(sum);
|
||||
}
|
||||
for ( int bar = check_start_bar; bar < rates_total; bar++ ) {
|
||||
MinSumBuffer[bar] = CurrentSumBuffer[ArrayMinimum(CurrentSumBuffer,
|
||||
bar-check_period, check_period)];
|
||||
}
|
||||
for ( int bar = signal_start_bar; bar < rates_total; bar++ ) {
|
||||
SignalBuffer[bar] = EMPTY_VALUE;
|
||||
if ( CurrentSumBuffer[bar] < MinSumBuffer[bar]
|
||||
&& CurrentSumBuffer[bar-1] >= MinSumBuffer[bar-1] )
|
||||
{
|
||||
SignalBuffer[bar] = MinSumBuffer[bar];
|
||||
}
|
||||
}
|
||||
//--- return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,208 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Round price DOC.mq5 |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "mladen"
|
||||
#property link "mladenfx@gmail.com"
|
||||
#property version "1.00"
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 7
|
||||
#property indicator_plots 7
|
||||
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_color1 Gold
|
||||
#property indicator_type2 DRAW_LINE
|
||||
#property indicator_color2 DeepSkyBlue
|
||||
#property indicator_type3 DRAW_LINE
|
||||
#property indicator_color3 DeepSkyBlue
|
||||
#property indicator_type4 DRAW_LINE
|
||||
#property indicator_color4 DeepSkyBlue
|
||||
#property indicator_type5 DRAW_LINE
|
||||
#property indicator_color5 PaleVioletRed
|
||||
#property indicator_type6 DRAW_LINE
|
||||
#property indicator_color6 PaleVioletRed
|
||||
#property indicator_type7 DRAW_LINE
|
||||
#property indicator_color7 PaleVioletRed
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
input int T3Period = 89; // T3 Calculation period
|
||||
input double T3Hot = 0.7; // T3 hot value
|
||||
input bool T3Original = false; // T3 original Tillson calculation?
|
||||
input ENUM_APPLIED_PRICE T3Price = PRICE_CLOSE; // T3 price to use
|
||||
input int Delta1 = 89; // Distance in points for first band
|
||||
input int Delta2 = 144; // Distance in points for second band
|
||||
input int Delta3 = 233; // Distance in points for third band
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
double t3[];
|
||||
double t3Up1[];
|
||||
double t3Up2[];
|
||||
double t3Up3[];
|
||||
double t3Dn1[];
|
||||
double t3Dn2[];
|
||||
double t3Dn3[];
|
||||
|
||||
double c1,c2,c3,c4,t3Alpha;
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
int OnInit()
|
||||
{
|
||||
SetIndexBuffer( 0,t3 ,INDICATOR_DATA);
|
||||
SetIndexBuffer( 1,t3Up1,INDICATOR_DATA);
|
||||
SetIndexBuffer( 2,t3Up2,INDICATOR_DATA);
|
||||
SetIndexBuffer( 3,t3Up3,INDICATOR_DATA);
|
||||
SetIndexBuffer( 4,t3Dn1,INDICATOR_DATA);
|
||||
SetIndexBuffer( 5,t3Dn2,INDICATOR_DATA);
|
||||
SetIndexBuffer( 6,t3Dn3,INDICATOR_DATA);
|
||||
|
||||
PlotIndexSetString(0,PLOT_LABEL,"T3");
|
||||
for (int i=1; i<4; i++)
|
||||
{
|
||||
PlotIndexSetString(i ,PLOT_LABEL,"T3 upper band "+(string)i);
|
||||
PlotIndexSetString(i+3,PLOT_LABEL,"T3 lower band "+(string)i);
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
double a = MathMax(MathMin(T3Hot,1),0.0001);;
|
||||
c1 = -a*a*a;
|
||||
c2 = 3*(a*a+a*a*a);
|
||||
c3 = -3*(2*a*a+a+a*a*a);
|
||||
c4 = 1+3*a+a*a*a+3*a*a;
|
||||
double t3period = T3Period;
|
||||
if (!T3Original) t3period = 1.0 + (t3period-1.0)/2.0;
|
||||
t3Alpha = 2.0/(1.0 + t3period);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
int OnCalculate(const int rates_total,const int prev_calculated,
|
||||
const datetime &Time[],
|
||||
const double &Open[],
|
||||
const double &High[],
|
||||
const double &Low[],
|
||||
const double &Close[],
|
||||
const long &TickVolume[],
|
||||
const long &Volume[],
|
||||
const int &Spread[])
|
||||
{
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
for (int i=(int)MathMax(prev_calculated-1,0); i<rates_total; i++)
|
||||
{
|
||||
double price;
|
||||
switch (T3Price)
|
||||
{
|
||||
case PRICE_CLOSE : price = Close[i]; break;
|
||||
case PRICE_OPEN : price = Open[i]; break;
|
||||
case PRICE_HIGH : price = High[i]; break;
|
||||
case PRICE_LOW : price = Low[i]; break;
|
||||
case PRICE_MEDIAN : price = (High[i]+Low[i])/2.0; break;
|
||||
case PRICE_TYPICAL : price = (High[i]+Low[i]+Close[i])/3.0; break;
|
||||
case PRICE_WEIGHTED : price = (High[i]+Low[i]+Close[i]+Close[i])/4.0; break;
|
||||
default : price = 0;
|
||||
}
|
||||
|
||||
t3[i] = calcT3(price,i,rates_total);
|
||||
t3Up1[i] = t3[i]+Delta1*_Point;
|
||||
t3Up2[i] = t3[i]+Delta2*_Point;
|
||||
t3Up3[i] = t3[i]+Delta3*_Point;
|
||||
t3Dn1[i] = t3[i]-Delta1*_Point;
|
||||
t3Dn2[i] = t3[i]-Delta2*_Point;
|
||||
t3Dn3[i] = t3[i]-Delta3*_Point;
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
return(rates_total);
|
||||
}
|
||||
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
double t3Values[][6];
|
||||
double calcT3(double price, int r, int bars, int s=0)
|
||||
{
|
||||
if (ArrayRange(t3Values,0)!=bars) ArrayResize(t3Values,bars);
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
if (r < 2)
|
||||
{
|
||||
t3Values[r][s+0] = price;
|
||||
t3Values[r][s+1] = price;
|
||||
t3Values[r][s+2] = price;
|
||||
t3Values[r][s+3] = price;
|
||||
t3Values[r][s+4] = price;
|
||||
t3Values[r][s+5] = price;
|
||||
}
|
||||
else
|
||||
{
|
||||
t3Values[r][s+0] = t3Values[r-1][s+0]+t3Alpha*(price -t3Values[r-1][s+0]);
|
||||
t3Values[r][s+1] = t3Values[r-1][s+1]+t3Alpha*(t3Values[r][s+0]-t3Values[r-1][s+1]);
|
||||
t3Values[r][s+2] = t3Values[r-1][s+2]+t3Alpha*(t3Values[r][s+1]-t3Values[r-1][s+2]);
|
||||
t3Values[r][s+3] = t3Values[r-1][s+3]+t3Alpha*(t3Values[r][s+2]-t3Values[r-1][s+3]);
|
||||
t3Values[r][s+4] = t3Values[r-1][s+4]+t3Alpha*(t3Values[r][s+3]-t3Values[r-1][s+4]);
|
||||
t3Values[r][s+5] = t3Values[r-1][s+5]+t3Alpha*(t3Values[r][s+4]-t3Values[r-1][s+5]);
|
||||
}
|
||||
return(c1*t3Values[r][s+5] + c2*t3Values[r][s+4] + c3*t3Values[r][s+3] + c4*t3Values[r][s+2]);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@@ -1,451 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Strong_Levels_V0.mq5 |
|
||||
//| Copyright 2023, MetaQuotes Ltd. |
|
||||
//| https://www.pipcrop.com |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2023, MetaQuotes Ltd."
|
||||
#property link "https://www.pipcrop.com"
|
||||
#property version "1.00"
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 0
|
||||
#property indicator_plots 0
|
||||
#property version "1.00"
|
||||
|
||||
#property description "Rule 1(bull candle on sup. level): if close - low > Jump Factor"
|
||||
#property description "Rule 2(bull candle on res. level): if close - low > Jump Factor & (close-low)/(high-low)>ratio"
|
||||
|
||||
#include <..\include\Math\Alglib\dataanalysis.mqh>
|
||||
CKMeans *Cclustering;
|
||||
|
||||
enum filterrules {
|
||||
rule1, // Rule 1
|
||||
rule12, // Rule 1+2
|
||||
rule2 // Rule 2
|
||||
};
|
||||
|
||||
input filterrules myfilters = 1; // Rule(s) for data gather
|
||||
input int LNo = 15; // Number of Levels to extract
|
||||
input ENUM_TIMEFRAMES tf0 = PERIOD_M1; // Analysing TF
|
||||
input double Jumpmulti = 100.0; // Min. Jump after touch (Percent of ATR)
|
||||
input double ratio = 0.6667; // Ratio
|
||||
input int ATRPer = 55; // ATR Period
|
||||
input color ResColor = clrPink; // Resistance color for Panel
|
||||
input color SupColor = clrPowderBlue; // Support color for Panel
|
||||
input color BGColor = C'23,27,38'; // Back-ground
|
||||
input color ResColor0 = clrRed; // Resistance Levels color
|
||||
input color SupColor0 = clrBlue; // Support Levels color
|
||||
input int LevelsInt = 2; // Levels Width
|
||||
|
||||
int ATRHndler, size0, xini=5, yini=20, maxbar, minbar=10, Ysize = 30, dyy=5, xdis = 0, lastbars = 0, LastLNo=0, minLN=3;
|
||||
int sup_xyz[], res_xyz[];
|
||||
long NextChart;
|
||||
string ToolName = "SH_Levels_", OBJName;
|
||||
double atr[], Jmulti;
|
||||
CMatrixDouble res_mat, sup_mat, supclusters, resclusters;
|
||||
bool startCluster = false;
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
ObjectsDeleteAll(0, ToolName);
|
||||
Jmulti = Jumpmulti/100.0;
|
||||
|
||||
ATRHndler = iATR(Symbol(), tf0, ATRPer);
|
||||
SetScreen();
|
||||
|
||||
maxbar = 100000;
|
||||
|
||||
OBJName = ToolName + "Analyse"; xdis = xini;
|
||||
ObjectCreate(0, OBJName, OBJ_BUTTON, 0, 0, 0);
|
||||
OBJSet(OBJName, "Analyse Sup./Res.", xini, yini, 180, 2*Ysize+dyy,12, C'240,240,240', clrNONE, clrBlack, ALIGN_CENTER, CORNER_LEFT_UPPER, true);
|
||||
|
||||
OBJName = ToolName + " Loadbar"; xdis+= (int)ObjectGetInteger(ChartID(), ToolName + "Analyse", OBJPROP_XSIZE) + dyy;
|
||||
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
|
||||
OBJSet(OBJName, "0.0 %", xdis, yini, 50, Ysize, 10, clrGold, clrGold, BGColor, ALIGN_LEFT, CORNER_LEFT_UPPER, true);
|
||||
|
||||
OBJName = ToolName + "clusterLoadbar"; xdis = xini+(int)ObjectGetInteger(ChartID(), ToolName + "Analyse", OBJPROP_XSIZE) + dyy; yini += Ysize + dyy;
|
||||
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
|
||||
OBJSet(OBJName, "0.0 %", xdis, yini, 50, Ysize, 10, clrGold, clrGold, BGColor, ALIGN_LEFT, CORNER_LEFT_UPPER, true);
|
||||
|
||||
OBJName = ToolName + " LN"; yini+=Ysize+dyy;
|
||||
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
|
||||
OBJSet(OBJName, "Level No.", xini, yini, 80, Ysize, 10, clrGold, clrGold, BGColor, ALIGN_LEFT, CORNER_LEFT_UPPER, true);
|
||||
|
||||
OBJName = ToolName + " LN.e"; xdis=xini+80+dyy;
|
||||
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
|
||||
OBJSet(OBJName, IntegerToString(LNo), xdis, yini, 100-dyy, Ysize, 10, BGColor, clrGold, clrGold, ALIGN_RIGHT, CORNER_LEFT_UPPER, false);
|
||||
LastLNo = LNo;
|
||||
|
||||
OBJName = ToolName + " bars"; xdis=xini; yini+=Ysize+dyy;
|
||||
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
|
||||
OBJSet(OBJName, "Bar count", xdis, yini, 80, Ysize, 10, clrGold, clrGold, BGColor, ALIGN_LEFT, CORNER_LEFT_UPPER, true);
|
||||
|
||||
OBJName = ToolName + " bars.e"; xdis+=80+dyy;
|
||||
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
|
||||
OBJSet(OBJName, IntegerToString(maxbar), xdis, yini, 100-dyy, Ysize, 10, BGColor, clrGold, clrGold, ALIGN_RIGHT, CORNER_LEFT_UPPER, false);
|
||||
lastbars = maxbar;
|
||||
|
||||
OBJName = ToolName + " TotalRes"; yini+=Ysize+3*dyy;
|
||||
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
|
||||
OBJSet(OBJName, "Res. Count: ", xini, yini, 180, Ysize, 12, ResColor, ResColor, BGColor, ALIGN_LEFT, CORNER_LEFT_UPPER, true);
|
||||
|
||||
OBJName = ToolName + " TotalSup"; yini+=Ysize+dyy;
|
||||
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
|
||||
OBJSet(OBJName, "Sup. Count: ", xini, yini, 180, Ysize, 12, SupColor, SupColor, BGColor, ALIGN_LEFT, CORNER_LEFT_UPPER, true);
|
||||
|
||||
EventSetMillisecondTimer(5);
|
||||
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[])
|
||||
{
|
||||
//---
|
||||
|
||||
//--- return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Expert deinitialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnDeinit(const int reason)
|
||||
{
|
||||
if (reason==1 || reason==4)
|
||||
{
|
||||
ObjectsDeleteAll(0, ToolName);
|
||||
EventKillTimer();
|
||||
}
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
void Analyse()
|
||||
{
|
||||
// Reset Graphics
|
||||
OBJName = ToolName + "Zone_";
|
||||
ObjectsDeleteAll(ChartID(), OBJName); ChartRedraw();
|
||||
|
||||
OBJName = ToolName + " Loadbar";
|
||||
ObjectSetString(0, OBJName, OBJPROP_TEXT, "0.0 %");
|
||||
ObjectSetInteger(0, OBJName, OBJPROP_XSIZE, 50);
|
||||
|
||||
OBJName = ToolName + "clusterLoadbar";
|
||||
ObjectSetInteger(0, OBJName, OBJPROP_XSIZE, 50);
|
||||
ObjectSetString(0, OBJName, OBJPROP_TEXT, "0.0 %");
|
||||
|
||||
Ysize = 30;
|
||||
|
||||
// Set data limits from screen
|
||||
int bars = lastbars, ctype[];
|
||||
double low[], high[], close[], open[], total[];
|
||||
ArrayResize(ctype, bars); ArrayInitialize(ctype, 0);
|
||||
|
||||
int resi = (int) (bars / 1000.0)-1;
|
||||
if (resi<=0) resi=2;
|
||||
|
||||
// Copy bars data
|
||||
if (CopyBuffer(ATRHndler, 0, 0, bars, atr)<=0) return;
|
||||
if (CopyLow(Symbol(), tf0, 0, bars, low)<=0) return;
|
||||
if (CopyHigh(Symbol(), tf0, 0, bars, high)<=0) return;
|
||||
if (CopyClose(Symbol(), tf0, 0, bars, close)<=0) return;
|
||||
if (CopyOpen(Symbol(), tf0, 0, bars, open)<=0) return;
|
||||
|
||||
bars = (int) MathMin(ArraySize(open), MathMin((double) bars, ArraySize(close)));
|
||||
|
||||
// Fill candle type (Bull? Bear?)
|
||||
for (int i=bars-ATRPer-1; i>=0; i--)
|
||||
{
|
||||
Print(i," ",ArraySize(close));
|
||||
if (close[i]>open[i]) ctype[i] = +1;
|
||||
else if (close[i]<open[i]) ctype[i] = -1;
|
||||
}
|
||||
|
||||
// Fill S/R matrixes base on selected time-frame candels OHLC data
|
||||
// Implementing Jump rules and candle type limits
|
||||
sup_mat.Resize(0, 0); supclusters.Resize(0, 0);
|
||||
res_mat.Resize(0, 0); resclusters.Resize(0,0);
|
||||
|
||||
for (int i=bars-ATRPer-1; i>=0; i--)
|
||||
{
|
||||
if (myfilters<=1 && ctype[i]==+1 && close[i]-low[i]>=atr[i]*Jmulti) Addsup(low[i]);
|
||||
if (myfilters>=1 && ctype[i]==-1 && close[i]-low[i]>=atr[i]*Jmulti && (close[i]-low[i])/(high[i]-low[i])>=ratio) Addsup(low[i]);
|
||||
|
||||
if (myfilters<=1 && ctype[i]==-1 && high[i]-close[i]>=atr[i]*Jmulti) Addres(high[i]);
|
||||
if (myfilters>=1 && ctype[i]==+1 && high[i]-close[i]>=atr[i]*Jmulti && (high[i]-close[i])/(high[i]-low[i])>=ratio) Addres(high[i]);
|
||||
|
||||
if (MathMod((double) i, resi) == 0)
|
||||
{
|
||||
ObjectSetString(0, ToolName + " Loadbar", OBJPROP_TEXT, DoubleToString(100*(double) (bars-ATRPer-1-i)/(bars-ATRPer-1),1) + " %");
|
||||
ObjectSetInteger(0, ToolName + " Loadbar", OBJPROP_XSIZE, 50 + (int) (300 * ((double) (bars-ATRPer-i+1)/(bars-ATRPer-1))));
|
||||
ObjectSetString(0, ToolName + " TotalRes", OBJPROP_TEXT, "Res. Count: " + IntegerToString(res_mat.Rows()));
|
||||
ObjectSetString(0, ToolName + " TotalSup", OBJPROP_TEXT, "Sup. Count: " + IntegerToString(sup_mat.Rows()));
|
||||
|
||||
ChartRedraw();
|
||||
}
|
||||
}
|
||||
|
||||
startCluster = true;
|
||||
OBJName = ToolName + "clusterLoadbar";
|
||||
ObjectSetInteger(0, OBJName, OBJPROP_XSIZE, 350);
|
||||
ObjectSetString(0, OBJName, OBJPROP_TEXT, "Wait for Cluster Calculation...");
|
||||
|
||||
int supinfo, resinfo, Restarts=5;
|
||||
Cclustering.KMeansGenerate(sup_mat, sup_mat.Rows(), sup_mat.Cols(), LastLNo, Restarts, supinfo, supclusters, sup_xyz);
|
||||
Cclustering.KMeansGenerate(res_mat, res_mat.Rows(), res_mat.Cols(), LastLNo, Restarts, resinfo, resclusters, res_xyz);
|
||||
|
||||
startCluster = false;
|
||||
ObjectSetString(0, OBJName, OBJPROP_TEXT, "Cluster Calculation done!");
|
||||
|
||||
double LevelRes[], LevelSup[], LevelTotal[];
|
||||
ArrayResize(LevelRes, LastLNo); ArrayResize(LevelSup, LastLNo); ArrayResize(LevelTotal, LastLNo);
|
||||
|
||||
OBJName = ToolName + "clusterLoadbar";
|
||||
int stat_x = (int) ObjectGetInteger(ChartID(), OBJName, OBJPROP_XDISTANCE);
|
||||
OBJName = ToolName + " Loadbar";;
|
||||
stat_x += (int) ObjectGetInteger(ChartID(), OBJName, OBJPROP_XSIZE) + dyy;
|
||||
OBJName = ToolName + "Analyse";
|
||||
int stat_y = (int) ObjectGetInteger(ChartID(), OBJName, OBJPROP_YDISTANCE);
|
||||
|
||||
// Closters Graphical
|
||||
OBJName = ToolName + "Zone_Res_Header";
|
||||
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
|
||||
OBJSet(OBJName, "Res. Levels", stat_x, stat_y, 135, Ysize, 12, ResColor, ResColor, BGColor, ALIGN_CENTER, CORNER_LEFT_UPPER, true);
|
||||
|
||||
OBJName = ToolName + "Zone_Sup_Header";
|
||||
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0); stat_x+=135+dyy;
|
||||
OBJSet(OBJName, "Sup. Levels", stat_x, stat_y, 135, Ysize, 12, SupColor, SupColor, BGColor, ALIGN_CENTER, CORNER_LEFT_UPPER, true);
|
||||
|
||||
stat_y+=Ysize+dyy;
|
||||
Ysize/=2;
|
||||
|
||||
for (int i=0; i<LastLNo; i++)
|
||||
{
|
||||
stat_x -=135+dyy;
|
||||
OBJName = ToolName + "Zone_Res_" + IntegerToString(i);
|
||||
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
|
||||
OBJSet(OBJName, DoubleToString(resclusters.Get(0, i), Digits()), stat_x, stat_y, 135, Ysize, 12, ResColor, ResColor, BGColor, ALIGN_CENTER, CORNER_LEFT_UPPER, true);
|
||||
|
||||
stat_x +=135+dyy;
|
||||
OBJName = ToolName + "Zone_Sup_" + IntegerToString(i);
|
||||
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
|
||||
OBJSet(OBJName, DoubleToString(supclusters.Get(0, i), Digits()), stat_x, stat_y, 135, Ysize, 12, SupColor, SupColor, BGColor, ALIGN_CENTER, CORNER_LEFT_UPPER, true);
|
||||
stat_y+=Ysize+dyy;
|
||||
}
|
||||
|
||||
|
||||
NextChart = ChartOpen(Symbol(), Period());
|
||||
datetime future = TimeCurrent()+ PeriodSeconds(PERIOD_MN1) * 100;
|
||||
double price;
|
||||
|
||||
for (int i=0; i<LastLNo; i++)
|
||||
{
|
||||
price = NormalizeDouble(resclusters.Get(0, i), Digits());
|
||||
OBJName = ToolName + "Zone_Res_" + IntegerToString(i+LastLNo+1);
|
||||
ObjectCreate(NextChart, OBJName, OBJ_HLINE, 0, 0, 0);
|
||||
TrendSet(OBJName, 0, NextChart, price, price, ResColor0, LevelsInt, STYLE_SOLID, true);
|
||||
|
||||
price = NormalizeDouble(supclusters.Get(0, i), Digits());
|
||||
OBJName = ToolName + "Zone_Sup_" + IntegerToString(i+LastLNo+1);
|
||||
ObjectCreate(NextChart, OBJName, OBJ_HLINE, 0, 0, 0);
|
||||
TrendSet(OBJName, 0, NextChart, price, price, SupColor0, LevelsInt, STYLE_SOLID, true);
|
||||
}
|
||||
|
||||
ChartRedraw(NextChart);
|
||||
delete Cclustering;
|
||||
ArrayFree(sup_xyz); ArrayFree(res_xyz);
|
||||
ArrayFree(atr);
|
||||
|
||||
Ysize = 30;
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Timer function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnTimer()
|
||||
{
|
||||
if (startCluster)
|
||||
{
|
||||
OBJName = ToolName + "clusterLoadbar";
|
||||
|
||||
if (ObjectGetString(0, OBJName, OBJPROP_TEXT)=="Wait for Cluster Calculation")
|
||||
ObjectSetString(0, OBJName, OBJPROP_TEXT, "Wait for Cluster Calculation.");
|
||||
else if (ObjectGetString(0, OBJName, OBJPROP_TEXT)=="Wait for Cluster Calculation.")
|
||||
ObjectSetString(0, OBJName, OBJPROP_TEXT, "Wait for Cluster Calculation..");
|
||||
else if (ObjectGetString(0, OBJName, OBJPROP_TEXT)=="Wait for Cluster Calculation..")
|
||||
ObjectSetString(0, OBJName, OBJPROP_TEXT, "Wait for Cluster Calculation...");
|
||||
else if (ObjectGetString(0, OBJName, OBJPROP_TEXT)=="Wait for Cluster Calculation..")
|
||||
ObjectSetString(0, OBJName, OBJPROP_TEXT, "Wait for Cluster Calculation");
|
||||
|
||||
ChartRedraw();
|
||||
}
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
void MeanNormalization(matrix &mat)
|
||||
{
|
||||
vector v = {};
|
||||
|
||||
for(ulong i=0; i<mat.Cols(); i++)
|
||||
{
|
||||
v = mat.Col(i);
|
||||
MeanNormalization(v);
|
||||
mat.Col(v, i);
|
||||
}
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
void MeanNormalization(vector &v)
|
||||
{
|
||||
double mean = v.Mean(),
|
||||
max = v.Max(),
|
||||
min = v.Min();
|
||||
|
||||
for(ulong i=0; i<v.Size(); i++)
|
||||
v[i] = (v[i] - mean) / (max - min);
|
||||
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
void Addsup(double price)
|
||||
{
|
||||
int msize = sup_mat.Rows();
|
||||
sup_mat.Resize(msize+1, 1);
|
||||
sup_mat.Set(msize, 0, price);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
void Addres(double price)
|
||||
{
|
||||
int msize = res_mat.Rows();
|
||||
res_mat.Resize(msize+1, 1);
|
||||
res_mat.Set(msize, 0, price);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| ChartEvent function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnChartEvent(const int id,
|
||||
const long &lparam,
|
||||
const double &dparam,
|
||||
const string &sparam)
|
||||
{
|
||||
if (id == CHARTEVENT_OBJECT_CLICK && sparam==ToolName + "Analyse")
|
||||
{
|
||||
Sleep(100);
|
||||
ObjectSetInteger(ChartID(), sparam, OBJPROP_STATE, false);
|
||||
ChartRedraw();
|
||||
Analyse();
|
||||
}
|
||||
|
||||
if (id == CHARTEVENT_OBJECT_ENDEDIT && sparam==ToolName + " bars.e")
|
||||
{
|
||||
OBJName = sparam;
|
||||
int bar = (int) StringToInteger(ObjectGetString(ChartID(), OBJName, OBJPROP_TEXT));
|
||||
if (bar<0) bar=iBars(Symbol(), tf0)+1;
|
||||
|
||||
if (bar<minbar)
|
||||
{
|
||||
MessageBox("Min. bar to analyse is " + IntegerToString(minbar) + "!", "Min. bar limit", 0);
|
||||
ObjectSetString(0, OBJName, OBJPROP_TEXT, IntegerToString(minbar));
|
||||
}
|
||||
else if (bar>iBars(Symbol(), tf0))
|
||||
{
|
||||
MessageBox("Max. bar to analyse is " + IntegerToString(iBars(Symbol(), tf0)) + "!","Max. bar limit", 0);
|
||||
ObjectSetString(0, OBJName, OBJPROP_TEXT, IntegerToString(iBars(Symbol(), tf0)));
|
||||
}
|
||||
else if (bar>900000)
|
||||
{
|
||||
int mes = MessageBox(IntegerToString(bar) + " bars to analyse is so much and will take time more than 1 minute! Are you sure?", "Max. bar warning", 1);
|
||||
if (mes==2) ObjectSetString(0, OBJName, OBJPROP_TEXT, IntegerToString(lastbars));
|
||||
}
|
||||
|
||||
lastbars = (int) StringToInteger(ObjectGetString(ChartID(), OBJName, OBJPROP_TEXT));
|
||||
}
|
||||
|
||||
|
||||
if (id == CHARTEVENT_OBJECT_ENDEDIT && sparam==ToolName + " LN.e")
|
||||
{
|
||||
OBJName = sparam;
|
||||
int bar = (int) StringToInteger(ObjectGetString(ChartID(), OBJName, OBJPROP_TEXT));
|
||||
if (bar<0) bar=LNo;
|
||||
|
||||
if (bar<minLN)
|
||||
{
|
||||
MessageBox("Min. Level No. to analyse is " + IntegerToString(minLN) + "!", "Min. Level No. limit", 0);
|
||||
ObjectSetString(0, OBJName, OBJPROP_TEXT, IntegerToString(minLN));
|
||||
}
|
||||
else if (bar>500)
|
||||
{
|
||||
MessageBox("Max. Level No. to analyse is 500" + "!","Max. bar limit", 0);
|
||||
ObjectSetString(0, OBJName, OBJPROP_TEXT, IntegerToString(500));
|
||||
}
|
||||
else if (bar>100)
|
||||
{
|
||||
int mes = MessageBox(IntegerToString(bar) + " Level No. analyse is so much and will take time more than 1 minute! Are you sure?", "Max. Level No. warning", 1);
|
||||
if (mes==2) ObjectSetString(0, OBJName, OBJPROP_TEXT, IntegerToString(LastLNo));
|
||||
}
|
||||
|
||||
LastLNo = (int) StringToInteger(ObjectGetString(ChartID(), OBJName, OBJPROP_TEXT));
|
||||
}
|
||||
|
||||
ChartRedraw();
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
void SetScreen()
|
||||
{
|
||||
ChartSetInteger(ChartID(), CHART_FOREGROUND, false);
|
||||
ChartSetInteger(0, CHART_COLOR_CANDLE_BEAR, BGColor);
|
||||
ChartSetInteger(0, CHART_COLOR_CANDLE_BULL, BGColor);
|
||||
ChartSetInteger(0, CHART_COLOR_CHART_LINE, BGColor);
|
||||
ChartSetInteger(0, CHART_COLOR_CHART_DOWN, BGColor);
|
||||
ChartSetInteger(0, CHART_COLOR_CHART_UP, BGColor);
|
||||
ChartSetInteger(0, CHART_COLOR_ASK, BGColor);
|
||||
ChartSetInteger(0, CHART_COLOR_BID, BGColor);
|
||||
ChartSetInteger(0, CHART_COLOR_GRID, BGColor);
|
||||
ChartSetInteger(0, CHART_COLOR_BACKGROUND, BGColor);
|
||||
ChartSetInteger(0, CHART_COLOR_FOREGROUND, BGColor);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
void OBJSet(string OBJNameSet, string txt, int XDis, int YDis, int XSize, int YSize, int FSize, color Fill, color Border, color TColor, ENUM_ALIGN_MODE myAlign, ENUM_BASE_CORNER mycorner, bool myread)
|
||||
{
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_CORNER, mycorner);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_XDISTANCE, XDis);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_YDISTANCE, YDis);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_XSIZE, XSize);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_YSIZE, YSize);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_FONTSIZE, FSize);
|
||||
ObjectSetString(ChartID(), OBJNameSet, OBJPROP_TEXT,txt);
|
||||
ObjectSetString(ChartID(), OBJNameSet, OBJPROP_FONT,"Calibri");
|
||||
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_BGCOLOR, Fill);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_BORDER_COLOR, Border);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_COLOR, TColor);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_ALIGN, myAlign);
|
||||
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_BACK, false);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_ZORDER,5);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_HIDDEN, true);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_READONLY, myread);
|
||||
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_SELECTABLE, false);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
void TrendSet(string TrendName, datetime time0, datetime time1, double price1, double price2, color Tcolor, int Twidth, ENUM_LINE_STYLE Tstyle, int b)
|
||||
{
|
||||
ObjectSetInteger(NextChart, TrendName, OBJPROP_TIME, 0, time0);
|
||||
ObjectSetInteger(NextChart, TrendName, OBJPROP_TIME, 1, time1);
|
||||
ObjectSetInteger(NextChart, TrendName, OBJPROP_COLOR, Tcolor);
|
||||
ObjectSetInteger(NextChart, TrendName, OBJPROP_RAY, false);
|
||||
ObjectSetInteger(NextChart, TrendName, OBJPROP_WIDTH, Twidth);
|
||||
ObjectSetInteger(NextChart, TrendName, OBJPROP_STYLE, Tstyle);
|
||||
ObjectSetInteger(NextChart, TrendName, OBJPROP_BACK, true);
|
||||
ObjectSetInteger(NextChart, TrendName, OBJPROP_SELECTABLE, false);
|
||||
ObjectSetInteger(NextChart, TrendName, OBJPROP_TIMEFRAMES, b?OBJ_ALL_PERIODS:OBJ_NO_PERIODS);
|
||||
ObjectSetDouble(NextChart, TrendName, OBJPROP_PRICE, 0, price1);
|
||||
ObjectSetDouble(NextChart, TrendName, OBJPROP_PRICE, 1, price2);
|
||||
}
|
||||
|
||||
@@ -1,204 +0,0 @@
|
||||
//------------------------------------------------------------------
|
||||
#property copyright "www.forex-tsd.com"
|
||||
#property link "www.forex-tsd.com"
|
||||
//------------------------------------------------------------------
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 2
|
||||
#property indicator_plots 1
|
||||
#property indicator_label1 "Super trend hull"
|
||||
#property indicator_type1 DRAW_COLOR_LINE
|
||||
#property indicator_color1 clrLimeGreen,clrPaleVioletRed
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 2
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
enum enPrices
|
||||
{
|
||||
pr_close, // Close
|
||||
pr_open, // Open
|
||||
pr_high, // High
|
||||
pr_low, // Low
|
||||
pr_median, // Median
|
||||
pr_typical, // Typical
|
||||
pr_weighted, // Weighted
|
||||
pr_average // Average (high+low+oprn+close)/4
|
||||
};
|
||||
|
||||
input int hullPeriod = 12; // Hull period
|
||||
input enPrices Price = pr_median; // Price
|
||||
input int atrPeriod = 12; // ATR period
|
||||
input double atrMultiplier = 0.66; // ATR multiplier
|
||||
|
||||
double st[];
|
||||
double colorBuffer[];
|
||||
|
||||
//------------------------------------------------------------------
|
||||
//
|
||||
//------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
int OnInit()
|
||||
{
|
||||
SetIndexBuffer(0,st,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,colorBuffer,INDICATOR_COLOR_INDEX);
|
||||
return(0);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------
|
||||
//
|
||||
//------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
double Up[];
|
||||
double Dn[];
|
||||
double Direction[];
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime& time[],
|
||||
const double& open[],
|
||||
const double& high[],
|
||||
const double& low[],
|
||||
const double& close[],
|
||||
const long& tick_volume[],
|
||||
const long& volume[],
|
||||
const int& spread[])
|
||||
{
|
||||
if (ArraySize(Direction)!=rates_total)
|
||||
{
|
||||
ArrayResize(Up,rates_total);
|
||||
ArrayResize(Dn,rates_total);
|
||||
ArrayResize(Direction,rates_total);
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
for (int i=(int)MathMax(prev_calculated-1,1); i<rates_total; i++)
|
||||
{
|
||||
double atr = 0;
|
||||
for (int k=0;k<atrPeriod && (i-k-1)>=0; k++)
|
||||
atr += MathMax(high[i-k],close[i-k-1])-MathMin(low[i-k],close[i-k-1]);
|
||||
atr /= atrPeriod;
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
double cprice = close[i];
|
||||
double mprice = iHull(getPrice(Price,open,close,high,low,i,rates_total),hullPeriod,i,rates_total);
|
||||
Up[i] = mprice+atrMultiplier*atr;
|
||||
Dn[i] = mprice-atrMultiplier*atr;
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
colorBuffer[i] = colorBuffer[i-1];
|
||||
Direction[i] = Direction[i-1];
|
||||
if (cprice > Up[i-1]) Direction[i] = 1;
|
||||
if (cprice < Dn[i-1]) Direction[i] = -1;
|
||||
if (Direction[i] > 0)
|
||||
{ Dn[i] = MathMax(Dn[i],Dn[i-1]); st[i] = Dn[i]; }
|
||||
else { Up[i] = MathMin(Up[i],Up[i-1]); st[i] = Up[i]; }
|
||||
if (Direction[i]== 1) colorBuffer[i] = 0;
|
||||
if (Direction[i]==-1) colorBuffer[i] = 1;
|
||||
}
|
||||
return(rates_total);
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------
|
||||
//
|
||||
//------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
double workHull[][2];
|
||||
double iHull(double price, double period, int r, int bars, int instanceNo=0)
|
||||
{
|
||||
if (ArrayRange(workHull,0)!= bars) ArrayResize(workHull,bars);
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
int HmaPeriod = (int)MathMax(period,2);
|
||||
int HalfPeriod = (int)MathFloor(HmaPeriod/2);
|
||||
int HullPeriod = (int)MathFloor(MathSqrt(HmaPeriod));
|
||||
double hma,hmw,weight; instanceNo *= 2;
|
||||
|
||||
workHull[r][instanceNo] = price;
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
hmw = HalfPeriod; hma = hmw*price;
|
||||
for(int k=1; k<HalfPeriod && (r-k)>=0; k++)
|
||||
{
|
||||
weight = HalfPeriod-k;
|
||||
hmw += weight;
|
||||
hma += weight*workHull[r-k][instanceNo];
|
||||
}
|
||||
workHull[r][instanceNo+1] = 2.0*hma/hmw;
|
||||
|
||||
hmw = HmaPeriod; hma = hmw*price;
|
||||
for(int k=1; k<period && (r-k)>=0; k++)
|
||||
{
|
||||
weight = HmaPeriod-k;
|
||||
hmw += weight;
|
||||
hma += weight*workHull[r-k][instanceNo];
|
||||
}
|
||||
workHull[r][instanceNo+1] -= hma/hmw;
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
hmw = HullPeriod; hma = hmw*workHull[r][instanceNo+1];
|
||||
for(int k=1; k<HullPeriod && (r-k)>=0; k++)
|
||||
{
|
||||
weight = HullPeriod-k;
|
||||
hmw += weight;
|
||||
hma += weight*workHull[r-k][1+instanceNo];
|
||||
}
|
||||
return(hma/hmw);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------
|
||||
//
|
||||
//------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
@@ -1,192 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| SuperTrend.mq5 |
|
||||
//| Copyright 2011, FxGeek |
|
||||
//| http://www.mql5.com |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2011, FxGeek"
|
||||
#property link " http://www.mql5.com"
|
||||
#property version "1.00"
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 9
|
||||
#property indicator_plots 2
|
||||
|
||||
#property indicator_label1 "Filling"
|
||||
#property indicator_type1 DRAW_FILLING
|
||||
#property indicator_color1 clrBisque, clrPaleGreen
|
||||
|
||||
#property indicator_label2 "SuperTrend"
|
||||
#property indicator_type2 DRAW_COLOR_LINE
|
||||
#property indicator_color2 clrGreen, clrRed
|
||||
|
||||
input int Periode=10;
|
||||
input double Multiplier=3;
|
||||
input bool Show_Filling=true; // Show as DRAW_FILLING
|
||||
|
||||
double Filled_a[];
|
||||
double Filled_b[];
|
||||
double SuperTrend[];
|
||||
double ColorBuffer[];
|
||||
double Atr[];
|
||||
double Up[];
|
||||
double Down[];
|
||||
double Middle[];
|
||||
double trend[];
|
||||
|
||||
int atrHandle;
|
||||
int changeOfTrend;
|
||||
int flag;
|
||||
int flagh;
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0,Filled_a,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,Filled_b,INDICATOR_DATA);
|
||||
SetIndexBuffer(2,SuperTrend,INDICATOR_DATA);
|
||||
SetIndexBuffer(3,ColorBuffer,INDICATOR_COLOR_INDEX);
|
||||
SetIndexBuffer(4,Atr,INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(5,Up,INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(6,Down,INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(7,Middle,INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(8,trend,INDICATOR_CALCULATIONS);
|
||||
|
||||
atrHandle=iATR(_Symbol,_Period,Periode);
|
||||
//---
|
||||
return(0);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[])
|
||||
{
|
||||
//---
|
||||
int to_copy;
|
||||
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
|
||||
else
|
||||
{
|
||||
to_copy=rates_total-prev_calculated;
|
||||
if(prev_calculated>0) to_copy++;
|
||||
}
|
||||
|
||||
if(IsStopped()) return(0); //Checking for stop flag
|
||||
if(CopyBuffer(atrHandle,0,0,to_copy,Atr)<=0)
|
||||
{
|
||||
Print("Getting Atr is failed! Error",GetLastError());
|
||||
return(0);
|
||||
}
|
||||
|
||||
int first;
|
||||
if(prev_calculated>rates_total || prev_calculated<=0) // checking for the first start of calculation of an indicator
|
||||
{
|
||||
first=Periode; // starting index for calculation of all bars
|
||||
}
|
||||
else
|
||||
{
|
||||
first=prev_calculated-1; // starting number for calculation of new bars
|
||||
}
|
||||
for(int i=first; i<rates_total && !IsStopped(); i++)
|
||||
{
|
||||
Middle[i]=(high[i]+low[i])/2;
|
||||
Up[i] = Middle[i] +(Multiplier*Atr[i]);
|
||||
Down[i]= Middle[i] -(Multiplier*Atr[i]);
|
||||
|
||||
if(close[i]>Up[i-1])
|
||||
{
|
||||
trend[i]=1;
|
||||
if(trend[i-1]==-1) changeOfTrend=1;
|
||||
|
||||
}
|
||||
else if(close[i]<Down[i-1])
|
||||
{
|
||||
trend[i]=-1;
|
||||
if(trend[i-1]==1) changeOfTrend=1;
|
||||
}
|
||||
else if(trend[i-1]==1)
|
||||
{
|
||||
trend[i]=1;
|
||||
changeOfTrend=0;
|
||||
}
|
||||
else if(trend[i-1]==-1)
|
||||
{
|
||||
trend[i]=-1;
|
||||
changeOfTrend=0;
|
||||
}
|
||||
|
||||
if(trend[i]<0 && trend[i-1]>0)
|
||||
{
|
||||
flag=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
flag=0;
|
||||
}
|
||||
|
||||
if(trend[i]>0 && trend[i-1]<0)
|
||||
{
|
||||
flagh=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
flagh=0;
|
||||
}
|
||||
|
||||
if(trend[i]>0 && Down[i]<Down[i-1])
|
||||
Down[i]=Down[i-1];
|
||||
|
||||
if(trend[i]<0 && Up[i]>Up[i-1])
|
||||
Up[i]=Up[i-1];
|
||||
|
||||
if(flag==1)
|
||||
Up[i]=Middle[i]+(Multiplier*Atr[i]);
|
||||
|
||||
if(flagh==1)
|
||||
Down[i]=Middle[i]-(Multiplier*Atr[i]);
|
||||
|
||||
//-- Draw the indicator
|
||||
if(trend[i]==1)
|
||||
{
|
||||
SuperTrend[i]=Down[i];
|
||||
if(changeOfTrend==1)
|
||||
{
|
||||
SuperTrend[i-1]=SuperTrend[i-2];
|
||||
changeOfTrend=0;
|
||||
}
|
||||
ColorBuffer[i]=0.0;
|
||||
}
|
||||
else if(trend[i]==-1)
|
||||
{
|
||||
SuperTrend[i]=Up[i];
|
||||
if(changeOfTrend==1)
|
||||
{
|
||||
SuperTrend[i-1]= SuperTrend[i-2];
|
||||
changeOfTrend = 0;
|
||||
}
|
||||
ColorBuffer[i]=1.0;
|
||||
}
|
||||
|
||||
if(Show_Filling)
|
||||
{
|
||||
Filled_a[i]= SuperTrend[i];
|
||||
Filled_b[i]= close[i];
|
||||
}else{
|
||||
Filled_a[i]= EMPTY_VALUE;
|
||||
Filled_b[i]= EMPTY_VALUE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//--- return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -1,117 +0,0 @@
|
||||
//------------------------------------------------------------------
|
||||
#property copyright "www.forex-tsd.com"
|
||||
#property link "www.forex-tsd.com"
|
||||
//------------------------------------------------------------------
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 2
|
||||
#property indicator_plots 1
|
||||
#property indicator_label1 "Swing line"
|
||||
#property indicator_type1 DRAW_COLOR_LINE
|
||||
#property indicator_color1 clrLimeGreen,clrPaleVioletRed
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 3
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
double swli[];
|
||||
double colorBuffer[];
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
int OnInit()
|
||||
{
|
||||
SetIndexBuffer(0,swli,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,colorBuffer,INDICATOR_COLOR_INDEX);
|
||||
return(0);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
|
||||
double work[][5];
|
||||
#define hHi 0
|
||||
#define hLo 1
|
||||
#define lHi 2
|
||||
#define lLo 3
|
||||
#define trend 4
|
||||
|
||||
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime& time[],
|
||||
const double& open[],
|
||||
const double& high[],
|
||||
const double& low[],
|
||||
const double& close[],
|
||||
const long& tick_volume[],
|
||||
const long& volume[],
|
||||
const int& spread[])
|
||||
{
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
if (ArrayRange(work,0)!=rates_total) ArrayResize(work,rates_total);
|
||||
for (int i=(int)MathMax(prev_calculated-1,0); i<rates_total; i++)
|
||||
{
|
||||
if (i==0)
|
||||
{
|
||||
work[i][hHi] = high[i]; work[i][hLo] = low[i];
|
||||
work[i][lHi] = high[i]; work[i][lLo] = low[i];
|
||||
work[i][trend] = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
work[i][trend] = work[i-1][trend];
|
||||
work[i][hHi] = work[i-1][hHi]; work[i][hLo] = work[i-1][hLo];
|
||||
work[i][lHi] = work[i-1][lHi]; work[i][lLo] = work[i-1][lLo];
|
||||
|
||||
if (work[i-1][trend] == 1)
|
||||
{
|
||||
work[i][hHi] = MathMax(work[i-1][hHi],high[i]);
|
||||
work[i][hLo] = MathMax(work[i-1][hLo],low[i]);
|
||||
if (high[i]<work[i][hLo]) { work[i][trend] = -1; work[i][lHi] = high[i]; work[i][lLo] = low[i]; }
|
||||
}
|
||||
if (work[i-1][trend] == -1)
|
||||
{
|
||||
work[i][lHi] = MathMin(work[i-1][lHi],high[i]);
|
||||
work[i][lLo] = MathMin(work[i-1][lLo],low[i]);
|
||||
if (low[i]>work[i][lHi]) { work[i][trend] = 1; work[i][hHi] = high[i]; work[i][hLo] = low[i]; }
|
||||
}
|
||||
|
||||
if (work[i][trend]==1)
|
||||
swli[i] = work[i][hLo];
|
||||
else swli[i] = work[i][lHi];
|
||||
colorBuffer[i] = colorBuffer[i-1];
|
||||
if (work[i][trend]== 1) colorBuffer[i]= 0;
|
||||
if (work[i][trend]==-1) colorBuffer[i]= 1;
|
||||
}
|
||||
return(rates_total);
|
||||
}
|
||||
@@ -1,97 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Swings.mq5 |
|
||||
//| Rajesh Nait, Copyright 2023 |
|
||||
//| https://www.mql5.com/en/users/rajeshnait/seller |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Rajesh Nait, Copyright 2023"
|
||||
#property link "https://www.mql5.com/en/users/rajeshnait/seller"
|
||||
#property version "1.00"
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 2
|
||||
#property indicator_plots 2
|
||||
|
||||
//--- plot Bullish Marubozu
|
||||
#property indicator_label1 "+S"
|
||||
#property indicator_type1 DRAW_ARROW
|
||||
#property indicator_color1 clrSnow
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 1
|
||||
//--- plot Bearish Marubozu
|
||||
#property indicator_label2 "-S"
|
||||
#property indicator_type2 DRAW_ARROW
|
||||
#property indicator_color2 clrSnow
|
||||
#property indicator_style2 STYLE_SOLID
|
||||
#property indicator_width2 1
|
||||
|
||||
//--- input parameters
|
||||
input group "Swing Low"
|
||||
uchar InpSwingLowCode = 110; // Swing Low: code for style DRAW_ARROW (font Wingdings)
|
||||
int InpSwingLowShift = 10; // Swing Low: vertical shift of arrows in pixels
|
||||
input group "Swing High"
|
||||
uchar InpSwingHighCode = 110; // SwingHigh: code for style DRAW_ARROW (font Wingdings)
|
||||
int InpSwingHighShift =10; // SwingHigh: vertical shift of arrows in pixels
|
||||
//--- indicator buffers
|
||||
double SwingLowBuffer[];
|
||||
double SwingHighBuffer[];
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit() {
|
||||
//--- indicator buffers mapping
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0,SwingLowBuffer,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,SwingHighBuffer,INDICATOR_DATA);
|
||||
|
||||
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
|
||||
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
|
||||
PlotIndexSetInteger(0,PLOT_ARROW,InpSwingLowCode);
|
||||
PlotIndexSetInteger(1,PLOT_ARROW,InpSwingHighCode);
|
||||
//--- set the vertical shift of arrows in pixels
|
||||
PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,InpSwingLowShift);
|
||||
PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-InpSwingHighShift);
|
||||
//--- set as an empty value 0.0
|
||||
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
|
||||
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
|
||||
//---
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[]) {
|
||||
//---
|
||||
if(rates_total<3)
|
||||
return(0);
|
||||
//---
|
||||
int limit=prev_calculated-1;
|
||||
if(prev_calculated==0)
|
||||
limit=2;
|
||||
|
||||
for(int i=limit; i<rates_total-2; i++) {
|
||||
SwingLowBuffer[i]=0.0;
|
||||
SwingHighBuffer[i]=0.0;
|
||||
if(i>0) {
|
||||
SwingHighBuffer[0]=EMPTY_VALUE;
|
||||
if(high[i+2]<high[i+1] && high[i+1]<high[i])
|
||||
if(high[i]>high[i-1] && high[i-1]>high[i-2])
|
||||
SwingHighBuffer[i]=high[i];
|
||||
|
||||
SwingLowBuffer[0]=EMPTY_VALUE;
|
||||
if(low[i+2]>low[i+1] && low[i+1]>low[i])
|
||||
if(low[i]<low[i-1] && low[i-1]<low[i-2])
|
||||
SwingLowBuffer[i]=low[i];
|
||||
}
|
||||
}
|
||||
//--- return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -1,289 +0,0 @@
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
#define MName "Time Segmented Volume (TSV)"
|
||||
#define MVersion "1.01"
|
||||
#define MBuild "2023-03-27 21:02 WET"
|
||||
#define MCopyright "Copyright \x00A9 2023, Fernando M. I. Carreiro, All rights reserved"
|
||||
#define MProfile "https://www.mql5.com/en/users/FMIC"
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
#property strict
|
||||
#property version MVersion
|
||||
#property description MName
|
||||
#property description "MetaTrader Indicator (Build "MBuild")"
|
||||
#property copyright MCopyright
|
||||
#property link MProfile
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
//--- Setup
|
||||
|
||||
#property indicator_separate_window
|
||||
|
||||
// Define number of buffers and plots
|
||||
#define MPlots 3
|
||||
#define MBuffers 7
|
||||
#ifdef __MQL4__
|
||||
#property indicator_buffers ( MPlots + 1 )
|
||||
#else
|
||||
#property indicator_buffers MBuffers
|
||||
#property indicator_plots MPlots
|
||||
#endif
|
||||
|
||||
// Define plot colours and respective indices
|
||||
#define MClrCandleNone C'239,166,117'
|
||||
#define MClrCandleUp C'38,166,154'
|
||||
#define MClrCandleDown C'239,83,80'
|
||||
|
||||
// Display properties for plots
|
||||
#ifdef __MQL4__
|
||||
// Summation plots
|
||||
#property indicator_label1 "Summation (positive)"
|
||||
#property indicator_type1 DRAW_HISTOGRAM
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 3
|
||||
#property indicator_color1 MClrCandleUp
|
||||
#property indicator_label2 "Summation (negative)"
|
||||
#property indicator_type2 DRAW_HISTOGRAM
|
||||
#property indicator_style2 STYLE_SOLID
|
||||
#property indicator_width2 3
|
||||
#property indicator_color2 MClrCandleDown
|
||||
// Simple averaging plot
|
||||
#property indicator_label3 "Averaging (simple)"
|
||||
#property indicator_type3 DRAW_LINE
|
||||
#property indicator_style3 STYLE_SOLID
|
||||
#property indicator_width3 2
|
||||
#property indicator_color3 MClrCandleNone
|
||||
// Exponential averaging plot
|
||||
#property indicator_label4 "Averaging (exponential)"
|
||||
#property indicator_type4 DRAW_LINE
|
||||
#property indicator_style4 STYLE_SOLID
|
||||
#property indicator_width4 1
|
||||
#property indicator_color4 MClrCandleNone
|
||||
#else
|
||||
// Define colour index for plots
|
||||
#define MIdxCandleNone 0.0
|
||||
#define MIdxCandleUp 1.0
|
||||
#define MIdxCandleDown 2.0
|
||||
// Summation plot
|
||||
#property indicator_label1 "Summation"
|
||||
#property indicator_type1 DRAW_COLOR_HISTOGRAM
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 5
|
||||
#property indicator_color1 MClrCandleNone, MClrCandleUp, MClrCandleDown
|
||||
// Simple averaging plot
|
||||
#property indicator_label2 "Averaging (simple)"
|
||||
#property indicator_type2 DRAW_LINE
|
||||
#property indicator_style2 STYLE_SOLID
|
||||
#property indicator_width2 2
|
||||
#property indicator_color2 MClrCandleNone
|
||||
// Exponential averaging plot
|
||||
#property indicator_label3 "Averaging (exponential)"
|
||||
#property indicator_type3 DRAW_LINE
|
||||
#property indicator_style3 STYLE_SOLID
|
||||
#property indicator_width3 1
|
||||
#property indicator_color3 MClrCandleNone
|
||||
#endif
|
||||
|
||||
//--- Enumarations
|
||||
|
||||
// Volume weight enumaraton
|
||||
enum EVolumeWeight
|
||||
{
|
||||
EVW_None = 0, // No volume weighting
|
||||
EVW_TickVolume, // Tick volume
|
||||
#ifndef __MQL4__
|
||||
EVW_RealVolume, // Real volume
|
||||
#endif
|
||||
EVW_PriceRange // True price range (pseudo volume)
|
||||
};
|
||||
|
||||
//--- Parameter settings
|
||||
|
||||
input uint i_nSummationPeriod = 13, // Summation period
|
||||
i_nAveragingPeriod = 7; // Averaging period
|
||||
input ENUM_APPLIED_PRICE i_ePriceApplied = PRICE_CLOSE; // Applied price
|
||||
input EVolumeWeight i_eVolumeWeight = EVW_TickVolume; // Applied volume
|
||||
|
||||
//--- Macro definitions
|
||||
|
||||
// Define OnCalculate loop sequencing macros
|
||||
#define MOnCalcPrevTest ( prev_calculated < 1 || prev_calculated > rates_total )
|
||||
#ifdef __MQL4__ // for MQL4 (as series)
|
||||
#define MOnCalcNext( _index ) ( _index-- )
|
||||
#define MOnCalcBack( _index, _offset ) ( _index + _offset )
|
||||
#define MOnCalcCheck( _index ) ( _index >= 0 )
|
||||
#define MOnCalcValid( _index ) ( _index < rates_total )
|
||||
#define MOnCalcStart \
|
||||
( rates_total - ( MOnCalcPrevTest ? 1 : prev_calculated ) )
|
||||
#else // for MQL5 (as non-series)
|
||||
#define MOnCalcNext( _index ) ( _index++ )
|
||||
#define MOnCalcBack( _index, _offset ) ( _index - _offset )
|
||||
#define MOnCalcCheck( _index ) ( _index < rates_total )
|
||||
#define MOnCalcValid( _index ) ( _index >= 0 )
|
||||
#define MOnCalcStart \
|
||||
( MOnCalcPrevTest ? 0 : prev_calculated - 1 )
|
||||
#endif
|
||||
|
||||
// Define applied price macro
|
||||
#define MSetAppliedPrice( _type, _where, _index ) { switch( _type ) { \
|
||||
case PRICE_WEIGHTED: _where = ( high[ _index ] + low[ _index ] + close[ _index ] \
|
||||
+ close[ _index ] ) * 0.25; break; \
|
||||
case PRICE_TYPICAL: _where = ( high[ _index ] + low[ _index ] + close[ _index ] ) / 3.0; break; \
|
||||
case PRICE_MEDIAN: _where = ( high[ _index ] + low[ _index ] ) * 0.5; break; \
|
||||
case PRICE_HIGH: _where = high[ _index ]; break; \
|
||||
case PRICE_LOW: _where = low[ _index ]; break; \
|
||||
case PRICE_OPEN: _where = open[ _index ]; break; \
|
||||
case PRICE_CLOSE: \
|
||||
default: _where = close[ _index ]; }; }
|
||||
|
||||
// Define macro for invalid parameter values
|
||||
#define MCheckParameter( _condition, _text ) if( _condition ) \
|
||||
{ Print( "Error: Invalid ", _text ); return INIT_PARAMETERS_INCORRECT; }
|
||||
|
||||
//--- Global variable declarations
|
||||
|
||||
// Indicator buffers
|
||||
double g_adbPriceApplied[], // Buffer for applied price
|
||||
g_adbVolumePriceDelta[], // Buffer for volume weight price delta change
|
||||
g_adbSummation[], // Buffer for summation of volume weighte price change
|
||||
g_adbSummationSimple[], // Buffer for summation of summation for simple averaging
|
||||
g_adbAveragingSimple[], // Buffer for simple averaging
|
||||
g_adbAveragingExponential[]; // Buffer for exponential averaging
|
||||
#ifdef __MQL4__
|
||||
double g_adbSummationPositive[], // Buffer for positive summation of volume weighte price change
|
||||
g_adbSummationNegative[]; // Buffer for negative summation of volume weighte price change
|
||||
#else
|
||||
double g_adbSummationColour[]; // Buffer for summation colourisation
|
||||
#endif
|
||||
|
||||
// Miscellaneous global variables
|
||||
double g_dbEmaWeight; // Weight to be used for exponential moving averages
|
||||
|
||||
//--- Event handling functions
|
||||
|
||||
// Initialisation event handler
|
||||
int OnInit(void) {
|
||||
// Validate input parameters
|
||||
MCheckParameter( i_nSummationPeriod < 1, "summation period" );
|
||||
MCheckParameter( i_nAveragingPeriod < 1 ||
|
||||
i_nAveragingPeriod > i_nSummationPeriod, "averaging period" );
|
||||
|
||||
// Calculate parameter variables
|
||||
g_dbEmaWeight = 2.0 / ( i_nAveragingPeriod + 1.0 );
|
||||
|
||||
// Set number of significant digits (precision)
|
||||
IndicatorSetInteger( INDICATOR_DIGITS, _Digits );
|
||||
|
||||
// Set buffers
|
||||
int iBuffer = 0;
|
||||
#ifdef __MQL4__
|
||||
IndicatorBuffers( MBuffers + 1 ); // Set total number of buffers (MQL4 Only)
|
||||
SetIndexBuffer( iBuffer++, g_adbSummationPositive, INDICATOR_DATA );
|
||||
SetIndexBuffer( iBuffer++, g_adbSummationNegative, INDICATOR_DATA );
|
||||
#else
|
||||
SetIndexBuffer( iBuffer++, g_adbSummation, INDICATOR_DATA );
|
||||
SetIndexBuffer( iBuffer++, g_adbSummationColour, INDICATOR_COLOR_INDEX );
|
||||
#endif
|
||||
SetIndexBuffer( iBuffer++, g_adbAveragingSimple, INDICATOR_DATA );
|
||||
SetIndexBuffer( iBuffer++, g_adbAveragingExponential, INDICATOR_DATA );
|
||||
SetIndexBuffer( iBuffer++, g_adbPriceApplied, INDICATOR_CALCULATIONS );
|
||||
SetIndexBuffer( iBuffer++, g_adbVolumePriceDelta, INDICATOR_CALCULATIONS );
|
||||
SetIndexBuffer( iBuffer++, g_adbSummationSimple, INDICATOR_CALCULATIONS );
|
||||
#ifdef __MQL4__
|
||||
SetIndexBuffer( iBuffer++, g_adbSummation, INDICATOR_CALCULATIONS );
|
||||
#endif
|
||||
|
||||
// Set indicator name
|
||||
IndicatorSetString( INDICATOR_SHORTNAME, StringFormat(
|
||||
MName " ( %d, %d )", i_nSummationPeriod, i_nAveragingPeriod ) );
|
||||
|
||||
return INIT_SUCCEEDED; // Successful initialisation of indicator
|
||||
};
|
||||
|
||||
// Calculation event handler
|
||||
int
|
||||
OnCalculate(
|
||||
const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[]
|
||||
)
|
||||
{
|
||||
// Main loop — fill in the arrays with data values
|
||||
for( int iCur = MOnCalcStart,
|
||||
iPrev = MOnCalcBack( iCur, 1 ),
|
||||
iSumPrev = MOnCalcBack( iCur, (int) i_nSummationPeriod ),
|
||||
iAvgPrev = MOnCalcBack( iCur, (int) i_nAveragingPeriod );
|
||||
!IsStopped() && MOnCalcCheck( iCur );
|
||||
MOnCalcNext( iCur ), MOnCalcNext( iPrev ), MOnCalcNext( iSumPrev ), MOnCalcNext( iAvgPrev ) )
|
||||
{
|
||||
// Calculate volume to apply
|
||||
double dbVolume = 1.0;
|
||||
switch( i_eVolumeWeight ) {
|
||||
#ifndef __MQL4__
|
||||
case EVW_RealVolume: dbVolume = (double) volume[ iCur ]; break;
|
||||
#endif
|
||||
case EVW_TickVolume: dbVolume = (double) tick_volume[ iCur ]; break;
|
||||
case EVW_PriceRange: if( MOnCalcValid( iPrev ) ) {
|
||||
double dbClosePrev = close[ iPrev ];
|
||||
dbVolume = fmax( high[ iCur ], dbClosePrev )
|
||||
- fmin( low[ iCur ], dbClosePrev );
|
||||
} else dbVolume = high[ iCur ] - low[ iCur ];
|
||||
};
|
||||
|
||||
// Calculate price to apply
|
||||
double dbPriceCur;
|
||||
MSetAppliedPrice( i_ePriceApplied, dbPriceCur, iCur );
|
||||
|
||||
// Calculate volume weighted price delta and sum
|
||||
double dbPricePrev = MOnCalcValid( iPrev ) ? g_adbPriceApplied [ iPrev ] : open[ iCur ],
|
||||
dbPriceDelta = dbPriceCur - dbPricePrev,
|
||||
dbVolumePriceDelta = dbPriceDelta * dbVolume,
|
||||
dbSummation = dbVolumePriceDelta
|
||||
+ ( MOnCalcValid( iPrev ) ? g_adbSummation[ iPrev ] : 0.0 )
|
||||
- ( MOnCalcValid( iSumPrev ) ? g_adbVolumePriceDelta[ iSumPrev ] : 0.0 );
|
||||
// Define colourasation
|
||||
#ifdef __MQL4__
|
||||
double dbSummationPositive = dbSummation > 0.0 ? dbSummation : 0.0,
|
||||
dbSummationNegative = dbSummation < 0.0 ? dbSummation : 0.0;
|
||||
#else
|
||||
double dbSummationColour = dbSummation > 0.0 ? MIdxCandleUp
|
||||
: ( dbSummation < 0.0 ? MIdxCandleDown
|
||||
: MIdxCandleNone );
|
||||
#endif
|
||||
|
||||
// Calculate simple summation and averaging
|
||||
double dbSumSimpleCur = dbSummation
|
||||
+ ( MOnCalcValid( iPrev ) ? g_adbSummationSimple[ iPrev ] : 0.0 )
|
||||
- ( MOnCalcValid( iAvgPrev ) ? g_adbSummation[ iAvgPrev ] : 0.0 ),
|
||||
dbAverageSimpleCur = dbSumSimpleCur / i_nAveragingPeriod;
|
||||
|
||||
// Calculate exponential averaging
|
||||
double dbAverageExponentialPrev = MOnCalcValid( iPrev ) ? g_adbAveragingExponential[ iPrev ] : dbSummation,
|
||||
dbAverageExponentialCur = dbAverageExponentialPrev
|
||||
+ ( dbSummation - dbAverageExponentialPrev )
|
||||
* g_dbEmaWeight;
|
||||
|
||||
// Set buffer values
|
||||
g_adbPriceApplied[ iCur ] = dbPriceCur;
|
||||
g_adbVolumePriceDelta[ iCur ] = dbVolumePriceDelta;
|
||||
g_adbSummation[ iCur ] = dbSummation;
|
||||
g_adbSummationSimple[ iCur ] = dbSumSimpleCur;
|
||||
g_adbAveragingSimple[ iCur ] = dbAverageSimpleCur;
|
||||
g_adbAveragingExponential[ iCur ] = dbAverageExponentialCur;
|
||||
#ifdef __MQL4__
|
||||
g_adbSummationPositive[ iCur ] = dbSummationPositive;
|
||||
g_adbSummationNegative[ iCur ] = dbSummationNegative;
|
||||
#else
|
||||
g_adbSummationColour[ iCur ] = dbSummationColour;
|
||||
#endif
|
||||
};
|
||||
|
||||
return rates_total; // Return value for prev_calculated of next call
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
@@ -1,114 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Timeframe Confluence Detector.mq5 |
|
||||
//| |
|
||||
//| https://www.mql5.com |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "phade"
|
||||
#property version "1.00"
|
||||
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 5
|
||||
#property indicator_plots 3
|
||||
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_color1 clrBurlyWood
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 1
|
||||
|
||||
#property indicator_type2 DRAW_LINE
|
||||
#property indicator_color2 clrGray
|
||||
#property indicator_style2 STYLE_SOLID
|
||||
#property indicator_width2 1
|
||||
|
||||
#property indicator_type3 DRAW_LINE
|
||||
#property indicator_color3 clrDarkGray
|
||||
#property indicator_style3 STYLE_SOLID
|
||||
#property indicator_width3 1
|
||||
|
||||
#define offset 60
|
||||
|
||||
input ENUM_TIMEFRAMES timeframe_a = PERIOD_CURRENT; //Current period
|
||||
input ENUM_TIMEFRAMES timeframe_b = PERIOD_H2; // 1st timeframe deviation to current period
|
||||
input ENUM_TIMEFRAMES timeframe_c = PERIOD_H1; // 2nd timeframe deviation to current period
|
||||
|
||||
int bars;
|
||||
|
||||
double buf_a[];
|
||||
double buf_b[];
|
||||
double buf_c[];
|
||||
|
||||
double deviator_a[], deviator_b[];
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
IndicatorRelease(0);
|
||||
|
||||
SetIndexBuffer(0, buf_a, INDICATOR_DATA);
|
||||
SetIndexBuffer(1, deviator_a, INDICATOR_DATA);
|
||||
SetIndexBuffer(2, deviator_b, INDICATOR_DATA);
|
||||
SetIndexBuffer(3, buf_b, INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(4, buf_c, INDICATOR_CALCULATIONS);
|
||||
|
||||
ArraySetAsSeries(buf_a,true);
|
||||
ArraySetAsSeries(buf_b,true);
|
||||
ArraySetAsSeries(buf_c,true);
|
||||
ArraySetAsSeries(deviator_a,true);
|
||||
ArraySetAsSeries(deviator_b,true);
|
||||
|
||||
PlotIndexSetString(0, PLOT_LABEL, TimeframeToString(timeframe_a));
|
||||
PlotIndexSetString(1, PLOT_LABEL, "Deviation from " + TimeframeToString(timeframe_b) + " to " + TimeframeToString(timeframe_a));
|
||||
PlotIndexSetString(2, PLOT_LABEL, "Deviation from " + TimeframeToString(timeframe_c) + " to " + TimeframeToString(timeframe_a));
|
||||
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[])
|
||||
{
|
||||
CopySeries(Symbol(), timeframe_a, 0, rates_total, COPY_RATES_CLOSE, buf_a);
|
||||
CopySeries(Symbol(), timeframe_b, 0, rates_total, COPY_RATES_CLOSE, buf_b);
|
||||
CopySeries(Symbol(), timeframe_c, 0, rates_total, COPY_RATES_CLOSE, buf_c);
|
||||
|
||||
for(int i = rates_total - 1; i>=0; i--){
|
||||
|
||||
deviator_a[i] = MathAbs(buf_b[i] - buf_a[i]) + buf_b[i] - offset*_Point;
|
||||
deviator_b[i] = MathAbs(buf_c[i] - buf_a[i]) + buf_c[i] - (offset*2)*_Point;
|
||||
}
|
||||
|
||||
return(rates_total);
|
||||
}
|
||||
|
||||
|
||||
string TimeframeToString(const ENUM_TIMEFRAMES timeframe)
|
||||
{
|
||||
string result;
|
||||
switch (timeframe){
|
||||
|
||||
case PERIOD_M1: result = "M1"; break;
|
||||
case PERIOD_M5: result = "M5"; break;
|
||||
case PERIOD_M15: result = "M15"; break;
|
||||
case PERIOD_M30: result = "M30"; break;
|
||||
case PERIOD_H1: result = "H1"; break;
|
||||
case PERIOD_H2: result = "H2"; break;
|
||||
case PERIOD_H4: result = "H4"; break;
|
||||
case PERIOD_D1: result = "D1"; break;
|
||||
case PERIOD_W1: result = "W1"; break;
|
||||
case PERIOD_MN1: result = "MN1"; break;
|
||||
default: result = ""; break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| TrendLinearReg.mq5 |
|
||||
//| Copyright 2022, MetaQuotes Ltd. |
|
||||
//| https://www.mql5.com |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2022, MetaQuotes Ltd."
|
||||
#property link "https://www.mql5.com"
|
||||
#property version "1.00"
|
||||
#property indicator_separate_window
|
||||
|
||||
#property indicator_buffers 2
|
||||
#property indicator_plots 2
|
||||
#property indicator_color1 LimeGreen
|
||||
#property indicator_type1 DRAW_HISTOGRAM
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 1
|
||||
|
||||
#property indicator_color2 Red
|
||||
#property indicator_type2 DRAW_HISTOGRAM
|
||||
#property indicator_style2 STYLE_SOLID
|
||||
#property indicator_width2 1
|
||||
|
||||
extern int barsToCount=34; // Bars to calculate
|
||||
|
||||
double buffer0[];
|
||||
double buffer1[];
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0,buffer0);
|
||||
SetIndexBuffer(1,buffer1);
|
||||
//---
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[])
|
||||
{
|
||||
//---
|
||||
|
||||
double b, c, sumy, sumx, sumxy, sumx2;
|
||||
double prev;
|
||||
double current;
|
||||
|
||||
if(rates_total <= barsToCount)
|
||||
return rates_total;
|
||||
|
||||
int start = prev_calculated;
|
||||
if(prev_calculated < barsToCount)
|
||||
start = barsToCount;
|
||||
|
||||
for(int index = start; index < rates_total; index++)
|
||||
{
|
||||
|
||||
sumy=0.0;
|
||||
sumx=0.0;
|
||||
sumxy=0.0;
|
||||
sumx2=0.0;
|
||||
for(int i=0; i < barsToCount ; i++)
|
||||
{
|
||||
sumy+=close[index-i];
|
||||
sumxy+=close[index-i]*(1+i);
|
||||
sumx+=(1+i);
|
||||
sumx2+=(1+i)*(1+i);
|
||||
}
|
||||
|
||||
c=sumx2*barsToCount-sumx*sumx;
|
||||
|
||||
if(c==0)
|
||||
c=0.1;
|
||||
|
||||
b=(sumxy*barsToCount-sumx*sumy)/c;
|
||||
|
||||
current=-1000*b;
|
||||
prev=current;
|
||||
|
||||
|
||||
if(buffer1[index-1] !=EMPTY_VALUE)
|
||||
prev=buffer1[index-1];
|
||||
else
|
||||
if(buffer0[index-1] !=EMPTY_VALUE)
|
||||
prev=buffer0[index-1];
|
||||
|
||||
if(current>=prev)
|
||||
{
|
||||
buffer0[index]= current;
|
||||
buffer1[index]= EMPTY_VALUE;
|
||||
}
|
||||
else
|
||||
if(current<prev)
|
||||
{
|
||||
buffer1[index]= current;
|
||||
buffer0[index]= EMPTY_VALUE;
|
||||
}
|
||||
/*
|
||||
*/
|
||||
}
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
Binary file not shown.
@@ -1,67 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| YMA.mq5 |
|
||||
//| Yuriy Tokman |
|
||||
//| http://ytg.com.ua |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Yuriy Tokman"
|
||||
#property link "http://ytg.com.ua"
|
||||
#property version "1.00"
|
||||
#property indicator_chart_window
|
||||
|
||||
#property indicator_buffers 1
|
||||
#property indicator_plots 1
|
||||
#property indicator_width1 2
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_color1 clrDarkViolet
|
||||
//--- input parameters
|
||||
input int YMA_Period=21; // Period
|
||||
//--- indicator buffers
|
||||
double Buffer[];
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
SetIndexBuffer(0,Buffer);
|
||||
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
|
||||
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,YMA_Period);
|
||||
string short_name="YMA";
|
||||
IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(YMA_Period)+")");
|
||||
//---
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[])
|
||||
{
|
||||
//----
|
||||
int i,limit;
|
||||
//--- check for rates
|
||||
if(rates_total<YMA_Period) return(0);
|
||||
//--- preliminary calculations
|
||||
if(prev_calculated==0)limit=YMA_Period;
|
||||
else limit=prev_calculated-1;
|
||||
//--- the main loop of calculations
|
||||
for(i=limit;i<rates_total && !IsStopped();i++)
|
||||
{
|
||||
double res =0;
|
||||
for(int j=i;j>i-YMA_Period && j>0;j--)
|
||||
{
|
||||
res += (close[j]+open[j]+high[j]+low[j])/4;
|
||||
}
|
||||
Buffer[i]=res/YMA_Period;
|
||||
}
|
||||
//----
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -1,644 +0,0 @@
|
||||
|
||||
//
|
||||
// Check Bar has Strong Body or Not ...
|
||||
bool HasStrongBody()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (!IsValid())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double body = GetBody();
|
||||
double shadow = GetShadows();
|
||||
|
||||
//
|
||||
result = body > shadow * 1.5;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Bar Must Open Below Prce
|
||||
// and Close Above it ...
|
||||
bool IsBreakUp(
|
||||
double price // a Price to Check Breake
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = HasStrongBody();
|
||||
if (!result || price <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Select required Prices ...
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
close > price &&
|
||||
open < price;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Bar Must Open Above Prce
|
||||
// and Close Below it ...
|
||||
bool IsBreakDown(
|
||||
double price // a Price to Check Breake
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = HasStrongBody();
|
||||
if (!result || price <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Select required Prices ...
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
open > price &&
|
||||
close < price;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool IsBreakOut(
|
||||
double price, // a Price to Check Breake
|
||||
bool useHighLow = true // if true using High and Low price for Breakeouts, if not use Open Close
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = HasStrongBody();
|
||||
if (!result || price <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Select required Prices ...
|
||||
|
||||
//
|
||||
double selectedUp =
|
||||
useHighLow
|
||||
? high
|
||||
: GetUp();
|
||||
double selectedDown =
|
||||
useHighLow
|
||||
? low
|
||||
: GetDown();
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
selectedUp > price &&
|
||||
selectedDown < price;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check a Support Line Rejected or not ...
|
||||
bool IsSupportRejected(
|
||||
double price // Support Price
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// this is zBar ...
|
||||
// so we are try to Recieve CBar ...
|
||||
XOHCL cBar;
|
||||
result = this.GetPreviousBar(cBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Now we are going to Recieve PBar ...
|
||||
XOHCL pBar;
|
||||
result = cBar.GetPreviousBar(pBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// We Have this (0) Bar, cBar (1) and pBar (2) ...
|
||||
|
||||
//
|
||||
// pBar Down Shadow must break Price Line ...
|
||||
// cBar and zBar Close must be Above Price Line ...
|
||||
// also zBar Open must be Above Price Line ...
|
||||
result =
|
||||
//
|
||||
pBar.high > price &&
|
||||
pBar.low < price &&
|
||||
cBar.close > price &&
|
||||
this.close > price &&
|
||||
this.open > price
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check a Support Line Breaked or not ...
|
||||
bool IsSupportBreaked(
|
||||
double price // Support Price
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// this is zBar ...
|
||||
// so we are try to Recieve CBar ...
|
||||
XOHCL cBar;
|
||||
result = this.GetPreviousBar(cBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Now we are going to Recieve PBar ...
|
||||
XOHCL pBar;
|
||||
result = cBar.GetPreviousBar(pBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// We Have this (0) Bar, cBar (1) and pBar (2) ...
|
||||
|
||||
//
|
||||
// pBar Down Shadow must break Price Line ...
|
||||
// cBar and zBar Close must be Below Price Line ...
|
||||
// also zBar Open must be Below Price Line ...
|
||||
result =
|
||||
//
|
||||
pBar.high > price &&
|
||||
pBar.low < price &&
|
||||
cBar.close < price &&
|
||||
this.close < price &&
|
||||
this.open < price
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check a Resistance Line Rejected or not ...
|
||||
bool IsResistanceRejected(
|
||||
double price // Resistance Price
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// this is zBar ...
|
||||
// so we are try to Recieve CBar ...
|
||||
XOHCL cBar;
|
||||
result = this.GetPreviousBar(cBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Now we are going to Recieve PBar ...
|
||||
XOHCL pBar;
|
||||
result = cBar.GetPreviousBar(pBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// We Have this (0) Bar, cBar (1) and pBar (2) ...
|
||||
|
||||
//
|
||||
// pBar Up Shadow must break Price Line ...
|
||||
// cBar and zBar Close must be Under Price Line ...
|
||||
// also zBar Open must be Under Price Line ...
|
||||
result =
|
||||
//
|
||||
pBar.high > price &&
|
||||
pBar.low < price &&
|
||||
cBar.close < price &&
|
||||
this.close < price &&
|
||||
this.open < price
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check a Resistance Line Breaked or not ...
|
||||
bool IsResistanceBreaked(
|
||||
double price // Support Price
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// this is zBar ...
|
||||
// so we are try to Recieve CBar ...
|
||||
XOHCL cBar;
|
||||
result = this.GetPreviousBar(cBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Now we are going to Recieve PBar ...
|
||||
XOHCL pBar;
|
||||
result = cBar.GetPreviousBar(pBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// We Have this (0) Bar, cBar (1) and pBar (2) ...
|
||||
|
||||
//
|
||||
// pBar Up Shadow must break Price Line ...
|
||||
// cBar and zBar Close must be Over Price Line ...
|
||||
// also zBar Open must be Pver Price Line ...
|
||||
result =
|
||||
//
|
||||
pBar.low < price &&
|
||||
pBar.high > price &&
|
||||
cBar.close > price &&
|
||||
this.close > price &&
|
||||
this.open > price
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bar is Inside Previus Bar ...
|
||||
bool IsInsideBar(
|
||||
double threshold = 5 // Points Distance between Up and Down
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (threshold < 0)
|
||||
{
|
||||
threshold = 0;
|
||||
}
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
result = GetPreviousBar(pBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double offset = PointToPrice(threshold, this.symbol);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
pBar.high > this.high &&
|
||||
pBar.low < this.low &&
|
||||
MathAbs(pBar.low - this.low) > offset &&
|
||||
MathAbs(pBar.high - this.high) > offset
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bar has Strongest Body in a Range ...
|
||||
bool HasStrongestBody(
|
||||
int mLoopback = 3 // loopback candles to compare it ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double body = GetBody();
|
||||
XOHCL prev = this;
|
||||
for (int i = 0; i < mLoopback; i++)
|
||||
{
|
||||
//
|
||||
bool isValid = prev.GetPreviousBar(prev);
|
||||
if (!isValid)
|
||||
{
|
||||
//
|
||||
result = false;
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
result &&
|
||||
body > prev.GetBody()
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bar has Weakest Body in a Range ...
|
||||
bool HasWeakestBody(
|
||||
int mLoopback = 3 // loopback candles to compare it ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double body = GetBody();
|
||||
XOHCL prev = this;
|
||||
for (int i = 0; i < mLoopback; i++)
|
||||
{
|
||||
//
|
||||
bool isValid = prev.GetPreviousBar(prev);
|
||||
if (!isValid)
|
||||
{
|
||||
//
|
||||
result = false;
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
result &&
|
||||
body < prev.GetBody()
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Determines Swings based On this Bar ...
|
||||
// Calculates Based on atleast 3 Bars Prev ...
|
||||
ENUM_X_SWING_TYPE GetSwingType()
|
||||
{
|
||||
//
|
||||
ENUM_X_SWING_TYPE result = X_NO_SWING;
|
||||
|
||||
//
|
||||
// Find Current Index of Bar ...
|
||||
int barIndex = Index();
|
||||
if (barIndex <= -1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// First we have to Retrieve atleast 3 Bars before this bar ...
|
||||
XOHCL bars[];
|
||||
int barsCount = GetBars(
|
||||
bars,
|
||||
symbol,
|
||||
period,
|
||||
barIndex + 1,
|
||||
3
|
||||
//
|
||||
);
|
||||
if (barsCount < 3)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Swing Start Candle has Strong Body ...
|
||||
bool isStrongBodyCandle = bars[2].HasStrongBody();
|
||||
if (!isStrongBodyCandle)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Swing Low Conditions ...
|
||||
bool isSwingLowOrderBlock =
|
||||
bars[2].low < bars[1].low &&
|
||||
bars[1].low < bars[0].low &&
|
||||
bars[2].low < bars[0].low;
|
||||
if (isSwingLowOrderBlock)
|
||||
{
|
||||
result = X_SWING_LOW;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Swing High Conditions ...
|
||||
bool isSwingHighOrderBlock =
|
||||
bars[2].high > bars[1].high &&
|
||||
bars[1].high > bars[0].high &&
|
||||
bars[2].high > bars[0].high;
|
||||
if (isSwingHighOrderBlock)
|
||||
{
|
||||
result = X_SWING_HIGH;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Check Bar Is Hammer Pattern ...
|
||||
bool IsHammer()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
double fib382 = GetFibonacciLevel(
|
||||
high,
|
||||
low,
|
||||
0.382,
|
||||
-1 //
|
||||
);
|
||||
|
||||
//
|
||||
result = GetDown() > fib382;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bar Is Shooting Star Pattern ...
|
||||
bool IsShootingStar()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
double fib382 = GetFibonacciLevel(
|
||||
high,
|
||||
low,
|
||||
0.382,
|
||||
1 //
|
||||
);
|
||||
|
||||
//
|
||||
result = GetUp() < fib382;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bar Bullish Engulfing Pattern ...
|
||||
bool IsBullishEngulf()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Current Bar Must be Bullish ...
|
||||
result = IsBullish();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Retrieve Previous Bar ...
|
||||
XOHCL pBar;
|
||||
result = GetPreviousBar(pBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
pBar.IsBearish() &&
|
||||
open < pBar.close && close > pBar.open &&
|
||||
high >= pBar.high && low <= pBar.low
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bar Bearish Engulfing Pattern ...
|
||||
bool IsBearishEngulf()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Current Bar Must be Bearish ...
|
||||
result = IsBearish();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Retrieve Previous Bar ...
|
||||
XOHCL pBar;
|
||||
result = GetPreviousBar(pBar);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
pBar.IsBullish() &&
|
||||
open > pBar.close && close < pBar.open &&
|
||||
high >= pBar.high && low <= pBar.low
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,562 +0,0 @@
|
||||
|
||||
//
|
||||
// Detect Trends ...
|
||||
struct XTrendDetector
|
||||
{
|
||||
//
|
||||
string symbol;
|
||||
ENUM_TIMEFRAMES period;
|
||||
|
||||
//
|
||||
double higherHighs[];
|
||||
datetime higherHighTimes[];
|
||||
|
||||
//
|
||||
double higherLows[];
|
||||
datetime higherLowTimes[];
|
||||
|
||||
//
|
||||
double lowerHighs[];
|
||||
datetime lowerHighTimes[];
|
||||
|
||||
//
|
||||
double lowerLows[];
|
||||
datetime lowerLowTimes[];
|
||||
|
||||
//
|
||||
bool isFirstLow;
|
||||
|
||||
//
|
||||
bool isUpTrend;
|
||||
bool isDownTrend;
|
||||
|
||||
//
|
||||
int _numberOfPivots;
|
||||
int _pivotShoulders;
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
XTrendDetector()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
bool FindTrend(
|
||||
string _symbol,
|
||||
ENUM_TIMEFRAMES _period,
|
||||
int barIndex = 0,
|
||||
int _requiredPivots = 3,
|
||||
int _requiredShoulders = 3 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (barIndex < 0)
|
||||
{
|
||||
barIndex = 0;
|
||||
}
|
||||
|
||||
//
|
||||
if (_requiredPivots < 3)
|
||||
{
|
||||
_requiredPivots = 3;
|
||||
}
|
||||
|
||||
//
|
||||
if (_requiredShoulders < 3)
|
||||
{
|
||||
_requiredShoulders = 3;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
IsValid(_symbol) &&
|
||||
IsValid(_period)
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find Swing Lows and Swing Highs ...
|
||||
|
||||
//
|
||||
int hhIndexes[];
|
||||
datetime hhTimes[];
|
||||
double hhs[];
|
||||
|
||||
//
|
||||
int llIndexes[];
|
||||
datetime llTimes[];
|
||||
double lls[];
|
||||
|
||||
//
|
||||
bool isEnough = false;
|
||||
|
||||
//
|
||||
double lastHH = 0;
|
||||
int lastHHIndex = barIndex;
|
||||
datetime lastHHTime = NULL;
|
||||
|
||||
//
|
||||
double lastLL = 0;
|
||||
int lastLLIndex = barIndex;
|
||||
datetime lastLLTime = NULL;
|
||||
|
||||
//
|
||||
// Calculate First ...
|
||||
lastHHIndex = FindSwing(
|
||||
_symbol,
|
||||
_period,
|
||||
X_SWING_HIGH,
|
||||
_requiredShoulders,
|
||||
lastHHIndex + 1 //
|
||||
);
|
||||
if (lastHHIndex >= 0)
|
||||
{
|
||||
//
|
||||
XOHCL lastBar;
|
||||
bool isInited = lastBar.Init(
|
||||
_symbol,
|
||||
_period,
|
||||
lastHHIndex //
|
||||
);
|
||||
if (isInited)
|
||||
{
|
||||
//
|
||||
lastHH = lastBar.high;
|
||||
lastHHTime = lastBar.time;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
lastLLIndex = FindSwing(
|
||||
_symbol,
|
||||
_period,
|
||||
X_SWING_LOW,
|
||||
_requiredShoulders,
|
||||
lastLLIndex + 1 //
|
||||
);
|
||||
if (lastLLIndex >= 0)
|
||||
{
|
||||
//
|
||||
XOHCL lastBar;
|
||||
bool isInited = lastBar.Init(
|
||||
_symbol,
|
||||
_period,
|
||||
lastLLIndex //
|
||||
);
|
||||
if (isInited)
|
||||
{
|
||||
//
|
||||
lastHH = lastBar.high;
|
||||
lastHHTime = lastBar.time;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
lastLLIndex >= 0 &&
|
||||
lastHHIndex >= 0
|
||||
//
|
||||
;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isFirstLow =
|
||||
//
|
||||
lastLLIndex < lastHHIndex
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
while (!isEnough)
|
||||
{
|
||||
//
|
||||
int hhSize = ArraySize(hhs);
|
||||
if (hhSize < _requiredPivots)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
int llSize = ArraySize(lls);
|
||||
if (llSize < _requiredPivots * 2)
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
}
|
||||
|
||||
// while (!isEnough)
|
||||
// {
|
||||
// //
|
||||
// int hhSize = ArraySize(hhs);
|
||||
// if (hhSize < _requiredPivots * 2)
|
||||
// {
|
||||
// //
|
||||
// lastHHIndex = FindSwing(
|
||||
// _symbol,
|
||||
// _period,
|
||||
// X_SWING_HIGH,
|
||||
// _requiredShoulders,
|
||||
// lastHHIndex + 1 //
|
||||
// );
|
||||
// if (lastHHIndex >= 0)
|
||||
// {
|
||||
// //
|
||||
// XOHCL hBar;
|
||||
// bool isInited = hBar.Init(
|
||||
// _symbol,
|
||||
// _period,
|
||||
// lastHHIndex //
|
||||
// );
|
||||
// if (isInited)
|
||||
// {
|
||||
// //
|
||||
// Add(
|
||||
// hBar.high,
|
||||
// hhs //
|
||||
// );
|
||||
|
||||
// //
|
||||
// Add(
|
||||
// hBar.time,
|
||||
// hhTimes //
|
||||
// );
|
||||
|
||||
// //
|
||||
// Add(
|
||||
// lastHHIndex,
|
||||
// hhIndexes //
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// //
|
||||
// int llSize = ArraySize(lls);
|
||||
// if (llSize < _requiredPivots * 2)
|
||||
// {
|
||||
// //
|
||||
// lastLLIndex = FindSwing(
|
||||
// _symbol,
|
||||
// _period,
|
||||
// X_SWING_LOW,
|
||||
// _requiredShoulders,
|
||||
// lastLLIndex + 1 //
|
||||
// );
|
||||
// if (lastLLIndex >= 0)
|
||||
// {
|
||||
// //
|
||||
// XOHCL lBar;
|
||||
// bool isInited = lBar.Init(
|
||||
// _symbol,
|
||||
// _period,
|
||||
// lastLLIndex //
|
||||
// );
|
||||
// if (isInited)
|
||||
// {
|
||||
// //
|
||||
// Add(
|
||||
// lBar.low,
|
||||
// lls //
|
||||
// );
|
||||
|
||||
// //
|
||||
// Add(
|
||||
// lBar.time,
|
||||
// llTimes //
|
||||
// );
|
||||
|
||||
// //
|
||||
// Add(
|
||||
// lastHHIndex,
|
||||
// llIndexes //
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// //
|
||||
// hhSize = ArraySize(hhs);
|
||||
// llSize = ArraySize(lls);
|
||||
// isEnough =
|
||||
// //
|
||||
// hhSize == _requiredPivots * 2 &&
|
||||
// llSize == _requiredPivots * 2
|
||||
// //
|
||||
// ;
|
||||
// }
|
||||
|
||||
// //
|
||||
// ArrayReverse(hhs);
|
||||
// ArrayReverse(hhTimes);
|
||||
// ArrayReverse(hhIndexes);
|
||||
|
||||
// //
|
||||
// ArrayReverse(lls);
|
||||
// ArrayReverse(llTimes);
|
||||
// ArrayReverse(llIndexes);
|
||||
|
||||
//
|
||||
// Draws ...
|
||||
for (int i = 0; i < ArraySize(hhs); i++)
|
||||
{
|
||||
//
|
||||
DrawArrow(
|
||||
ChartID(),
|
||||
"XTRND_HH" + ToString(i),
|
||||
0,
|
||||
hhTimes[i],
|
||||
hhs[i],
|
||||
234,
|
||||
ANCHOR_BOTTOM,
|
||||
clrMagenta,
|
||||
STYLE_SOLID,
|
||||
3 //
|
||||
);
|
||||
|
||||
//
|
||||
DrawArrow(
|
||||
ChartID(),
|
||||
"XTRND_LL" + ToString(i),
|
||||
0,
|
||||
llTimes[i],
|
||||
lls[i],
|
||||
233,
|
||||
ANCHOR_TOP,
|
||||
clrAqua,
|
||||
STYLE_SOLID,
|
||||
3 //
|
||||
);
|
||||
}
|
||||
|
||||
// //
|
||||
// // Here We Try to Detect Trands ...
|
||||
// int idxHH = 0;
|
||||
// int idxLL = 0;
|
||||
// isEnough = false;
|
||||
// isFirstLow = llTimes[0] > hhTimes[0];
|
||||
// while(!isEnough) {
|
||||
// //
|
||||
// datetime firstTime = NULL;
|
||||
// if (isFirstLow) {
|
||||
// //
|
||||
// firstTime = llTimes[0];
|
||||
|
||||
// //
|
||||
// // Looking for a High ...
|
||||
|
||||
// //
|
||||
// if (hhs[hhIdx] > lls[llIdx]) {
|
||||
|
||||
// }
|
||||
// } else {
|
||||
// //
|
||||
// firstTime = hhTimes[0];
|
||||
|
||||
// //
|
||||
// // Looking for a Low ...
|
||||
// }
|
||||
// }
|
||||
|
||||
//
|
||||
isUpTrend =
|
||||
//
|
||||
isFirstLow
|
||||
?
|
||||
//
|
||||
lls[0] > lls[1] &&
|
||||
lls[1] > lls[2] &&
|
||||
//
|
||||
hhs[0] > hhs[1] &&
|
||||
hhs[1] > hhs[2]
|
||||
//
|
||||
:
|
||||
//
|
||||
hhs[0] > hhs[1] &&
|
||||
hhs[1] > hhs[2] &&
|
||||
//
|
||||
lls[0] > lls[1] &&
|
||||
lls[1] > lls[2]
|
||||
//
|
||||
;
|
||||
isDownTrend =
|
||||
//
|
||||
isFirstLow
|
||||
?
|
||||
//
|
||||
lls[0] < lls[1] &&
|
||||
lls[1] < lls[2] &&
|
||||
//
|
||||
hhs[0] < hhs[1] &&
|
||||
hhs[1] < hhs[2]
|
||||
//
|
||||
:
|
||||
//
|
||||
hhs[0] < hhs[1] &&
|
||||
hhs[1] < hhs[2] &&
|
||||
//
|
||||
lls[0] < lls[1] &&
|
||||
lls[1] < lls[2]
|
||||
//
|
||||
;
|
||||
for (int i = 1; i < _requiredPivots; i++)
|
||||
{
|
||||
//
|
||||
// Lows ...
|
||||
|
||||
//
|
||||
// Lower Lows ...
|
||||
if (lls[i - 1] < lls[i])
|
||||
{
|
||||
//
|
||||
Add(
|
||||
lls[i - 1],
|
||||
lowerLows //
|
||||
);
|
||||
|
||||
//
|
||||
Add(
|
||||
llTimes[i - 1],
|
||||
lowerLowTimes //
|
||||
);
|
||||
}
|
||||
else
|
||||
//
|
||||
// Higher Lows ...
|
||||
if (lls[i - 1] > lls[i])
|
||||
{
|
||||
//
|
||||
Add(
|
||||
lls[i - 1],
|
||||
higherLows //
|
||||
);
|
||||
|
||||
//
|
||||
Add(
|
||||
llTimes[i - 1],
|
||||
higherLowTimes //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Highs ...
|
||||
|
||||
//
|
||||
// Higher Highs ...
|
||||
if (hhs[i - 1] > hhs[i])
|
||||
{
|
||||
//
|
||||
Add(
|
||||
hhs[i - 1],
|
||||
higherHighs //
|
||||
);
|
||||
|
||||
//
|
||||
Add(
|
||||
hhTimes[i - 1],
|
||||
higherHighTimes //
|
||||
);
|
||||
}
|
||||
else
|
||||
//
|
||||
// Lower Highs ...
|
||||
if (hhs[i - 1] < hhs[i])
|
||||
{
|
||||
//
|
||||
Add(
|
||||
hhs[i - 1],
|
||||
lowerHighs //
|
||||
);
|
||||
|
||||
//
|
||||
Add(
|
||||
hhTimes[i - 1],
|
||||
lowerHighTimes //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Remove Draws ...
|
||||
RemoveDraws("XTRND");
|
||||
|
||||
//
|
||||
symbol = _symbol;
|
||||
period = _period;
|
||||
_numberOfPivots = _requiredPivots;
|
||||
_pivotShoulders = _requiredShoulders;
|
||||
|
||||
//
|
||||
result = IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
symbol = NULL;
|
||||
period = NULL;
|
||||
|
||||
//
|
||||
_numberOfPivots = 0;
|
||||
_pivotShoulders = 0;
|
||||
|
||||
//
|
||||
Clean(higherHighs);
|
||||
Clean(higherHighTimes);
|
||||
|
||||
//
|
||||
Clean(higherLows);
|
||||
Clean(higherLowTimes);
|
||||
|
||||
//
|
||||
Clean(lowerHighs);
|
||||
Clean(lowerHighTimes);
|
||||
|
||||
//
|
||||
Clean(lowerLows);
|
||||
Clean(lowerLowTimes);
|
||||
}
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
bool IsValid()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
IsValid(symbol) &&
|
||||
IsValid(period)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
@@ -1,59 +0,0 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 "../../Classes/x-saherelm.xind.class.mq5"
|
||||
|
||||
//
|
||||
// a Simple Indicator ...
|
||||
|
||||
class XSCMid : public XSCBaseInd
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Constructor(s) ...
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
|
||||
//
|
||||
// Property Getter(s) / Setter(s) ...
|
||||
|
||||
//
|
||||
// Override(s) ...
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
};
|
||||
@@ -1,845 +0,0 @@
|
||||
|
||||
//
|
||||
struct XPivot
|
||||
{
|
||||
//
|
||||
double pivot; // Pivot Price ...
|
||||
int breaks; // Number of Breaks ...
|
||||
int rejects; // Number of Rejects ...
|
||||
|
||||
//
|
||||
void XPivot()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
pivot = 0;
|
||||
breaks = 0;
|
||||
rejects = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
bool IsValid()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = pivot > 0;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
struct XPivotTracker
|
||||
{
|
||||
//
|
||||
XPivot pivots[];
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
void XPivotTracker()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(pivots);
|
||||
}
|
||||
|
||||
//
|
||||
int Count()
|
||||
{
|
||||
return ArraySize(pivots);
|
||||
}
|
||||
|
||||
//
|
||||
double Get(int index)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
NormalizeIndex(index, pivots);
|
||||
|
||||
//
|
||||
XPivot iPivot = pivots[index];
|
||||
|
||||
//
|
||||
result = iPivot.pivot;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XPivot GetPivot(int index)
|
||||
{
|
||||
//
|
||||
XPivot result;
|
||||
|
||||
//
|
||||
NormalizeIndex(index, pivots);
|
||||
|
||||
//
|
||||
result = pivots[index];
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool Add(double mPivot)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = mPivot > 0 && !Has(mPivot);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XPivot pivot;
|
||||
pivot.pivot = mPivot;
|
||||
|
||||
//
|
||||
AddRef(
|
||||
pivot,
|
||||
pivots //
|
||||
);
|
||||
|
||||
//
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int Adds(double &mPivots[])
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
int pivotsCount = ArraySize(mPivots);
|
||||
if (!IsValidSize(pivotsCount))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < pivotsCount; i++)
|
||||
{
|
||||
//
|
||||
double iPivot = mPivots[i];
|
||||
|
||||
//
|
||||
bool isAdded = Add(iPivot);
|
||||
if (isAdded)
|
||||
{
|
||||
result++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int FindIndex(double mPivot)
|
||||
{
|
||||
//
|
||||
int result = -1;
|
||||
|
||||
//
|
||||
if (mPivot <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int count = Count();
|
||||
if (!IsValidSize(count))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
XPivot iPivot = pivots[i];
|
||||
|
||||
//
|
||||
if (iPivot.pivot == mPivot)
|
||||
{
|
||||
//
|
||||
result = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double Has(double mPivot)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int pivotIDX = FindIndex(mPivot);
|
||||
result = pivotIDX >= 0;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int Reject(double mPivot)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
int pivotIDX = FindIndex(mPivot);
|
||||
if (pivotIDX < 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
pivots[pivotIDX].rejects++;
|
||||
|
||||
//
|
||||
result = pivots[pivotIDX].rejects;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int Break(double mPivot)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
int pivotIDX = FindIndex(mPivot);
|
||||
if (pivotIDX < 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
pivots[pivotIDX].breaks++;
|
||||
|
||||
//
|
||||
result = pivots[pivotIDX].breaks;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool Remove(double mPivot)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int pivotIDX = FindIndex(mPivot);
|
||||
result = pivotIDX >= 0;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = ArrayRemove(
|
||||
pivots,
|
||||
pivotIDX,
|
||||
1 //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool HasChild()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int count = Count();
|
||||
result = IsValidSize(count);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Model Support and Resistance
|
||||
// for Specific Bar ...
|
||||
struct XOHCLSupRes
|
||||
{
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
/// Resistances ...
|
||||
double res[];
|
||||
|
||||
//
|
||||
// Supports ...
|
||||
double sup[];
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
XOHCLSupRes()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Init ...
|
||||
bool Init(
|
||||
double price, // Price ...
|
||||
const double &pivots[], // Provided Pivot Points ...
|
||||
int count = 3, // Number of Requireds ...
|
||||
double step = 0 // Distance between each item with it's Last Side ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
Clean();
|
||||
|
||||
//
|
||||
if (price <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int pivotsCount = ArraySize(pivots);
|
||||
if (pivotsCount <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (count <= 0 ||
|
||||
count > pivotsCount - 1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double lastR = 0;
|
||||
double tmpR[];
|
||||
|
||||
//
|
||||
double lastS = 0;
|
||||
double tmpS[];
|
||||
|
||||
//
|
||||
// Extract Supports ...
|
||||
// which prices is under low of candle ...
|
||||
//
|
||||
// Extract Resistance ...
|
||||
// which prices is over high of candle ...
|
||||
for (int i = 0; i < pivotsCount; i++)
|
||||
{
|
||||
//
|
||||
double iFlat = pivots[i];
|
||||
|
||||
//
|
||||
if (iFlat > price)
|
||||
{
|
||||
//
|
||||
bool canAdd =
|
||||
step <= 0
|
||||
? true
|
||||
: lastR == 0 || MathAbs(iFlat - lastR) >= step;
|
||||
if (canAdd)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
iFlat,
|
||||
tmpR);
|
||||
|
||||
//
|
||||
lastR = iFlat;
|
||||
}
|
||||
}
|
||||
else if (iFlat < price)
|
||||
{
|
||||
//
|
||||
bool canAdd =
|
||||
step <= 0
|
||||
? true
|
||||
: lastS == 0 || MathAbs(iFlat - lastS) >= step;
|
||||
if (canAdd)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
iFlat,
|
||||
tmpS);
|
||||
|
||||
//
|
||||
lastS = iFlat;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Sorting Founded Resistance and Supports ...
|
||||
|
||||
//
|
||||
// Since Resistance Levels must be Increasing ...
|
||||
ArraySort(tmpR);
|
||||
|
||||
//
|
||||
// Since Support Levels must be Decreasing ...
|
||||
ArraySort(tmpS);
|
||||
ArrayReverse(tmpS);
|
||||
|
||||
//
|
||||
// Fill Resistance ...
|
||||
int tmpRCount = ArraySize(tmpR);
|
||||
if (tmpRCount > 0)
|
||||
{
|
||||
//
|
||||
if (tmpRCount < count)
|
||||
{
|
||||
//
|
||||
ArrayCopy(
|
||||
res,
|
||||
tmpR);
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
ArrayCopy(
|
||||
res,
|
||||
tmpR,
|
||||
0,
|
||||
0,
|
||||
count);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Fill Supports ...
|
||||
int tmpSCount = ArraySize(tmpS);
|
||||
if (tmpSCount > 0)
|
||||
{
|
||||
//
|
||||
if (tmpSCount < count)
|
||||
{
|
||||
//
|
||||
ArrayCopy(
|
||||
sup,
|
||||
tmpS);
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
ArrayCopy(
|
||||
sup,
|
||||
tmpS,
|
||||
0,
|
||||
0,
|
||||
count);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
Clean(sup);
|
||||
Clean(res);
|
||||
}
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
bool IsValid()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
CountSupports() > 0 ||
|
||||
CountResistances() > 0
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int CountSupports()
|
||||
{
|
||||
return ArraySize(sup);
|
||||
}
|
||||
|
||||
//
|
||||
int CountResistances()
|
||||
{
|
||||
return ArraySize(res);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Track Value Changes ...
|
||||
template <typename T>
|
||||
struct XValueTracker
|
||||
{
|
||||
//
|
||||
// Definitions ...
|
||||
|
||||
//
|
||||
// Model a Value Change ...
|
||||
struct XValueChange
|
||||
{
|
||||
//
|
||||
// Props ...
|
||||
datetime at; // Change Time
|
||||
T from; // Before Change Value
|
||||
T to; // After Change Value
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
XValueChange()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
at = NULL;
|
||||
from = NULL;
|
||||
to = NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
bool IsValid()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = IsValid(at);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = NotEmpty(from) &&
|
||||
NotEmpty(to);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Props ...
|
||||
XValueChange changes[]; // Hold Changes
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
XValueTracker()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Track a Change Happens Or Not ...
|
||||
bool Track(
|
||||
const T &source[] // Data Source for Track Changes
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (ArraySize(source) <= 1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
datetime time = TimeCurrent();
|
||||
|
||||
//
|
||||
double from = source[1];
|
||||
double to = source[0];
|
||||
|
||||
//
|
||||
result = to != from;
|
||||
if (result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XValueChange lastChange;
|
||||
bool hasLastChange =
|
||||
GetLastItem(
|
||||
lastChange,
|
||||
changes
|
||||
//
|
||||
);
|
||||
result =
|
||||
!hasLastChange
|
||||
? true
|
||||
: lastChange.at < time &&
|
||||
lastChange.to != to &&
|
||||
lastChange.from != from;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
lastChange.Clean();
|
||||
|
||||
//
|
||||
lastChange.to = to;
|
||||
lastChange.at = time;
|
||||
lastChange.from = from;
|
||||
|
||||
//
|
||||
AddRef(
|
||||
lastChange,
|
||||
changes
|
||||
//
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
void Clean()
|
||||
{
|
||||
Clean(changes);
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
int GenerateEQMOrders(
|
||||
XSignal &orders[], // Result
|
||||
XPosition &position, // Supported Position
|
||||
XOHCLSupRes &supRes, // Data Source
|
||||
bool longs = true,
|
||||
bool shorts = true //
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
Clean(orders);
|
||||
|
||||
//
|
||||
if (!supRes.IsValid() ||
|
||||
!position.IsValid())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (longs)
|
||||
{
|
||||
//
|
||||
double longLevels[];
|
||||
|
||||
//
|
||||
Copy(
|
||||
supRes.res,
|
||||
longLevels //
|
||||
);
|
||||
|
||||
//
|
||||
double minSup = GetMin(
|
||||
supRes.sup //
|
||||
);
|
||||
if (minSup > 0)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
minSup,
|
||||
longLevels //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
ArraySort(longLevels);
|
||||
|
||||
//
|
||||
if (ArraySize(longLevels) > 2)
|
||||
{
|
||||
//
|
||||
for (int i = 0; i < ArraySize(longLevels) - 2; i++)
|
||||
{
|
||||
//
|
||||
double iSL = longLevels[i];
|
||||
double iEntry = longLevels[i + 1];
|
||||
double iTP = longLevels[i + 2];
|
||||
|
||||
//
|
||||
XSignal iSignal;
|
||||
bool isPrepared = iSignal.PrepareStopLong(
|
||||
position.symbol,
|
||||
XEQMSupportToken,
|
||||
position.period,
|
||||
iEntry,
|
||||
position.volume,
|
||||
iSL,
|
||||
iTP //
|
||||
);
|
||||
if (isPrepared)
|
||||
{
|
||||
//
|
||||
string comment = GenerateSupportTag(position.ticket);
|
||||
iSignal.comment = comment;
|
||||
|
||||
//
|
||||
AddRef(
|
||||
iSignal,
|
||||
orders //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (shorts)
|
||||
{
|
||||
//
|
||||
double shortLevels[];
|
||||
|
||||
//
|
||||
Copy(
|
||||
supRes.sup,
|
||||
shortLevels //
|
||||
);
|
||||
|
||||
//
|
||||
double maxRes = GetMax(
|
||||
supRes.res //
|
||||
);
|
||||
if (maxRes > 0)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
maxRes,
|
||||
shortLevels //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
ArraySort(shortLevels);
|
||||
ArrayReverse(shortLevels);
|
||||
|
||||
//
|
||||
if (ArraySize(shortLevels) > 2)
|
||||
{
|
||||
//
|
||||
for (int i = 0; i < ArraySize(shortLevels) - 2; i++)
|
||||
{
|
||||
//
|
||||
double iSL = shortLevels[i];
|
||||
double iEntry = shortLevels[i + 1];
|
||||
double iTP = shortLevels[i + 2];
|
||||
|
||||
//
|
||||
XSignal iSignal;
|
||||
bool isPrepared = iSignal.PrepareStopShort(
|
||||
position.symbol,
|
||||
XEQMSupportToken,
|
||||
position.period,
|
||||
iEntry,
|
||||
position.volume,
|
||||
iSL,
|
||||
iTP //
|
||||
);
|
||||
if (isPrepared)
|
||||
{
|
||||
//
|
||||
string comment = GenerateSupportTag(position.ticket);
|
||||
iSignal.comment = comment;
|
||||
|
||||
//
|
||||
AddRef(
|
||||
iSignal,
|
||||
orders //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = ArraySize(orders);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,506 +0,0 @@
|
||||
/**
|
||||
* XColor Tools Module ...
|
||||
* a module for handle colorify text contents in node js ...
|
||||
*
|
||||
* Maintainer
|
||||
*
|
||||
* Hadi Khazaee Asl <https://saherelm.ir> (hadi_khazaee_asl@yahoo.com)
|
||||
*/
|
||||
|
||||
//
|
||||
//#region Module Imports ...
|
||||
const XValueTools = require("./x-value.tools");
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Constants ...
|
||||
/**
|
||||
* these are available style which can applied to an string ...
|
||||
*/
|
||||
const AVAILABLE_STYLES = {
|
||||
//
|
||||
Bold: "\x1b[1m",
|
||||
Dim: "\x1b[2m",
|
||||
Underlined: "\x1b[4m",
|
||||
Blink: "\x1b[5m",
|
||||
ReverseFandB: "\x1b[7m",
|
||||
Hidden: "\x1b[8m",
|
||||
//
|
||||
// Commonly used for reset all Styles ...
|
||||
Reset: "\x1b[0m"
|
||||
};
|
||||
|
||||
/**
|
||||
* these are available foreground colors which can applied to an string ...
|
||||
*/
|
||||
const AVAILABLE_FOREGROUND_COLORS = {
|
||||
Default: "\x1b[39m",
|
||||
Black: "\x1b[30m",
|
||||
Red: "\x1b[31m",
|
||||
Green: "\x1b[32m",
|
||||
Yellow: "\x1b[33m",
|
||||
Blue: "\x1b[34m",
|
||||
Magenta: "\x1b[35m",
|
||||
Cyan: "\x1b[36m",
|
||||
LightGray: "\x1b[37m",
|
||||
DarkGray: "\x1b[90m",
|
||||
LightRed: "\x1b[91m",
|
||||
LightGreen: "\x1b[92m",
|
||||
LightYellow: "\x1b[93m",
|
||||
LightBlue: "\x1b[94m",
|
||||
LightMagenta: "\x1b[95m",
|
||||
LightCyan: "\x1b[96m",
|
||||
White: "\x1b[97m",
|
||||
};
|
||||
|
||||
/**
|
||||
* these are available background colors which can applied to an string ...
|
||||
*/
|
||||
const AVAILABLE_BACKGROUND_COLORS = {
|
||||
Default: "\x1b[49m",
|
||||
Black: "\x1b[40m",
|
||||
Red: "\x1b[41m",
|
||||
Green: "\x1b[42m",
|
||||
Yellow: "\x1b[43m",
|
||||
Blue: "\x1b[44m",
|
||||
Magenta: "\x1b[45m",
|
||||
Cyan: "\x1b[46m",
|
||||
LightGray: "\x1b[47m",
|
||||
DarkGray: "\x1b[100m",
|
||||
LightRed: "\x1b[101m",
|
||||
LightGreen: "\x1b[102m",
|
||||
LightYellow: "\x1b[103m",
|
||||
LightBlue: "\x1b[104m",
|
||||
LightMagenta: "\x1b[105m",
|
||||
LightCyan: "\x1b[106m",
|
||||
White: "\x1b[107m",
|
||||
};
|
||||
|
||||
/**
|
||||
* these are available style names, which exports from module and
|
||||
* users can use them ...
|
||||
*/
|
||||
const STYLE_NAMES = {
|
||||
Bold: "Bold",
|
||||
Dim: "Dim",
|
||||
Underlined: "Underlined",
|
||||
Blink: "Blink",
|
||||
ReverseFandB: "ReverseFandB",
|
||||
Hidden: "Hidden",
|
||||
Reset: "Reset",
|
||||
};
|
||||
|
||||
/**
|
||||
* these are available color names, which exports from module and
|
||||
* users can use them ...
|
||||
*/
|
||||
const COLOR_NAMES = {
|
||||
Default: "Default",
|
||||
Black: "Black",
|
||||
Red: "Red",
|
||||
Green: "Green",
|
||||
Yellow: "Yellow",
|
||||
Blue: "Blue",
|
||||
Magenta: "Magenta",
|
||||
Cyan: "Cyan",
|
||||
LightGray: "LightGray",
|
||||
DarkGray: "DarkGray",
|
||||
LightRed: "LightRed",
|
||||
LightGreen: "LightGreen",
|
||||
LightYellow: "LightYellow",
|
||||
LightBlue: "LightBlue",
|
||||
LightMagenta: "LightMagenta",
|
||||
LightCyan: "LightCyan",
|
||||
White: "White",
|
||||
};
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Actions ...
|
||||
/**
|
||||
* apply specified style and color on a content ...
|
||||
*
|
||||
* @param {string} content specified content for styling ...
|
||||
* @param {string} color specific color name for using to styling ...
|
||||
* @param {string} style soecufic style name to use ...
|
||||
* @param {boolean} toForeground apply specified color as foreground ...
|
||||
* @param {boolean} toBackground apply specified color as background ...
|
||||
* @returns {string} styled content ...
|
||||
*/
|
||||
function apply(
|
||||
content,
|
||||
color,
|
||||
style,
|
||||
toForeground = true,
|
||||
toBackground = false
|
||||
) {
|
||||
//
|
||||
let result = content;
|
||||
|
||||
//
|
||||
// Validate Arg ...
|
||||
if (!XValueTools.isValidArg(content)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Detect and Validate Style and Apply it ...
|
||||
let eStyle = AVAILABLE_STYLES[style];
|
||||
if (XValueTools.isValidArg(eStyle)) {
|
||||
result = `${eStyle}${result}${AVAILABLE_STYLES.Reset}`;
|
||||
}
|
||||
|
||||
//
|
||||
// Detect and Validate Foreground Color and Apply it ...
|
||||
let eFColor = AVAILABLE_FOREGROUND_COLORS[color];
|
||||
if (
|
||||
!!toForeground
|
||||
&& XValueTools.isValidArg(eFColor)
|
||||
) {
|
||||
result = `${eFColor}${result}${AVAILABLE_STYLES.Reset}`;
|
||||
}
|
||||
|
||||
//
|
||||
// Detect and Validate Background Color and Apply it ...
|
||||
let eBColor = AVAILABLE_BACKGROUND_COLORS[color];
|
||||
if (
|
||||
!!toBackground
|
||||
&& XValueTools.isValidArg(eBColor)
|
||||
) {
|
||||
result = `${eBColor}${result}${AVAILABLE_STYLES.Reset}`;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* apply specific style on a content ...
|
||||
*
|
||||
* @param {string} content specific content which going to styled ...
|
||||
* @param {string} style a member of STYLE_NAMES which specified that which style going to applied to content ...
|
||||
* @returns {string} styled content ...
|
||||
*/
|
||||
function applyStyle(content, style) {
|
||||
//
|
||||
// Validate Arg ...
|
||||
if (!XValueTools.isValidArg(content)) {
|
||||
return content;
|
||||
}
|
||||
|
||||
//
|
||||
let eStyle = AVAILABLE_STYLES[style];
|
||||
if (eStyle === undefined) {
|
||||
return content;
|
||||
}
|
||||
|
||||
//
|
||||
return `${eStyle}${content}${AVAILABLE_STYLES.Reset}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* apply specific foreground color on a content ...
|
||||
*
|
||||
* @param {string} content specific content which going to colorified ...
|
||||
* @param {string} color a member of COLOR_NAMES which specified that which color going to applied to content ...
|
||||
* @returns {string} colorified content ...
|
||||
*/
|
||||
function applyForegroundColor(content, color) {
|
||||
//
|
||||
// Validate Arg ...
|
||||
if (!XValueTools.isValidArg(content)) {
|
||||
return content;
|
||||
}
|
||||
|
||||
//
|
||||
let eColor = AVAILABLE_FOREGROUND_COLORS[color];
|
||||
if (eColor === undefined) {
|
||||
return content;
|
||||
}
|
||||
|
||||
//
|
||||
return `${eColor}${content}${AVAILABLE_STYLES.Reset}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* apply specific background color on a content ...
|
||||
*
|
||||
* @param {string} content specific content which going to colorified ...
|
||||
* @param {string} color a member of COLOR_NAMES which specified that which color going to applied to content ...
|
||||
* @returns {string} colorified content ...
|
||||
*/
|
||||
function applyBackgroundColor(content, color) {
|
||||
//
|
||||
// Validate Arg ...
|
||||
if (!XValueTools.isValidArg(content)) {
|
||||
return content;
|
||||
}
|
||||
|
||||
//
|
||||
let eColor = AVAILABLE_BACKGROUND_COLORS[color];
|
||||
if (eColor === undefined) {
|
||||
return content;
|
||||
}
|
||||
|
||||
//
|
||||
return `${eColor}${content}${AVAILABLE_STYLES.Reset}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* generate style and color applier expression ...
|
||||
*
|
||||
* @param {string} color specific color name for using to styling ...
|
||||
* @param {string} style soecufic style name to use ...
|
||||
* @param {boolean} reset close applier string by reset styles ...
|
||||
* @param {boolean} toForeground apply specified color as foreground ...
|
||||
* @param {boolean} toBackground apply specified color as background ...
|
||||
* @returns {string} style and color applier string ...
|
||||
*/
|
||||
function getApplier(
|
||||
style = "",
|
||||
color = "",
|
||||
reset = false,
|
||||
toForeground = true,
|
||||
toBackground = false
|
||||
) {
|
||||
//
|
||||
let result = "";
|
||||
|
||||
//
|
||||
// Detect and Validate Style and Apply it ...
|
||||
let eStyle = AVAILABLE_STYLES[style];
|
||||
if (XValueTools.isValidArg(eStyle)) {
|
||||
result = `${eStyle}`;
|
||||
}
|
||||
|
||||
//
|
||||
// Detect and Validate Foreground Color and Apply it ...
|
||||
let eFColor = AVAILABLE_FOREGROUND_COLORS[color];
|
||||
if (
|
||||
!!toForeground
|
||||
&& XValueTools.isValidArg(eFColor)
|
||||
) {
|
||||
result = `${eFColor}`;
|
||||
}
|
||||
|
||||
//
|
||||
// Detect and Validate Background Color and Apply it ...
|
||||
let eBColor = AVAILABLE_BACKGROUND_COLORS[color];
|
||||
if (
|
||||
!!toBackground
|
||||
&& XValueTools.isValidArg(eBColor)
|
||||
) {
|
||||
result = `${eBColor}`;
|
||||
}
|
||||
|
||||
//
|
||||
if (
|
||||
!!reset &&
|
||||
result.length > 0
|
||||
) {
|
||||
result = `${result}${AVAILABLE_STYLES.Reset}`;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* generate style applier expression ...
|
||||
*
|
||||
* @param {string} style soecufic style name to use ...
|
||||
* @param {boolean} reset close applier string by reset styles ...
|
||||
* @returns {string} style applier string ...
|
||||
*/
|
||||
function getStyleApplier(
|
||||
style = "",
|
||||
reset = false
|
||||
) {
|
||||
//
|
||||
let result = "";
|
||||
|
||||
//
|
||||
// Detect and Validate Style and Apply it ...
|
||||
let eStyle = AVAILABLE_STYLES[style];
|
||||
if (XValueTools.isValidArg(eStyle)) {
|
||||
result = `${eStyle}`;
|
||||
}
|
||||
|
||||
//
|
||||
if (
|
||||
!!reset &&
|
||||
result.length > 0
|
||||
) {
|
||||
result = `${result}${AVAILABLE_STYLES.Reset}`;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* generate color applier expression ...
|
||||
*
|
||||
* @param {string} color specific color name for using to styling ...
|
||||
* @param {boolean} reset close applier string by reset styles ...
|
||||
* @param {boolean} toForeground apply specified color as foreground ...
|
||||
* @param {boolean} toBackground apply specified color as background ...
|
||||
* @returns {string} color applier string ...
|
||||
*/
|
||||
function getColorApplier(
|
||||
color = "",
|
||||
reset = false,
|
||||
toForeground = true,
|
||||
toBackground = false
|
||||
) {
|
||||
//
|
||||
let result = "";
|
||||
|
||||
//
|
||||
// Detect and Validate Foreground Color and Apply it ...
|
||||
let eFColor = AVAILABLE_FOREGROUND_COLORS[color];
|
||||
if (
|
||||
!!toForeground
|
||||
&& XValueTools.isValidArg(eFColor)
|
||||
) {
|
||||
result = `${eFColor}`;
|
||||
}
|
||||
|
||||
//
|
||||
// Detect and Validate Background Color and Apply it ...
|
||||
let eBColor = AVAILABLE_BACKGROUND_COLORS[color];
|
||||
if (
|
||||
!!toBackground
|
||||
&& XValueTools.isValidArg(eBColor)
|
||||
) {
|
||||
result = `${eBColor}`;
|
||||
}
|
||||
|
||||
//
|
||||
if (
|
||||
!!reset &&
|
||||
result.length > 0
|
||||
) {
|
||||
result = `${result}${AVAILABLE_STYLES.Reset}`;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* colorified specific content ...
|
||||
*
|
||||
* @param {string} content specified content for styling ...
|
||||
* @param {string} color specific color name for using to styling ...
|
||||
* @param {boolean} toForeground apply specified color as foreground ...
|
||||
* @param {boolean} toBackground apply specified color as background ...
|
||||
* @returns {string}
|
||||
*/
|
||||
function colorifyContent(
|
||||
content = "",
|
||||
color = "",
|
||||
toForeground = true,
|
||||
toBackground = false
|
||||
) {
|
||||
//
|
||||
let result = content;
|
||||
|
||||
//
|
||||
if (!XValueTools.isValidArg(content)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Finde Colors ...
|
||||
|
||||
//
|
||||
// Detect and Validate Foreground Color and Apply it ...
|
||||
let eFColor = AVAILABLE_FOREGROUND_COLORS[color];
|
||||
if (
|
||||
!!toForeground
|
||||
&& XValueTools.isValidArg(eFColor)
|
||||
) {
|
||||
result = `${eFColor}${result}`;
|
||||
}
|
||||
|
||||
//
|
||||
// Detect and Validate Background Color and Apply it ...
|
||||
let eBColor = AVAILABLE_BACKGROUND_COLORS[color];
|
||||
if (
|
||||
!!toBackground
|
||||
&& XValueTools.isValidArg(eBColor)
|
||||
) {
|
||||
result = `${eBColor}${result}`;
|
||||
}
|
||||
|
||||
//
|
||||
if (
|
||||
result.length > 0
|
||||
&& (
|
||||
XValueTools.isValidArg(eFColor) ||
|
||||
XValueTools.isValidArg(eBColor)
|
||||
)
|
||||
) {
|
||||
result = `${result}${AVAILABLE_STYLES.Reset}`;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* apply style on specific content ...
|
||||
*
|
||||
* @param {string} content specified content for styling ...
|
||||
* @param {string} style soecufic style name to use ...
|
||||
* @returns {string}
|
||||
*/
|
||||
function stylifiyContent(
|
||||
content = "",
|
||||
style = "",
|
||||
) {
|
||||
//
|
||||
let result = content;
|
||||
|
||||
//
|
||||
if (!XValueTools.isValidArg(content)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Detect and Validate Style and Apply it ...
|
||||
let eStyle = AVAILABLE_STYLES[style];
|
||||
if (XValueTools.isValidArg(eStyle)) {
|
||||
result = `${eStyle}${result}`;
|
||||
}
|
||||
|
||||
//
|
||||
if (
|
||||
result.length > 0
|
||||
&& XValueTools.isValidArg(eStyle)
|
||||
) {
|
||||
result = `${result}${AVAILABLE_STYLES.Reset}`;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Module Exports ...
|
||||
module.exports = {
|
||||
//
|
||||
STYLE_NAMES,
|
||||
COLOR_NAMES,
|
||||
//
|
||||
apply,
|
||||
applyStyle,
|
||||
getApplier,
|
||||
getColorApplier,
|
||||
getStyleApplier,
|
||||
colorifyContent,
|
||||
stylifiyContent,
|
||||
applyForegroundColor,
|
||||
applyBackgroundColor,
|
||||
}
|
||||
//#endregion
|
||||
@@ -1,890 +0,0 @@
|
||||
/**
|
||||
* XFile Tools Module ...
|
||||
* a module for handle all file/folder manipulating task in node js ...
|
||||
*
|
||||
* Maintainer
|
||||
*
|
||||
* Hadi Khazaee Asl <https://saherelm.ir> (hadi_khazaee_asl@yahoo.com)
|
||||
*/
|
||||
|
||||
//
|
||||
//#region Module Imports ...
|
||||
const fs = require('fs');
|
||||
const os = require('os');
|
||||
const Path = require('path');
|
||||
const http = require('http');
|
||||
const https = require('https');
|
||||
const XValueTools = require('./x-value.tools');
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Constants ...
|
||||
/**
|
||||
* current os path separators ...
|
||||
*/
|
||||
const PathSeparator = Path.sep;
|
||||
|
||||
/**
|
||||
* current directory ...
|
||||
*/
|
||||
const CurrentDir = __dirname;
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Actions ...
|
||||
//
|
||||
//#region Global ...
|
||||
/**
|
||||
* retrieve a path status ...
|
||||
*
|
||||
* @param {string} path a path value to check ...
|
||||
* @returns an stat object ...
|
||||
*/
|
||||
function getStatus(path = '') {
|
||||
//
|
||||
if (!XValueTools.isValidArg(path)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
//
|
||||
return fs.statSync(path);
|
||||
}
|
||||
|
||||
/**
|
||||
* retrieve user's Home path ...
|
||||
*
|
||||
* @returns {string} a path ...
|
||||
*/
|
||||
function getHomePath() {
|
||||
return os.homedir();
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Path ...
|
||||
/**
|
||||
* retrieve the base name of specific address path ...
|
||||
*
|
||||
* @param {string} path address of file or folder ...
|
||||
* @returns string ...
|
||||
*/
|
||||
function basename(path = '') {
|
||||
//
|
||||
if (!XValueTools.isValidArg(path)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
//
|
||||
const result = Path.basename(path);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* join several path segments together ...
|
||||
*
|
||||
* @param {...string} path path params ...
|
||||
* @returns a joined paths ...
|
||||
*/
|
||||
function joinPath(...path) {
|
||||
return Path.join(...path);
|
||||
}
|
||||
|
||||
/**
|
||||
* resolve a relative path to absolute ...
|
||||
*
|
||||
* @param {string[]} path a path value to check ...
|
||||
* @returns {string}
|
||||
*/
|
||||
function resolvePath(...path) {
|
||||
return Path.resolve(...path);
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region File ...
|
||||
/**
|
||||
* determines a path destination is a file or not ...
|
||||
*
|
||||
* @param {string} path a path value to check ...
|
||||
* @returns a boolean value ...
|
||||
*/
|
||||
function isFileExists(path = '') {
|
||||
//
|
||||
if (!XValueTools.isValidArg(path)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
try {
|
||||
const stat = getStatus(path);
|
||||
if (!stat) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
return stat.isFile();
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* remove a file ...
|
||||
*
|
||||
* @param {string} path a file path ...
|
||||
* @returns {Promise<boolean>} action done or not ...
|
||||
*/
|
||||
function removeFile(path = '') {
|
||||
return new Promise((resolve) => {
|
||||
//
|
||||
if (!isFileExists(path)) {
|
||||
resolve(false);
|
||||
}
|
||||
|
||||
//
|
||||
fs.unlink(path, (err) => {
|
||||
//
|
||||
if (err) {
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* copy a file to destination path ...
|
||||
*
|
||||
* @param {string} source source file path ...
|
||||
* @param {string} dest dest folder path ...
|
||||
* @returns {Promise<boolean>} action done or not ...
|
||||
*/
|
||||
function copyFile(
|
||||
source = '',
|
||||
dest = ''
|
||||
) {
|
||||
return new Promise((resolve) => {
|
||||
//
|
||||
if (
|
||||
!isFileExists(source) ||
|
||||
!isDirectoryExists(dest)
|
||||
) {
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
const destFilePath = Path.join(dest, Path.basename(source));
|
||||
fs.copyFile(source, destFilePath, (err) => {
|
||||
//
|
||||
if (err) {
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* reading specified file content ...
|
||||
*
|
||||
* @param {string} path a file path ...
|
||||
* @returns {Promise<string>} file content ...
|
||||
*/
|
||||
function readFile(path = '') {
|
||||
return new Promise((resolve) => {
|
||||
//
|
||||
if (!isFileExists(path)) {
|
||||
resolve('');
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
fs.readFile(path, 'utf8', (err, content) => {
|
||||
//
|
||||
if (err) {
|
||||
resolve(undefined);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
resolve(content);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* write content to a file ...
|
||||
*
|
||||
* @param {string} path a file path ...
|
||||
* @param {string} content the content which going to write to the file ...
|
||||
* @param {bool} overwrite determines file overwrite if exists ...
|
||||
* @returns {Promise<boolean>} action done or not ...
|
||||
*/
|
||||
function writeFile(
|
||||
path = '',
|
||||
content = '',
|
||||
overwrite = true
|
||||
) {
|
||||
return new Promise((resolve) => {
|
||||
//
|
||||
if (isFileExists(path) && !overwrite) {
|
||||
//
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Normalize Content ...
|
||||
content = XValueTools.isValidArg(content) ?
|
||||
content :
|
||||
'';
|
||||
|
||||
//
|
||||
fs.writeFile(path, content, (err) => {
|
||||
//
|
||||
if (err) {
|
||||
//
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* create a file ...
|
||||
*
|
||||
* @param {string} path file path ...
|
||||
* @param {string} fileName file name ...
|
||||
* @returns {Promise<boolean>} action done or not ...
|
||||
*/
|
||||
function createFile(
|
||||
path = '',
|
||||
fileName = ''
|
||||
) {
|
||||
return new Promise((resolve) => {
|
||||
//
|
||||
const filePath = Path.join(path, fileName);
|
||||
if (
|
||||
isFileExists(filePath) ||
|
||||
!XValueTools.isValidArg(path) ||
|
||||
!XValueTools.isValidArg(fileName)
|
||||
) {
|
||||
//
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
fs.writeFile(filePath, '', (err) => {
|
||||
//
|
||||
if (err) {
|
||||
//
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* remove a file name extension ...
|
||||
*
|
||||
* @param {string} name
|
||||
* @returns {string} name without extension ...
|
||||
*/
|
||||
function removeFileExtension(name = '') {
|
||||
return name.substring(0, name.lastIndexOf('.')) || name;
|
||||
}
|
||||
|
||||
/**
|
||||
* retrieve a file extension ...
|
||||
*
|
||||
* @param {string} path a path which locate a file ...
|
||||
* @returns {string}
|
||||
*/
|
||||
function getFileExtension(path = '') {
|
||||
//
|
||||
let result = "";
|
||||
|
||||
//
|
||||
// Validate Arg ...
|
||||
if (
|
||||
!XValueTools.isValidArg(path)
|
||||
|| !isFileExists(path)
|
||||
) {
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Retrieve just file name ...
|
||||
const fileName = basename(path);
|
||||
result = fileName.replace(
|
||||
removeFileExtension(fileName),
|
||||
""
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* retrieve all files list recursively from specific path ...
|
||||
*
|
||||
* @param {string} path a source folder path ...
|
||||
* @param {string[]} extensions which file extensions need to be listed, live empty for all files ...
|
||||
* @returns {Promise<string[]>}
|
||||
*/
|
||||
async function getRecursiveFilesList(
|
||||
path = "",
|
||||
extensions = []
|
||||
) {
|
||||
//
|
||||
let result = [];
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (
|
||||
!XValueTools.isValidArg(path)
|
||||
|| !isDirectoryExists(path)
|
||||
) {
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
const contents = await getDirectoryContents(path);
|
||||
for (const item of contents) {
|
||||
//
|
||||
const itemPath = joinPath(
|
||||
path,
|
||||
item
|
||||
);
|
||||
|
||||
//
|
||||
const isItemFile = isFileExists(itemPath);
|
||||
if (isItemFile) {
|
||||
//
|
||||
const itemFileExtension = getFileExtension(itemPath);
|
||||
const isFileInSupportedExtensions =
|
||||
extensions === undefined || extensions.length === 0
|
||||
? true
|
||||
: extensions.includes(itemFileExtension)
|
||||
;
|
||||
if (isFileInSupportedExtensions) {
|
||||
result.push(itemPath);
|
||||
}
|
||||
} else if (isDirectoryExists(itemPath)) {
|
||||
//
|
||||
const itemPathFiles = await getRecursiveFilesList(itemPath, extensions);
|
||||
result.push(...itemPathFiles);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract Specific files from a folder and it's content ...
|
||||
*
|
||||
* @param {string} path Folder Path ...
|
||||
* @returns
|
||||
*/
|
||||
async function extractFiles(path = "", ext = [], excludeWorkspaceFolders = []) {
|
||||
//
|
||||
const result = [];
|
||||
|
||||
//
|
||||
if (!ext || ext.length == 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
const pathContent = await getDirectoryContents(path);
|
||||
if (!pathContent || pathContent.length == 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Loop through Content ...
|
||||
for (const c of pathContent) {
|
||||
//
|
||||
// Prepare full path ...
|
||||
const cPath = joinPath(path, c);
|
||||
|
||||
//
|
||||
// check content path is file or not ...
|
||||
const isCFile = isFileExists(cPath);
|
||||
const isCDirectory = isDirectoryExists(cPath);
|
||||
if (isCFile) {
|
||||
//
|
||||
// Check it is MQL file or not ...
|
||||
const cExt = getFileExtension(cPath);
|
||||
if (ext.includes(cExt)) {
|
||||
result.push(cPath);
|
||||
}
|
||||
} else if (isCDirectory) {
|
||||
//
|
||||
const destFolderName = basename(cPath);
|
||||
const isExcluded = excludeWorkspaceFolders.includes(destFolderName);
|
||||
if (isExcluded) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
const cFiles = await extractFiles(cPath, ext);
|
||||
if (cFiles && cFiles.length > 0) {
|
||||
result.push(...cFiles);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Directory ...
|
||||
/**
|
||||
* create a directory ...
|
||||
*
|
||||
* @param {string} path destination path including dir name ...
|
||||
* @param {boolean} recursive create directories recursively ...
|
||||
* @returns action done or not ...
|
||||
*/
|
||||
function createDirectory(
|
||||
path = '',
|
||||
recursive = true
|
||||
) {
|
||||
//
|
||||
let result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
isDirectoryExists(path) ||
|
||||
!XValueTools.isValidArg(path)
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
try {
|
||||
//
|
||||
fs.mkdirSync(path, { recursive: recursive });
|
||||
result = true;
|
||||
return result;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* remove a directory ...
|
||||
*
|
||||
* @param {string} path destination path including dir name ...
|
||||
* @param {boolean} recursive removes directories recursively ...
|
||||
* @returns {Promise<boolean>} action done or not ...
|
||||
*/
|
||||
function removeDirectory(
|
||||
path = '',
|
||||
recursive = false
|
||||
) {
|
||||
return new Promise((resolve) => {
|
||||
//
|
||||
if (!isDirectoryExists(path)) {
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
fs.rm(path, {
|
||||
recursive
|
||||
}, (err) => {
|
||||
//
|
||||
if (err) {
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* determines a path destination is a directory or not ...
|
||||
*
|
||||
* @param {string} path a folder path ...
|
||||
* @returns represent destnation path is Directory or not ...
|
||||
*/
|
||||
function isDirectoryExists(path = '') {
|
||||
//
|
||||
if (!XValueTools.isValidArg(path)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
try {
|
||||
//
|
||||
const isExists = fs.existsSync(path);
|
||||
if (!isExists) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
const stat = getStatus(path);
|
||||
if (!stat) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
const result = stat.isDirectory();
|
||||
return result;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* retrieve a directory content ...
|
||||
*
|
||||
* @param {string} path a folder path ...
|
||||
* @returns {Promise<string[]>} a collection of folder files ...
|
||||
*/
|
||||
function getDirectoryContents(path = '') {
|
||||
return new Promise((resolve) => {
|
||||
//
|
||||
if (!isDirectoryExists(path)) {
|
||||
resolve([]);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
fs.readdir(path, (err, content) => {
|
||||
//
|
||||
if (err) {
|
||||
resolve([]);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
resolve(content);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* retrieve a directory files ...
|
||||
*
|
||||
* @param {string} path a folder path ...
|
||||
* @returns {Promise<string[]>} a collection of folder files ...
|
||||
*/
|
||||
function getDirectoryFiles(
|
||||
path = '',
|
||||
containsHiddenFiles = false
|
||||
) {
|
||||
return new Promise((resolve) => {
|
||||
//
|
||||
if (!isDirectoryExists(path)) {
|
||||
resolve([]);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
fs.readdir(path, (err, content) => {
|
||||
//
|
||||
if (err) {
|
||||
resolve([]);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
if (!containsHiddenFiles) {
|
||||
content = content.filter(c => !c.startsWith('.'));
|
||||
}
|
||||
|
||||
//
|
||||
const result = [];
|
||||
content
|
||||
.forEach(c => {
|
||||
//
|
||||
const cPath = Path.join(path, c);
|
||||
if (isFileExists(cPath)) {
|
||||
result.push(c);
|
||||
}
|
||||
});
|
||||
|
||||
//
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* retrieve a directory folders ...
|
||||
*
|
||||
* @param {string} path a folder path ...
|
||||
* @returns {Promise<string[]>} a collection of folder names ...
|
||||
*/
|
||||
function getDirectoryFolders(path = '') {
|
||||
return new Promise((resolve) => {
|
||||
//
|
||||
if (!isDirectoryExists(path)) {
|
||||
resolve([]);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
fs.readdir(path, (err, content) => {
|
||||
//
|
||||
if (err) {
|
||||
resolve([]);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
const result = [];
|
||||
content.forEach(c => {
|
||||
//
|
||||
const cPath = Path.join(path, c);
|
||||
if (isDirectoryExists(cPath)) {
|
||||
result.push(c);
|
||||
}
|
||||
});
|
||||
|
||||
//
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* copy a folder with all of it's content to dest ...
|
||||
*
|
||||
* @param {string} source source folder path ...
|
||||
* @param {string} dest dest folder path ...
|
||||
* @returns {Promise<boolean>} action done or not ...
|
||||
*/
|
||||
async function copyFolder(
|
||||
source = '',
|
||||
dest = ''
|
||||
) {
|
||||
//
|
||||
if (
|
||||
!isDirectoryExists(source) ||
|
||||
!XValueTools.isValidArg(dest) ||
|
||||
!XValueTools.isValidArg(source)
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
const folderName = Path.basename(source);
|
||||
const destPath = Path.join(dest, folderName);
|
||||
|
||||
//
|
||||
// Create Dest Path folder if not exists ...
|
||||
if (!isDirectoryExists(destPath)) {
|
||||
//
|
||||
let result = createDirectory(destPath, true);
|
||||
if (!result) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Files ...
|
||||
const files = await getDirectoryFiles(source);
|
||||
if (files && files.constructor === Array && files.length > 0) {
|
||||
//
|
||||
const filesPromises = files.map(file => copyFile(Path.join(source, file), destPath));
|
||||
const filesResult = (await Promise.all(filesPromises)).every(r => !!r);
|
||||
if (!filesResult) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Folders ...
|
||||
const folders = await getDirectoryFolders(source);
|
||||
if (folders && folders.constructor === Array && folders.length > 0) {
|
||||
//
|
||||
const folderPromises = folders.map(folder => copyFolder(Path.join(source, folder), destPath));
|
||||
const filesResult = (await Promise.all(folderPromises)).every(r => !!r);
|
||||
if (!filesResult) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return true;
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Downloader ...
|
||||
/**
|
||||
* download a file from specific url and store it ...
|
||||
*
|
||||
* @param {string} filepath the file name and path which required to put download file on it ...
|
||||
* @param {string} url the web url for downloading ...
|
||||
*/
|
||||
function download(filepath, url) {
|
||||
//
|
||||
// Validate Args ...
|
||||
if (
|
||||
!XValueTools.isValidArg(url)
|
||||
|| !XValueTools.isValidURL(url)
|
||||
|| !XValueTools.isValidArg(filepath)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
var file = fs.createWriteStream(filepath);
|
||||
|
||||
//
|
||||
if (url.startsWith('https:')) {
|
||||
https.get(url, function (response) {
|
||||
response.pipe(file);
|
||||
});
|
||||
} else if (url.startsWith('http:')) {
|
||||
http.get(url, function (response) {
|
||||
response.pipe(file);
|
||||
});
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region JSON ...
|
||||
/**
|
||||
* read and parse a JSON content from a file ...
|
||||
*
|
||||
* @param {string} path source file path ...
|
||||
* @returns {any}
|
||||
*/
|
||||
function readJSON(path = "") {
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!isFileExists(path)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
//
|
||||
let result = undefined;
|
||||
try {
|
||||
result = require(path);
|
||||
} catch {
|
||||
result = undefined;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* write a JSON Object content into a file ...
|
||||
*
|
||||
* @param {string} path dest file path ...
|
||||
* @param {any} content an object which required to write to file ...
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
async function writeJSON(
|
||||
path = "",
|
||||
content = undefined
|
||||
) {
|
||||
//
|
||||
let result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XValueTools.isValidArg(path)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Normallize Content ...
|
||||
if (content === undefined) {
|
||||
content = {};
|
||||
}
|
||||
|
||||
//
|
||||
const contentString = XValueTools.beautifyJSON(content);
|
||||
|
||||
//
|
||||
result = await writeFile(
|
||||
path,
|
||||
contentString,
|
||||
true
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
//#endregion
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Module Exports ...
|
||||
module.exports = {
|
||||
//
|
||||
CurrentDir,
|
||||
PathSeparator,
|
||||
|
||||
//
|
||||
getStatus,
|
||||
getHomePath,
|
||||
|
||||
//
|
||||
basename,
|
||||
joinPath,
|
||||
resolvePath,
|
||||
|
||||
//
|
||||
download,
|
||||
|
||||
//
|
||||
readJSON,
|
||||
writeJSON,
|
||||
|
||||
//
|
||||
copyFile,
|
||||
readFile,
|
||||
writeFile,
|
||||
createFile,
|
||||
removeFile,
|
||||
isFileExists,
|
||||
getFileExtension,
|
||||
removeFileExtension,
|
||||
getRecursiveFilesList,
|
||||
extractFiles,
|
||||
|
||||
//
|
||||
copyFolder,
|
||||
createDirectory,
|
||||
removeDirectory,
|
||||
createDirectory,
|
||||
removeDirectory,
|
||||
isDirectoryExists,
|
||||
isDirectoryExists,
|
||||
getDirectoryFiles,
|
||||
getDirectoryFolders,
|
||||
getDirectoryContents,
|
||||
};
|
||||
//#endregion
|
||||
@@ -1,219 +0,0 @@
|
||||
/**
|
||||
* XShell Tools Module ...
|
||||
* a module for handling shell actions and retrieve OS Info in node js ...
|
||||
*
|
||||
* Maintainer
|
||||
*
|
||||
* Hadi Khazaee Asl <https://saherelm.ir> (hadi_khazaee_asl@yahoo.com)
|
||||
*/
|
||||
|
||||
//
|
||||
//#region Imports ...
|
||||
const os = require('os');
|
||||
const process = require('process');
|
||||
const { exec } = require("child_process");
|
||||
const XFileTools = require('./x-file.tools');
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Constants ...
|
||||
//
|
||||
const OS = {
|
||||
Aix: 'aix',
|
||||
Darwin: 'darwin',
|
||||
FreeBSD: 'freebsd',
|
||||
Linux: 'linux',
|
||||
OpenBSD: 'openbsd',
|
||||
SnOS: 'sunos',
|
||||
Windows: 'win32'
|
||||
};
|
||||
|
||||
//
|
||||
const isWindows = process.platform === OS.Windows;
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Actions ...
|
||||
//
|
||||
//#region Pure shell commands ...
|
||||
/**
|
||||
* execute a command using NodeJS on shell ...
|
||||
*
|
||||
* @param {string} cmd command to execute ...
|
||||
* @param {string} cwd working directory ...
|
||||
*
|
||||
* @returns Promise<any, errr> instance ...
|
||||
*/
|
||||
function execute(cmd, cwd) {
|
||||
return new Promise((resolve, reject) => {
|
||||
//
|
||||
if (!cmd || cmd.toString().length === 0 || (cwd && !XFileTools.isDirectoryExists(cwd))) {
|
||||
reject('invalid args ...');
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
exec(cmd, { cwd }, (err, result, stdError) => {
|
||||
//
|
||||
if (err) {
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
if (stdError) {
|
||||
//
|
||||
// reject(stdError);
|
||||
// return;
|
||||
}
|
||||
|
||||
//
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* determines a command exists on host or not ...
|
||||
*
|
||||
* @param {string} name specific command name ...
|
||||
*
|
||||
* @returns boolean Promise ...
|
||||
*/
|
||||
function checkCommandExists(name) {
|
||||
return new Promise(resolve => {
|
||||
//
|
||||
if (!name) {
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
const cmd = isWindows ? `${name} >nul 2>&1` : `type ${name} >/dev/null 2>&1`;
|
||||
execute(cmd).then(result => {
|
||||
resolve(true);
|
||||
})
|
||||
.catch(err => {
|
||||
resolve(false);
|
||||
});
|
||||
});
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region required commands state ...
|
||||
/**
|
||||
* check al required commands exists or not ...
|
||||
*
|
||||
* @returns
|
||||
*/
|
||||
async function isRequiredCommandsExists() {
|
||||
//
|
||||
let result = false;
|
||||
|
||||
//
|
||||
// const isTarExists = await isTarCommandExists();
|
||||
// const isCatExists = await isCatCommandExists();
|
||||
// const isGrepExists = await isGrepCommandExists();
|
||||
// const isSedExists = await isSedCommandExists();
|
||||
const isNpmExists = await isNpmCommandExists();
|
||||
const isNgExists = await isNgCommandExists();
|
||||
const isIonicExists = await isIonicCommandExists();
|
||||
const isCordovaExists = await isCordovaCommandExists();
|
||||
|
||||
//
|
||||
result = isNpmExists
|
||||
&& isNgExists
|
||||
&& isIonicExists
|
||||
&& isCordovaExists
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* retrieve required commands state object ...
|
||||
*
|
||||
* @returns
|
||||
*/
|
||||
async function getRequiredCommandsStates() {
|
||||
//
|
||||
const result = {};
|
||||
|
||||
//
|
||||
// const isTarExists = await isTarCommandExists();
|
||||
// const isCatExists = await isCatCommandExists();
|
||||
// const isGrepExists = await isGrepCommandExists();
|
||||
// const isSedExists = await isSedCommandExists();
|
||||
const isNpmExists = await isNpmCommandExists();
|
||||
const isNgExists = await isNgCommandExists();
|
||||
const isIonicExists = await isIonicCommandExists();
|
||||
const isCordovaExists = await isCordovaCommandExists();
|
||||
|
||||
//
|
||||
result['npm'] = isNpmExists;
|
||||
result['ng'] = isNgExists;
|
||||
result['ionic'] = isIonicExists;
|
||||
result['cordova'] = isCordovaExists;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Commonly used Command Checkers ...
|
||||
/**
|
||||
* determines npm command exists or not ...
|
||||
*
|
||||
* @returns
|
||||
*/
|
||||
function isNpmCommandExists() {
|
||||
return checkCommandExists('npm');
|
||||
}
|
||||
|
||||
/**
|
||||
* determines ng command exists or not ...
|
||||
*
|
||||
* @returns
|
||||
*/
|
||||
function isNgCommandExists() {
|
||||
return checkCommandExists('ng');
|
||||
}
|
||||
|
||||
/**
|
||||
* determines ionic command exists or not ...
|
||||
*
|
||||
* @returns
|
||||
*/
|
||||
function isIonicCommandExists() {
|
||||
return checkCommandExists('ionic');
|
||||
}
|
||||
|
||||
/**
|
||||
* determines cordova command exists or not ...
|
||||
*
|
||||
* @returns
|
||||
*/
|
||||
function isCordovaCommandExists() {
|
||||
return checkCommandExists('cordova');
|
||||
}
|
||||
//#endregion
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Module Exports ...
|
||||
module.exports = {
|
||||
//
|
||||
execute,
|
||||
checkCommandExists,
|
||||
isRequiredCommandsExists,
|
||||
getRequiredCommandsStates,
|
||||
|
||||
//
|
||||
isNgCommandExists,
|
||||
isIonicCommandExists,
|
||||
isCordovaCommandExists,
|
||||
}
|
||||
//#endregion
|
||||
@@ -1,268 +0,0 @@
|
||||
/**
|
||||
* DataType Tools Module ...
|
||||
* a module for manipulate and detect supported data types in node js ...
|
||||
*
|
||||
* Maintainer
|
||||
*
|
||||
* Hadi Khazaee Asl <https://saherelm.ir> (hadi_khazaee_asl@yahoo.com)
|
||||
*/
|
||||
|
||||
//
|
||||
//#region Constants ...
|
||||
/**
|
||||
* all supported data types ...
|
||||
*/
|
||||
const DataTypes = {
|
||||
Null: 'null',
|
||||
Date: 'date',
|
||||
Array: 'array',
|
||||
Object: 'object',
|
||||
String: 'string',
|
||||
Number: 'number',
|
||||
Unknown: 'unknown',
|
||||
Boolean: 'boolean',
|
||||
Function: 'function',
|
||||
Undefined: 'undefined',
|
||||
};
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Actions ...
|
||||
/**
|
||||
* detect type of a content ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function getType(value) {
|
||||
//
|
||||
const type = typeof value;
|
||||
|
||||
//
|
||||
let result = DataTypes.Unknown;
|
||||
let dateIdentifier = '[object Date]';
|
||||
let constructor = value && value.constructor ?
|
||||
value.constructor.toString() :
|
||||
'';
|
||||
|
||||
//
|
||||
switch (type) {
|
||||
//
|
||||
case 'undefined':
|
||||
result = DataTypes.Undefined;
|
||||
break;
|
||||
|
||||
//
|
||||
case 'boolean':
|
||||
result = DataTypes.Boolean;
|
||||
break;
|
||||
|
||||
//
|
||||
case 'string':
|
||||
result = DataTypes.String;
|
||||
break;
|
||||
|
||||
//
|
||||
case 'number':
|
||||
result = DataTypes.Number;
|
||||
break;
|
||||
|
||||
//
|
||||
case 'function':
|
||||
result = DataTypes.Function;
|
||||
break;
|
||||
|
||||
//
|
||||
case 'object':
|
||||
//
|
||||
// Null ...
|
||||
if (value === null) {
|
||||
result = DataTypes.Null;
|
||||
} else
|
||||
//
|
||||
// Array ...
|
||||
if (Array.isArray(value)) {
|
||||
result = DataTypes.Array;
|
||||
} else
|
||||
//
|
||||
// Data ...
|
||||
if (
|
||||
value instanceof Date ||
|
||||
isFunction(value.getMonth) ||
|
||||
constructor.includes(dateIdentifier) ||
|
||||
Object.prototype.toString.call(value) === dateIdentifier
|
||||
) {
|
||||
result = DataTypes.Date;
|
||||
} else
|
||||
//
|
||||
// Object ...
|
||||
{
|
||||
result = DataTypes.Object;
|
||||
}
|
||||
break;
|
||||
|
||||
//
|
||||
default:
|
||||
result = DataTypes.Unknown;
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* retrieve an object constructor ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function getConstructor(value) {
|
||||
//
|
||||
const result = value && value.constructor ?
|
||||
value.constructor.toString() :
|
||||
'';
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* retrieve an object prototype ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function getPrototype(value) {
|
||||
//
|
||||
const result = value ?
|
||||
Object.prototype.toString.call(value) :
|
||||
'';
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* check an object is null or not ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function isNull(value) {
|
||||
return getType(value) === DataTypes.Null;
|
||||
}
|
||||
|
||||
/**
|
||||
* check an object is undefined or not ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function isUndefined(value) {
|
||||
return getType(value) === DataTypes.Undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* check an object is null or undefined or not ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function isNullOrUndefined(value) {
|
||||
return isNull(value) || isUndefined(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* check an object is a date or not ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function isDate(value) {
|
||||
return getType(value) === DataTypes.Date;
|
||||
}
|
||||
|
||||
/**
|
||||
* check an object is number or not ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function isNumber(value) {
|
||||
return getType(value) === DataTypes.Number;
|
||||
}
|
||||
|
||||
/**
|
||||
* check an object is string or not ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function isString(value) {
|
||||
return getType(value) === DataTypes.String;
|
||||
}
|
||||
|
||||
/**
|
||||
* check an object is boolean or not ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function isBoolean(value) {
|
||||
return getType(value) === DataTypes.Boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* check an object is an Array or not ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function isArray(value) {
|
||||
return getType(value) === DataTypes.Array;
|
||||
}
|
||||
|
||||
/**
|
||||
* check an object is and Object or not ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function isObject(value) {
|
||||
return getType(value) === DataTypes.Object;
|
||||
}
|
||||
|
||||
/**
|
||||
* check an object is a Function or not ...
|
||||
*
|
||||
* @param {any} value the content which going to check ...
|
||||
* @returns
|
||||
*/
|
||||
function isFunction(value) {
|
||||
return getType(value) === DataTypes.Function;
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//
|
||||
//#region Module Exports ...
|
||||
module.exports = {
|
||||
//
|
||||
DataTypes,
|
||||
|
||||
//
|
||||
getType,
|
||||
getConstructor,
|
||||
getPrototype,
|
||||
isNull,
|
||||
isUndefined,
|
||||
isNullOrUndefined,
|
||||
isDate,
|
||||
isNumber,
|
||||
isString,
|
||||
isBoolean,
|
||||
isArray,
|
||||
isObject,
|
||||
isFunction,
|
||||
}
|
||||
//#endregion
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -1,517 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| FVG SMC EA.mq5 |
|
||||
//| Copyright 2024, ALLAN MUNENE MUTIIRIA. #@Forex Algo-Trader. |
|
||||
//| https://youtube.com/@ForexAlgo-Trader? |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2024, ALLAN MUNENE MUTIIRIA. #@Forex Algo-Trader"
|
||||
#property link "https://youtube.com/@ForexAlgo-Trader?"
|
||||
#property version "3.00"
|
||||
|
||||
#include <Trade/Trade.mqh>
|
||||
CTrade obj_Trade;
|
||||
|
||||
#define FVG_Prefix "FVG REC "
|
||||
#define CLR_UP clrLime
|
||||
#define CLR_DOWN clrRed
|
||||
|
||||
int minPts = 100;
|
||||
int FVG_Rec_Ext_Bars = 10;
|
||||
|
||||
string totalFVGs[];
|
||||
int barINDICES[];
|
||||
datetime barTIMEs[];
|
||||
bool signalFVGs[];
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Expert initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit(){
|
||||
|
||||
int visibleBars = (int)ChartGetInteger(0,CHART_VISIBLE_BARS);
|
||||
Print("Total visible bars on chart = ",visibleBars);
|
||||
|
||||
if (ObjectsTotal(0,0,OBJ_RECTANGLE)==0){
|
||||
Print("No FVGs Found, Resizing storage arrays to 0 now!!!");
|
||||
ArrayResize(totalFVGs,0);
|
||||
ArrayResize(barINDICES,0);
|
||||
ArrayResize(signalFVGs,0);
|
||||
}
|
||||
|
||||
ObjectsDeleteAll(0,FVG_Prefix);
|
||||
|
||||
for (int i=0; i<=visibleBars; i++){
|
||||
//Print("Bar Index = ",i);
|
||||
double low0 = iLow(_Symbol,_Period,i);
|
||||
double high2 = iHigh(_Symbol,_Period,i+2);
|
||||
double gap_L0_H2 = NormalizeDouble((low0 - high2)/_Point,_Digits);
|
||||
|
||||
double high0 = iHigh(_Symbol,_Period,i);
|
||||
double low2 = iLow(_Symbol,_Period,i+2);
|
||||
double gap_H0_L2 = NormalizeDouble((low2 - high0)/_Point,_Digits);
|
||||
|
||||
bool FVG_UP = low0 > high2 && gap_L0_H2 > minPts;
|
||||
bool FVG_DOWN = low2 > high0 && gap_H0_L2 > minPts;
|
||||
|
||||
if (FVG_UP || FVG_DOWN){
|
||||
Print("Bar Index with FVG = ",i+1);
|
||||
datetime time1 = iTime(_Symbol,_Period,i+1);
|
||||
double price1 = FVG_UP ? high2 : high0;
|
||||
datetime time2 = time1 + PeriodSeconds(_Period)*FVG_Rec_Ext_Bars;
|
||||
double price2 = FVG_UP ? low0 : low2;
|
||||
string fvgNAME = FVG_Prefix+"("+TimeToString(time1)+")";
|
||||
color fvgClr = FVG_UP ? CLR_UP : CLR_DOWN;
|
||||
CreateRec(fvgNAME,time1,price1,time2,price2,fvgClr);
|
||||
Print("Old ArraySize = ",ArraySize(totalFVGs));
|
||||
ArrayResize(totalFVGs,ArraySize(totalFVGs)+1);
|
||||
ArrayResize(barINDICES,ArraySize(barINDICES)+1);
|
||||
Print("New ArraySize = ",ArraySize(totalFVGs));
|
||||
totalFVGs[ArraySize(totalFVGs)-1] = fvgNAME;
|
||||
barINDICES[ArraySize(barINDICES)-1] = i+1;
|
||||
ArrayPrint(totalFVGs);
|
||||
ArrayPrint(barINDICES);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=ArraySize(totalFVGs)-1; i>=0; i--){
|
||||
string objName = totalFVGs[i];
|
||||
string fvgNAME = ObjectGetString(0,objName,OBJPROP_NAME);
|
||||
int barIndex = barINDICES[i];
|
||||
datetime timeSTART = (datetime)ObjectGetInteger(0,fvgNAME,OBJPROP_TIME,0);
|
||||
datetime timeEND = (datetime)ObjectGetInteger(0,fvgNAME,OBJPROP_TIME,1);
|
||||
double fvgLOW = ObjectGetDouble(0,fvgNAME,OBJPROP_PRICE,0);
|
||||
double fvgHIGH = ObjectGetDouble(0,fvgNAME,OBJPROP_PRICE,1);
|
||||
color fvgColor = (color)ObjectGetInteger(0,fvgNAME,OBJPROP_COLOR);
|
||||
|
||||
Print("FVG NAME = ",fvgNAME," >No: ",barIndex," TS: ",timeSTART," TE: ",
|
||||
timeEND," LOW: ",fvgLOW," HIGH: ",fvgHIGH," CLR = ",fvgColor);
|
||||
for (int k=barIndex-1; k>=(barIndex-FVG_Rec_Ext_Bars); k--){
|
||||
datetime barTime = iTime(_Symbol,_Period,k);
|
||||
double barLow = iLow(_Symbol,_Period,k);
|
||||
double barHigh = iHigh(_Symbol,_Period,k);
|
||||
//Print("Bar No: ",k," >Time: ",barTime," >H: ",barHigh," >L: ",barLow);
|
||||
|
||||
if (k==0){
|
||||
Print("OverFlow Detected @ fvg ",fvgNAME);
|
||||
UpdateRec(fvgNAME,timeSTART,fvgLOW,barTime,fvgHIGH);
|
||||
break;
|
||||
}
|
||||
|
||||
if ((fvgColor == CLR_DOWN && barHigh > fvgHIGH) ||
|
||||
(fvgColor == CLR_UP && barLow < fvgLOW)
|
||||
){
|
||||
Print("Cut Off @ bar no: ",k," of Time: ",barTime);
|
||||
UpdateRec(fvgNAME,timeSTART,fvgLOW,barTime,fvgHIGH);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ArrayResize(totalFVGs,0);
|
||||
ArrayResize(barINDICES,0);
|
||||
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Expert deinitialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnDeinit(const int reason)
|
||||
{
|
||||
//---
|
||||
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Expert tick function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnTick(){
|
||||
|
||||
for (int i=0; i<=FVG_Rec_Ext_Bars; i++){
|
||||
double low0 = iLow(_Symbol,_Period,i+1);
|
||||
double high2 = iHigh(_Symbol,_Period,i+2+1);
|
||||
double gap_L0_H2 = NormalizeDouble((low0 - high2)/_Point,_Digits);
|
||||
|
||||
double high0 = iHigh(_Symbol,_Period,i+1);
|
||||
double low2 = iLow(_Symbol,_Period,i+2+1);
|
||||
double gap_H0_L2 = NormalizeDouble((low2 - high0)/_Point,_Digits);
|
||||
|
||||
bool FVG_UP = low0 > high2 && gap_L0_H2 > minPts;
|
||||
bool FVG_DOWN = low2 > high0 && gap_H0_L2 > minPts;
|
||||
|
||||
if (FVG_UP || FVG_DOWN){
|
||||
datetime time1 = iTime(_Symbol,_Period,i+1+1);
|
||||
double price1 = FVG_UP ? high2 : high0;
|
||||
datetime time2 = time1 + PeriodSeconds(_Period)*FVG_Rec_Ext_Bars;
|
||||
double price2 = FVG_UP ? low0 : low2;
|
||||
string fvgNAME = FVG_Prefix+"("+TimeToString(time1)+")";
|
||||
color fvgClr = FVG_UP ? CLR_UP : CLR_DOWN;
|
||||
|
||||
if (ObjectFind(0,fvgNAME) < 0){
|
||||
CreateRec(fvgNAME,time1,price1,time2,price2,fvgClr);
|
||||
Print("Old ArraySize = ",ArraySize(totalFVGs));
|
||||
ArrayResize(totalFVGs,ArraySize(totalFVGs)+1);
|
||||
ArrayResize(barTIMEs,ArraySize(barTIMEs)+1);
|
||||
ArrayResize(signalFVGs,ArraySize(signalFVGs)+1);
|
||||
Print("New ArraySize = ",ArraySize(totalFVGs));
|
||||
totalFVGs[ArraySize(totalFVGs)-1] = fvgNAME;
|
||||
barTIMEs[ArraySize(barTIMEs)-1] = time1;
|
||||
signalFVGs[ArraySize(signalFVGs)-1] = false;
|
||||
ArrayPrint(totalFVGs);
|
||||
ArrayPrint(barTIMEs);
|
||||
ArrayPrint(signalFVGs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int j=ArraySize(totalFVGs)-1; j>=0; j--){
|
||||
bool fvgExist = false;
|
||||
string objName = totalFVGs[j];
|
||||
string fvgNAME = ObjectGetString(0,objName,OBJPROP_NAME);
|
||||
double fvgLow = ObjectGetDouble(0,fvgNAME,OBJPROP_PRICE,0);
|
||||
double fvgHigh = ObjectGetDouble(0,fvgNAME,OBJPROP_PRICE,1);
|
||||
color fvgColor = (color)ObjectGetInteger(0,fvgNAME,OBJPROP_COLOR);
|
||||
|
||||
for (int k=1; k<=FVG_Rec_Ext_Bars; k++){
|
||||
double barLow = iLow(_Symbol,_Period,k);
|
||||
double barHigh = iHigh(_Symbol,_Period,k);
|
||||
|
||||
if (barHigh == fvgLow || barLow == fvgLow){
|
||||
//Print("Found: ",fvgNAME," @ bar ",k);
|
||||
fvgExist = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//Print("Existence of ",fvgNAME," = ",fvgExist);
|
||||
|
||||
double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
|
||||
double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
|
||||
|
||||
if (fvgColor == CLR_DOWN && Bid > fvgHigh && !signalFVGs[j]){
|
||||
Print("SELL SIGNAL For (",fvgNAME,") Now @ ",Bid);
|
||||
double SL_sell = Ask + NormalizeDouble((((fvgHigh-fvgLow)/_Point)*10)*_Point,_Digits);
|
||||
double trade_lots = Check1_ValidateVolume_Lots(0.01);
|
||||
|
||||
if (Check2_Margin(ORDER_TYPE_SELL,trade_lots) &&
|
||||
Check3_VolumeLimit(trade_lots) &&
|
||||
Check4_TradeLevels(POSITION_TYPE_SELL,SL_sell,fvgLow)){
|
||||
obj_Trade.Sell(trade_lots,_Symbol,Bid,SL_sell,fvgLow);
|
||||
signalFVGs[j] = true;
|
||||
}
|
||||
ArrayPrint(totalFVGs,_Digits," [< >] ");
|
||||
ArrayPrint(signalFVGs,_Digits," [< >] ");
|
||||
}
|
||||
else if (fvgColor == CLR_UP && Ask < fvgLow && !signalFVGs[j]){
|
||||
Print("BUY SIGNAL For (",fvgNAME,") Now @ ",Ask);
|
||||
double SL_buy = Bid - NormalizeDouble((((fvgHigh-fvgLow)/_Point)*10)*_Point,_Digits);
|
||||
double trade_lots = Check1_ValidateVolume_Lots(0.01);
|
||||
|
||||
if (Check2_Margin(ORDER_TYPE_BUY,trade_lots) &&
|
||||
Check3_VolumeLimit(trade_lots) &&
|
||||
Check4_TradeLevels(POSITION_TYPE_BUY,SL_buy,fvgHigh)){
|
||||
obj_Trade.Buy(trade_lots,_Symbol,Ask,SL_buy,fvgHigh);
|
||||
signalFVGs[j] = true;
|
||||
}
|
||||
ArrayPrint(totalFVGs,_Digits," [< >] ");
|
||||
ArrayPrint(signalFVGs,_Digits," [< >] ");
|
||||
}
|
||||
|
||||
if (fvgExist == false){
|
||||
bool removeName = ArrayRemove(totalFVGs,0,1);
|
||||
bool removeTime = ArrayRemove(barTIMEs,0,1);
|
||||
bool removeSignal = ArrayRemove(signalFVGs,0,1);
|
||||
if (removeName && removeTime && removeSignal){
|
||||
Print("Success removing the FVG DATA from the arrays. New Data as Below:");
|
||||
Print("FVGs: ",ArraySize(totalFVGs)," TIMEs: ",ArraySize(barTIMEs),
|
||||
" SIGNALs: ",ArraySize(signalFVGs));
|
||||
ArrayPrint(totalFVGs);
|
||||
ArrayPrint(barTIMEs);
|
||||
ArrayPrint(signalFVGs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
void CreateRec(string objName,datetime time1,double price1,
|
||||
datetime time2, double price2,color clr){
|
||||
if (ObjectFind(0,objName) < 0){
|
||||
ObjectCreate(0,objName,OBJ_RECTANGLE,0,time1,price1,time2,price2);
|
||||
|
||||
ObjectSetInteger(0,objName,OBJPROP_TIME,0,time1);
|
||||
ObjectSetDouble(0,objName,OBJPROP_PRICE,0,price1);
|
||||
ObjectSetInteger(0,objName,OBJPROP_TIME,1,time2);
|
||||
ObjectSetDouble(0,objName,OBJPROP_PRICE,1,price2);
|
||||
ObjectSetInteger(0,objName,OBJPROP_COLOR,clr);
|
||||
ObjectSetInteger(0,objName,OBJPROP_FILL,true);
|
||||
ObjectSetInteger(0,objName,OBJPROP_BACK,false);
|
||||
|
||||
ChartRedraw(0);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateRec(string objName,datetime time1,double price1,
|
||||
datetime time2, double price2){
|
||||
if (ObjectFind(0,objName) >= 0){
|
||||
ObjectSetInteger(0,objName,OBJPROP_TIME,0,time1);
|
||||
ObjectSetDouble(0,objName,OBJPROP_PRICE,0,price1);
|
||||
ObjectSetInteger(0,objName,OBJPROP_TIME,1,time2);
|
||||
ObjectSetDouble(0,objName,OBJPROP_PRICE,1,price2);
|
||||
|
||||
ChartRedraw(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| 1. CHECK TRADING VOLUME |
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
double Check1_ValidateVolume_Lots(double lots){
|
||||
double symbolVol_Min = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
|
||||
double symbolVol_Max = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
|
||||
double symbolVol_STEP = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
|
||||
|
||||
double accepted_Lots;
|
||||
double CurrentLots = lots;
|
||||
accepted_Lots = MathMax(MathMin(CurrentLots,symbolVol_Max),symbolVol_Min);
|
||||
|
||||
int lotDigits = 0;
|
||||
if (symbolVol_Min == 1) lotDigits = 0;
|
||||
if (symbolVol_Min == 0.1) lotDigits = 1;
|
||||
if (symbolVol_Min == 0.01) lotDigits = 2;
|
||||
if (symbolVol_Min == 0.001) lotDigits = 3;
|
||||
|
||||
double normalized_lots = NormalizeDouble(accepted_Lots,lotDigits);
|
||||
//Print("MIN LOTS = ",symbolVol_Min,", NORMALIZED LOTS = ",normalized_lots);
|
||||
|
||||
return (normalized_lots);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| 2. CHECK MONEY/MARGIN TO OPEN POSITION |
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
bool Check2_Margin(ENUM_ORDER_TYPE Order_Type,double lot_Vol){
|
||||
double margin;
|
||||
double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
|
||||
double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
|
||||
|
||||
double openPrice = (Order_Type == ORDER_TYPE_BUY) ? Ask : Bid;
|
||||
|
||||
bool result = OrderCalcMargin(Order_Type,_Symbol,lot_Vol,openPrice,margin);
|
||||
if (result == false){
|
||||
Print("ERROR: Something Unexpected Happened While Calculating Margin");
|
||||
return (false);
|
||||
}
|
||||
if (margin > AccountInfoDouble(ACCOUNT_MARGIN_FREE)){
|
||||
Print("WARNING! NOT ENOUGH MARGIN TO OPEN THE POSITION. NEEDED = ",margin);
|
||||
return (false);
|
||||
}
|
||||
return (true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| 3. CHECK VOLUME LIMIT |
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
bool Check3_VolumeLimit(double lots_Vol_Limit){
|
||||
double volumeLimit = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_LIMIT);
|
||||
double symb_Vol_Max40 = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
|
||||
double allowed_Vol_Lim = (volumeLimit == 0) ? symb_Vol_Max40 : volumeLimit;
|
||||
if (getAllVolume()+lots_Vol_Limit > allowed_Vol_Lim){
|
||||
Print("WARNING! VOLUME LIMIT REACHED: LIMIT = ",allowed_Vol_Lim);
|
||||
return (false);
|
||||
}
|
||||
return (true);
|
||||
}
|
||||
|
||||
double getAllVolume(){
|
||||
ulong ticket=0;
|
||||
double Volume=0;
|
||||
|
||||
for (int i=PositionsTotal()-1 ;i>=0 ;i--){
|
||||
ticket = PositionGetTicket(i);
|
||||
if (PositionSelectByTicket(ticket)){
|
||||
if (PositionGetString(POSITION_SYMBOL)==_Symbol){
|
||||
Volume += PositionGetDouble(POSITION_VOLUME);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=OrdersTotal()-1 ;i>=0 ;i--){
|
||||
ticket = OrderGetTicket(i);
|
||||
if (OrderSelect(ticket)){
|
||||
if (OrderGetString(ORDER_SYMBOL)==_Symbol){
|
||||
Volume += OrderGetDouble(ORDER_VOLUME_CURRENT);
|
||||
}
|
||||
}
|
||||
}
|
||||
return (Volume);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| 4. CHECK TRADE LEVELS |
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
bool Check4_TradeLevels(ENUM_POSITION_TYPE pos_Type,double sl=0,double tp=0,ulong tkt=0){
|
||||
double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
|
||||
double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
|
||||
|
||||
int stopLevel = (int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
|
||||
int freezeLevel = (int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL);
|
||||
int spread = (int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
|
||||
|
||||
double stopLevel_Pts = stopLevel*_Point;
|
||||
double freezeLevel_Pts = freezeLevel*_Point;
|
||||
|
||||
if (pos_Type == POSITION_TYPE_BUY){
|
||||
// STOP LEVELS CHECK
|
||||
if (tp > 0 && tp - Bid < stopLevel_Pts){
|
||||
Print("WARNING! BUY TP ",tp,", Bid ",Bid," (TP-Bid = ",NormalizeDouble((tp-Bid)/_Point,_Digits),") WITHIN STOP LEVEL OF ",stopLevel);
|
||||
return (false);
|
||||
}
|
||||
if (sl > 0 && Bid - sl < stopLevel_Pts){
|
||||
Print("WARNING! BUY SL ",sl,", Bid ",Bid," (Bid-SL = ",NormalizeDouble((Bid-sl)/_Point,_Digits),") WITHIN STOP LEVEL OF ",stopLevel);
|
||||
return (false);
|
||||
}
|
||||
// FREEZE LEVELS CHECK
|
||||
if (tp > 0 && tp - Bid < freezeLevel_Pts){
|
||||
Print("WARNING! BUY TP ",tp,", Bid ",Bid," (TP-Bid = ",NormalizeDouble((tp-Bid)/_Point,_Digits),") WITHIN FREEZE LEVEL OF ",freezeLevel);
|
||||
return (false);
|
||||
}
|
||||
if (sl > 0 && Bid - sl < freezeLevel_Pts){
|
||||
Print("WARNING! BUY SL ",sl,", Bid ",Bid," (Bid-SL = ",NormalizeDouble((Bid-sl)/_Point,_Digits),") WITHIN FREEZE LEVEL OF ",freezeLevel);
|
||||
return (false);
|
||||
}
|
||||
}
|
||||
if (pos_Type == POSITION_TYPE_SELL){
|
||||
// STOP LEVELS CHECK
|
||||
if (tp > 0 && Ask - tp < stopLevel_Pts){
|
||||
Print("WARNING! SELL TP ",tp,", Ask ",Ask," (Ask-TP = ",NormalizeDouble((Ask-tp)/_Point,_Digits),") WITHIN STOP LEVEL OF ",stopLevel);
|
||||
return (false);
|
||||
}
|
||||
if (sl > 0 && sl - Ask < stopLevel_Pts){
|
||||
Print("WARNING! SELL SL ",sl,", Ask ",Ask," (SL-Ask = ",NormalizeDouble((sl-Ask)/_Point,_Digits),") WITHIN STOP LEVEL OF ",stopLevel);
|
||||
return (false);
|
||||
}
|
||||
|
||||
// FREEZE LEVELS CHECK
|
||||
if (tp > 0 && Ask - tp < freezeLevel_Pts){
|
||||
Print("WARNING! SELL TP ",tp,", Ask ",Ask," (Ask-TP = ",NormalizeDouble((Ask-tp)/_Point,_Digits),") WITHIN FREEZE LEVEL OF ",freezeLevel);
|
||||
return (false);
|
||||
}
|
||||
if (sl > 0 && sl - Ask < freezeLevel_Pts){
|
||||
Print("WARNING! SELL SL ",sl,", Ask ",Ask," (SL-Ask = ",NormalizeDouble((sl-Ask)/_Point,_Digits),") WITHIN FREEZE LEVEL OF ",freezeLevel);
|
||||
return (false);
|
||||
}
|
||||
}
|
||||
|
||||
if (tkt > 0){
|
||||
bool result = PositionSelectByTicket(tkt);
|
||||
if (result == false){
|
||||
Print("ERROR Selecting The Position (CHECK) With Ticket # ",tkt);
|
||||
return (false);
|
||||
}
|
||||
double point = SymbolInfoDouble(_Symbol,SYMBOL_POINT);
|
||||
double pos_SL = PositionGetDouble(POSITION_SL);
|
||||
double pos_TP = PositionGetDouble(POSITION_TP);
|
||||
|
||||
bool slChanged = MathAbs(pos_SL - sl) > point;
|
||||
bool tpChanged = MathAbs(pos_TP - tp) > point;
|
||||
|
||||
//bool slChanged = pos_SL != sl;
|
||||
//bool tpChanged = pos_TP != tp;
|
||||
|
||||
if (!slChanged && !tpChanged){
|
||||
Print("ERROR. Pos # ",tkt," Already has Levels of SL: ",pos_SL,
|
||||
", TP: ",pos_TP," NEW[SL = ",sl," | TP = ",tp,"]. NO POINT IN MODIFYING!!!");
|
||||
return (false);
|
||||
}
|
||||
}
|
||||
|
||||
return (true);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| 5. CHECK & CORRECT TRADE LEVELS |
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
double Check5_TradeLevels_Rectify(ENUM_POSITION_TYPE pos_Type,double sl=0,double tp=0){
|
||||
double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
|
||||
double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
|
||||
|
||||
int stopLevel = (int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
|
||||
int freezeLevel = (int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL);
|
||||
int spread = (int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
|
||||
|
||||
double stopLevel_Pts = stopLevel*_Point;
|
||||
double freezeLevel_Pts = freezeLevel*_Point;
|
||||
|
||||
double accepted_price = 0.0;
|
||||
|
||||
if (pos_Type == POSITION_TYPE_BUY){
|
||||
// STOP LEVELS CHECK
|
||||
if (tp > 0 && tp - Bid < stopLevel_Pts){
|
||||
accepted_price = Bid+stopLevel_Pts;
|
||||
Print("WARNING! BUY TP ",tp,", Bid ",Bid," (TP-Bid = ",NormalizeDouble((tp-Bid)/_Point,_Digits),") WITHIN STOP LEVEL OF ",stopLevel);
|
||||
Print("PRICE MODIFIED TO: ",accepted_price);
|
||||
return (accepted_price);
|
||||
}
|
||||
if (sl > 0 && Bid - sl < stopLevel_Pts){
|
||||
accepted_price = Bid-stopLevel_Pts;
|
||||
Print("WARNING! BUY SL ",sl,", Bid ",Bid," (Bid-SL = ",NormalizeDouble((Bid-sl)/_Point,_Digits),") WITHIN STOP LEVEL OF ",stopLevel);
|
||||
Print("PRICE MODIFIED TO: ",accepted_price);
|
||||
return (accepted_price);
|
||||
}
|
||||
// FREEZE LEVELS CHECK
|
||||
if (tp > 0 && tp - Bid < freezeLevel_Pts){
|
||||
accepted_price = Bid+freezeLevel_Pts;
|
||||
Print("WARNING! BUY TP ",tp,", Bid ",Bid," (TP-Bid = ",NormalizeDouble((tp-Bid)/_Point,_Digits),") WITHIN FREEZE LEVEL OF ",freezeLevel);
|
||||
Print("PRICE MODIFIED TO: ",accepted_price);
|
||||
return (accepted_price);
|
||||
}
|
||||
if (sl > 0 && Bid - sl < freezeLevel_Pts){
|
||||
accepted_price = Bid-freezeLevel_Pts;
|
||||
Print("WARNING! BUY SL ",sl,", Bid ",Bid," (Bid-SL = ",NormalizeDouble((Bid-sl)/_Point,_Digits),") WITHIN FREEZE LEVEL OF ",freezeLevel);
|
||||
Print("PRICE MODIFIED TO: ",accepted_price);
|
||||
return (accepted_price);
|
||||
}
|
||||
}
|
||||
if (pos_Type == POSITION_TYPE_SELL){
|
||||
// STOP LEVELS CHECK
|
||||
if (tp > 0 && Ask - tp < stopLevel_Pts){
|
||||
accepted_price = Ask-stopLevel_Pts;
|
||||
Print("WARNING! SELL TP ",tp,", Ask ",Ask," (Ask-TP = ",NormalizeDouble((Ask-tp)/_Point,_Digits),") WITHIN STOP LEVEL OF ",stopLevel);
|
||||
Print("PRICE MODIFIED TO: ",accepted_price);
|
||||
return (accepted_price);
|
||||
}
|
||||
if (sl > 0 && sl - Ask < stopLevel_Pts){
|
||||
accepted_price = Ask+stopLevel_Pts;
|
||||
Print("WARNING! SELL SL ",sl,", Ask ",Ask," (SL-Ask = ",NormalizeDouble((sl-Ask)/_Point,_Digits),") WITHIN STOP LEVEL OF ",stopLevel);
|
||||
Print("PRICE MODIFIED TO: ",accepted_price);
|
||||
return (accepted_price);
|
||||
}
|
||||
|
||||
// FREEZE LEVELS CHECK
|
||||
if (tp > 0 && Ask - tp < freezeLevel_Pts){
|
||||
accepted_price = Ask-freezeLevel_Pts;
|
||||
Print("WARNING! SELL TP ",tp,", Ask ",Ask," (Ask-TP = ",NormalizeDouble((Ask-tp)/_Point,_Digits),") WITHIN FREEZE LEVEL OF ",freezeLevel);
|
||||
Print("PRICE MODIFIED TO: ",accepted_price);
|
||||
return (accepted_price);
|
||||
}
|
||||
if (sl > 0 && sl - Ask < freezeLevel_Pts){
|
||||
accepted_price = Ask+freezeLevel_Pts;
|
||||
Print("WARNING! SELL SL ",sl,", Ask ",Ask," (SL-Ask = ",NormalizeDouble((sl-Ask)/_Point,_Digits),") WITHIN FREEZE LEVEL OF ",freezeLevel);
|
||||
Print("PRICE MODIFIED TO: ",accepted_price);
|
||||
return (accepted_price);
|
||||
}
|
||||
}
|
||||
return (accepted_price);
|
||||
}
|
||||
@@ -1,332 +0,0 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| RESISTANCE AND SUPPORT.mq5 |
|
||||
//| Copyright 2024, MetaQuotes Ltd. |
|
||||
//| https://www.mql5.com |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2024, MetaQuotes Ltd."
|
||||
#property link "https://www.mql5.com"
|
||||
#property version "1.00"
|
||||
|
||||
#include <Trade/Trade.mqh>
|
||||
CTrade obj_Trade;
|
||||
|
||||
//bool stop_processing = false;
|
||||
|
||||
double pricesHighest[], pricesLowest[];
|
||||
|
||||
double resistanceLevels[2], supportLevels[2];
|
||||
|
||||
|
||||
#define resLine "RESISTANCE LEVEL"
|
||||
#define colorRes clrRed
|
||||
#define resline_prefix "R"
|
||||
|
||||
#define supLine "SUPPORT LEVEL"
|
||||
#define colorSup clrBlue
|
||||
#define supline_prefix "S"
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Expert initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit(){
|
||||
//---
|
||||
|
||||
ArraySetAsSeries(pricesHighest,true);
|
||||
ArraySetAsSeries(pricesLowest,true);
|
||||
// define the size of the arrays
|
||||
ArrayResize(pricesHighest,50);
|
||||
ArrayResize(pricesLowest,50);
|
||||
//---
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Expert deinitialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnDeinit(const int reason){
|
||||
//---
|
||||
ArrayFree(pricesHighest);
|
||||
ArrayFree(pricesLowest);
|
||||
|
||||
//ArrayFree(resistanceLevels); // cannot be used for static allocated array
|
||||
//ArrayFree(supportLevels); // cannot be used for static allocated array
|
||||
|
||||
ArrayRemove(resistanceLevels,0,WHOLE_ARRAY);
|
||||
ArrayRemove(supportLevels,0,WHOLE_ARRAY);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Expert tick function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnTick(){
|
||||
//---
|
||||
|
||||
int currBars = iBars(_Symbol,_Period);
|
||||
static int prevBars = currBars;
|
||||
if (prevBars == currBars) return;
|
||||
prevBars = currBars;
|
||||
|
||||
int visible_bars = (int)ChartGetInteger(0,CHART_VISIBLE_BARS);
|
||||
bool stop_processing = false; // Flag to control outer loop
|
||||
bool matchFound_high1 = false, matchFound_low1 = false;
|
||||
bool matchFound_high2 = false, matchFound_low2 = false;
|
||||
|
||||
ArrayFree(pricesHighest);
|
||||
ArrayFree(pricesLowest);
|
||||
|
||||
int copiedBarsHighs = CopyHigh(_Symbol,_Period,1,visible_bars,pricesHighest);
|
||||
int copiedBarsLows = CopyLow(_Symbol,_Period,1,visible_bars,pricesLowest);
|
||||
|
||||
//ArrayPrint(pricesHighest);
|
||||
//ArrayPrint(pricesLowest);
|
||||
// sort the array in ascending order
|
||||
ArraySort(pricesHighest);
|
||||
ArraySort(pricesLowest);
|
||||
//ArrayPrint(pricesHighest);
|
||||
//ArrayPrint(pricesLowest);
|
||||
ArrayRemove(pricesHighest,10,WHOLE_ARRAY);
|
||||
ArrayRemove(pricesLowest,0,visible_bars-10);
|
||||
//Print("FIRST 10 HIGHEST PRICES:");
|
||||
//ArrayPrint(pricesHighest);
|
||||
//Print("LAST 10 LOWEST PRICES:");
|
||||
//ArrayPrint(pricesLowest);
|
||||
|
||||
for (int i=1; i<=visible_bars-1 && !stop_processing; i++){
|
||||
//Print(":: BAR NO: ",i);
|
||||
double open = iOpen(_Symbol,_Period,i);
|
||||
double high = iHigh(_Symbol,_Period,i);
|
||||
double low = iLow(_Symbol,_Period,i);
|
||||
double close = iClose(_Symbol,_Period,i);
|
||||
datetime time = iTime(_Symbol,_Period,i);
|
||||
|
||||
int diff_i_j = 10;
|
||||
|
||||
for (int j=i+diff_i_j; j<=visible_bars-1; j++){
|
||||
//Print("BAR CHECK NO: ",j);
|
||||
double open_j = iOpen(_Symbol,_Period,j);
|
||||
double high_j = iHigh(_Symbol,_Period,j);
|
||||
double low_j = iLow(_Symbol,_Period,j);
|
||||
double close_j = iClose(_Symbol,_Period,j);
|
||||
datetime time_j = iTime(_Symbol,_Period,j);
|
||||
|
||||
// CHECK FOR RESISTANCE
|
||||
double high_diff = NormalizeDouble((MathAbs(high-high_j)/_Point),0);
|
||||
bool is_resistance = high_diff <= 10;
|
||||
|
||||
// CHECK FOR SUPPORT
|
||||
double low_diff = NormalizeDouble((MathAbs(low-low_j)/_Point),0);
|
||||
bool is_support = low_diff <= 10;
|
||||
|
||||
if (is_resistance){
|
||||
//Print("RESISTANCE AT BAR ",i," (",high,") & ",j," (",high_j,"), Pts = ",high_diff);
|
||||
|
||||
for (int k=0; k<ArraySize(pricesHighest); k++){
|
||||
if (pricesHighest[k]==high){
|
||||
matchFound_high1 = true;
|
||||
//Print("> RES H1(",high,") FOUND @ ",k," (",pricesHighest[k],")");
|
||||
}
|
||||
if (pricesHighest[k]==high_j){
|
||||
matchFound_high2 = true;
|
||||
//Print("> RES H2(",high_j,") FOUND @ ",k," (",pricesHighest[k],")");
|
||||
}
|
||||
if (matchFound_high1 && matchFound_high2){
|
||||
if (resistanceLevels[0]==high || resistanceLevels[1]==high_j){
|
||||
Print("CONFIRMED BUT This is the same resistance level, skip updating!");
|
||||
stop_processing = true; // Set the flag to stop processing
|
||||
break; // stop the inner loop prematurily
|
||||
}
|
||||
else {
|
||||
Print(" ++++++++++ RESISTANCE LEVELS CONFIRMED @ BARS ",i,
|
||||
"(",high,") & ",j,"(",high_j,")");
|
||||
resistanceLevels[0] = high;
|
||||
resistanceLevels[1] = high_j;
|
||||
ArrayPrint(resistanceLevels);
|
||||
|
||||
draw_S_R_Level(resLine,high,colorRes,5);
|
||||
draw_S_R_Level_Point(resline_prefix,high,time,218,-1,colorRes,90);
|
||||
draw_S_R_Level_Point(resline_prefix,high,time_j,218,-1,colorRes,90);
|
||||
|
||||
stop_processing = true; // Set the flag to stop processing
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if (is_support){
|
||||
//Print("SUPPORT AT BAR ",i," (",low,") & ",j," (",low_j,"), Pts = ",low_diff);
|
||||
|
||||
for (int k=0; k<ArraySize(pricesLowest); k++){
|
||||
if (pricesLowest[k]==low){
|
||||
matchFound_low1 = true;
|
||||
//Print("> SUP L1(",low,") FOUND @ ",k," (",pricesLowest[k],")");
|
||||
}
|
||||
if (pricesLowest[k]==low_j){
|
||||
matchFound_low2 = true;
|
||||
//Print("> SUP L2(",low_j,") FOUND @ ",k," (",pricesLowest[k],")");
|
||||
}
|
||||
if (matchFound_low1 && matchFound_low2){
|
||||
if (supportLevels[0]==low || supportLevels[1]==low_j){
|
||||
Print("CONFIRMED BUT This is the same support level, skip updating!");
|
||||
stop_processing = true; // Set the flag to stop processing
|
||||
break; // stop the inner loop prematurely
|
||||
}
|
||||
else {
|
||||
Print(" ++++++++++ SUPPORT LEVELS CONFIRMED @ BARS ",i,
|
||||
"(",low,") & ",j,"(",low_j,")");
|
||||
supportLevels[0] = low;
|
||||
supportLevels[1] = low_j;
|
||||
ArrayPrint(supportLevels);
|
||||
|
||||
draw_S_R_Level(supLine,low,colorSup,5);
|
||||
draw_S_R_Level_Point(supline_prefix,low,time,217,1,colorSup,-90);
|
||||
draw_S_R_Level_Point(supline_prefix,low,time_j,217,1,colorSup,-90);
|
||||
|
||||
stop_processing = true; // Set the flag to stop processing
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (stop_processing){break;}
|
||||
}
|
||||
if (stop_processing){break;}
|
||||
}
|
||||
|
||||
if (ObjectFind(0,resLine) >= 0){
|
||||
double objPrice = ObjectGetDouble(0,resLine,OBJPROP_PRICE);
|
||||
double visibleHighs[];
|
||||
ArraySetAsSeries(visibleHighs,true);
|
||||
CopyHigh(_Symbol,_Period,1,visible_bars,visibleHighs);
|
||||
//Print("Object Found & visible bars is: ",ArraySize(visibleHighs));
|
||||
//ArrayPrint(visibleHighs);
|
||||
bool matchHighFound = false;
|
||||
|
||||
for (int i=0; i<ArraySize(visibleHighs); i++){
|
||||
if (visibleHighs[i] == objPrice){
|
||||
Print("> Match price for resistance found at bar # ",i+1," (",objPrice,")");
|
||||
matchHighFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!matchHighFound){
|
||||
Print("(",objPrice,") > Match price for the resistance line not found. Delete!");
|
||||
deleteLevel(resLine);
|
||||
}
|
||||
}
|
||||
|
||||
if (ObjectFind(0,supLine) >= 0){
|
||||
double objPrice = ObjectGetDouble(0,supLine,OBJPROP_PRICE);
|
||||
double visibleLows[];
|
||||
ArraySetAsSeries(visibleLows,true);
|
||||
CopyLow(_Symbol,_Period,1,visible_bars,visibleLows);
|
||||
//Print("Object Found & visible bars is: ",ArraySize(visibleLows));
|
||||
//ArrayPrint(visibleLows);
|
||||
bool matchLowFound = false;
|
||||
|
||||
for (int i=0; i<ArraySize(visibleLows); i++){
|
||||
if (visibleLows[i] == objPrice){
|
||||
Print("> Match price for support found at bar # ",i+1," (",objPrice,")");
|
||||
matchLowFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!matchLowFound){
|
||||
Print("(",objPrice,") > Match price for the support line not found. Delete!");
|
||||
deleteLevel(supLine);
|
||||
}
|
||||
}
|
||||
|
||||
static double ResistancePriceTrade = 0;
|
||||
if (ObjectFind(0,resLine) >= 0){
|
||||
double ResistancePriceLevel = ObjectGetDouble(0,resLine,OBJPROP_PRICE);
|
||||
if (ResistancePriceTrade != ResistancePriceLevel){
|
||||
double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
|
||||
double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
|
||||
double open1 = iOpen(_Symbol,_Period,1);
|
||||
double high1 = iHigh(_Symbol,_Period,1);
|
||||
double low1 = iLow(_Symbol,_Period,1);
|
||||
double close1 = iClose(_Symbol,_Period,1);
|
||||
|
||||
if (open1 > close1 && open1 < ResistancePriceLevel
|
||||
&& high1 > ResistancePriceLevel && Bid < ResistancePriceLevel){
|
||||
Print("$$$$$$$$$$$$ SELL NOW SIGNAL!");
|
||||
obj_Trade.Sell(0.01,_Symbol,Bid,Bid+350*5*_Point,Bid-350*_Point);
|
||||
ResistancePriceTrade = ResistancePriceLevel;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static double SupportPriceTrade = 0;
|
||||
if (ObjectFind(0,supLine) >= 0){
|
||||
double SupportPriceLevel = ObjectGetDouble(0,supLine,OBJPROP_PRICE);
|
||||
if (SupportPriceTrade != SupportPriceLevel){
|
||||
double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
|
||||
double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
|
||||
double open1 = iOpen(_Symbol,_Period,1);
|
||||
double high1 = iHigh(_Symbol,_Period,1);
|
||||
double low1 = iLow(_Symbol,_Period,1);
|
||||
double close1 = iClose(_Symbol,_Period,1);
|
||||
|
||||
if (open1 < close1 && open1 > SupportPriceLevel
|
||||
&& low1 < SupportPriceLevel && Ask > SupportPriceLevel){
|
||||
Print("$$$$$$$$$$$$ BUY NOW SIGNAL!");
|
||||
obj_Trade.Buy(0.01,_Symbol,Ask,Ask-350*5*_Point,Ask+350*_Point);
|
||||
SupportPriceTrade = SupportPriceLevel;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
void draw_S_R_Level(string levelName,double price,color clr,int width){
|
||||
if (ObjectFind(0,levelName) < 0){
|
||||
ObjectCreate(0,levelName,OBJ_HLINE,0,TimeCurrent(),price);
|
||||
ObjectSetInteger(0,levelName,OBJPROP_COLOR,clr);
|
||||
ObjectSetInteger(0,levelName,OBJPROP_WIDTH,width);
|
||||
}
|
||||
else {
|
||||
ObjectSetDouble(0,levelName,OBJPROP_PRICE,price);
|
||||
}
|
||||
ChartRedraw(0);
|
||||
}
|
||||
|
||||
void deleteLevel(string levelName){
|
||||
ObjectDelete(0,levelName);
|
||||
ChartRedraw(0);
|
||||
}
|
||||
|
||||
void draw_S_R_Level_Point(string objName,double price,datetime time,
|
||||
int arrowcode,int direction,color clr,double angle){
|
||||
//objName = " ";
|
||||
StringConcatenate(objName,objName," @ \nTime: ",time,"\nPrice: ",DoubleToString(price,_Digits));
|
||||
if (ObjectCreate(0,objName,OBJ_ARROW,0,time,price)) {
|
||||
ObjectSetInteger(0,objName,OBJPROP_ARROWCODE,arrowcode);
|
||||
ObjectSetInteger(0,objName,OBJPROP_COLOR,clr);
|
||||
ObjectSetInteger(0,objName,OBJPROP_FONTSIZE,10);
|
||||
if (direction > 0) ObjectSetInteger(0,objName,OBJPROP_ANCHOR,ANCHOR_TOP);
|
||||
if (direction < 0) ObjectSetInteger(0,objName,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
|
||||
}
|
||||
string prefix = resline_prefix;
|
||||
string txt = "\n"+prefix+"("+DoubleToString(price,_Digits)+")";
|
||||
string objNameDescription = objName + txt;
|
||||
if (ObjectCreate(0,objNameDescription,OBJ_TEXT,0,time,price)) {
|
||||
// ObjectSetString(0,objNameDescription,OBJPROP_TEXT, "" + txt);
|
||||
ObjectSetInteger(0,objNameDescription,OBJPROP_COLOR,clr);
|
||||
ObjectSetDouble(0,objNameDescription,OBJPROP_ANGLE, angle);
|
||||
ObjectSetInteger(0,objNameDescription,OBJPROP_FONTSIZE,10);
|
||||
if (direction > 0) {
|
||||
ObjectSetInteger(0,objNameDescription,OBJPROP_ANCHOR,ANCHOR_LEFT);
|
||||
ObjectSetString(0,objNameDescription,OBJPROP_TEXT, " " + txt);
|
||||
}
|
||||
if (direction < 0) {
|
||||
ObjectSetInteger(0,objNameDescription,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
|
||||
ObjectSetString(0,objNameDescription,OBJPROP_TEXT, " " + txt);
|
||||
}
|
||||
}
|
||||
ChartRedraw(0);
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
# Concepts of a Neural Network (NN)
|
||||
|
||||
simulation of human nervous system in its ability to learn and adpt.
|
||||
|
||||
## Units
|
||||
|
||||
1. Inputs
|
||||
2. Weights
|
||||
3. Transfer Function + net output
|
||||
4. Activation Function
|
||||
5. Outputs
|
||||
|
||||
### Flow
|
||||
|
||||
1. Update and Provide our Inputs;
|
||||
2. Transfer Function;
|
||||
3. Net OutPut (Inputs and Weights);
|
||||
4. Actiation Function;
|
||||
5. Calculate Output;
|
||||
|
||||
### Learnign
|
||||
|
||||
it is a process to Change Weights of inputs based on results ...
|
||||
this happens to algorithm improve itself optimization ...
|
||||
|
||||
### Net
|
||||
|
||||
in this process Inputs and their Weights collecting together.
|
||||
|
||||
### Activation Function
|
||||
|
||||
Recieved Net Inputs (Weighted Inputs) and then Calculate output based on them.
|
||||
|
||||
## Multi Layer NN
|
||||
|
||||
1. Input Layer;
|
||||
2. Hidden Layer;
|
||||
3. Output Layer;
|
||||
|
||||
Hidden Layers recieved Data from all other layers at the end, then Populate as a Neuron.
|
||||
|
||||
### Input Data Normalization
|
||||
|
||||
a Process where all the input data normalized.
|
||||
reduce data to an accepted ranges.
|
||||
i.e. [0,1] or [-1, 1].
|
||||
|
||||
this peocess so important for us for making data more acceptable.
|
||||
|
||||
this can done by some standard form:
|
||||
|
||||
y = x - (x(min) * (d2 -d1)) / x(max - x(min)) + d1
|
||||
|
||||
x => value to normalized;
|
||||
x(min)/x(max) => x Value range max and min;
|
||||
d1,d2 => ranges to upper and lower normalization;
|
||||
|
||||
### Activation Functions
|
||||
|
||||
a function which calculate the output of a neuron.
|
||||
it recieved a Net Input (Weighted functions);
|
||||
|
||||
1. Unit Step / Hard Threshold Functions;
|
||||
2. Sigmoid Function;
|
||||
3. Hyperbolic Tangent Function;
|
||||
|
||||
## Unti Step
|
||||
|
||||
a Graph by y axix Output and x axix Net Input and values in y between 0, 1 and x is 0 to TETA or threshold.
|
||||
|
||||
### Sigmoid
|
||||
|
||||
Change Activation Functions Shape;
|
||||
@@ -1,75 +0,0 @@
|
||||
//
|
||||
// Longs ...
|
||||
|
||||
//
|
||||
// 1 ...
|
||||
2022.03.07 04:00:00 16 AUDUSDb buy in 0.01 0.74269 16 0.00 0.00 0.00 1 002.13 PRV(XPVF)PR(H2)
|
||||
2022.03.07 15:44:19 17 AUDUSDb sell out 0.01 0.73769 17 0.00 0.00 -5.00 997.13 sl 0.73769
|
||||
|
||||
//
|
||||
// 2 ...
|
||||
2022.05.12 08:00:00 24 EURNZDb buy in 0.01 1.68355 24 0.00 0.00 0.00 994.45 PRV(XPVF)PR(H2)
|
||||
2022.05.12 09:23:54 25 EURNZDb sell out 0.01 1.67855 25 0.00 0.00 -5.00 989.45 sl 1.67855
|
||||
|
||||
//
|
||||
// 3 ...
|
||||
2022.09.12 12:00:00 48 EURGBPb buy in 0.01 0.87175 48 0.00 0.00 0.00 993.91 PRV(XPVF)PR(H2)
|
||||
2022.09.12 16:05:33 49 EURGBPb sell out 0.01 0.86674 49 0.00 0.00 -5.01 988.90 sl 0.86675
|
||||
|
||||
//
|
||||
// 4 ...
|
||||
2022.12.07 20:00:00 58 EURCHFb buy in 0.01 0.98922 58 0.00 0.00 0.00 992.16 PRV(XHULL)PR(M15)
|
||||
2022.12.09 13:57:47 59 EURCHFb sell out 0.01 0.98419 59 0.00 0.00 -5.03 987.13 sl 0.98422
|
||||
|
||||
//
|
||||
// 5 ...
|
||||
2022.12.12 16:00:00 60 EURUSDb buy in 0.01 1.05716 60 0.00 0.00 0.00 987.13 PRV(XHTD)PR(H1)
|
||||
2022.12.12 17:58:08 61 EURUSDb sell out 0.01 1.05216 61 0.00 0.00 -5.00 982.13 sl 1.05216
|
||||
|
||||
//
|
||||
// 6 ...
|
||||
2023.05.12 20:00:01 82 USDCHFb buy in 0.01 0.89811 82 0.00 0.00 0.00 981.00 PRV(XPVF)PR(H1)
|
||||
2023.05.16 10:52:51 83 USDCHFb sell out 0.01 0.89311 83 0.00 0.00 -5.00 976.00 sl 0.89311
|
||||
|
||||
//
|
||||
// 7 ...
|
||||
2023.08.10 20:00:00 104 EURGBPb buy in 0.01 0.86616 104 0.00 0.00 0.00 986.00 PRV(XPVF)PR(H2)
|
||||
2023.08.14 17:06:19 107 EURGBPb sell out 0.01 0.86115 107 0.00 0.00 -5.01 981.58 sl 0.86116
|
||||
|
||||
//
|
||||
// 8 ...
|
||||
2023.09.22 16:00:00 118 NZDUSDb buy in 0.01 0.59810 118 0.00 0.00 0.00 979.59 PRV(XHTSRD)PR(H2)
|
||||
2023.09.27 05:32:30 123 NZDUSDb sell out 0.01 0.59310 123 0.00 0.00 -5.00 976.64 sl 0.59310
|
||||
|
||||
//
|
||||
// Shorts ...
|
||||
|
||||
//
|
||||
// 1 ...
|
||||
2022.02.18 20:00:00 10 EURUSDb sell in 0.01 1.13219 10 0.00 0.00 0.00 1 004.49 PRV(XPVF)PR(H1)
|
||||
2022.02.21 09:01:13 11 EURUSDb buy out 0.01 1.13719 11 0.00 0.00 -5.00 999.49 sl 1.13719
|
||||
|
||||
//
|
||||
// 2 ...
|
||||
2022.04.20 20:00:00 20 EURAUDb sell in 0.01 1.45617 20 0.00 0.00 0.00 998.61 PRV(XVLM)PR(M5)
|
||||
2022.04.21 09:30:40 21 EURAUDb buy out 0.01 1.46123 21 0.00 0.00 -5.06 993.55 sl 1.46117
|
||||
|
||||
//
|
||||
// 3 ...
|
||||
2022.07.06 16:00:00 40 EURJPYb sell in 0.01 137.669 40 0.00 0.00 0.00 996.25 PRV(XPVF)PR(H1)
|
||||
2022.07.06 17:02:26 41 EURJPYb buy out 0.01 138.169 41 0.00 0.00 -5.00 991.25 sl 138.169
|
||||
|
||||
//
|
||||
// 4 ...
|
||||
2023.02.09 16:00:00 76 EURJPYb sell in 0.01 140.700 76 0.00 0.00 0.00 989.87 PRV(XHTSRD)PR(M15)
|
||||
2023.02.09 21:00:34 77 EURJPYb buy out 0.01 141.202 77 0.00 0.00 -5.02 984.85 sl 141.200
|
||||
|
||||
//
|
||||
// 5 ...
|
||||
2023.02.14 03:00:00 78 EURCHFb sell in 0.01 0.98548 78 0.00 0.00 0.00 984.85 PRV(XHK)PR(M5)
|
||||
2023.02.14 23:59:59 79 EURCHFb buy out 0.01 0.99053 79 0.00 0.00 -5.05 979.80 sl 0.99048
|
||||
|
||||
//
|
||||
// 6 ...
|
||||
2023.09.21 04:00:00 116 EURCADb sell in 0.01 1.43337 116 0.00 0.00 0.00 984.59 PRV(XTD)PR(M15)
|
||||
2023.09.21 10:35:22 117 EURCADb buy out 0.01 1.43837 117 0.00 0.00 -5.00 979.59 sl 1.43837
|
||||
@@ -1,39 +0,0 @@
|
||||
# Supporting Senarios
|
||||
|
||||
first check current Position Direction's
|
||||
|
||||
## Short
|
||||
|
||||
InDirectional
|
||||
for short positions we only have Long Supports;
|
||||
entry price must below the Lines;
|
||||
and Lines Must below the SL of Positions, if it's Exists;
|
||||
|
||||
### Long Orders
|
||||
|
||||
after putting orders of InDirectionals;
|
||||
set EQM Provider;
|
||||
|
||||
### Long Orders Supporting
|
||||
|
||||
now we have to find out when orders Executed;
|
||||
after each InDirectional EQM Order Execution, we Have to Prepare a Directional Order
|
||||
by it's volume on Signal Entry.
|
||||
|
||||
## Long
|
||||
|
||||
InDirectional
|
||||
for long positions we only have short Supports;
|
||||
entry price must above the Lines;
|
||||
and Lines Must Above the SL of Positions, if it's Exists;
|
||||
|
||||
### Short Orders
|
||||
|
||||
after putting orders of InDirectionals;
|
||||
set EQM Provider;
|
||||
|
||||
### Short Orders Supporting
|
||||
|
||||
now we have to find out when orders Executed;
|
||||
after each InDirectional EQM Order Execution, we Have to Prepare a Directional Order
|
||||
by it's volume on Signal Entry.
|
||||
@@ -1,105 +0,0 @@
|
||||
|
||||
//
|
||||
// Definitions ...
|
||||
|
||||
//
|
||||
// Base Provider Inputs ...
|
||||
// class XSCBaseProviderInpts : public XSCBase
|
||||
// {
|
||||
// //
|
||||
// // Public ...
|
||||
// public:
|
||||
// //
|
||||
// // Validate Input ...
|
||||
// virtual bool IsValid();
|
||||
|
||||
// //
|
||||
// // Cleanup ...
|
||||
// virtual void Clean();
|
||||
|
||||
// //
|
||||
// // Default ...
|
||||
// virtual void Default();
|
||||
|
||||
// //
|
||||
// // Max ...
|
||||
// virtual int Max();
|
||||
// };
|
||||
|
||||
//
|
||||
// Base Market Conditions Class ...
|
||||
// class XSCBaseProviderMarketConditions : public XSCBase
|
||||
// {
|
||||
// //
|
||||
// // Public ...
|
||||
// public:
|
||||
// //
|
||||
// // Props ...
|
||||
// string symbol; // Symbol
|
||||
// ENUM_TIMEFRAMES period; // Period
|
||||
// datetime time; // Time
|
||||
|
||||
// //
|
||||
// XOHCL bars[]; // Number of Bars ...
|
||||
|
||||
// //
|
||||
// // Buffers ...
|
||||
|
||||
// //
|
||||
// // Conditions ...
|
||||
|
||||
// //
|
||||
// // Generate Score ...
|
||||
// virtual void GenerateScore(
|
||||
// double &bullishScore, // Bullish Score
|
||||
// double &bearishScore, // Bearish Score
|
||||
// double multiplier = 1 // Score Multiplier
|
||||
// );
|
||||
|
||||
// //
|
||||
// // Generate Summary ...
|
||||
// virtual string GenerateSummary(
|
||||
// const bool onlySummary = false, // Only Generate Conditions Summary
|
||||
// double multiplier = 1, // Score Multiplier
|
||||
// const string separator = "\n", // Separator
|
||||
// const bool ignoreFalseConditions = true // Ignore False Conditions
|
||||
// );
|
||||
// };
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//// Class Implementation Method ...
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//
|
||||
// Inheritance ...
|
||||
|
||||
//
|
||||
// Init all Requirements ...
|
||||
// virtual bool Init(XSCBaseProviderInpts &inputs);
|
||||
|
||||
//
|
||||
// Get Inputs ...
|
||||
// virtual void GetInputs(XSCBaseProviderInpts &inputs);
|
||||
|
||||
//
|
||||
// Set Inputs and Reinitial ...
|
||||
// virtual bool setInputs(XSCBaseProviderInpts &inputs);
|
||||
|
||||
//
|
||||
// virtual void GetMarketConditions(
|
||||
// XSCBaseProviderMarketConditions &conditions, // Market Conditions Result
|
||||
// int barIndex = 0 // Specified Bar Index
|
||||
// );
|
||||
|
||||
//
|
||||
// Check Market For Signal ...
|
||||
// virtual bool HasSignal(
|
||||
// int barIndex,
|
||||
// XSignal &signal, // Hold's Signal if Exists ...
|
||||
// XSCBaseProviderMarketConditions &conditions // Hold's Market Conditions ...
|
||||
// );
|
||||
@@ -1 +0,0 @@
|
||||
type *.x121.log > Signals.x121.log
|
||||
@@ -1,191 +0,0 @@
|
||||
//
|
||||
// Check Conditions For Signal ...
|
||||
bool HasSignal(
|
||||
XSignal &signal //
|
||||
) override
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
signal.Clean();
|
||||
|
||||
//
|
||||
double sl = 0;
|
||||
double tp = 0;
|
||||
double risk = 0;
|
||||
double entry = 0;
|
||||
double reward = 0;
|
||||
double r2r = R2R();
|
||||
ENUM_POSITION_TYPE type;
|
||||
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
|
||||
|
||||
//
|
||||
// Check Signalling Direction ...
|
||||
result = mSignallingDirection != X_SIGNALLING_NONE;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Conditions Exists ...
|
||||
result = HasRequirements();
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
// Prepare Conditions ...
|
||||
result = PrepareRequirements();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Implement Signalling Conditions ...
|
||||
XOHCL cBar;
|
||||
result = cBar.Init(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
1 //
|
||||
);
|
||||
|
||||
//
|
||||
// Check Analyzing Period Contains a Trend or not ...
|
||||
|
||||
//
|
||||
// Detecting Trend ...
|
||||
bool isInBullishTrend = false;
|
||||
bool isInBearishTrend = false;
|
||||
|
||||
//
|
||||
isInBullishTrend = bar.HasBullishTrend(
|
||||
highSwingBars,
|
||||
lowSwingBars //
|
||||
);
|
||||
if (!isInBullishTrend)
|
||||
{
|
||||
//
|
||||
isInBearishTrend = bar.HasBearishTrend(
|
||||
highSwingBars,
|
||||
lowSwingBars //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Only Looks For Signals if aTrend Detected ...
|
||||
result = isInBullishTrend || isInBearishTrend;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Here We have to Decide Trend or Reversal Act ...
|
||||
|
||||
//
|
||||
// Check Trend Direction Signal ...
|
||||
if (mSignallingDirection == X_SIGNALLING_BOTH_DIRECTIONS ||
|
||||
mSignallingDirection == X_SIGNALLING_TREND_DIRECTION)
|
||||
{
|
||||
//
|
||||
if (isInBullishTrend)
|
||||
{
|
||||
//
|
||||
// Find Long Signals ...
|
||||
// since we are in Bullish Trend and
|
||||
// we must do Trend Trading ...
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
false
|
||||
//
|
||||
;
|
||||
}
|
||||
else if (isInBearishTrend)
|
||||
{
|
||||
//
|
||||
// Find Short Signals ...
|
||||
// since we are in Bearish Trend and
|
||||
// we must do Trend Trading ...
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
false
|
||||
//
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check Trend Reversal Direction Signal ...
|
||||
if (!result &&
|
||||
(mSignallingDirection == X_SIGNALLING_BOTH_DIRECTIONS ||
|
||||
mSignallingDirection == X_SIGNALIING_TREND_REVERSAL_DIRECTION))
|
||||
{
|
||||
//
|
||||
if (isInBullishTrend)
|
||||
{
|
||||
//
|
||||
// Find Short Signals ...
|
||||
// since we are in Bullish Trend and
|
||||
// we must do Trend Reversal Trading ...
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
false
|
||||
//
|
||||
;
|
||||
}
|
||||
else if (isInBearishTrend)
|
||||
{
|
||||
//
|
||||
// Find Long Signals ...
|
||||
// since we are in Bearish Trend and
|
||||
// we must do Trend Reversal Trading ...
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
false
|
||||
//
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Make Sure Signal Exists ...
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
CalculateTPSLBtPrice(
|
||||
sl,
|
||||
tp,
|
||||
type,
|
||||
entry,
|
||||
r2r //
|
||||
);
|
||||
|
||||
//
|
||||
result = signal.Prepare(
|
||||
mSymbol,
|
||||
GetTag(),
|
||||
mPeriod,
|
||||
type,
|
||||
mode,
|
||||
entry,
|
||||
mVolume,
|
||||
sl,
|
||||
tp //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
@@ -1,163 +0,0 @@
|
||||
//
|
||||
// XSCORES ...
|
||||
(
|
||||
//
|
||||
bearishScore < 5 &&
|
||||
bullishScore > bearishScore * 10
|
||||
//
|
||||
)
|
||||
|
||||
//
|
||||
// XICH ...
|
||||
(
|
||||
//
|
||||
(
|
||||
//
|
||||
!conditions.ichConditions.isClosedOverKijunSen &&
|
||||
conditions.ichConditions.isTenkanSenOverKijunSen
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
conditions.ichConditions.isClosedOverKijunSen &&
|
||||
!conditions.ichConditions.isTenkanSenOverKijunSen
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
conditions.ichConditions.isSenkouSpanAUnderB ||
|
||||
conditions.ichConditions.isSenkouSpanAUnderLast ||
|
||||
conditions.ichConditions.isFutureSenkouSpanAUnderB
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
|
||||
//
|
||||
// XCHMA ...
|
||||
(
|
||||
//
|
||||
(
|
||||
//
|
||||
(!conditions.chmaConditions.isFastOverSlow &&
|
||||
conditions.chmaConditions.isFastUnderSlow)
|
||||
//
|
||||
&&
|
||||
//
|
||||
(
|
||||
//
|
||||
(
|
||||
//
|
||||
conditions.chmaConditions.isCFastUnderSlow ||
|
||||
conditions.chmaConditions.isSFastUnderSlow
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
conditions.chmaConditions.isSFastUnderSlow ||
|
||||
conditions.chmaConditions.isMFastUnderSlow
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
conditions.chmaConditions.isMFastUnderSlow ||
|
||||
conditions.chmaConditions.isLFastUnderSlow
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
conditions.chmaConditions.isLFastUnderSlow ||
|
||||
conditions.chmaConditions.isHFastUnderSlow
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
(
|
||||
//
|
||||
conditions.chmaConditions.isCFastUnderSlow ||
|
||||
conditions.chmaConditions.isSFastUnderSlow ||
|
||||
conditions.chmaConditions.isMFastUnderSlow
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
conditions.chmaConditions.isCFastUnderSlow ||
|
||||
conditions.chmaConditions.isSFastUnderSlow ||
|
||||
conditions.chmaConditions.isMFastUnderSlow ||
|
||||
conditions.chmaConditions.isLFastUnderSlow
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
conditions.chmaConditions.isCFastUnderSlow ||
|
||||
conditions.chmaConditions.isSFastUnderSlow ||
|
||||
conditions.chmaConditions.isMFastUnderSlow ||
|
||||
conditions.chmaConditions.isLFastUnderSlow ||
|
||||
conditions.chmaConditions.isHFastUnderSlow
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
conditions.chmaConditions.isRetestFastSlow &&
|
||||
conditions.chmaConditions.isRetestCFastSlow &&
|
||||
conditions.chmaConditions.isRetestSFastSlow &&
|
||||
conditions.chmaConditions.isRetestMFastSlow &&
|
||||
conditions.chmaConditions.isRetestLFastSlow &&
|
||||
conditions.chmaConditions.isRetestHFastSlow
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
|
||||
//
|
||||
// XCM ...
|
||||
(
|
||||
//
|
||||
(
|
||||
//
|
||||
conditions.mcConditions.isFastUnderSlow ||
|
||||
conditions.mcConditions.isFastUnderVerifier
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
|
||||
//
|
||||
// XMRB ...
|
||||
(
|
||||
//
|
||||
(
|
||||
//
|
||||
conditions.mrbConditions.isFastUnderSlow
|
||||
//
|
||||
)
|
||||
//
|
||||
)
|
||||
@@ -1,423 +0,0 @@
|
||||
//
|
||||
// Hind Signals ...
|
||||
if (hSignal.IsValid())
|
||||
{
|
||||
//
|
||||
bool isLong = IsLong(hSignal.type);
|
||||
if (isLong)
|
||||
{
|
||||
mBullishSigns += hPusher;
|
||||
}
|
||||
else
|
||||
{
|
||||
mBearishSigns += hPusher;
|
||||
}
|
||||
|
||||
//
|
||||
if (hPusher >= mReuiredSignalVerifications)
|
||||
{
|
||||
//
|
||||
X121SetupConditions otherConditions[];
|
||||
AddRef(
|
||||
cConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
sConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
mConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
lConditions,
|
||||
otherConditions //
|
||||
);
|
||||
|
||||
//
|
||||
// Check Final Validations ...
|
||||
bool isValid =
|
||||
//
|
||||
(
|
||||
//
|
||||
cHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
sHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
mHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
lHasSignal
|
||||
//
|
||||
) //
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
!mGetVerificationFromOtherTimeFrames
|
||||
? true
|
||||
: isLong
|
||||
? signalGenerator.HasLongVerifications(otherConditions)
|
||||
: signalGenerator.HasShortVerifications(otherConditions)
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (isValid)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
hSignal,
|
||||
signals //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
//
|
||||
// Long Signals ...
|
||||
if (lSignal.IsValid())
|
||||
{
|
||||
//
|
||||
bool isLong = IsLong(lSignal.type);
|
||||
if (isLong)
|
||||
{
|
||||
mBullishSigns += lPusher;
|
||||
}
|
||||
else
|
||||
{
|
||||
mBearishSigns += lPusher;
|
||||
}
|
||||
|
||||
//
|
||||
if (lPusher >= mReuiredSignalVerifications)
|
||||
{
|
||||
//
|
||||
X121SetupConditions otherConditions[];
|
||||
AddRef(
|
||||
cConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
sConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
mConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
hConditions,
|
||||
otherConditions //
|
||||
);
|
||||
|
||||
//
|
||||
// Check Final Validations ...
|
||||
bool isValid =
|
||||
//
|
||||
(
|
||||
//
|
||||
cHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
sHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
mHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
hHasSignal
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
!mGetVerificationFromOtherTimeFrames
|
||||
? true
|
||||
: isLong
|
||||
? signalGenerator.HasLongVerifications(otherConditions)
|
||||
: signalGenerator.HasShortVerifications(otherConditions)
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (isValid)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
lSignal,
|
||||
signals //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
//
|
||||
// Medium Signals ...
|
||||
if (mSignal.IsValid())
|
||||
{
|
||||
//
|
||||
bool isLong = IsLong(mSignal.type);
|
||||
if (isLong)
|
||||
{
|
||||
mBullishSigns += mPusher;
|
||||
}
|
||||
else
|
||||
{
|
||||
mBearishSigns += mPusher;
|
||||
}
|
||||
|
||||
//
|
||||
if (mPusher >= mReuiredSignalVerifications)
|
||||
{
|
||||
//
|
||||
X121SetupConditions otherConditions[];
|
||||
AddRef(
|
||||
cConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
sConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
lConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
hConditions,
|
||||
otherConditions //
|
||||
);
|
||||
|
||||
//
|
||||
// Check Final Validations ...
|
||||
bool isValid =
|
||||
//
|
||||
(
|
||||
//
|
||||
cHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
sHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
lHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
hHasSignal
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
!mGetVerificationFromOtherTimeFrames
|
||||
? true
|
||||
: isLong
|
||||
? signalGenerator.HasLongVerifications(otherConditions)
|
||||
: signalGenerator.HasShortVerifications(otherConditions)
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (isValid)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
mSignal,
|
||||
signals //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
//
|
||||
// Short Signals ...
|
||||
if (sSignal.IsValid())
|
||||
{
|
||||
//
|
||||
bool isLong = IsLong(sSignal.type);
|
||||
if (isLong)
|
||||
{
|
||||
mBullishSigns += sPusher;
|
||||
}
|
||||
else
|
||||
{
|
||||
mBearishSigns += sPusher;
|
||||
}
|
||||
|
||||
//
|
||||
if (sPusher >= mReuiredSignalVerifications)
|
||||
{
|
||||
//
|
||||
X121SetupConditions otherConditions[];
|
||||
AddRef(
|
||||
cConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
mConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
lConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
hConditions,
|
||||
otherConditions //
|
||||
);
|
||||
|
||||
//
|
||||
// Check Final Validations ...
|
||||
bool isValid =
|
||||
//
|
||||
(
|
||||
//
|
||||
cHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
mHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
lHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
hHasSignal
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
!mGetVerificationFromOtherTimeFrames
|
||||
? true
|
||||
: isLong
|
||||
? signalGenerator.HasLongVerifications(otherConditions)
|
||||
: signalGenerator.HasShortVerifications(otherConditions)
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (isValid)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
sSignal,
|
||||
signals //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
//
|
||||
// Current Signals ...
|
||||
if (cSignal.IsValid())
|
||||
{
|
||||
//
|
||||
bool isLong = IsLong(cSignal.type);
|
||||
if (isLong)
|
||||
{
|
||||
mBullishSigns += cPusher;
|
||||
}
|
||||
else
|
||||
{
|
||||
mBearishSigns += cPusher;
|
||||
}
|
||||
|
||||
//
|
||||
if (cPusher >= mReuiredSignalVerifications)
|
||||
{
|
||||
//
|
||||
X121SetupConditions otherConditions[];
|
||||
AddRef(
|
||||
sConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
mConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
lConditions,
|
||||
otherConditions //
|
||||
);
|
||||
AddRef(
|
||||
hConditions,
|
||||
otherConditions //
|
||||
);
|
||||
|
||||
//
|
||||
// Check Final Validations ...
|
||||
bool isValid =
|
||||
//
|
||||
(
|
||||
//
|
||||
sHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
mHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
lHasSignal
|
||||
//
|
||||
||
|
||||
//
|
||||
hHasSignal
|
||||
//
|
||||
)
|
||||
//
|
||||
||
|
||||
//
|
||||
(
|
||||
//
|
||||
!mGetVerificationFromOtherTimeFrames
|
||||
? true
|
||||
: isLong
|
||||
? signalGenerator.HasLongVerifications(otherConditions)
|
||||
: signalGenerator.HasShortVerifications(otherConditions)
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
if (isValid)
|
||||
{
|
||||
//
|
||||
AddRef(
|
||||
cSignal,
|
||||
signals //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user