last works on Candlestick Patterns ...

This commit is contained in:
2024-07-13 19:30:03 +03:30
parent f3118b226e
commit 046f721b19
7 changed files with 4006 additions and 1061 deletions
+644
View File
@@ -0,0 +1,644 @@
//
// 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
+19 -19
View File
@@ -316,25 +316,25 @@ bool InitialEA()
// 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);
// //
// // 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);
}
//
-395
View File
@@ -1,395 +0,0 @@
/////////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 OrderBlock Detector Indicator
// -----------------------------------------------------
// Name: XOBD
// Description: detect Order Blocks based on Swings ...
//
//
// 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 XOBD Indicator"
#property strict
//
// START Constants ...
//
#define ShortName "XOBD"
//
// END Constants ...
//
//
// START Inputs ...
//
//
input int length = 5; // Swing Length
//
input uchar swingHighArrowCode = 108; // Swing High Arrow Code
input color swingHighArrowColor = clrMagenta; // Swing High Arrow Color
//
input uchar swingLowArrowCode = 108; // Swing Low Arrow Code
input color swingLowArrowColor = clrAqua; // Swing Low Arrow Color
//
// END Inputs ...
//
//
// Include Common and Models Library ...
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// Include Draw Library ...
#include "../Libraries/x-saherelm.draw.lib.mq5"
//
// START Buffers ...
//
#property indicator_chart_window
//
#property indicator_buffers 1
#property indicator_plots 0
//
#define swingBufferIndex 0
double swingBuffer[];
//
// END Buffers ...
//
//
// START Global Definitions: Variables, Properties and etc ...
//
//
// END Global Definitions: Variables, Properties and etc ...
//
//
// START Event Handlers ...
//
//
// Initialization ...
int OnInit()
{
//
// Validate Inputs ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
drawPrefix = ShortName;
//
// 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
}
//
// Calculations ...
//
// Calculating what we want ...
int OnCalculate(
//
// total Candles on chart ...
const int rates_total,
//
// total calculated Candles on charts ...
const int prev_calculated,
//
// history of Candles Open Time ...
const datetime &time[],
//
// history of Candles Open Price ...
const double &open[],
//
// history of Candles High Price ...
const double &high[],
//
// history of Candles Low Price ...
const double &low[],
//
// history of Candles Close Price ...
const double &close[],
//
// history of Tick Volumes on Candle ...
const long &tick_volume[],
//
// history of Trade Volumes ...
const long &volume[],
//
// history of Candles Spread Price ...
const int &spread[])
{
//
// Prepare Buffers ...
ArraySetAsSeries(time, true);
ArraySetAsSeries(open, true);
ArraySetAsSeries(high, true);
ArraySetAsSeries(low, true);
ArraySetAsSeries(close, true);
ArraySetAsSeries(tick_volume, true);
ArraySetAsSeries(volume, true);
ArraySetAsSeries(spread, true);
//
// this counts Available Bars ...
int limit;
//
// because in some cases we may have more than one input for
// calculation and we must prevent any calculation
// untill we pass the biggest input length, here we get max Input length
// and then wait until pass it ...
int maxLength = MathMax(0, length * 3);
//
limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated;
//
// Main Loop ...
for (int i = limit; i >= 0 && !IsStopped(); i--)
{
//
CalculateBuffers(i);
}
//
return rates_total;
}
//
// END Event Handlers ...
//
//
// START Functions ...
//
//
// Validate Input Args for Initialization ...
bool ValidateInputs()
{
//
bool result = false;
//
// Validate Args ...
if (length >= 2)
{
result = true;
}
//
return result;
}
//
// Define Indexes and Styles ...
void DefineBuffers()
{
//
ArraySetAsSeries(swingBuffer, true);
SetIndexBuffer(swingBufferIndex, swingBuffer, INDICATOR_CALCULATIONS);
}
//
// Set Indicator Short Name and also we can define Buffers Labels ...
void SetIndicatorName()
{
//
string indicatorShortName = "";
StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )");
//
IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName);
}
//
// Calculate Buffers ...
void CalculateBuffers(int bar_index)
{
//
// GetCandleSwing(bar_index);
ENUM_X_SWING_TYPE type = X_NO_SWING;
//
// Try To Detect Order Blocks ...
bool isSwingLow = false;
bool isSwingHigh = false;
//
// Reading Candles Data ...
int start = bar_index;
int count = (length * 2) + 2;
int end = start + count;
XOHCL bars[];
int readedBars = GetBars(
bars,
_Symbol,
_Period,
start,
count
//
);
if (readedBars < count) {
return;
}
//
// Swing Low ...
isSwingLow =
//
bars[1].close > bars[2].close &&
bars[2].close > bars[3].close &&
//
bars[3].close < bars[4].close &&
//
bars[5].close > bars[4].close &&
bars[6].close > bars[5].close
//
;
//
if (isSwingLow)
{
type = X_SWING_LOW;
}
//
if (!isSwingLow)
{
//
// Swing High ...
isSwingHigh =
//
bars[1].close < bars[2].close &&
bars[2].close < bars[3].close &&
//
bars[3].close > bars[4].close &&
//
bars[5].close < bars[4].close &&
bars[6].close < bars[5].close
//
;
//
if (isSwingHigh)
{
type = X_SWING_HIGH;
}
}
//
switch (type)
{
//
// Swing High ...
case X_SWING_HIGH:
//
swingBuffer[bar_index] = type;
DrawSwingArrow(1, bar_index);
break;
//
// Swinmg Low ...
case X_SWING_LOW:
//
swingBuffer[bar_index] = type;
DrawSwingArrow(0, bar_index);
break;
//
// No Swing ...
default:
case X_NO_SWING:
//
swingBuffer[bar_index] = 0;
break;
}
}
//
// Draw a Swing Arrow Shape ...
void DrawSwingArrow(
int type, // Swing Type: 0 - Low / 1 - High ...
int bar_index //
)
{
//
bool isSwingHigh = type == 1;
//
if ((isSwingHigh && swingHighArrowCode == 0) ||
(!isSwingHigh && swingLowArrowCode == 0))
{
return;
}
XOHCL candle;
candle.Init(
_Symbol,
_Period,
bar_index + 3);
double arrowDistanceInPoint = 0;
//
// Define Required Object Properties fro Draw an Arrow ...
datetime time = iTime(_Symbol, _Period, bar_index + 3);
double purePrice = isSwingHigh ? candle.high : candle.low;
color clr = isSwingHigh ? swingHighArrowColor : swingLowArrowColor;
ENUM_ARROW_ANCHOR anchor = isSwingHigh ? ANCHOR_BOTTOM : ANCHOR_TOP;
uchar arrowCode = uchar(isSwingHigh ? swingHighArrowCode : swingLowArrowCode);
double price = isSwingHigh ? purePrice + arrowDistanceInPoint : purePrice - arrowDistanceInPoint;
string name = "Swing " + (isSwingHigh ? "High" : "Low") + "_" + (string)time + "_" + (string)purePrice;
//
// Draw desired Arrow ...
DrawArrow(
0,
name,
0,
time,
price,
arrowCode,
anchor,
clr);
}
//
// END Functions ...
//
+371
View File
@@ -0,0 +1,371 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Trend Detector Oscillator
// --------------------------------------------------
// Name: XTD
// Description: trend detecting in both sides ...
//
//
// 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 XTD Oscillator"
#property strict
//
#define ShortName "XTDP"
//
// Imports ...
#include "../Libraries/x-saherelm.common.lib.mq5";
//
// Inputs ...
//
input group "Market";
input int length = 14; // Market Length
//
input group "Presentation";
input bool showBullishPower = true;
input bool showBearishPower = true;
input bool showBullishPressure = true;
input bool showBearishPressure = true;
input bool showSignal = true;
//
// Buffers ...
//
#property indicator_separate_window
//
#property indicator_buffers 5
#property indicator_plots 5
//
#define bullishBufferIndex 0
#define bearishBufferIndex 1
#define bullishPBufferIndex 2
#define bearishPBufferIndex 3
#define signalBufferIndex 4
//
double bullishBuffer[];
double bearishBuffer[];
double bullishPBuffer[];
double bearishPBuffer[];
double signalBuffer[];
//
#property indicator_label1 "XBullPressure"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLime
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//
#property indicator_label2 "XBearPressure"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//
#property indicator_label3 "XBullPow"
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrAqua
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//
#property indicator_label4 "XBearPow"
#property indicator_type4 DRAW_LINE
#property indicator_color4 clrMagenta
#property indicator_style4 STYLE_SOLID
#property indicator_width4 1
//
#property indicator_label5 "XSignal"
#property indicator_type5 DRAW_LINE
#property indicator_color5 clrYellow
#property indicator_style5 STYLE_SOLID
#property indicator_width5 1
//
// Event Handlers ...
//
//
// Initialization ...
int OnInit()
{
//
// Validate Inputs ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// Define Index Buffers ...
DefineBuffers();
//
// Set Indicator ShortName ...
SetIndicatorName();
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
//
// DeInitialization ...
void OnDeinit(const int reason)
{
//
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
// REASON_REMOVE 1 Program removed from a chart
// REASON_RECOMPILE 2 Program recompiled
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
// REASON_CHARTCLOSE 4 Chart closed
// REASON_PARAMETERS 5 Inputs changed by a user
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
// REASON_TEMPLATE 7 Another chart template applied
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
// REASON_CLOSE 9 Terminal closed
//
// Here we can handle De Initialization Reasons ...
}
//
// Calculations ...
//
// 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 ...
)
{
//
// Prepare Buffers ...
ArraySetAsSeries(time, true);
ArraySetAsSeries(open, true);
ArraySetAsSeries(high, true);
ArraySetAsSeries(low, true);
ArraySetAsSeries(close, true);
ArraySetAsSeries(tick_volume, true);
ArraySetAsSeries(volume, true);
ArraySetAsSeries(spread, true);
//
// this counts Available Bars ...
int limit;
//
// because in some cases we may have more than one input for
// calculation and we must prevent any calculation
// untill we pass the biggest input length, here we get max Input length
// and then wait until pass it ...
int maxLength = MathMax(0, length);
//
limit = prev_calculated < maxLength ? rates_total - (maxLength + 1) : rates_total - prev_calculated;
//
// Main Loop ...
for (int i = limit; i >= 0 && !IsStopped(); i--)
{
//
CalculateBuffers(i,
open,
high,
low,
close //
);
}
//
return rates_total;
}
//
// Functions ...
//
// Validate Input Args for Initialization ...
bool ValidateInputs()
{
//
bool result = false;
//
// Validate Args ...
if (length >= 5)
{
result = true;
}
//
return result;
}
//
// Define Indexes and Styles ...
void DefineBuffers()
{
//
// Bullish Buffer ...
ENUM_DRAW_TYPE bullishDrawType = showBullishPressure ? DRAW_LINE : DRAW_NONE;
string bullishBufferLabel = ShortName + "BullPress " + "(" + (string)length + ")";
ArraySetAsSeries(bullishBuffer, true);
SetIndexBuffer(bullishBufferIndex, bullishBuffer, INDICATOR_DATA);
PlotIndexSetInteger(bullishBufferIndex, PLOT_DRAW_BEGIN, length);
PlotIndexSetString(bullishBufferIndex, PLOT_LABEL, bullishBufferLabel);
PlotIndexSetInteger(bullishBufferIndex, PLOT_DRAW_TYPE, bullishDrawType);
//
// Bearish Buffer ...
ENUM_DRAW_TYPE bearishDrawType = showBearishPressure ? DRAW_LINE : DRAW_NONE;
string bearishBufferLabel = ShortName + "BearPress " + "(" + (string)length + ")";
ArraySetAsSeries(bearishBuffer, true);
SetIndexBuffer(bearishBufferIndex, bearishBuffer, INDICATOR_DATA);
PlotIndexSetInteger(bearishBufferIndex, PLOT_DRAW_BEGIN, length);
PlotIndexSetString(bearishBufferIndex, PLOT_LABEL, bearishBufferLabel);
PlotIndexSetInteger(bearishBufferIndex, PLOT_DRAW_TYPE, bearishDrawType);
//
// Bullish Buffer ...
ENUM_DRAW_TYPE bullishPDrawType = showBullishPower ? DRAW_LINE : DRAW_NONE;
string bullishPBufferLabel = ShortName + "BullPow " + "(" + (string)length + ")";
ArraySetAsSeries(bullishPBuffer, true);
SetIndexBuffer(bullishPBufferIndex, bullishPBuffer, INDICATOR_DATA);
PlotIndexSetInteger(bullishPBufferIndex, PLOT_DRAW_BEGIN, length);
PlotIndexSetString(bullishPBufferIndex, PLOT_LABEL, bullishPBufferLabel);
PlotIndexSetInteger(bullishPBufferIndex, PLOT_DRAW_TYPE, bullishPDrawType);
//
// Bearish Buffer ...
ENUM_DRAW_TYPE bearishPDrawType = showBearishPower ? DRAW_LINE : DRAW_NONE;
string bearishPBufferLabel = ShortName + "BearPow " + "(" + (string)length + ")";
ArraySetAsSeries(bearishPBuffer, true);
SetIndexBuffer(bearishPBufferIndex, bearishPBuffer, INDICATOR_DATA);
PlotIndexSetInteger(bearishPBufferIndex, PLOT_DRAW_BEGIN, length);
PlotIndexSetString(bearishPBufferIndex, PLOT_LABEL, bearishPBufferLabel);
PlotIndexSetInteger(bearishPBufferIndex, PLOT_DRAW_TYPE, bearishPDrawType);
//
// Signal Buffer ...
ENUM_DRAW_TYPE signalDrawType = showSignal ? DRAW_LINE : DRAW_NONE;
string signalBufferLabel = ShortName + "Signal " + "(" + (string)length + ")";
ArraySetAsSeries(signalBuffer, true);
SetIndexBuffer(signalBufferIndex, signalBuffer, INDICATOR_DATA);
PlotIndexSetInteger(signalBufferIndex, PLOT_DRAW_BEGIN, length);
PlotIndexSetString(signalBufferIndex, PLOT_LABEL, signalBufferLabel);
PlotIndexSetInteger(signalBufferIndex, PLOT_DRAW_TYPE, signalDrawType);
}
//
// Set Indicator Short Name and also we can define Buffers Labels ...
void SetIndicatorName()
{
//
string indicatorShortName = "";
StringConcatenate(indicatorShortName, ShortName, " ", "( ", length, " )");
//
IndicatorSetString(INDICATOR_SHORTNAME, indicatorShortName);
}
//
// Calculate Buffers ...
void CalculateBuffers(
int bar_index,
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 ...
)
{
//
double bullPow = 0;
double bearPow = 0;
double bullPressure = 0;
double bearPressure = 0;
double signal = 0;
//
// Loop through Closes ...
for (int i = bar_index; i <= bar_index + length; i++)
{
//
double iO = open[i];
double iH = high[i];
double iL = low[i];
double iC = close[i];
//
double iUp = MathMax(iO, iC);
double iDown = MathMin(iO, iC);
//
double iUpShadow = iH - iUp;
double iDownShadow = iDown - iL;
//
bullPressure += iDownShadow;
bearPressure += iUpShadow;
//
signal += (iUp - iDown);
//
// Bearish ...
if (iO > iC)
{
bearPow += signal;
}
//
// Bullish ...
if (iO < iC)
{
bullPow += signal;
}
}
//
// Bullish Power Buffer ...
bullishPBuffer[bar_index] = bullPow;
bullishBuffer[bar_index] = bullPressure;
//
// Bearish Power Buffer ...
bearishPBuffer[bar_index] = bearPow;
bearishBuffer[bar_index] = bearPressure;
//
// Signal Buffer ...
// signal = length;
signalBuffer[bar_index] = signal;
}
//
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -980,10 +980,10 @@ bool DrawRectangle(
const long chartID = 0, // chart's ID
const string name = "Rectangle", // rectangle name
const int subWindow = 0, // subwindow index
datetime time1 = 0, // first point time
double price1 = 0, // first point price
datetime time2 = 0, // second point time
double price2 = 0, // second point price
datetime time1 = 0, // down first point time
double price1 = 0, // down first point price
datetime time2 = 0, // up second point time
double price2 = 0, // up second point price
const color clr = clrRed, // rectangle color
const ENUM_LINE_STYLE style = STYLE_SOLID, // style of rectangle lines
const int width = 1, // width of rectangle lines