Indicator Collection
Indicator Collection
This commit is contained in:
@@ -0,0 +1,199 @@
|
||||
//@version=5
|
||||
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
|
||||
// © godfather
|
||||
// update vwap
|
||||
|
||||
indicator('Alert VOL Strong Candle CME', shorttitle='Alert VOL Strong Candle CME', overlay=true, format=format.price, precision=2, max_boxes_count=500, max_bars_back=500, max_lines_count=500, max_labels_count = 500)
|
||||
|
||||
|
||||
MaxLabel=input.int(title="Số Nến Hiện Tín Hiệu", defval=100, minval=5, maxval=10000, step=1)
|
||||
|
||||
|
||||
groupVolume = '📈 Cấu Hình Thông Số Đầu Vào Cho Volume CME 📉'
|
||||
showBarcolorVol = input.bool(defval=true, title="Hiện Màu Nến Vol Bất Thường" , group = groupVolume)
|
||||
adaptive = input.string(title="Market Type ", options=["AUTO", "OTHERS"], defval="AUTO", group = groupVolume)
|
||||
symbol_manual = input.symbol(defval="COMEX_DL:GC1!", group = groupVolume)
|
||||
|
||||
sCode1 =
|
||||
syminfo.root == "XAUUSD" ? "COMEX_DL:GC1!" :
|
||||
syminfo.root == "AUDUSD" ? "CME_DL:6A1!" :
|
||||
syminfo.root == "USDCAD" ? "CME_DL:6C1!" :
|
||||
syminfo.root == "GBPUSD" ? "CME_DL:6B1!" :
|
||||
syminfo.root == "EURUSD" ? "CME_DL:6E1!" :
|
||||
syminfo.root == "USDJPY" ? "CME_DL:6J1!" :
|
||||
syminfo.root == "USDCHF" ? "CME_DL:6S1!" :
|
||||
syminfo.root == "NZDUSD" ? "CME_DL:6N1!" :
|
||||
syminfo.root == "BTCUSDT" ? "CME_DL:BTC1!" :
|
||||
syminfo.root == "ETHUSDT" ? "CME_DL:ETH1!" :
|
||||
syminfo.root == "XAGUSD" ? "COMEX_DL:SI1!" :
|
||||
syminfo.root == "US30" ? "CBOT_MINI_DL:YM1!" :
|
||||
""
|
||||
|
||||
float _volume = na
|
||||
string code_futures = na
|
||||
|
||||
if (adaptive=="AUTO" and sCode1 != "")
|
||||
code_futures := sCode1
|
||||
else
|
||||
code_futures := ""
|
||||
|
||||
volFuture = request.security(code_futures, timeframe.period, volume, lookahead=barmerge.lookahead_on)
|
||||
|
||||
if (adaptive=="AUTO" and code_futures != "" )
|
||||
_volume:= volFuture
|
||||
if (adaptive=="OTHERS" or code_futures == "")
|
||||
_volume:= volume
|
||||
|
||||
//showMA = input(defval=false, title='Show Volume Moving Average')
|
||||
lengthVolumeMA = input(defval=20, title='Length of MA applied on Volume', group = groupVolume)
|
||||
ratioUltraVolume = input(defval=2.2, title='Ultra High Volume Ratio', group = groupVolume)
|
||||
ratioVeryHighVolume = input(defval=1.8, title='Very High Volume Ratio', group = groupVolume)
|
||||
ratioHighVolume = input(defval=1.2, title='High Volume Ratio', group = groupVolume)
|
||||
ratioNormalVolume = input(defval=0.8, title='Normal Volume Ratio', group = groupVolume)
|
||||
ratioLowVolume = input(defval=0.4, title='Low Volume Ratio', group = groupVolume)
|
||||
ratioVeryLowVolume = input(defval=0.4, title='Very Low Volume Ratio', group = groupVolume)
|
||||
|
||||
|
||||
// WILDERS MA
|
||||
float volumeMA = 0
|
||||
volumeMA := nz(volumeMA[1]) + (_volume - nz(volumeMA[1])) / lengthVolumeMA
|
||||
float volumeMA_default = 0
|
||||
volumeMA_default := nz(volumeMA_default[1]) + (volume - nz(volumeMA_default[1])) / lengthVolumeMA
|
||||
|
||||
ultraHighVolumeMin = volumeMA * ratioUltraVolume
|
||||
veryHighVolumeMin = volumeMA * ratioVeryHighVolume
|
||||
|
||||
ultraHighVolumeMin_default = volumeMA_default * ratioUltraVolume
|
||||
veryHighVolumeMin_default = volumeMA_default * ratioVeryHighVolume
|
||||
|
||||
highVolumeMin = volumeMA * ratioHighVolume
|
||||
normalVolumeMin = volumeMA * ratioNormalVolume
|
||||
lowVolumeMin = volumeMA * ratioLowVolume
|
||||
veryLowVolumeMin = volumeMA * ratioVeryLowVolume
|
||||
|
||||
|
||||
volUltraHigh = _volume >= ultraHighVolumeMin ? true : false
|
||||
volVeryHigh = _volume >= veryHighVolumeMin and _volume < ultraHighVolumeMin ? true : false
|
||||
|
||||
volUltraHigh_default = volume >= ultraHighVolumeMin_default ? true : false
|
||||
volVeryHigh_default = volume >= veryHighVolumeMin_default and volume < ultraHighVolumeMin_default ? true : false
|
||||
|
||||
volHigh = _volume >= highVolumeMin and _volume < veryHighVolumeMin ? true : false
|
||||
volNormal = _volume >= normalVolumeMin and _volume < highVolumeMin ? true : false
|
||||
volLow = _volume >= lowVolumeMin and _volume < normalVolumeMin ? true : false
|
||||
volVeryLow = _volume < lowVolumeMin ? true : false
|
||||
|
||||
// ... (existing code from the linked script)
|
||||
|
||||
// Determine bullish and bearish candles
|
||||
isBullish = close > open
|
||||
isBearish = close < open
|
||||
|
||||
// Set candle color based on conditions
|
||||
//barcolor(volUltraHigh and isBullish ? color.rgb(6, 114, 96) : volUltraHigh and isBearish ? color.red : na)
|
||||
//barcolor(volVeryHigh and isBullish ? color.rgb(125, 199, 127) : volVeryHigh and isBearish ? color.rgb(221, 161, 161) : na)
|
||||
barcolor(showBarcolorVol and volUltraHigh and isBullish ? color.rgb(23, 109, 41) : showBarcolorVol and volUltraHigh and isBearish? color.rgb(173, 20, 20) : na)
|
||||
barcolor(showBarcolorVol and volVeryHigh and isBullish ? color.rgb(173, 218, 183) : showBarcolorVol and volVeryHigh and isBearish ? color.rgb(236, 128, 128) : na)
|
||||
|
||||
|
||||
|
||||
//========================================Begin Flase Break - TRAP============================================
|
||||
groupTrap = '📈 Cấu Hình Signal Trap 📉'
|
||||
bool showTrap = input(false, 'Hiện Signal TRAP', group = groupTrap)
|
||||
lookbackTRAP=input.int(title="Kiểm Tra Bao Nhiêu Cây Nến", defval=3, minval=1, maxval=10, step=1, group = groupTrap)
|
||||
bool showSignalUltra = input(true, 'Get Break Vol Ultra', group = groupTrap)
|
||||
bool showSignalVery = input(false, 'Get Break Vol Very', group = groupTrap)
|
||||
bool alertTrap = input(true, 'Thông Báo Tín Hiệu', group = groupTrap)
|
||||
|
||||
//=======================
|
||||
bool firstTrapSell = false
|
||||
var highTrapSell = high
|
||||
//=================================
|
||||
bool firstTrapBuy = false
|
||||
var lowTrapBuy = low
|
||||
|
||||
////////////////////////////////////////////////////////////////Code Sell
|
||||
|
||||
for ii = 1 to lookbackTRAP by 1
|
||||
//Tìm thấy tín hiệu trước đó bỏ qua
|
||||
// if(firstTrapBuy[ii])
|
||||
// lowTrapBuy := low
|
||||
// break
|
||||
|
||||
//Kill vol ultra high
|
||||
if(showSignalUltra and volUltraHigh[ii])
|
||||
lowTrapBuy :=low[ii]
|
||||
break
|
||||
else
|
||||
lowTrapBuy := low
|
||||
|
||||
//Kill vol very ultra
|
||||
if(showSignalVery and volVeryHigh[ii])
|
||||
lowTrapBuy :=low[ii]
|
||||
break
|
||||
else
|
||||
lowTrapBuy := low
|
||||
|
||||
|
||||
|
||||
trapBuy = ta.crossunder(close, lowTrapBuy)
|
||||
|
||||
if(volUltraHigh or volVeryHigh)
|
||||
trapBuy := false
|
||||
|
||||
|
||||
if last_bar_index - bar_index < MaxLabel
|
||||
if(showTrap and trapBuy)
|
||||
label.new(bar_index, high, text="", yloc = yloc.abovebar, style=label.style_label_down, textcolor=color.white, size=size.tiny, color=color.rgb(204, 169, 13))
|
||||
firstTrapBuy := trapBuy
|
||||
//plotshape(trapBuy , title="Sell False Break signal", style=shape.labeldown, size=size.small, color=color.rgb(218, 169, 8), location= location.abovebar, text="T", textcolor=color.white)
|
||||
|
||||
////////////////////////////////////////////////////////////////Code Buy
|
||||
|
||||
for ii = 1 to lookbackTRAP by 1
|
||||
//Tìm thấy tín hiệu trước đó bỏ qua
|
||||
// if(firstTrapSell[ii])
|
||||
// highTrapSell := high
|
||||
// break
|
||||
|
||||
//Vol ultra high bị kill
|
||||
if(showSignalUltra and volUltraHigh[ii])
|
||||
highTrapSell :=high[ii]
|
||||
break
|
||||
else
|
||||
highTrapSell := high
|
||||
|
||||
//Vol very high bị kill
|
||||
if(showSignalVery and volVeryHigh[ii])
|
||||
highTrapSell :=high[ii]
|
||||
break
|
||||
else
|
||||
highTrapSell := high
|
||||
|
||||
|
||||
trapSell = ta.crossover(close, highTrapSell)
|
||||
|
||||
if(volUltraHigh or volVeryHigh)
|
||||
trapSell := false
|
||||
|
||||
|
||||
if last_bar_index - bar_index < MaxLabel
|
||||
if(showTrap and trapSell)
|
||||
label.new(bar_index, low, text="", yloc = yloc.belowbar, style=label.style_label_up, textcolor=color.white, size=size.tiny, color=color.rgb(28, 169, 204))
|
||||
firstTrapSell := trapSell
|
||||
//plotshape(_showTrapEntrytime and showTrap and trapSell , title="Buy False Break signal", style=shape.labelup, size=size.small, color=color.rgb(28, 169, 204), location= location.belowbar, text="T", textcolor=color.white)
|
||||
|
||||
checkForAlert(trapBuy, trapSell)=>
|
||||
alertMsg = ""
|
||||
if (trapBuy)
|
||||
alertMsg += str.format("Canh Sell {0} M{1} !\n", syminfo.tickerid,timeframe.period)
|
||||
if (trapSell)
|
||||
alertMsg += str.format("Canh Buy {0} M{1} !\n", syminfo.tickerid,timeframe.period)
|
||||
alertMsg
|
||||
|
||||
if(alertTrap and showSignalUltra or alertTrap and showSignalVery)
|
||||
// if(EntryTimePhienA or EntryTimePhienAu or EntryTimePhienMy)
|
||||
msg = checkForAlert(trapBuy, trapSell)
|
||||
if str.length(msg) > 0
|
||||
alert(msg, alert.freq_once_per_bar_close)
|
||||
//=============================================================================End Begin Flase Break IB - TRAP====================================================================
|
||||
+148
@@ -0,0 +1,148 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Alligator.mq5 |
|
||||
//| Copyright 2009-2020, MetaQuotes Software Corp. |
|
||||
//| http://www.mql5.com |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "2009-2020, MetaQuotes Software Corp."
|
||||
#property link "http://www.mql5.com"
|
||||
|
||||
//--- indicator settings
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 3
|
||||
#property indicator_plots 3
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_type2 DRAW_LINE
|
||||
#property indicator_type3 DRAW_LINE
|
||||
#property indicator_color1 Blue
|
||||
#property indicator_color2 Red
|
||||
#property indicator_color3 Lime
|
||||
#property indicator_width1 1
|
||||
#property indicator_width2 1
|
||||
#property indicator_width3 1
|
||||
#property indicator_label1 "Jaws"
|
||||
#property indicator_label2 "Teeth"
|
||||
#property indicator_label3 "Lips"
|
||||
//--- input parameters
|
||||
input int InpJawsPeriod=13; // Jaws period
|
||||
input int InpJawsShift=8; // Jaws shift
|
||||
input int InpTeethPeriod=8; // Teeth period
|
||||
input int InpTeethShift=5; // Teeth shift
|
||||
input int InpLipsPeriod=5; // Lips period
|
||||
input int InpLipsShift=3; // Lips shift
|
||||
input ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // Moving average method
|
||||
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_MEDIAN; // Applied price
|
||||
//--- indicator buffers
|
||||
double ExtJaws[];
|
||||
double ExtTeeth[];
|
||||
double ExtLips[];
|
||||
//--- handles for moving averages
|
||||
int ExtJawsHandle;
|
||||
int ExtTeethHandle;
|
||||
int ExtLipsHandle;
|
||||
//--- bars minimum for calculation
|
||||
int ExtBarsMinimum;
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnInit()
|
||||
{
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0,ExtJaws,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,ExtTeeth,INDICATOR_DATA);
|
||||
SetIndexBuffer(2,ExtLips,INDICATOR_DATA);
|
||||
//--- set accuracy
|
||||
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
|
||||
//--- sets first bar from what index will be drawn
|
||||
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpJawsPeriod-1);
|
||||
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpTeethPeriod-1);
|
||||
PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpLipsPeriod-1);
|
||||
//--- line shifts when drawing
|
||||
PlotIndexSetInteger(0,PLOT_SHIFT,InpJawsShift);
|
||||
PlotIndexSetInteger(1,PLOT_SHIFT,InpTeethShift);
|
||||
PlotIndexSetInteger(2,PLOT_SHIFT,InpLipsShift);
|
||||
//--- name for DataWindow
|
||||
PlotIndexSetString(0,PLOT_LABEL,"Jaws("+string(InpJawsPeriod)+")");
|
||||
PlotIndexSetString(1,PLOT_LABEL,"Teeth("+string(InpTeethPeriod)+")");
|
||||
PlotIndexSetString(2,PLOT_LABEL,"Lips("+string(InpLipsPeriod)+")");
|
||||
//--- get MA's handles
|
||||
ExtJawsHandle=iMA(NULL,0,InpJawsPeriod,0,InpMAMethod,InpAppliedPrice);
|
||||
ExtTeethHandle=iMA(NULL,0,InpTeethPeriod,0,InpMAMethod,InpAppliedPrice);
|
||||
ExtLipsHandle=iMA(NULL,0,InpLipsPeriod,0,InpMAMethod,InpAppliedPrice);
|
||||
//--- bars minimum for calculation
|
||||
ExtBarsMinimum=InpJawsPeriod+InpJawsShift;
|
||||
if(ExtBarsMinimum<(InpTeethPeriod+InpTeethShift))
|
||||
ExtBarsMinimum=InpTeethPeriod+InpTeethShift;
|
||||
if(ExtBarsMinimum<(InpLipsPeriod+InpLipsPeriod))
|
||||
ExtBarsMinimum=InpLipsPeriod+InpLipsPeriod;
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Alligator OnCalculate 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<ExtBarsMinimum)
|
||||
return(0);
|
||||
//--- not all data may be calculated
|
||||
int calculated=BarsCalculated(ExtJawsHandle);
|
||||
if(calculated<rates_total)
|
||||
{
|
||||
Print("Not all data of ExtJawsHandle is calculated (",calculated," bars). Error ",GetLastError());
|
||||
return(0);
|
||||
}
|
||||
calculated=BarsCalculated(ExtTeethHandle);
|
||||
if(calculated<rates_total)
|
||||
{
|
||||
Print("Not all data of ExtTeethHandle is calculated (",calculated," bars). Error ",GetLastError());
|
||||
return(0);
|
||||
}
|
||||
calculated=BarsCalculated(ExtLipsHandle);
|
||||
if(calculated<rates_total)
|
||||
{
|
||||
Print("Not all data of ExtLipsHandle is calculated (",calculated," bars). Error ",GetLastError());
|
||||
return(0);
|
||||
}
|
||||
//--- we can copy not all data
|
||||
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++;
|
||||
}
|
||||
//--- get ma buffers
|
||||
if(IsStopped()) // checking for stop flag
|
||||
return(0);
|
||||
if(CopyBuffer(ExtJawsHandle,0,0,to_copy,ExtJaws)<=0)
|
||||
{
|
||||
Print("getting ExtJawsHandle is failed! Error ",GetLastError());
|
||||
return(0);
|
||||
}
|
||||
if(IsStopped()) // checking for stop flag
|
||||
return(0);
|
||||
if(CopyBuffer(ExtTeethHandle,0,0,to_copy,ExtTeeth)<=0)
|
||||
{
|
||||
Print("getting ExtTeethHandle is failed! Error ",GetLastError());
|
||||
return(0);
|
||||
}
|
||||
if(IsStopped()) // checking for stop flag
|
||||
return(0);
|
||||
if(CopyBuffer(ExtLipsHandle,0,0,to_copy,ExtLips)<=0)
|
||||
{
|
||||
Print("getting ExtLipsHandle is failed! Error ",GetLastError());
|
||||
return(0);
|
||||
}
|
||||
//--- return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,215 @@
|
||||
//+--------------------------------------------------------------------------+
|
||||
//| Bollinger Squeeze Basic.mq5 |
|
||||
//| Copyright © 2022, EarnForex.com |
|
||||
//| https://www.earnforex.com/metatrader-indicators/Bollinger-Squeeze-Basic/ |
|
||||
//+--------------------------------------------------------------------------+
|
||||
#property copyright "Copyright © 2022, EarnForex.com"
|
||||
#property link "https://www.earnforex.com/metatrader-indicators/Bollinger-Squeeze-Basic/"
|
||||
#property version "1.00"
|
||||
|
||||
#property description "Bollinger Squeeze Basic shows the change of momentum histogram and BB / Keltner channel dots."
|
||||
#property description "Red dots are shown when Bollinger bands are outside of the Keltner channel."
|
||||
#property description "Blue dots are shown when Bollinger bands are inside the Keltner channel."
|
||||
|
||||
#property indicator_separate_window
|
||||
#property indicator_buffers 4
|
||||
#property indicator_plots 2
|
||||
#property indicator_type1 DRAW_COLOR_HISTOGRAM
|
||||
#property indicator_color1 clrLimeGreen, clrIndianRed, clrLightGreen, clrLightPink
|
||||
#property indicator_width1 2
|
||||
#property indicator_label1 "Momentum Histo"
|
||||
#property indicator_type2 DRAW_COLOR_ARROW
|
||||
#property indicator_width2 1
|
||||
#property indicator_color2 clrBlue, clrRed
|
||||
#property indicator_label2 "BB/Keltner"
|
||||
|
||||
enum enum_candle_to_check
|
||||
{
|
||||
Current,
|
||||
Previous
|
||||
};
|
||||
|
||||
input int MaxBars = 300;
|
||||
input int BB_Period = 20; // BB Period
|
||||
input double BB_Deviation = 1.6185; // BB Deviation
|
||||
input ENUM_MA_METHOD BB_MA_Method = MODE_SMA;
|
||||
input ENUM_APPLIED_PRICE BB_Price = PRICE_CLOSE;
|
||||
input int Keltner_Period = 20; // Keltner Period
|
||||
input double Keltner_Factor = 1.5; // Keltner Factor
|
||||
input int Momentum_Period = 12; // Momentum Period
|
||||
input ENUM_APPLIED_PRICE Momentum_Price = PRICE_CLOSE;
|
||||
input int SqueezeWingDingsCode = 167;
|
||||
input bool EnableNativeAlerts = false;
|
||||
input bool EnableEmailAlerts = false;
|
||||
input bool EnablePushAlerts = false;
|
||||
input enum_candle_to_check TriggerCandle = Previous;
|
||||
|
||||
// Indicator buffers:
|
||||
double Histogram[];
|
||||
double Histogram_Color[];
|
||||
double Arrows[];
|
||||
double Arrows_Color[];
|
||||
|
||||
// Internal intidcator buffers:
|
||||
double Momentum_Buffer[];
|
||||
double ATR_Buffer[];
|
||||
double StdDev_Buffer[];
|
||||
|
||||
// Global variables:
|
||||
int Momentum_Handle, ATR_Handle, StdDev_Handle;
|
||||
datetime LastAlertTime = D'01.01.1970';
|
||||
int LastAlertDirection = 0;
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Получение таймфрейма в виде строки |
|
||||
//+------------------------------------------------------------------+
|
||||
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
|
||||
{return(StringSubstr(EnumToString(timeframe),7,-1));}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnInit()
|
||||
{
|
||||
SetIndexBuffer(0, Histogram, INDICATOR_DATA);
|
||||
SetIndexBuffer(1, Histogram_Color, INDICATOR_COLOR_INDEX);
|
||||
SetIndexBuffer(2, Arrows, INDICATOR_DATA);
|
||||
SetIndexBuffer(3, Arrows_Color, INDICATOR_COLOR_INDEX);
|
||||
|
||||
PlotIndexSetInteger(1, PLOT_ARROW, SqueezeWingDingsCode); // Arrow code.
|
||||
|
||||
ArraySetAsSeries(Histogram, true);
|
||||
ArraySetAsSeries(Histogram_Color, true);
|
||||
ArraySetAsSeries(Arrows, true);
|
||||
ArraySetAsSeries(Arrows_Color, true);
|
||||
|
||||
Momentum_Handle = iMomentum(Symbol(), Period(), Momentum_Period, Momentum_Price);
|
||||
ATR_Handle = iATR(Symbol(), Period(), Keltner_Period);
|
||||
StdDev_Handle = iStdDev(Symbol(), Period(), BB_Period, BB_MA_Method, 0, BB_Price);
|
||||
|
||||
ArraySetAsSeries(Momentum_Buffer, true);
|
||||
ArraySetAsSeries(ATR_Buffer, true);
|
||||
ArraySetAsSeries(StdDev_Buffer, true);
|
||||
|
||||
//---- инициализации переменной для короткого имени индикатора
|
||||
//---- initializing a variable for the short name of the indicator
|
||||
string shortName="["+GetStringTimeframe(_Period)+"] [" + Symbol() + "] Bollinger Squeeze Basic";
|
||||
|
||||
//--- создание имени для отображения в отдельном подокне и во всплывающей подсказке
|
||||
//--- creating a name to display in a separate subwindow and in a tooltip
|
||||
IndicatorSetString(INDICATOR_SHORTNAME,shortName);
|
||||
|
||||
//--- определение точности отображения значений индикатора
|
||||
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| 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(Time, true);
|
||||
|
||||
int limit = MaxBars;
|
||||
if (limit > rates_total) limit = rates_total;
|
||||
|
||||
double d = 0, prev_d = 0;
|
||||
|
||||
if (CopyBuffer(Momentum_Handle, 0, 0, limit, Momentum_Buffer) != limit) return 0; // Data not ready yet.
|
||||
if (CopyBuffer(ATR_Handle, 0, 0, limit, ATR_Buffer) != limit) return 0; // Data not ready yet.
|
||||
if (CopyBuffer(StdDev_Handle, 0, 0, limit, StdDev_Buffer) != limit) return 0; // Data not ready yet.
|
||||
|
||||
for (int shift = limit - 1; shift >= 0; shift--)
|
||||
{
|
||||
d = Momentum_Buffer[shift] - 100;
|
||||
|
||||
if (d > 0)
|
||||
{
|
||||
if (d >= prev_d)
|
||||
{
|
||||
Histogram_Color[shift] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Histogram_Color[shift] = 2;
|
||||
}
|
||||
Histogram[shift] = d;
|
||||
}
|
||||
else if (d < 0)
|
||||
{
|
||||
|
||||
if (d <= prev_d)
|
||||
{
|
||||
Histogram_Color[shift] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
Histogram_Color[shift] = 3;
|
||||
}
|
||||
Histogram[shift] = d;
|
||||
}
|
||||
else
|
||||
{
|
||||
Histogram[shift] = 0;
|
||||
Histogram_Color[shift] = 0;
|
||||
}
|
||||
prev_d = d;
|
||||
|
||||
double diff = ATR_Buffer[shift] * Keltner_Factor;
|
||||
double std = StdDev_Buffer[shift];
|
||||
double bbs = BB_Deviation * std / diff;
|
||||
|
||||
Arrows[shift] = 0;
|
||||
if (bbs < 1)
|
||||
{
|
||||
Arrows_Color[shift] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Arrows_Color[shift] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (((TriggerCandle > 0) && (Time[0] > LastAlertTime)) || (TriggerCandle == 0))
|
||||
{
|
||||
string Text;
|
||||
// Outside Alert
|
||||
if ((Arrows_Color[TriggerCandle] == 1) && (LastAlertDirection != 1))
|
||||
{
|
||||
if (LastAlertDirection != 0) // Skip actual alerts if it is the first run after attachment.
|
||||
{
|
||||
Text = "BB Squeeze: " + Symbol() + " - " + StringSubstr(EnumToString((ENUM_TIMEFRAMES)Period()), 7) + " - BB Outside Keltner.";
|
||||
if (EnableNativeAlerts) Alert(Text);
|
||||
if (EnableEmailAlerts) SendMail("BB Squeeze Alert", Text);
|
||||
if (EnablePushAlerts) SendNotification(Text);
|
||||
}
|
||||
LastAlertTime = Time[0];
|
||||
LastAlertDirection = 1;
|
||||
}
|
||||
// Inside Alert
|
||||
if ((Arrows_Color[TriggerCandle] == 0) && (LastAlertDirection != -1))
|
||||
{
|
||||
if (LastAlertDirection != 0) // Skip actual alerts if it is the first run after attachment.
|
||||
{
|
||||
Text = "BB Squeeze: " + Symbol() + " - " + StringSubstr(EnumToString((ENUM_TIMEFRAMES)Period()), 7) + " - BB Inside Keltner.";
|
||||
if (EnableNativeAlerts) Alert(Text);
|
||||
if (EnableEmailAlerts) SendMail("BB Squeeze Alert", Text);
|
||||
if (EnablePushAlerts) SendNotification(Text);
|
||||
}
|
||||
LastAlertTime = Time[0];
|
||||
LastAlertDirection = -1;
|
||||
}
|
||||
}
|
||||
|
||||
return rates_total;
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -0,0 +1,93 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| Bollinger bands %b.mq5 |
|
||||
//| Copyright 2014, mohsen khashei |
|
||||
//| mkhashei@gmail.com |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2014, mohsen khashei"
|
||||
#property link "mkhashei@gmail.com"
|
||||
#property version "1.10"
|
||||
#property indicator_separate_window
|
||||
#property indicator_buffers 4
|
||||
#property indicator_plots 1
|
||||
//--- plot Label1
|
||||
#property indicator_label1 "Bollinger bands %b"
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_color1 clrYellow
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 1
|
||||
#property indicator_level1 0.0
|
||||
#property indicator_level2 0.5
|
||||
#property indicator_level3 1.0
|
||||
|
||||
//---- input parameters
|
||||
input int BBPeriod=20; //Period
|
||||
input int BBShift=0; // Shift
|
||||
input double StdDeviation=2.0; //Standard Deviation
|
||||
input ENUM_APPLIED_PRICE appliedprc=PRICE_CLOSE; //Applied Price
|
||||
//--- indicator buffers
|
||||
double UpperBuffer[];
|
||||
double LowerBuffer[];
|
||||
double MiddleBuffer[];
|
||||
double BLGBuffer[];
|
||||
int bbhandle;
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0,BLGBuffer,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,MiddleBuffer,INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(2,UpperBuffer ,INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(3,LowerBuffer ,INDICATOR_CALCULATIONS);
|
||||
ArraySetAsSeries(BLGBuffer,true);
|
||||
ArraySetAsSeries(MiddleBuffer,true);
|
||||
ArraySetAsSeries(UpperBuffer,true);
|
||||
ArraySetAsSeries(LowerBuffer,true);
|
||||
if(Bars(_Symbol,_Period)<60)
|
||||
{
|
||||
Alert("We have less than 60 bars for Indicator exited now!!");
|
||||
return (-1);
|
||||
|
||||
}
|
||||
bbhandle=iBands(NULL,0,BBPeriod,BBShift,StdDeviation,appliedprc);
|
||||
if(bbhandle<0){
|
||||
Alert("Can not create handle ",GetLastError(),"!!");
|
||||
return (-1);
|
||||
}
|
||||
//---
|
||||
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[])
|
||||
{
|
||||
//---
|
||||
ArraySetAsSeries(close,true);
|
||||
if(BarsCalculated(bbhandle)<rates_total) return(0);
|
||||
if(CopyBuffer(bbhandle,0,0,rates_total,MiddleBuffer)<=0) return (0);
|
||||
if(CopyBuffer(bbhandle,1,0,rates_total,UpperBuffer)<=0) return (0);
|
||||
if(CopyBuffer(bbhandle,2,0,rates_total,LowerBuffer)<=0) return (0);
|
||||
|
||||
int pos=prev_calculated-1;
|
||||
if(pos<0) pos=0;
|
||||
for(int i=pos; i<rates_total-(BBPeriod+BBShift+1); i++)
|
||||
{
|
||||
|
||||
BLGBuffer[i]=(close[i]-LowerBuffer[i])/(UpperBuffer[i]-LowerBuffer[i]);
|
||||
|
||||
}
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
Binary file not shown.
+143
@@ -0,0 +1,143 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| PEMA.mq5 |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "2022 IonOne"
|
||||
#property link "forex-station.com"
|
||||
#property version "1.00"
|
||||
#property description "Inverse BB"
|
||||
|
||||
//--- indicator settings
|
||||
#property indicator_chart_window
|
||||
|
||||
#property indicator_buffers 3
|
||||
#property indicator_plots 3
|
||||
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_color1 Red
|
||||
#property indicator_width1 2
|
||||
#property indicator_label1 "Main"
|
||||
|
||||
#property indicator_type2 DRAW_LINE
|
||||
#property indicator_color2 Yellow
|
||||
#property indicator_width2 2
|
||||
#property indicator_label2 "Top"
|
||||
|
||||
#property indicator_type3 DRAW_LINE
|
||||
#property indicator_color3 Orange
|
||||
#property indicator_width3 2
|
||||
#property indicator_label3 "Bot"
|
||||
|
||||
|
||||
input int bars = 10000;
|
||||
|
||||
input int BBPeriod = 200;
|
||||
input ENUM_MA_METHOD BBMAMode = MODE_SMA;
|
||||
input ENUM_APPLIED_PRICE BBPrice = PRICE_CLOSE;
|
||||
|
||||
input int StdDevPeriod = 200;
|
||||
input ENUM_MA_METHOD StdDevMAMode = MODE_SMA;
|
||||
input ENUM_APPLIED_PRICE StdDevPrice = PRICE_CLOSE;
|
||||
|
||||
input double StdDevMul = 1.0;
|
||||
|
||||
input int InversePeriod = 200;
|
||||
|
||||
double BBMain[];
|
||||
double BBTop[];
|
||||
double BBBot[];
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
int HandleMA;
|
||||
int HandleStdDev;
|
||||
|
||||
|
||||
void OnInit()
|
||||
{
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0,BBMain,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,BBTop,INDICATOR_DATA);
|
||||
SetIndexBuffer(2,BBBot,INDICATOR_DATA);
|
||||
|
||||
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
|
||||
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrRed);
|
||||
PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
|
||||
|
||||
PlotIndexSetInteger(1,PLOT_LINE_WIDTH,2);
|
||||
PlotIndexSetInteger(1,PLOT_LINE_COLOR,clrYellow);
|
||||
PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);
|
||||
|
||||
PlotIndexSetInteger(2,PLOT_LINE_WIDTH,2);
|
||||
PlotIndexSetInteger(2,PLOT_LINE_COLOR,clrOrange);
|
||||
PlotIndexSetInteger(2,PLOT_LINE_STYLE,STYLE_SOLID);
|
||||
|
||||
IndicatorSetString(INDICATOR_SHORTNAME,"Inverse BB");
|
||||
|
||||
HandleMA = iMA(NULL,0,BBPeriod,0,BBMAMode,BBPrice);
|
||||
HandleStdDev = iStdDev(NULL,0,StdDevPeriod,0,StdDevMAMode,StdDevPrice);
|
||||
//--- initialization done
|
||||
}
|
||||
double GetIndi(int i, int bufnum, int handle)
|
||||
{
|
||||
double Buffer[1];
|
||||
Buffer[0] = 0;
|
||||
int retries = 5;
|
||||
while (retries >= 0 && CopyBuffer(handle,bufnum,i,1,Buffer) <= 0)
|
||||
{
|
||||
retries--;
|
||||
}
|
||||
|
||||
return Buffer[0];
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Triple Exponential Moving Average |
|
||||
//+------------------------------------------------------------------+
|
||||
int limit;
|
||||
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[])
|
||||
{
|
||||
|
||||
limit = prev_calculated <= 0 ? 0 : prev_calculated-1;
|
||||
limit = MathMax(limit, rates_total-1-bars);
|
||||
limit = MathMax(limit, BBPeriod+1);
|
||||
limit = MathMax(limit, StdDevPeriod+1);
|
||||
limit = MathMax(limit, InversePeriod+1);
|
||||
|
||||
for(int i=limit;i<rates_total && !IsStopped();i++)
|
||||
{
|
||||
static datetime tim;
|
||||
if (tim != iTime(NULL,0,rates_total-1-i))
|
||||
{
|
||||
int shift = rates_total-1-i+1;
|
||||
double ma0 = GetIndi(shift,0,HandleMA);
|
||||
double stdDev0 = GetIndi(shift,0,HandleStdDev);
|
||||
|
||||
double ma = 0;
|
||||
for (int j = 0; j < InversePeriod; j++)
|
||||
{
|
||||
double stdDev = GetIndi(shift+j,0,HandleStdDev);
|
||||
ma += stdDev;
|
||||
}
|
||||
ma /= double(InversePeriod);
|
||||
|
||||
BBMain[i-1] = ma0;
|
||||
BBTop[i-1] = BBMain[i-1] + StdDevMul * (ma - (stdDev0 - ma));
|
||||
BBBot[i-1] = BBMain[i-1] - StdDevMul * (ma + (ma - stdDev0));
|
||||
BBMain[i] = EMPTY_VALUE;
|
||||
BBTop[i] = EMPTY_VALUE;
|
||||
BBBot[i] = EMPTY_VALUE;
|
||||
}
|
||||
}
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,332 @@
|
||||
#property link "https://www.earnforex.com/metatrader-indicators/moving-average-crossover-alert/"
|
||||
#property version "1.02"
|
||||
#property strict
|
||||
#property copyright "EarnForex.com - 2020-2021"
|
||||
#property description "The RSI Indicator With Alert"
|
||||
#property description " "
|
||||
#property description "WARNING : You use this software at your own risk."
|
||||
#property description "The creator of these plugins cannot be held responsible for damage or loss."
|
||||
#property description " "
|
||||
#property description "Find More on EarnForex.com"
|
||||
#property icon "\\Files\\EF-Icon-64x64px.ico"
|
||||
|
||||
#property indicator_separate_window
|
||||
#property indicator_buffers 1
|
||||
#property indicator_plots 1
|
||||
#property indicator_color1 Blue
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_width1 1
|
||||
#property indicator_label1 "RSI"
|
||||
#property indicator_minimum 0
|
||||
#property indicator_maximum 100
|
||||
#property indicator_level1 30
|
||||
#property indicator_level2 70
|
||||
|
||||
|
||||
#include <MQLTA ErrorHandling.mqh>
|
||||
#include <MQLTA Utils.mqh>
|
||||
|
||||
enum ENUM_TRADE_SIGNAL{
|
||||
SIGNAL_BUY=1, //BUY
|
||||
SIGNAL_SELL=-1, //SELL
|
||||
SIGNAL_NEUTRAL=0 //NEUTRAL
|
||||
};
|
||||
|
||||
enum ENUM_CANDLE_TO_CHECK{
|
||||
CURRENT_CANDLE=0, //CURRENT CANDLE
|
||||
CLOSED_CANDLE=1 //PREVIOUS CANDLE
|
||||
};
|
||||
|
||||
enum ENUM_ALERT_SIGNAL{
|
||||
RSI_BREAK_OUT=0, //RSI BREAKS OUT THE LIMITS
|
||||
RSI_COMES_IN=1 //RSI RETURNS IN THE LIMITS
|
||||
};
|
||||
|
||||
input string Comment1="========================"; //MQLTA RSI With Alert
|
||||
input string IndicatorName="MQLTA-RSIWA"; //Indicator Short Name
|
||||
|
||||
input string Comment2="========================"; //Indicator Parameters
|
||||
input int RSIPeriod=14; //RSI Period
|
||||
input int RSIHighLimit=70; //RSI High Limit
|
||||
input int RSILowLimit=30; //RSI Low Limit
|
||||
input ENUM_APPLIED_PRICE RSIAppliedPrice=PRICE_CLOSE; //RSI Applied Price
|
||||
input ENUM_ALERT_SIGNAL AlertSignal=RSI_COMES_IN; //Alert Signal When
|
||||
input ENUM_CANDLE_TO_CHECK CandleToCheck=CURRENT_CANDLE; //Candle To Use For Analysis
|
||||
input int BarsToScan=500; //Number Of Candles To Analyse
|
||||
|
||||
input string Comment_3="===================="; //Notification Options
|
||||
input bool EnableNotify=false; //Enable Notifications Feature
|
||||
input bool SendAlert=true; //Send Alert Notification
|
||||
input bool SendApp=true; //Send Notification to Mobile
|
||||
input bool SendEmail=true; //Send Notification via Email
|
||||
input int WaitTimeNotify=5; //Wait time between notifications (Minutes)
|
||||
|
||||
input string Comment_4="===================="; //Drawing Options
|
||||
input bool EnableDrawArrows=true; //Draw Signal Arrows
|
||||
input int ArrowBuy=241; //Buy Arrow Code
|
||||
input int ArrowSell=242; //Sell Arrow Code
|
||||
input int ArrowSize=3; //Arrow Size (1-5)
|
||||
input color ArrowBuyColor=clrGreen; //Buy Arrow Color
|
||||
input color ArrowSellColor=clrRed; //Sell Arrow Color
|
||||
|
||||
|
||||
double BufferMain[];
|
||||
|
||||
int BufferMainHandle;
|
||||
|
||||
double Open[],Close[],High[],Low[];
|
||||
datetime Time[];
|
||||
|
||||
datetime LastNotificationTime;
|
||||
int Shift=0;
|
||||
|
||||
|
||||
int OnInit(void){
|
||||
|
||||
IndicatorSetString(INDICATOR_SHORTNAME,IndicatorName);
|
||||
|
||||
OnInitInitialization();
|
||||
if(!OnInitPreChecksPass()){
|
||||
return(INIT_FAILED);
|
||||
}
|
||||
|
||||
InitialiseHandles();
|
||||
InitialiseBuffers();
|
||||
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
|
||||
|
||||
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[]){
|
||||
|
||||
bool IsNewCandle=CheckIfNewCandle();
|
||||
int i,pos,upTo;
|
||||
|
||||
pos=0;
|
||||
if(prev_calculated==0 || IsNewCandle)
|
||||
upTo=BarsToScan-1;
|
||||
else
|
||||
upTo=0;
|
||||
|
||||
if(IsStopped()) return(0);
|
||||
if(CopyBuffer(BufferMainHandle,0,0,upTo+1,BufferMain)<=0){
|
||||
Print("Failed to create the Indicator! Error ",GetLastErrorText(GetLastError())," - ",GetLastError());
|
||||
return(0);
|
||||
}
|
||||
|
||||
for(i=pos; i<=upTo && !IsStopped(); i++){
|
||||
Open[i]=iOpen(Symbol(),PERIOD_CURRENT,i);
|
||||
Low[i]=iLow(Symbol(),PERIOD_CURRENT,i);
|
||||
High[i]=iHigh(Symbol(),PERIOD_CURRENT,i);
|
||||
Close[i]=iClose(Symbol(),PERIOD_CURRENT,i);
|
||||
Time[i]=iTime(Symbol(),PERIOD_CURRENT,i);
|
||||
}
|
||||
|
||||
if(IsNewCandle || prev_calculated==0){
|
||||
if(EnableDrawArrows) DrawArrows();
|
||||
}
|
||||
|
||||
if(EnableDrawArrows)
|
||||
DrawArrow(0);
|
||||
|
||||
if(EnableNotify)
|
||||
NotifyHit();
|
||||
|
||||
return(rates_total);
|
||||
}
|
||||
|
||||
|
||||
void OnDeinit(const int reason){
|
||||
CleanChart();
|
||||
}
|
||||
|
||||
|
||||
void OnInitInitialization(){
|
||||
LastNotificationTime=TimeCurrent();
|
||||
Shift=CandleToCheck;
|
||||
}
|
||||
|
||||
|
||||
bool OnInitPreChecksPass(){
|
||||
if(RSIPeriod<=0 || RSIHighLimit>100 || RSIHighLimit<0 || RSILowLimit>100 || RSILowLimit<0 || RSILowLimit>RSIHighLimit){
|
||||
Print("Wrong input parameter");
|
||||
return false;
|
||||
}
|
||||
if(Bars(Symbol(),PERIOD_CURRENT)<RSIPeriod){
|
||||
Print("Not Enough Historical Candles");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void CleanChart(){
|
||||
int Window=0;
|
||||
for(int i=ObjectsTotal(ChartID(),Window,-1)-1;i>=0;i--){
|
||||
if(StringFind(ObjectName(0,i),IndicatorName,0)>=0){
|
||||
ObjectDelete(0,ObjectName(0,i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void InitialiseHandles(){
|
||||
BufferMainHandle=iRSI(Symbol(),PERIOD_CURRENT,RSIPeriod,RSIAppliedPrice);
|
||||
ArrayResize(Open,BarsToScan);
|
||||
ArrayResize(High,BarsToScan);
|
||||
ArrayResize(Low,BarsToScan);
|
||||
ArrayResize(Close,BarsToScan);
|
||||
ArrayResize(Time,BarsToScan);
|
||||
}
|
||||
|
||||
|
||||
void InitialiseBuffers(){
|
||||
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
|
||||
ArraySetAsSeries(BufferMain,true);
|
||||
SetIndexBuffer(0,BufferMain,INDICATOR_DATA);
|
||||
IndicatorSetDouble(INDICATOR_LEVELVALUE,indicator_level1,(double)RSILowLimit);
|
||||
IndicatorSetDouble(INDICATOR_LEVELVALUE,indicator_level2,(double)RSIHighLimit);
|
||||
}
|
||||
|
||||
|
||||
datetime NewCandleTime=TimeCurrent();
|
||||
bool CheckIfNewCandle(){
|
||||
if(NewCandleTime==iTime(Symbol(),0,0)) return false;
|
||||
else{
|
||||
NewCandleTime=iTime(Symbol(),0,0);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Check if it is a trade Signla 0 - Neutral, 1 - Buy, -1 - Sell
|
||||
ENUM_TRADE_SIGNAL IsSignal(int i){
|
||||
int j=i+Shift;
|
||||
if(AlertSignal==RSI_BREAK_OUT){
|
||||
if(BufferMain[j+1]<RSIHighLimit && BufferMain[j]>RSIHighLimit) return SIGNAL_BUY;
|
||||
if(BufferMain[j+1]>RSILowLimit && BufferMain[j]<RSILowLimit) return SIGNAL_SELL;
|
||||
}
|
||||
if(AlertSignal==RSI_COMES_IN){
|
||||
if(BufferMain[j+1]<RSILowLimit && BufferMain[j]>RSILowLimit) return SIGNAL_BUY;
|
||||
if(BufferMain[j+1]>RSIHighLimit && BufferMain[j]<RSIHighLimit) return SIGNAL_SELL;
|
||||
}
|
||||
|
||||
return SIGNAL_NEUTRAL;
|
||||
}
|
||||
|
||||
|
||||
datetime LastNotification=TimeCurrent()-WaitTimeNotify*60;
|
||||
|
||||
void NotifyHit(){
|
||||
if(!EnableNotify || TimeCurrent()<(LastNotification+WaitTimeNotify*60)) return;
|
||||
if(!SendAlert && !SendApp && !SendEmail) return;
|
||||
if(Time[0]==LastNotificationTime) return;
|
||||
ENUM_TRADE_SIGNAL Signal=IsSignal(0);
|
||||
if(Signal==SIGNAL_NEUTRAL) return;
|
||||
string EmailSubject=IndicatorName+" "+Symbol()+" Notification ";
|
||||
string EmailBody="\r\n"+AccountCompany()+" - "+AccountName()+" - "+IntegerToString(AccountNumber())+"\r\n\r\n"+IndicatorName+" Notification for "+Symbol()+"\r\n\r\n";
|
||||
string AlertText=IndicatorName+" - "+Symbol()+" Notification\r\n";
|
||||
string AppText=AccountCompany()+" - "+AccountName()+" - "+IntegerToString(AccountNumber())+" - "+IndicatorName+" - "+Symbol()+" - ";
|
||||
string Text="";
|
||||
|
||||
if(Signal!=SIGNAL_NEUTRAL){
|
||||
Text+="The RSI indicator triggered a signal";
|
||||
}
|
||||
|
||||
EmailBody+=Text+"\r\n\r\n";
|
||||
AlertText+=Text+"\r\n";
|
||||
AppText+=Text+"";
|
||||
if(SendAlert) Alert(AlertText);
|
||||
if(SendEmail){
|
||||
if(!SendMail(EmailSubject,EmailBody)) Print("Error sending email "+IntegerToString(GetLastError()));
|
||||
}
|
||||
if(SendApp){
|
||||
if(!SendNotification(AppText)) Print("Error sending notification "+IntegerToString(GetLastError()));
|
||||
}
|
||||
LastNotification=TimeCurrent();
|
||||
Print(IndicatorName+"-"+Symbol()+" last notification sent "+TimeToString(LastNotification));
|
||||
}
|
||||
|
||||
|
||||
void DrawArrows(){
|
||||
RemoveArrows();
|
||||
if(!EnableDrawArrows || BarsToScan==0) return;
|
||||
int MaxBars=Bars(Symbol(),PERIOD_CURRENT);
|
||||
if(MaxBars>BarsToScan) MaxBars=BarsToScan;
|
||||
for(int i=MaxBars-2;i>=1;i--){
|
||||
DrawArrow(i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RemoveArrows(){
|
||||
int Window=-1;
|
||||
for(int i=ObjectsTotal(ChartID(),Window,-1)-1;i>=0;i--){
|
||||
if(StringFind(ObjectName(0,i),IndicatorName+"-ARWS-",0)>=0){
|
||||
ObjectDelete(0,ObjectName(0,i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int SignalWidth=0;
|
||||
|
||||
void DrawArrow(int i){
|
||||
RemoveArrowCurr();
|
||||
if(!EnableDrawArrows){
|
||||
RemoveArrows();
|
||||
return;
|
||||
}
|
||||
ENUM_TRADE_SIGNAL Signal=IsSignal(i);
|
||||
if(Signal==SIGNAL_NEUTRAL) return;
|
||||
datetime ArrowDate=iTime(Symbol(),0,i);
|
||||
string ArrowName=IndicatorName+"-ARWS-"+IntegerToString(ArrowDate);
|
||||
double ArrowPrice=0;
|
||||
ENUM_OBJECT ArrowType=OBJ_ARROW;
|
||||
color ArrowColor=0;
|
||||
int ArrowAnchor=0;
|
||||
string ArrowDesc="";
|
||||
if(Signal==SIGNAL_BUY){
|
||||
ArrowPrice=Low[i];
|
||||
ArrowType=(ENUM_OBJECT)ArrowBuy;
|
||||
ArrowColor=ArrowBuyColor;
|
||||
ArrowAnchor=ANCHOR_TOP;
|
||||
ArrowDesc="BUY";
|
||||
}
|
||||
if(Signal==SIGNAL_SELL){
|
||||
ArrowPrice=High[i];
|
||||
ArrowType=(ENUM_OBJECT)ArrowSell;
|
||||
ArrowColor=ArrowSellColor;
|
||||
ArrowAnchor=ANCHOR_BOTTOM;
|
||||
ArrowDesc="SELL";
|
||||
}
|
||||
ObjectCreate(0,ArrowName,OBJ_ARROW,0,ArrowDate,ArrowPrice);
|
||||
ObjectSetInteger(0,ArrowName,OBJPROP_COLOR,ArrowColor);
|
||||
ObjectSetInteger(0,ArrowName,OBJPROP_SELECTABLE,false);
|
||||
ObjectSetInteger(0,ArrowName,OBJPROP_HIDDEN,true);
|
||||
ObjectSetInteger(0,ArrowName,OBJPROP_ANCHOR,ArrowAnchor);
|
||||
ObjectSetInteger(0,ArrowName,OBJPROP_ARROWCODE,ArrowType);
|
||||
SignalWidth=ArrowSize;
|
||||
ObjectSetInteger(0,ArrowName,OBJPROP_WIDTH,SignalWidth);
|
||||
ObjectSetInteger(0,ArrowName,OBJPROP_STYLE,STYLE_SOLID);
|
||||
ObjectSetInteger(0,ArrowName,OBJPROP_BGCOLOR,ArrowColor);
|
||||
ObjectSetString(0,ArrowName,OBJPROP_TEXT,ArrowDesc);
|
||||
datetime CurrTime=iTime(Symbol(),0,0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void RemoveArrowCurr(){
|
||||
datetime ArrowDate=iTime(Symbol(),0,Shift);
|
||||
string ArrowName=IndicatorName+"-ARWS-"+IntegerToString(ArrowDate);
|
||||
ObjectDelete(0,ArrowName);
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,214 @@
|
||||
// More information about this indicator can be found at:
|
||||
// http://fxcodebase.com/code/viewtopic.php?f=38&t=69358
|
||||
// More information about this indicator can be found at:
|
||||
//http://fxcodebase.com/code/viewtopic.php?f=38&t=69358
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Copyright © 2020, Gehtsoft USA LLC |
|
||||
//| http://fxcodebase.com |
|
||||
//+------------------------------------------------------------------+
|
||||
//| Developed by : Mario Jemic |
|
||||
//| mario.jemic@gmail.com |
|
||||
//| https://AppliedMachineLearning.systems |
|
||||
//+------------------------------------------------------------------+
|
||||
//| Support our efforts by donating |
|
||||
//| Paypal : https://goo.gl/9Rj74e |
|
||||
//+------------------------------------------------------------------+
|
||||
//| Patreon : https://goo.gl/GdXWeN |
|
||||
//| BitCoin : 15VCJTLaz12Amr7adHSBtL9v8XomURo9RF |
|
||||
//| BitCoin Cash : 1BEtS465S3Su438Kc58h2sqvVvHK9Mijtg |
|
||||
//| Ethereum : 0x8C110cD61538fb6d7A2B47858F0c0AaBd663068D |
|
||||
//| LiteCoin : LLU8PSY2vsq7B9kRELLZQcKf5nJQrdeqwD |
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
#property copyright "Copyright © 2020, Gehtsoft USA LLC"
|
||||
#property link "http://fxcodebase.com"
|
||||
#property version "1.0"
|
||||
#property strict
|
||||
|
||||
input string Comment1 = "- Comma Separated Pairs - Ex: EURUSD,EURJPY,GBPUSD - ";
|
||||
input string Pairs = "EURUSD,EURJPY,USDJPY,GBPUSD";
|
||||
input color button_with_trades_color = Green; // Color of button with trades
|
||||
input ENUM_BASE_CORNER corner = CORNER_RIGHT_UPPER; // Corner
|
||||
input int x_start = 50;
|
||||
input int y_start = 20;
|
||||
int button_width = 50;
|
||||
int button_height = 20;
|
||||
|
||||
string IndicatorName;
|
||||
string IndicatorObjPrefix;
|
||||
string GenerateIndicatorName(const string target)
|
||||
{
|
||||
string name = target;
|
||||
return name;
|
||||
}
|
||||
|
||||
string _symbols[];
|
||||
void split(string& arr[], string str, string sym)
|
||||
{
|
||||
ArrayResize(arr, 0);
|
||||
int len = StringLen(str);
|
||||
for (int i=0; i < len;)
|
||||
{
|
||||
int pos = StringFind(str, sym, i);
|
||||
if (pos == -1)
|
||||
pos = len;
|
||||
|
||||
string item = StringSubstr(str, i, pos-i);
|
||||
StringTrimLeft(item);
|
||||
StringTrimRight(item);
|
||||
|
||||
int size = ArraySize(arr);
|
||||
ArrayResize(arr, size+1);
|
||||
arr[size] = item;
|
||||
|
||||
i = pos+1;
|
||||
}
|
||||
}
|
||||
|
||||
int OnInit(void)
|
||||
{
|
||||
IndicatorName = GenerateIndicatorName("Symbol Changer");
|
||||
IndicatorObjPrefix = "__" + IndicatorName + "__";
|
||||
IndicatorSetString(INDICATOR_SHORTNAME, IndicatorName);
|
||||
IndicatorSetInteger(INDICATOR_DIGITS, Digits());
|
||||
|
||||
split(_symbols, Pairs, ",");
|
||||
|
||||
DoInit();
|
||||
|
||||
return INIT_SUCCEEDED;
|
||||
}
|
||||
|
||||
void DoInit()
|
||||
{
|
||||
guiCreate();
|
||||
guiRefresh();
|
||||
}
|
||||
|
||||
void OnDeinit(const int reason)
|
||||
{
|
||||
ObjectsDeleteAll(0, IndicatorObjPrefix);
|
||||
}
|
||||
|
||||
int OnCalculate(const int rates_total, // size of input time series
|
||||
const int prev_calculated, // number of handled bars at the previous call
|
||||
const datetime& time[], // Time array
|
||||
const double& open[], // Open array
|
||||
const double& high[], // High array
|
||||
const double& low[], // Low array
|
||||
const double& close[], // Close array
|
||||
const long& tick_volume[], // Tick Volume array
|
||||
const long& volume[], // Real Volume array
|
||||
const int& spread[] // Spread array
|
||||
)
|
||||
{
|
||||
guiRefresh();
|
||||
|
||||
return rates_total;
|
||||
}
|
||||
|
||||
bool TradesExist(string symbol)
|
||||
{
|
||||
for (int i = PositionsTotal() - 1; i >= 0; i--)
|
||||
{
|
||||
if (PositionGetSymbol(i) == symbol)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void guiRefresh()
|
||||
{
|
||||
for (int i = 0; i < ArraySize(_symbols); ++i)
|
||||
{
|
||||
string item = _symbols[i];
|
||||
if (_Symbol == item)
|
||||
ObjectSetInteger(0, IndicatorObjPrefix + "_BT_" + item, OBJPROP_STATE, true);
|
||||
else
|
||||
ObjectSetInteger(0, IndicatorObjPrefix + "_BT_" + item, OBJPROP_STATE, false);
|
||||
if (TradesExist(item))
|
||||
{
|
||||
ObjectSetInteger(0, IndicatorObjPrefix + "_BT_" + item, OBJPROP_BGCOLOR, button_with_trades_color);
|
||||
}
|
||||
else
|
||||
{
|
||||
ObjectSetInteger(0, IndicatorObjPrefix + "_BT_" + item, OBJPROP_BGCOLOR, clrLightGray);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void guiCreate()
|
||||
{
|
||||
for (int i = 0; i < ArraySize(_symbols); ++i)
|
||||
{
|
||||
string item = _symbols[i];
|
||||
ButtonCreate(IndicatorObjPrefix + "_BT_" + item, x_start + (button_width * i), y_start, button_width, button_height, item);
|
||||
}
|
||||
}
|
||||
|
||||
void OnChartEvent(const int id,
|
||||
const long &lparam,
|
||||
const double &dparam,
|
||||
const string &sparam
|
||||
)
|
||||
{
|
||||
if (id == CHARTEVENT_OBJECT_CLICK)
|
||||
{
|
||||
if (StringFind(sparam,"_BT_",0) != -1)
|
||||
{
|
||||
for (int i = 0; i < ArraySize(_symbols); ++i)
|
||||
{
|
||||
string item = _symbols[i];
|
||||
if (StringFind(sparam, item, 0) != -1)
|
||||
{
|
||||
ChartSetSymbolPeriod(0, item, _Period);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool ButtonCreate(const string name = "Button", // button name
|
||||
const int x=10, // X coordinate
|
||||
const int y=10, // Y coordinate
|
||||
const int width=20, // button width
|
||||
const int height=20, // button height
|
||||
const string text="", // text
|
||||
const string tooltip="\n", // tooltip
|
||||
const int font_size=8, // font size
|
||||
const string font="Arial", // font
|
||||
const color clr=clrBlack, // text color
|
||||
const color back_clr=clrLightGray // background color
|
||||
)
|
||||
{
|
||||
ResetLastError();
|
||||
if(ObjectFind(0,name)>-1)
|
||||
return(false);
|
||||
|
||||
if(!ObjectCreate(0,name,OBJ_BUTTON,0,0,0))
|
||||
{
|
||||
Print(__FUNCTION__,
|
||||
": failed to create button! Error code = ",GetLastError());
|
||||
return(false);
|
||||
}
|
||||
ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
|
||||
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
|
||||
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
|
||||
ObjectSetInteger(0,name,OBJPROP_XSIZE,width);
|
||||
ObjectSetInteger(0,name,OBJPROP_YSIZE,height);
|
||||
ObjectSetInteger(0,name,OBJPROP_CORNER, corner);
|
||||
ObjectSetString(0,name,OBJPROP_FONT,font);
|
||||
ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
|
||||
ObjectSetString(0,name,OBJPROP_TEXT,text);
|
||||
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,font_size);
|
||||
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,back_clr);
|
||||
ObjectSetInteger(0,name,OBJPROP_BACK,false);
|
||||
ObjectSetInteger(0,name,OBJPROP_STATE,false);
|
||||
ObjectSetInteger(0,name,OBJPROP_ZORDER,10);
|
||||
ObjectSetString(0,name,OBJPROP_TOOLTIP,tooltip);
|
||||
return(true);
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,116 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| BB_Price_on_channel.mq5 |
|
||||
//| Copyright 2009, MetaQuotes Software Corp. |
|
||||
//| http://www.mql5.com |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "2009, MetaQuotes Software Corp."
|
||||
#property link "http://www.mql5.com"
|
||||
#property version "1.00"
|
||||
|
||||
#property indicator_separate_window
|
||||
#property indicator_buffers 8
|
||||
#property indicator_plots 3
|
||||
//---- plot MA
|
||||
#property indicator_label1 "Bollinger High"
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_color1 clrRed
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 1
|
||||
|
||||
#property indicator_label2 "Open;High;Low;Close"
|
||||
#property indicator_type2 DRAW_BARS
|
||||
#property indicator_color2 clrBlue
|
||||
#property indicator_style2 STYLE_SOLID
|
||||
#property indicator_width2 1
|
||||
|
||||
#property indicator_label3 "Bollinger Low"
|
||||
#property indicator_type3 DRAW_LINE
|
||||
#property indicator_color3 clrRed
|
||||
#property indicator_style3 STYLE_SOLID
|
||||
#property indicator_width3 1
|
||||
#property indicator_level1 50
|
||||
#property indicator_level2 -50
|
||||
|
||||
//--- input parameters
|
||||
input int period=15;
|
||||
input double deviation=2;
|
||||
input ENUM_APPLIED_PRICE price=PRICE_WEIGHTED;
|
||||
|
||||
//--- indicator buffers
|
||||
double MABuffer[];
|
||||
double MABuffer2[];
|
||||
double BolingerBuffer[];
|
||||
double BolingerBuffer_l[];
|
||||
double BarsBuffer1[];
|
||||
double BarsBuffer2[];
|
||||
double BarsBuffer3[];
|
||||
double BarsBuffer4[];
|
||||
int ma_handle;
|
||||
string symbol;
|
||||
int indx1=100000;
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0,BolingerBuffer,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,BarsBuffer1,INDICATOR_DATA);
|
||||
SetIndexBuffer(2,BarsBuffer2,INDICATOR_DATA);
|
||||
SetIndexBuffer(3,BarsBuffer3,INDICATOR_DATA);
|
||||
SetIndexBuffer(4,BarsBuffer4,INDICATOR_DATA);
|
||||
SetIndexBuffer(5,BolingerBuffer_l,INDICATOR_DATA);
|
||||
IndicatorSetInteger(INDICATOR_DIGITS,0);
|
||||
|
||||
SetIndexBuffer(6,MABuffer,INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(7,MABuffer2,INDICATOR_CALCULATIONS);
|
||||
|
||||
symbol=_Symbol;
|
||||
//--- set short name
|
||||
IndicatorSetString(INDICATOR_SHORTNAME,"Bolkinger View ("+symbol+"): "" ");
|
||||
//---
|
||||
ma_handle=iBands(Symbol(),0,period,0,deviation,price);
|
||||
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[])
|
||||
{
|
||||
//--- check if all data calculated
|
||||
if(BarsCalculated(ma_handle)<rates_total) return(0);
|
||||
//--- we can copy not all data
|
||||
int to_copy;
|
||||
if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
|
||||
else
|
||||
{
|
||||
to_copy=rates_total-prev_calculated;
|
||||
//--- last value is always copied
|
||||
to_copy++;
|
||||
}
|
||||
//--- try to copy
|
||||
CopyBuffer(ma_handle,0,0,to_copy,MABuffer);
|
||||
CopyBuffer(ma_handle,1,0,to_copy,MABuffer2);
|
||||
//--- calculate
|
||||
for(int i=0;i<rates_total && !IsStopped();i++)
|
||||
{
|
||||
BolingerBuffer[i]=(MABuffer2[i]-MABuffer[i])*indx1;
|
||||
BolingerBuffer_l[i]=-BolingerBuffer[i];
|
||||
|
||||
BarsBuffer1[i]=(open[i]-MABuffer[i])*indx1;
|
||||
BarsBuffer2[i]=(high[i]-MABuffer[i])*indx1;
|
||||
BarsBuffer3[i]=(low[i]-MABuffer[i])*indx1;
|
||||
BarsBuffer4[i]=(close[i]-MABuffer[i])*indx1;
|
||||
}
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
+365
@@ -0,0 +1,365 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| BBSqueeze.mq5 |
|
||||
//| Copyright © 2005, Nick Bilak |
|
||||
//| beluck[AT]gmail.com |
|
||||
//+------------------------------------------------------------------+
|
||||
//| Place the SmoothAlgorithms.mqh file |
|
||||
//| to the terminal_data_folder\MQL5\Include |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright © 2005, Nick Bilak"
|
||||
#property link "http://metatrader.50webs.com/"
|
||||
//---- indicator version
|
||||
#property version "1.00"
|
||||
//---- drawing the indicator in a separate window
|
||||
#property indicator_separate_window
|
||||
//---- number of indicator buffers 4
|
||||
#property indicator_buffers 4
|
||||
//---- 4 plots are used
|
||||
#property indicator_plots 4
|
||||
//+-----------------------------------+
|
||||
//| Declaration of constants |
|
||||
//+-----------------------------------+
|
||||
#define RESET 0 // the constant for getting the command for the indicator recalculation back to the terminal
|
||||
//+-----------------------------------+
|
||||
//| Indicator drawing parameters |
|
||||
//+-----------------------------------+
|
||||
//---- drawing the indicator as a histogram
|
||||
#property indicator_type1 DRAW_HISTOGRAM
|
||||
//---- teal color is used
|
||||
#property indicator_color1 Teal
|
||||
//---- indicator line is a solid one
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
//---- indicator line width is equal to 2
|
||||
#property indicator_width1 2
|
||||
//---- displaying the indicator label
|
||||
#property indicator_label1 "Uptrend"
|
||||
|
||||
//---- drawing the indicator as a histogram
|
||||
#property indicator_type2 DRAW_HISTOGRAM
|
||||
//---- magenta color is used
|
||||
#property indicator_color2 Magenta
|
||||
//---- indicator line is a solid one
|
||||
#property indicator_style2 STYLE_SOLID
|
||||
//---- indicator line width is equal to 2
|
||||
#property indicator_width2 2
|
||||
//---- displaying the indicator label
|
||||
#property indicator_label2 "Downtrend"
|
||||
//+-----------------------------------+
|
||||
//| Indicator drawing parameters |
|
||||
//+-----------------------------------+
|
||||
//---- drawing the indicator as labels
|
||||
#property indicator_type3 DRAW_ARROW
|
||||
//---- blue color is used
|
||||
#property indicator_color3 Blue
|
||||
//---- indicator line width is equal to 2
|
||||
#property indicator_width3 2
|
||||
//---- displaying the indicator label
|
||||
#property indicator_label3 "Strong trend"
|
||||
//+-----------------------------------+
|
||||
//| Indicator drawing parameters |
|
||||
//+-----------------------------------+
|
||||
//---- drawing the indicator as labels
|
||||
#property indicator_type4 DRAW_ARROW
|
||||
//---- MediumPurple color is used
|
||||
#property indicator_color4 MediumPurple
|
||||
//---- indicator line width is equal to 2
|
||||
#property indicator_width4 2
|
||||
//---- displaying the indicator label
|
||||
#property indicator_label4 "Weak trend"
|
||||
//+-----------------------------------+
|
||||
//| Smoothings classes description |
|
||||
//+-----------------------------------+
|
||||
#include <SmoothAlgorithms.mqh>
|
||||
//+-----------------------------------+
|
||||
//---- declaration of the CXMA class variables from the SmoothAlgorithms.mqh file
|
||||
CXMA XMA1;
|
||||
//+-----------------------------------+
|
||||
//| Declaration of enumerations |
|
||||
//+-----------------------------------+
|
||||
enum Applied_price_ // Type of constant
|
||||
{
|
||||
PRICE_CLOSE_ = 1, // Close
|
||||
PRICE_OPEN_, // Open
|
||||
PRICE_HIGH_, // High
|
||||
PRICE_LOW_, // Low
|
||||
PRICE_MEDIAN_, // Median Price (HL/2)
|
||||
PRICE_TYPICAL_, // Typical Price (HLC/3)
|
||||
PRICE_WEIGHTED_, // Weighted Close (HLCC/4)
|
||||
PRICE_SIMPLE, // Simple Price (OC/2)
|
||||
PRICE_QUARTER_, // Quarted Price (HLOC/4)
|
||||
PRICE_TRENDFOLLOW0_, // TrendFollow_1 Price
|
||||
PRICE_TRENDFOLLOW1_ // TrendFollow_2 Price
|
||||
};
|
||||
/*enum Smooth_Method - enumeration is declared in the SmoothAlgorithms.mqh file
|
||||
{
|
||||
MODE_SMA_, // SMA
|
||||
MODE_EMA_, // EMA
|
||||
MODE_SMMA_, // SMMA
|
||||
MODE_LWMA_, // LWMA
|
||||
MODE_JJMA, // JJMA
|
||||
MODE_JurX, // JurX
|
||||
MODE_ParMA, // ParMA
|
||||
MODE_T3, // T3
|
||||
MODE_VIDYA, // VIDYA
|
||||
MODE_AMA, // AMA
|
||||
}; */
|
||||
//+-----------------------------------+
|
||||
//| Indicator input parameters |
|
||||
//+-----------------------------------+
|
||||
input Smooth_Method BB_Method=MODE_EMA_; // Histogram smoothing method
|
||||
input int BB_Period = 20; // Bollinger Bands period
|
||||
input int BB_Phase= 100; // Bollinger Bands smoothing parameter
|
||||
input double BB_Deviation=2.0; // Number of deviations
|
||||
input Applied_price_ AppliedPrice=PRICE_CLOSE_; // Applied price
|
||||
input double ATR_Period=20; // ATR period
|
||||
input double ATR_Factor=1.5; // ATR ratio
|
||||
//+-----------------------------------+
|
||||
//---- declaration of the integer variables for the start of data calculation
|
||||
int min_rates_total,min_rates_xma;
|
||||
//---- declaration of global variables
|
||||
int Count[];
|
||||
double Xma[];
|
||||
//---- declaration of integer variables for the indicators handles
|
||||
int ATR_Handle,STD_Handle;
|
||||
//---- declaration of dynamic arrays that
|
||||
//---- will be used as indicator buffers
|
||||
double UpHistBuffer[],DnHistBuffer[],UpArrBuffer[],DnArrBuffer[];
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
//---- initialization of variables of the start of data calculation
|
||||
min_rates_xma=XMA1.GetStartBars(BB_Method,BB_Period,BB_Phase);
|
||||
min_rates_total=int(MathMax(min_rates_xma,ATR_Period));
|
||||
|
||||
//---- getting handle of the iStdDev indicator
|
||||
STD_Handle=iStdDev(NULL,0,BB_Period,0,MODE_SMA,PRICE_CLOSE);
|
||||
if(STD_Handle==INVALID_HANDLE)
|
||||
{
|
||||
Print(" Failed to get handle of the iStdDev indicator");
|
||||
return(1);
|
||||
}
|
||||
|
||||
//---- getting handle of the ATR indicator
|
||||
ATR_Handle=iATR(NULL,0,15);
|
||||
if(ATR_Handle==INVALID_HANDLE)
|
||||
{
|
||||
Print(" Failed to get handle of the iATR indicator");
|
||||
return(1);
|
||||
}
|
||||
|
||||
//---- memory distribution for variables' arrays
|
||||
if(ArrayResize(Count,BB_Period)<BB_Period) Print("Failed to distribute the memory for Count[] array");
|
||||
if(ArrayResize(Xma,BB_Period)<BB_Period) Print("Failed to distribute the memory for Xma[] array");
|
||||
|
||||
ArrayInitialize(Count,0);
|
||||
ArrayInitialize(Xma,0);
|
||||
|
||||
//---- set UpHistBuffer[] dynamic array as an indicator buffer
|
||||
SetIndexBuffer(0,UpHistBuffer,INDICATOR_DATA);
|
||||
//---- performing the shift of the beginning of the indicator drawing
|
||||
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
|
||||
//---- setting the indicator values that won't be visible on a chart
|
||||
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
||||
//---- indexing the elements in the buffer as timeseries
|
||||
ArraySetAsSeries(UpHistBuffer,true);
|
||||
|
||||
//---- set DnHistBuffer[] dynamic array as an indicator buffer
|
||||
SetIndexBuffer(1,DnHistBuffer,INDICATOR_DATA);
|
||||
//---- performing the shift of the beginning of the indicator drawing
|
||||
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
|
||||
//---- setting the indicator values that won't be visible on a chart
|
||||
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
||||
//---- indexing the elements in the buffer as timeseries
|
||||
ArraySetAsSeries(DnHistBuffer,true);
|
||||
|
||||
//---- set UpArrBuffer[] dynamic array as an indicator buffer
|
||||
SetIndexBuffer(2,UpArrBuffer,INDICATOR_DATA);
|
||||
//---- performing the shift of the beginning of the indicator drawing
|
||||
PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
|
||||
//---- setting the indicator values that won't be visible on a chart
|
||||
PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
||||
//---- indicator symbol
|
||||
PlotIndexSetInteger(2,PLOT_ARROW,159);
|
||||
//---- indexing the elements in the buffer as timeseries
|
||||
ArraySetAsSeries(UpArrBuffer,true);
|
||||
|
||||
//---- set DnArrBuffer[] dynamic array as an indicator buffer
|
||||
SetIndexBuffer(3,DnArrBuffer,INDICATOR_DATA);
|
||||
//---- performing the shift of the beginning of the indicator drawing
|
||||
PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);
|
||||
//---- setting the indicator values that won't be visible on a chart
|
||||
PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
||||
//---- indicator symbol
|
||||
PlotIndexSetInteger(3,PLOT_ARROW,159);
|
||||
//---- indexing the elements in the buffer as timeseries
|
||||
ArraySetAsSeries(DnArrBuffer,true);
|
||||
|
||||
//--- creation of the name to be displayed in a separate sub-window and in a tooltip
|
||||
IndicatorSetString(INDICATOR_SHORTNAME,"BBSqueeze");
|
||||
//--- determination of accuracy of displaying the indicator values
|
||||
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
|
||||
//---- initialization end
|
||||
return(0);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total, // number of bars in history at the current tick
|
||||
const int prev_calculated,// number of bars calculated at previous call
|
||||
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[])
|
||||
{
|
||||
//---- checking the number of bars to be enough for the calculation
|
||||
if(BarsCalculated(ATR_Handle)<rates_total
|
||||
|| BarsCalculated(STD_Handle)<rates_total
|
||||
|| rates_total<min_rates_total) return(RESET);
|
||||
|
||||
//---- declarations of local variables
|
||||
int to_copy,limit,bar,maxbar,maxbar1;
|
||||
double STD[],ATR[],lregress,bbs,price_;
|
||||
|
||||
maxbar=rates_total-1;
|
||||
maxbar1=maxbar-min_rates_xma-2*BB_Period;
|
||||
|
||||
//---- calculation of the 'limit' starting index for the bars recalculation loop
|
||||
if(prev_calculated>rates_total || prev_calculated<=0)// checking for the first start of the indicator calculation
|
||||
limit=rates_total-1; // starting index for calculation of all bars
|
||||
else limit=rates_total-prev_calculated; // starting index for calculation of new bars
|
||||
|
||||
//---- calculation of the necessary amount of data to be copied
|
||||
to_copy=limit+1;
|
||||
//---- copy the newly appeared data into the STD[] and ATR[] arrays
|
||||
if(CopyBuffer(STD_Handle,0,0,to_copy,STD)<=0) return(RESET);
|
||||
if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) return(RESET);
|
||||
|
||||
//---- indexing elements in arrays as time series
|
||||
ArraySetAsSeries(STD,true);
|
||||
ArraySetAsSeries(ATR,true);
|
||||
ArraySetAsSeries(high,true);
|
||||
ArraySetAsSeries(low,true);
|
||||
ArraySetAsSeries(open,true);
|
||||
ArraySetAsSeries(close,true);
|
||||
|
||||
//---- main indicator calculation loop
|
||||
for(bar=limit; bar>=0 && !IsStopped(); bar--)
|
||||
{
|
||||
price_=PriceSeries(AppliedPrice,bar,open,low,high,close);
|
||||
Xma[Count[0]]=XMA1.XMASeries(maxbar,prev_calculated,rates_total,BB_Method,BB_Phase,BB_Period,price_,bar,true);
|
||||
if(bar>maxbar1)
|
||||
{
|
||||
Recount_ArrayZeroPos(Count,BB_Period);
|
||||
continue;
|
||||
}
|
||||
|
||||
lregress=LinearRegressionValue(BB_Period,bar,open,low,high,close);
|
||||
|
||||
if(lregress<0)
|
||||
{
|
||||
UpHistBuffer[bar]=EMPTY_VALUE;
|
||||
DnHistBuffer[bar]=lregress;
|
||||
}
|
||||
else
|
||||
{
|
||||
UpHistBuffer[bar]=lregress;
|
||||
DnHistBuffer[bar]=EMPTY_VALUE;
|
||||
}
|
||||
|
||||
bbs=BB_Deviation*STD[bar]/(ATR[bar]*ATR_Factor);
|
||||
|
||||
if(bbs<1)
|
||||
{
|
||||
DnArrBuffer[bar]=0;
|
||||
UpArrBuffer[bar]=EMPTY_VALUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
UpArrBuffer[bar]=0;
|
||||
DnArrBuffer[bar]=EMPTY_VALUE;
|
||||
}
|
||||
|
||||
if(bar) Recount_ArrayZeroPos(Count,BB_Period);
|
||||
}
|
||||
//----
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Linear regression calculation |
|
||||
//+------------------------------------------------------------------+
|
||||
double LinearRegressionValue(int Len,
|
||||
int index,
|
||||
const double &Open[],
|
||||
const double &Low[],
|
||||
const double &High[],
|
||||
const double &Close[])
|
||||
{
|
||||
//----
|
||||
double SumBars,Sum1,Sum2,SumY,Slope,SumSqrBars;
|
||||
double dxma,Num1,Num2,HH,LL,Intercept,LinearRegValue;
|
||||
|
||||
SumY=0;
|
||||
Sum1=0;
|
||||
//----
|
||||
SumBars=Len *(Len-1)*0.5;
|
||||
SumSqrBars=(Len-1)*Len *(2*Len-1)/6;
|
||||
//----
|
||||
for(int x=0; x<Len;x++)
|
||||
{
|
||||
HH=Low[index+x];
|
||||
LL=High[index+x];
|
||||
|
||||
for(int y=x; y<x+Len; y++)
|
||||
{
|
||||
HH=MathMax(HH,High[index+y]);
|
||||
LL=MathMin(LL,Low[index+y]);
|
||||
}
|
||||
|
||||
dxma=Close[index+x]-((HH+LL)/2+Xma[Count[x]])/2;
|
||||
Sum1+=x*dxma;
|
||||
SumY+=dxma;
|
||||
}
|
||||
|
||||
Sum2=SumBars*SumY;
|
||||
Num1=Len*Sum1-Sum2;
|
||||
Num2=SumBars*SumBars-Len*SumSqrBars;
|
||||
//----
|
||||
if(Num2!=0.0) Slope=Num1/Num2;
|
||||
else Slope=0;
|
||||
|
||||
Intercept=(SumY-Slope*SumBars)/Len;
|
||||
LinearRegValue=Intercept+Slope*(Len-1);
|
||||
//----
|
||||
return(LinearRegValue);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Recalculation of position of the newest element in the array |
|
||||
//+------------------------------------------------------------------+
|
||||
void Recount_ArrayZeroPos(int &CoArr[],// Return the current value of the price series by the link
|
||||
uint Size)
|
||||
{
|
||||
//----
|
||||
int numb,Max1,Max2;
|
||||
static int count=1;
|
||||
|
||||
Max1=int(Size-1);
|
||||
Max2=int(Size);
|
||||
|
||||
count--;
|
||||
if(count<0) count=Max1;
|
||||
|
||||
for(int iii=0; iii<Max2; iii++)
|
||||
{
|
||||
numb=iii+count;
|
||||
if(numb>Max1) numb-=Max2;
|
||||
CoArr[iii]=numb;
|
||||
}
|
||||
//----
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+175
@@ -0,0 +1,175 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| iBBFill.mq5 |
|
||||
//| Copyright Integer |
|
||||
//| http://dmffx.com |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Integer"
|
||||
#property link "http://dmffx.com"
|
||||
#property version "1.00"
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 10
|
||||
#property indicator_plots 6
|
||||
//--- plot Label1
|
||||
#property indicator_label1 "UpTrend"
|
||||
#property indicator_type1 DRAW_FILLING
|
||||
#property indicator_color1 C'10,10,70'
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
#property indicator_width1 1
|
||||
//--- plot Label2
|
||||
#property indicator_label2 "DnTrend"
|
||||
#property indicator_type2 DRAW_FILLING
|
||||
#property indicator_color2 C'70,10,10'
|
||||
#property indicator_style2 STYLE_SOLID
|
||||
#property indicator_width2 1
|
||||
//--- plot Label3
|
||||
#property indicator_label3 "Flat"
|
||||
#property indicator_type3 DRAW_FILLING
|
||||
#property indicator_color3 C'50,50,50'
|
||||
#property indicator_style3 STYLE_SOLID
|
||||
#property indicator_width3 1
|
||||
//--- plot Label4
|
||||
#property indicator_label4 "BB MA"
|
||||
#property indicator_type4 DRAW_LINE
|
||||
#property indicator_color4 Yellow
|
||||
#property indicator_style4 STYLE_SOLID
|
||||
#property indicator_width4 1
|
||||
//--- plot Label5
|
||||
#property indicator_label5 "BB Upper"
|
||||
#property indicator_type5 DRAW_LINE
|
||||
#property indicator_color5 DodgerBlue
|
||||
#property indicator_style5 STYLE_SOLID
|
||||
#property indicator_width5 1
|
||||
//--- plot Label6
|
||||
#property indicator_label6 "BB Lower"
|
||||
#property indicator_type6 DRAW_LINE
|
||||
#property indicator_color6 Red
|
||||
#property indicator_style6 STYLE_SOLID
|
||||
#property indicator_width4 1
|
||||
//--- input parameters
|
||||
input int BBPeriod = 20; // Ïåðèîä BB
|
||||
input double BBDeviation = 2; // Øèðèíà BB
|
||||
input ENUM_APPLIED_PRICE BBPrice = PRICE_CLOSE; // Öåíà BB
|
||||
//--- indicator buffers
|
||||
double Upper1[];
|
||||
double Lower1[];
|
||||
double Upper2[];
|
||||
double Lower2[];
|
||||
double Upper3[];
|
||||
double Lower3[];
|
||||
double BCBuf[];
|
||||
double BUBuf[];
|
||||
double BLBuf[];
|
||||
double Trend[];
|
||||
int BBHand;
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
SetIndexBuffer(0,Upper1,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,Lower1,INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(2,Upper2,INDICATOR_DATA);
|
||||
SetIndexBuffer(3,Lower2,INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(4,Upper3,INDICATOR_DATA);
|
||||
SetIndexBuffer(5,Lower3,INDICATOR_CALCULATIONS);
|
||||
SetIndexBuffer(6,BCBuf,INDICATOR_DATA);
|
||||
SetIndexBuffer(7,BUBuf,INDICATOR_DATA);
|
||||
SetIndexBuffer(8,BLBuf,INDICATOR_DATA);
|
||||
SetIndexBuffer(9,Trend,INDICATOR_CALCULATIONS);
|
||||
|
||||
BBHand=iBands(NULL,PERIOD_CURRENT,BBPeriod,0,BBDeviation,BBPrice);
|
||||
|
||||
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 limit=0,limit1=0;
|
||||
if(prev_calculated>0)
|
||||
{
|
||||
limit=prev_calculated-1;
|
||||
limit1=limit;
|
||||
}
|
||||
else
|
||||
{
|
||||
limit=0;
|
||||
limit1=1;
|
||||
}
|
||||
|
||||
CopyBuffer(BBHand,0,0,rates_total-limit,BCBuf);
|
||||
CopyBuffer(BBHand,1,0,rates_total-limit,BUBuf);
|
||||
CopyBuffer(BBHand,2,0,rates_total-limit,BLBuf);
|
||||
|
||||
for(int i=limit1;i<rates_total;i++)
|
||||
{
|
||||
Trend[i]=Trend[i-1];
|
||||
Upper1[i]=0;
|
||||
Lower1[i]=0;
|
||||
Upper2[i]=0;
|
||||
Lower2[i]=0;
|
||||
Upper3[i]=0;
|
||||
Lower3[i]=0;
|
||||
|
||||
if(Trend[i]==1 && close[i]<BCBuf[i])
|
||||
{
|
||||
Trend[i]=0;
|
||||
}
|
||||
if(Trend[i]==-1 && close[i]>BCBuf[i])
|
||||
{
|
||||
Trend[i]=0;
|
||||
}
|
||||
|
||||
if(close[i]>BUBuf[i])
|
||||
{
|
||||
Trend[i]=1;
|
||||
}
|
||||
if(close[i]<BLBuf[i])
|
||||
{
|
||||
Trend[i]=-1;
|
||||
}
|
||||
|
||||
switch((int)Trend[i])
|
||||
{
|
||||
case 1:
|
||||
Upper1[i]=BUBuf[i];
|
||||
Lower1[i]=BLBuf[i];
|
||||
if(Trend[i-1]!=1)
|
||||
{
|
||||
Upper1[i-1]=BUBuf[i-1];
|
||||
Lower1[i-1]=BLBuf[i-1];
|
||||
}
|
||||
break;
|
||||
case -1:
|
||||
Upper2[i]=BUBuf[i];
|
||||
Lower2[i]=BLBuf[i];
|
||||
if(Trend[i-1]!=-1)
|
||||
{
|
||||
Upper2[i-1]=BUBuf[i-1];
|
||||
Lower2[i-1]=BLBuf[i-1];
|
||||
}
|
||||
break;
|
||||
case 0:
|
||||
Upper3[i]=BUBuf[i];
|
||||
Lower3[i]=BLBuf[i];
|
||||
if(Trend[i-1]!=0)
|
||||
{
|
||||
Upper3[i-1]=BUBuf[i-1];
|
||||
Lower3[i-1]=BLBuf[i-1];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
+579
@@ -0,0 +1,579 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| MACD Sample.mq5 |
|
||||
//| Copyright 2009-2013, MetaQuotes Software Corp. |
|
||||
//| http://www.mql5.com |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2014 Semet Gaetan"
|
||||
#property link "http://www.xeberon.net/gaetan"
|
||||
#property version "1.0"
|
||||
#property description "Gaetan Semet Expert Advisor"
|
||||
#property description "This expert advisor triggers position on MACD and"
|
||||
#property description "crossing Moving Averages. After a bid is placed"
|
||||
#property description "it is qualified as 'gaining' or loosing'. If loosing,"
|
||||
#property description "the stop will triggered to stop losses. If gaining,"
|
||||
#property description "a trailing stop will be placed that allow a retracement"
|
||||
#property description "of N percents. Only a small number of retracement is"
|
||||
#property description "allowed, after a stop loss will be placed."
|
||||
|
||||
|
||||
|
||||
//---
|
||||
#include <Trade\Trade.mqh>
|
||||
#include <Trade\SymbolInfo.mqh>
|
||||
#include <Trade\PositionInfo.mqh>
|
||||
#include <Trade\AccountInfo.mqh>
|
||||
|
||||
//---
|
||||
input double InpLots = 0.1; // Size of lots for each position
|
||||
input int InpAllowedRetracementPercent = 50; // Allowed retracement for gaining position (in percent)
|
||||
input int IntMaxNumberOfRetracement = 2; // Maximum number of allowed retracement before placing a close stop loss.
|
||||
input int InpMACDOpenLevel = 3; // MACD open level (in pips)
|
||||
input int InpMACDCloseLevel = 2; // MACD close level (in pips)
|
||||
input int InpMA20TrendPeriod = 20; // Long MA trend period
|
||||
input int InpMA6TrendPeriod = 6; // Short MA trend period
|
||||
|
||||
//---
|
||||
int ExtTimeOut=10; // time out in seconds between trade operations
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| CMacdExpert class |
|
||||
//+------------------------------------------------------------------+
|
||||
class CMacdExpert
|
||||
{
|
||||
protected:
|
||||
double m_adjusted_point; // point value adjusted for 3 or 5 points
|
||||
CTrade m_trade; // trading object
|
||||
CSymbolInfo m_symbol; // symbol info object
|
||||
CPositionInfo m_position; // trade position object
|
||||
CAccountInfo m_account; // account info wrapper
|
||||
|
||||
//--- indicators
|
||||
int m_handle_macd; // MACD indicator handle
|
||||
int m_handle_ema20; // long moving average indicator handle
|
||||
int m_handle_ema6; // short moving average indicator handle
|
||||
|
||||
//--- indicator buffers
|
||||
double m_buff_MACD_main[]; // MACD indicator main buffer
|
||||
double m_buff_MACD_signal[]; // MACD indicator signal buffer
|
||||
double m_buff_EMA[]; // EMA indicator buffer
|
||||
|
||||
//--- indicator data for processing
|
||||
double m_macd_current;
|
||||
double m_macd_previous;
|
||||
double m_signal_current;
|
||||
double m_signal_previous;
|
||||
double m_ema_current;
|
||||
double m_ema_previous;
|
||||
|
||||
//---
|
||||
double m_macd_open_level;
|
||||
double m_macd_close_level;
|
||||
double m_traling_stop;
|
||||
double m_take_profit;
|
||||
|
||||
public:
|
||||
CMacdExpert(void);
|
||||
~CMacdExpert(void);
|
||||
bool Init(void);
|
||||
void Deinit(void);
|
||||
bool Processing(void);
|
||||
|
||||
protected:
|
||||
bool InitCheckParameters(const int digits_adjust);
|
||||
bool InitIndicators(void);
|
||||
bool LongClosed(void);
|
||||
bool ShortClosed(void);
|
||||
bool LongModified(void);
|
||||
bool ShortModified(void);
|
||||
bool LongOpened(void);
|
||||
bool ShortOpened(void);
|
||||
};
|
||||
|
||||
//--- global expert
|
||||
CMacdExpert ExtExpert;
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Constructor |
|
||||
//+------------------------------------------------------------------+
|
||||
CMacdExpert::CMacdExpert(void) : m_adjusted_point(0),
|
||||
m_handle_macd(INVALID_HANDLE),
|
||||
m_handle_ema20(INVALID_HANDLE),
|
||||
m_handle_ema6(INVALID_HANDLE),
|
||||
m_macd_current(0),
|
||||
m_macd_previous(0),
|
||||
m_signal_current(0),
|
||||
m_signal_previous(0),
|
||||
m_ema_current(0),
|
||||
m_ema_previous(0),
|
||||
m_macd_open_level(0),
|
||||
m_macd_close_level(0),
|
||||
m_traling_stop(0),
|
||||
m_take_profit(0)
|
||||
{
|
||||
ArraySetAsSeries(m_buff_MACD_main, true);
|
||||
ArraySetAsSeries(m_buff_MACD_signal, true);
|
||||
ArraySetAsSeries(m_buff_EMA, true);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Destructor |
|
||||
//+------------------------------------------------------------------+
|
||||
CMacdExpert::~CMacdExpert(void)
|
||||
{
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Initialization and checking for input parameters |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CMacdExpert::Init(void)
|
||||
{
|
||||
//--- initialize common information
|
||||
m_symbol.Name(Symbol()); // symbol
|
||||
m_trade.SetExpertMagicNumber(0xcafebabe); // magic
|
||||
|
||||
//--- tuning for 3 or 5 digits
|
||||
int digits_adjust=1;
|
||||
if (m_symbol.Digits() == 3 || m_symbol.Digits() == 5)
|
||||
{
|
||||
digits_adjust = 10;
|
||||
}
|
||||
m_adjusted_point = m_symbol.Point() * digits_adjust;
|
||||
|
||||
//--- set default deviation for trading in adjusted points
|
||||
m_macd_open_level = InpMACDOpenLevel * m_adjusted_point;
|
||||
m_macd_close_level= InpMACDCloseLevel * m_adjusted_point;
|
||||
m_traling_stop = InpTrailingStop * m_adjusted_point;
|
||||
m_take_profit = InpTakeProfit * m_adjusted_point;
|
||||
|
||||
//--- set default deviation for trading in adjusted points
|
||||
m_trade.SetDeviationInPoints(3 * digits_adjust);
|
||||
|
||||
if (!InitCheckParameters(digits_adjust))
|
||||
{
|
||||
return(false);
|
||||
}
|
||||
if (!InitIndicators())
|
||||
{
|
||||
return(false);
|
||||
}
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Checking for input parameters |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CMacdExpert::InitCheckParameters(const int digits_adjust)
|
||||
{
|
||||
//--- initial data checks
|
||||
if (InpTakeProfit * digits_adjust < m_symbol.StopsLevel())
|
||||
{
|
||||
printf("Take Profit must be greater than %d", m_symbol.StopsLevel());
|
||||
return(false);
|
||||
}
|
||||
if (InpTrailingStop * digits_adjust < m_symbol.StopsLevel())
|
||||
{
|
||||
printf("Trailing Stop must be greater than %d", m_symbol.StopsLevel());
|
||||
return(false);
|
||||
}
|
||||
|
||||
//--- check for right lots amount
|
||||
if (InpLots < m_symbol.LotsMin() || InpLots > m_symbol.LotsMax())
|
||||
{
|
||||
printf("Lots amount must be in the range from %f to %f", m_symbol.LotsMin(), m_symbol.LotsMax());
|
||||
return(false);
|
||||
}
|
||||
if (MathAbs(InpLots / m_symbol.LotsStep() - MathRound(InpLots / m_symbol.LotsStep())) > 1.0E - 10)
|
||||
{
|
||||
printf("Lots amount is not corresponding with lot step %f", m_symbol.LotsStep());
|
||||
return(false);
|
||||
}
|
||||
|
||||
//--- warning
|
||||
if (InpTakeProfit <= InpTrailingStop)
|
||||
{
|
||||
printf("Warning: Trailing Stop must be less than Take Profit");
|
||||
}
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Initialization of the indicators |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CMacdExpert::InitIndicators(void)
|
||||
{
|
||||
//--- create MACD indicator
|
||||
if (m_handle_macd == INVALID_HANDLE)
|
||||
{
|
||||
if ((m_handle_macd = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE)) == INVALID_HANDLE)
|
||||
{
|
||||
printf("Error creating MACD indicator");
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
//--- create EMA 20 indicator and add it to collection
|
||||
if (m_handle_ema20 == INVALID_HANDLE)
|
||||
{
|
||||
if ((m_handle_ema20 = iMA(NULL, 0, InpMA20TrendPeriod, 0, MODE_EMA, PRICE_CLOSE)) == INVALID_HANDLE)
|
||||
{
|
||||
printf("Error creating EMA indicator");
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
//--- create EMA 6 indicator and add it to collection
|
||||
if (m_handle_ema6== INVALID_HANDLE)
|
||||
{
|
||||
if ((m_handle_ema6 = iMA(NULL, 0, InpMA6TrendPeriod, 0, MODE_EMA, PRICE_CLOSE)) == INVALID_HANDLE)
|
||||
{
|
||||
printf("Error creating EMA indicator");
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Check for long position closing |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CMacdExpert::LongClosed(void)
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
//--- should it be closed?
|
||||
if (m_macd_current > 0)
|
||||
{
|
||||
if ((m_macd_current < m_signal_current) && (m_macd_previous > m_signal_previous))
|
||||
{
|
||||
if (m_macd_current > m_macd_close_level)
|
||||
{
|
||||
//--- close position
|
||||
if (m_trade.PositionClose(Symbol()))
|
||||
{
|
||||
printf("Long position by %s to be closed",Symbol());
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Error closing position by %s : '%s'", Symbol(), m_trade.ResultComment());
|
||||
}
|
||||
//--- processed and cannot be modified
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(res);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Check for short position closing |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CMacdExpert::ShortClosed(void)
|
||||
{
|
||||
bool res=false;
|
||||
|
||||
//--- should it be closed?
|
||||
if (m_macd_current < 0)
|
||||
{
|
||||
if ((m_macd_current > m_signal_current) && (m_macd_previous < m_signal_previous))
|
||||
{
|
||||
if (MathAbs(m_macd_current) > m_macd_close_level)
|
||||
{
|
||||
//--- close position
|
||||
if (m_trade.PositionClose(Symbol()))
|
||||
{
|
||||
printf("Short position by %s to be closed",Symbol());
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Error closing position by %s : '%s'", Symbol(), m_trade.ResultComment());
|
||||
}
|
||||
//--- processed and cannot be modified
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(res);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Check for long position modifying |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CMacdExpert::LongModified(void)
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
//--- check for trailing stop
|
||||
if (InpTrailingStop > 0)
|
||||
{
|
||||
if ((m_symbol.Bid() - m_position.PriceOpen()) > (m_adjusted_point * InpTrailingStop))
|
||||
{
|
||||
double sl = NormalizeDouble(m_symbol.Bid() - m_traling_stop, m_symbol.Digits());
|
||||
double tp = m_position.TakeProfit();
|
||||
|
||||
if ((m_position.StopLoss() < sl) || (m_position.StopLoss() == 0.0))
|
||||
{
|
||||
//--- modify position
|
||||
if (m_trade.PositionModify(Symbol(), sl, tp))
|
||||
{
|
||||
printf("Long position by %s to be modified",Symbol());
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Error modifying position by %s : '%s'", Symbol(), m_trade.ResultComment());
|
||||
printf("Modify parameters : SL=%f,TP=%f", sl, tp);
|
||||
}
|
||||
//--- modified and must exit from expert
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(res);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Check for short position modifying |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CMacdExpert::ShortModified(void)
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
//--- check for trailing stop
|
||||
if (InpTrailingStop > 0)
|
||||
{
|
||||
if ((m_position.PriceOpen() - m_symbol.Ask()) > (m_adjusted_point * InpTrailingStop))
|
||||
{
|
||||
double sl = NormalizeDouble(m_symbol.Ask() + m_traling_stop, m_symbol.Digits());
|
||||
double tp = m_position.TakeProfit();
|
||||
|
||||
if ((m_position.StopLoss() > sl) || (m_position.StopLoss() == 0.0))
|
||||
{
|
||||
//--- modify position
|
||||
if (m_trade.PositionModify(Symbol(), sl, tp))
|
||||
{
|
||||
printf("Short position by %s to be modified",Symbol());
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Error modifying position by %s : '%s'",Symbol(), m_trade.ResultComment());
|
||||
printf("Modify parameters : SL=%f,TP=%f", sl, tp);
|
||||
}
|
||||
//--- modified and must exit from expert
|
||||
res=true;
|
||||
}
|
||||
}
|
||||
}
|
||||
//--- result
|
||||
return(res);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Check for long position opening |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CMacdExpert::LongOpened(void)
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
//--- check for long position (BUY) possibility
|
||||
if (m_macd_current < 0)
|
||||
{
|
||||
if (m_macd_current > m_signal_current && m_macd_previous<m_signal_previous)
|
||||
{
|
||||
if ((MathAbs(m_macd_current) > m_macd_open_level) && (m_ema_current > m_ema_previous))
|
||||
{
|
||||
double price=m_symbol.Ask();
|
||||
double tp =m_symbol.Bid() + m_take_profit;
|
||||
|
||||
//--- check for free money
|
||||
if (m_account.FreeMarginCheck(Symbol(), ORDER_TYPE_BUY, InpLots, price) < 0.0)
|
||||
{
|
||||
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
|
||||
}
|
||||
else
|
||||
{
|
||||
//--- open position
|
||||
if (m_trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, InpLots, price, 0.0, tp))
|
||||
printf("Position by %s to be opened", Symbol());
|
||||
else
|
||||
{
|
||||
printf("Error opening BUY position by %s : '%s'", Symbol(), m_trade.ResultComment());
|
||||
printf("Open parameters : price=%f,TP=%f", price, tp);
|
||||
}
|
||||
}
|
||||
//--- in any case we must exit from expert
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(res);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Check for short position opening |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CMacdExpert::ShortOpened(void)
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
//--- check for short position (SELL) possibility
|
||||
if (m_macd_current > 0)
|
||||
{
|
||||
if (m_macd_current < m_signal_current && m_macd_previous > m_signal_previous)
|
||||
{
|
||||
if (m_macd_current > (m_macd_open_level) && m_ema_current < m_ema_previous)
|
||||
{
|
||||
double price = m_symbol.Bid();
|
||||
double tp = m_symbol.Ask() - m_take_profit;
|
||||
|
||||
//--- check for free money
|
||||
if (m_account.FreeMarginCheck(Symbol(), ORDER_TYPE_SELL, InpLots, price) < 0.0)
|
||||
{
|
||||
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
|
||||
}
|
||||
else
|
||||
{
|
||||
//--- open position
|
||||
if (m_trade.PositionOpen(Symbol(), ORDER_TYPE_SELL, InpLots, price, 0.0, tp))
|
||||
{
|
||||
printf("Position by %s to be opened",Symbol());
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Error opening SELL position by %s : '%s'", Symbol(), m_trade.ResultComment());
|
||||
printf("Open parameters : price=%f,TP=%f", price, tp);
|
||||
}
|
||||
}
|
||||
//--- in any case we must exit from expert
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--- result
|
||||
return(res);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| main function returns true if any position processed |
|
||||
//+------------------------------------------------------------------+
|
||||
bool CMacdExpert::Processing(void)
|
||||
{
|
||||
//--- refresh rates
|
||||
if (!m_symbol.RefreshRates())
|
||||
{
|
||||
return(false);
|
||||
}
|
||||
|
||||
//--- refresh indicators
|
||||
if (BarsCalculated(m_handle_macd) < 2 || BarsCalculated(m_handle_ema20) < 2 || BarsCalculated(m_handle_ema6) < 2)
|
||||
{
|
||||
return(false);
|
||||
}
|
||||
|
||||
if (CopyBuffer(m_handle_macd, 0, 0, 2, m_buff_MACD_main) != 2 ||
|
||||
CopyBuffer(m_handle_macd, 1, 0, 2, m_buff_MACD_signal)!= 2 ||
|
||||
CopyBuffer(m_handle_ema6, 0, 0, 2, m_buff_EMA) != 2 ||
|
||||
CopyBuffer(m_handle_ema20, 0, 0, 2, m_buff_EMA) != 2)
|
||||
{
|
||||
return(false);
|
||||
}
|
||||
|
||||
// m_indicators.Refresh();
|
||||
//--- to simplify the coding and speed up access
|
||||
//--- data are put into internal variables
|
||||
m_macd_current = m_buff_MACD_main[0];
|
||||
m_macd_previous = m_buff_MACD_main[1];
|
||||
m_signal_current = m_buff_MACD_signal[0];
|
||||
m_signal_previous= m_buff_MACD_signal[1];
|
||||
m_ema_current = m_buff_EMA[0];
|
||||
m_ema_previous = m_buff_EMA[1];
|
||||
|
||||
//--- it is important to enter the market correctly,
|
||||
//--- but it is more important to exit it correctly...
|
||||
//--- first check if position exists - try to select it
|
||||
if (m_position.Select(Symbol()))
|
||||
{
|
||||
if (m_position.PositionType() == POSITION_TYPE_BUY)
|
||||
{
|
||||
//--- try to close or modify long position
|
||||
if (LongClosed())
|
||||
{
|
||||
return(true);
|
||||
}
|
||||
if (LongModified())
|
||||
{
|
||||
return(true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//--- try to close or modify short position
|
||||
if (ShortClosed())
|
||||
{
|
||||
return(true);
|
||||
}
|
||||
if (ShortModified())
|
||||
{
|
||||
return(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
//--- no opened position identified
|
||||
else
|
||||
{
|
||||
//--- check for long position (BUY) possibility
|
||||
if (LongOpened())
|
||||
{
|
||||
return(true);
|
||||
}
|
||||
//--- check for short position (SELL) possibility
|
||||
if (ShortOpened())
|
||||
{
|
||||
return(true);
|
||||
}
|
||||
}
|
||||
|
||||
//--- exit without position processing
|
||||
return(false);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Expert initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit(void)
|
||||
{
|
||||
//--- create all necessary objects
|
||||
if (!ExtExpert.Init())
|
||||
{
|
||||
return(INIT_FAILED);
|
||||
}
|
||||
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Expert new tick handling function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnTick(void)
|
||||
{
|
||||
static datetime limit_time = 0; // last trade processing time + timeout
|
||||
|
||||
//--- don't process if timeout
|
||||
if (TimeCurrent() >= limit_time)
|
||||
{
|
||||
//--- check for data
|
||||
if (Bars(Symbol(), Period()) > 2 * InpMA20TrendPeriod)
|
||||
{
|
||||
//--- change limit time by timeout in seconds if processed
|
||||
if (ExtExpert.Processing())
|
||||
{
|
||||
limit_time = TimeCurrent() + ExtTimeOut;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -0,0 +1,122 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| MACD_AnyTimeFrame.mq5 |
|
||||
//| Copyright 2010, Slacktrader |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Slacktrader"
|
||||
#property description "Moving Average Convergence/Divergence - Any higher timeframe"
|
||||
//--- indicator settings
|
||||
#property indicator_separate_window
|
||||
#property indicator_buffers 2
|
||||
#property indicator_plots 2
|
||||
#property indicator_type1 DRAW_HISTOGRAM
|
||||
#property indicator_type2 DRAW_LINE
|
||||
#property indicator_color1 Silver
|
||||
#property indicator_color2 Red
|
||||
#property indicator_width1 2
|
||||
#property indicator_width2 1
|
||||
#property indicator_label1 "MACD"
|
||||
#property indicator_label2 "Signal"
|
||||
//--- input parameters
|
||||
input ENUM_TIMEFRAMES ANY_TIMEFRAME = PERIOD_H1; //Timeframe of MACD which we want to see instead of current Period
|
||||
//It has to be a higher timeframe as currently displayed
|
||||
input int InpFastEMA=12; // Fast EMA period
|
||||
input int InpSlowEMA=26; // Slow EMA period
|
||||
input int InpSignalSMA=9; // Signal SMA period
|
||||
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price
|
||||
//--- indicator buffers
|
||||
double ExtMacdBuffer[];
|
||||
double ExtSignalBuffer[];
|
||||
double ExtMacdBuffer2pom[];
|
||||
double ExtSignalBuffer2pom[];
|
||||
//--- MACD Handle
|
||||
int MacdHandle;
|
||||
//--- variable to hold ratio between current chart timeframe and MACD timeframe
|
||||
int PeriodRatio;
|
||||
//+------------------------------------------------------------------+
|
||||
//| PeriodStr |
|
||||
//+------------------------------------------------------------------+
|
||||
string PeriodStr(int val)
|
||||
{
|
||||
int i;
|
||||
//--- arrays to convert ENUM_TIMEFRAMES to string
|
||||
static string _p_str[]=
|
||||
{
|
||||
"M1","M2","M3","M4","M5","M6","M10","M12","M15","M20","M30",
|
||||
"H1","H2","H3","H4","H6","H12","D1","W1","MN","UNKNOWN"
|
||||
};
|
||||
static int _p_int[]={1,2,3,4,5,6,10,12,15,20,30,0x4001,0x4002,0x4003,0x4004,0x4006,0x400c,0x4018,0x8001,0xc001};
|
||||
//--- checking
|
||||
if(val<0) return("ERROR");
|
||||
//---
|
||||
if(val==(int)PERIOD_CURRENT) val=ChartPeriod();
|
||||
for(i=0;i<20;i++)
|
||||
if(val==_p_int[i])
|
||||
{
|
||||
break;
|
||||
}
|
||||
//---
|
||||
return(_p_str[i]);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
//--- indicator buffers mapping
|
||||
SetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
|
||||
|
||||
MacdHandle=iMACD(NULL,ANY_TIMEFRAME,InpFastEMA,InpSlowEMA,InpSignalSMA,InpAppliedPrice);
|
||||
|
||||
PeriodRatio=PeriodSeconds(ANY_TIMEFRAME)/PeriodSeconds();
|
||||
IndicatorSetString(INDICATOR_SHORTNAME,"MACD - Any Timeframe - "+PeriodStr(ANY_TIMEFRAME));
|
||||
|
||||
Comment("");
|
||||
|
||||
if(PeriodRatio<1)
|
||||
{
|
||||
Comment("Variable ANY_TIMEFRAME has to be a Timeframe equal or higher then current chart!","Please coose right timeframe!");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
return(0);
|
||||
//--- initialization done
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Moving Averages Convergence/Divergence |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate (const int rates_total, // size of the price[] array
|
||||
const int prev_calculated, // bars handled on a previous call
|
||||
const int begin, // where the significant data start from
|
||||
const double& price[]) // array to calculate
|
||||
{
|
||||
//--- check if all data calculated
|
||||
if(BarsCalculated(MacdHandle)<rates_total/PeriodRatio) return(0);
|
||||
//--- we can copy not all data
|
||||
int to_copy;
|
||||
if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
|
||||
else
|
||||
{
|
||||
to_copy=rates_total-prev_calculated;
|
||||
//--- last value is always copied
|
||||
to_copy++;
|
||||
}
|
||||
|
||||
CopyBuffer(MacdHandle,0,0,to_copy/PeriodRatio,ExtMacdBuffer2pom);
|
||||
CopyBuffer(MacdHandle,1,0,to_copy/PeriodRatio,ExtSignalBuffer2pom);
|
||||
|
||||
ArrayResize(ExtMacdBuffer,ArraySize(ExtMacdBuffer2pom)*PeriodRatio);
|
||||
|
||||
for(int i=0; i<ArraySize(ExtMacdBuffer2pom); i++)
|
||||
for(int j=0; j<PeriodRatio; j++)
|
||||
ExtMacdBuffer[int(fmod(to_copy,PeriodRatio))+i*PeriodRatio+j]=ExtMacdBuffer2pom[i];
|
||||
|
||||
ArrayResize(ExtSignalBuffer,ArraySize(ExtSignalBuffer2pom)*PeriodRatio);
|
||||
|
||||
for(int i=0; i<ArraySize(ExtSignalBuffer2pom); i++)
|
||||
for(int j=0; j<PeriodRatio; j++)
|
||||
ExtSignalBuffer[int(fmod(to_copy,PeriodRatio))+i*PeriodRatio+j]=ExtSignalBuffer2pom[i];
|
||||
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,552 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| VWAP.mq5 |
|
||||
//| Copyright 2015, SOL Digital Consultoria LTDA |
|
||||
//| http://www.soldigitalconsultoria.com.br |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2015, SOL Digital Consultoria LTDA"
|
||||
#property link "http://www.soldigitalconsultoria.com.br"
|
||||
#property version "1.47"
|
||||
|
||||
#property indicator_chart_window
|
||||
#property indicator_buffers 8
|
||||
#property indicator_plots 8
|
||||
|
||||
//--- plot VWAP
|
||||
#property indicator_label1 "VWAP Daily"
|
||||
#property indicator_type1 DRAW_LINE
|
||||
#property indicator_color1 clrRed
|
||||
#property indicator_style1 STYLE_DASH
|
||||
#property indicator_width1 2
|
||||
|
||||
#property indicator_label2 "VWAP Weekly"
|
||||
#property indicator_type2 DRAW_LINE
|
||||
#property indicator_color2 clrBlue
|
||||
#property indicator_style2 STYLE_DASH
|
||||
#property indicator_width2 2
|
||||
|
||||
#property indicator_label3 "VWAP Monthly"
|
||||
#property indicator_type3 DRAW_LINE
|
||||
#property indicator_color3 clrGreen
|
||||
#property indicator_style3 STYLE_DASH
|
||||
#property indicator_width3 2
|
||||
|
||||
#property indicator_label4 "VWAP Level 01"
|
||||
#property indicator_type4 DRAW_LINE
|
||||
#property indicator_color4 clrGray
|
||||
#property indicator_style4 STYLE_DASH
|
||||
#property indicator_width4 2
|
||||
|
||||
#property indicator_label5 "VWAP Level 02"
|
||||
#property indicator_type5 DRAW_LINE
|
||||
#property indicator_color5 clrYellow
|
||||
#property indicator_style5 STYLE_DASH
|
||||
#property indicator_width5 2
|
||||
|
||||
#property indicator_label6 "VWAP Level 03"
|
||||
#property indicator_type6 DRAW_LINE
|
||||
#property indicator_color6 clrGreen
|
||||
#property indicator_style6 STYLE_DASH
|
||||
#property indicator_width6 2
|
||||
|
||||
#property indicator_label7 "VWAP Level 04"
|
||||
#property indicator_type7 DRAW_LINE
|
||||
#property indicator_color7 clrBlack
|
||||
#property indicator_style7 STYLE_DASH
|
||||
#property indicator_width7 2
|
||||
|
||||
#property indicator_label8 "VWAP Level 05"
|
||||
#property indicator_type8 DRAW_LINE
|
||||
#property indicator_color8 clrBlue
|
||||
#property indicator_style8 STYLE_DASH
|
||||
#property indicator_width8 2
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
enum DATE_TYPE
|
||||
{
|
||||
DAILY,
|
||||
WEEKLY,
|
||||
MONTHLY
|
||||
};
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
enum PRICE_TYPE
|
||||
{
|
||||
OPEN,
|
||||
CLOSE,
|
||||
HIGH,
|
||||
LOW,
|
||||
OPEN_CLOSE,
|
||||
HIGH_LOW,
|
||||
CLOSE_HIGH_LOW,
|
||||
OPEN_CLOSE_HIGH_LOW
|
||||
};
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
datetime CreateDateTime(DATE_TYPE nReturnType=DAILY,datetime dtDay=D'2000.01.01 00:00:00',int pHour=0,int pMinute=0,int pSecond=0)
|
||||
{
|
||||
datetime dtReturnDate;
|
||||
MqlDateTime timeStruct;
|
||||
|
||||
TimeToStruct(dtDay,timeStruct);
|
||||
timeStruct.hour = pHour;
|
||||
timeStruct.min = pMinute;
|
||||
timeStruct.sec = pSecond;
|
||||
dtReturnDate=(StructToTime(timeStruct));
|
||||
|
||||
if(nReturnType==WEEKLY)
|
||||
{
|
||||
while(timeStruct.day_of_week!=0)
|
||||
{
|
||||
dtReturnDate=(dtReturnDate-86400);
|
||||
TimeToStruct(dtReturnDate,timeStruct);
|
||||
}
|
||||
}
|
||||
|
||||
if(nReturnType==MONTHLY)
|
||||
{
|
||||
timeStruct.day=1;
|
||||
dtReturnDate=(StructToTime(timeStruct));
|
||||
}
|
||||
|
||||
return dtReturnDate;
|
||||
}
|
||||
|
||||
sinput string Indicator_Name="Volume Weighted Average Price (VWAP)";
|
||||
input PRICE_TYPE Price_Type = CLOSE_HIGH_LOW;
|
||||
input bool Enable_Daily = true;
|
||||
input bool Enable_Weekly = true;
|
||||
input bool Enable_Monthly = true;
|
||||
input bool Enable_Level_01 = false;
|
||||
input int VWAP_Level_01_Period = 5;
|
||||
input bool Enable_Level_02 = false;
|
||||
input int VWAP_Level_02_Period = 13;
|
||||
input bool Enable_Level_03 = false;
|
||||
input int VWAP_Level_03_Period = 20;
|
||||
input bool Enable_Level_04 = false;
|
||||
input int VWAP_Level_04_Period = 30;
|
||||
input bool Enable_Level_05 = false;
|
||||
input int VWAP_Level_05_Period = 40;
|
||||
|
||||
bool Show_Daily_Value = true;
|
||||
bool Show_Weekly_Value = true;
|
||||
bool Show_Monthly_Value = true;
|
||||
|
||||
double VWAP_Buffer_Daily[];
|
||||
double VWAP_Buffer_Weekly[];
|
||||
double VWAP_Buffer_Monthly[];
|
||||
double VWAP_Buffer_01[];
|
||||
double VWAP_Buffer_02[];
|
||||
double VWAP_Buffer_03[];
|
||||
double VWAP_Buffer_04[];
|
||||
double VWAP_Buffer_05[];
|
||||
|
||||
double nPriceArr[];
|
||||
double nTotalTPV[];
|
||||
double nTotalVol[];
|
||||
double nSumDailyTPV = 0, nSumWeeklyTPV = 0, nSumMonthlyTPV = 0;
|
||||
double nSumDailyVol = 0, nSumWeeklyVol = 0, nSumMonthlyVol = 0;
|
||||
|
||||
int nIdxDaily=0,nIdxWeekly=0,nIdxMonthly=0,nIdx=0;
|
||||
|
||||
bool bIsFirstRun=true;
|
||||
|
||||
ENUM_TIMEFRAMES LastTimePeriod=PERIOD_MN1;
|
||||
|
||||
string sDailyStr = "";
|
||||
string sWeeklyStr = "";
|
||||
string sMonthlyStr = "";
|
||||
string sLevel01Str = "";
|
||||
string sLevel02Str = "";
|
||||
string sLevel03Str = "";
|
||||
string sLevel04Str = "";
|
||||
string sLevel05Str = "";
|
||||
datetime dtLastDay=CreateDateTime(DAILY),dtLastWeek=CreateDateTime(WEEKLY),dtLastMonth=CreateDateTime(MONTHLY);
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
|
||||
|
||||
SetIndexBuffer(0,VWAP_Buffer_Daily,INDICATOR_DATA);
|
||||
SetIndexBuffer(1,VWAP_Buffer_Weekly,INDICATOR_DATA);
|
||||
SetIndexBuffer(2,VWAP_Buffer_Monthly,INDICATOR_DATA);
|
||||
SetIndexBuffer(3,VWAP_Buffer_01,INDICATOR_DATA);
|
||||
SetIndexBuffer(4,VWAP_Buffer_02,INDICATOR_DATA);
|
||||
SetIndexBuffer(5,VWAP_Buffer_03,INDICATOR_DATA);
|
||||
SetIndexBuffer(6,VWAP_Buffer_04,INDICATOR_DATA);
|
||||
SetIndexBuffer(7,VWAP_Buffer_05,INDICATOR_DATA);
|
||||
|
||||
ObjectCreate(0,"VWAP_Daily",OBJ_LABEL,0,0,0);
|
||||
ObjectSetInteger(0,"VWAP_Daily",OBJPROP_CORNER,3);
|
||||
ObjectSetInteger(0,"VWAP_Daily",OBJPROP_XDISTANCE,180);
|
||||
ObjectSetInteger(0,"VWAP_Daily",OBJPROP_YDISTANCE,40);
|
||||
ObjectSetInteger(0,"VWAP_Daily",OBJPROP_COLOR,indicator_color1);
|
||||
ObjectSetInteger(0,"VWAP_Daily",OBJPROP_FONTSIZE,7);
|
||||
ObjectSetString(0,"VWAP_Daily",OBJPROP_FONT,"Verdana");
|
||||
ObjectSetString(0,"VWAP_Daily",OBJPROP_TEXT," ");
|
||||
|
||||
ObjectCreate(0,"VWAP_Weekly",OBJ_LABEL,0,0,0);
|
||||
ObjectSetInteger(0,"VWAP_Weekly",OBJPROP_CORNER,3);
|
||||
ObjectSetInteger(0,"VWAP_Weekly",OBJPROP_XDISTANCE,180);
|
||||
ObjectSetInteger(0,"VWAP_Weekly",OBJPROP_YDISTANCE,60);
|
||||
ObjectSetInteger(0,"VWAP_Weekly",OBJPROP_COLOR,indicator_color2);
|
||||
ObjectSetInteger(0,"VWAP_Weekly",OBJPROP_FONTSIZE,7);
|
||||
ObjectSetString(0,"VWAP_Weekly",OBJPROP_FONT,"Verdana");
|
||||
ObjectSetString(0,"VWAP_Weekly",OBJPROP_TEXT," ");
|
||||
|
||||
ObjectCreate(0,"VWAP_Monthly",OBJ_LABEL,0,0,0);
|
||||
ObjectSetInteger(0,"VWAP_Monthly",OBJPROP_CORNER,3);
|
||||
ObjectSetInteger(0,"VWAP_Monthly",OBJPROP_XDISTANCE,180);
|
||||
ObjectSetInteger(0,"VWAP_Monthly",OBJPROP_YDISTANCE,80);
|
||||
ObjectSetInteger(0,"VWAP_Monthly",OBJPROP_COLOR,indicator_color3);
|
||||
ObjectSetInteger(0,"VWAP_Monthly",OBJPROP_FONTSIZE,7);
|
||||
ObjectSetString(0,"VWAP_Monthly",OBJPROP_FONT,"Verdana");
|
||||
ObjectSetString(0,"VWAP_Monthly",OBJPROP_TEXT," ");
|
||||
|
||||
ObjectCreate(0,"VWAP_Level_01",OBJ_LABEL,0,0,0);
|
||||
ObjectSetInteger(0,"VWAP_Level_01",OBJPROP_CORNER,3);
|
||||
ObjectSetInteger(0,"VWAP_Level_01",OBJPROP_XDISTANCE,180);
|
||||
ObjectSetInteger(0,"VWAP_Level_01",OBJPROP_YDISTANCE,100);
|
||||
ObjectSetInteger(0,"VWAP_Level_01",OBJPROP_COLOR,indicator_color4);
|
||||
ObjectSetInteger(0,"VWAP_Level_01",OBJPROP_FONTSIZE,7);
|
||||
ObjectSetString(0,"VWAP_Level_01",OBJPROP_FONT,"Verdana");
|
||||
ObjectSetString(0,"VWAP_Level_01",OBJPROP_TEXT," ");
|
||||
|
||||
ObjectCreate(0,"VWAP_Level_02",OBJ_LABEL,0,0,0);
|
||||
ObjectSetInteger(0,"VWAP_Level_02",OBJPROP_CORNER,3);
|
||||
ObjectSetInteger(0,"VWAP_Level_02",OBJPROP_XDISTANCE,180);
|
||||
ObjectSetInteger(0,"VWAP_Level_02",OBJPROP_YDISTANCE,120);
|
||||
ObjectSetInteger(0,"VWAP_Level_02",OBJPROP_COLOR,indicator_color5);
|
||||
ObjectSetInteger(0,"VWAP_Level_02",OBJPROP_FONTSIZE,7);
|
||||
ObjectSetString(0,"VWAP_Level_02",OBJPROP_FONT,"Verdana");
|
||||
ObjectSetString(0,"VWAP_Level_02",OBJPROP_TEXT," ");
|
||||
|
||||
ObjectCreate(0,"VWAP_Level_03",OBJ_LABEL,0,0,0);
|
||||
ObjectSetInteger(0,"VWAP_Level_03",OBJPROP_CORNER,3);
|
||||
ObjectSetInteger(0,"VWAP_Level_03",OBJPROP_XDISTANCE,180);
|
||||
ObjectSetInteger(0,"VWAP_Level_03",OBJPROP_YDISTANCE,140);
|
||||
ObjectSetInteger(0,"VWAP_Level_03",OBJPROP_COLOR,indicator_color6);
|
||||
ObjectSetInteger(0,"VWAP_Level_03",OBJPROP_FONTSIZE,7);
|
||||
ObjectSetString(0,"VWAP_Level_03",OBJPROP_FONT,"Verdana");
|
||||
ObjectSetString(0,"VWAP_Level_03",OBJPROP_TEXT," ");
|
||||
|
||||
ObjectCreate(0,"VWAP_Level_04",OBJ_LABEL,0,0,0);
|
||||
ObjectSetInteger(0,"VWAP_Level_04",OBJPROP_CORNER,3);
|
||||
ObjectSetInteger(0,"VWAP_Level_04",OBJPROP_XDISTANCE,180);
|
||||
ObjectSetInteger(0,"VWAP_Level_04",OBJPROP_YDISTANCE,160);
|
||||
ObjectSetInteger(0,"VWAP_Level_04",OBJPROP_COLOR,indicator_color7);
|
||||
ObjectSetInteger(0,"VWAP_Level_04",OBJPROP_FONTSIZE,7);
|
||||
ObjectSetString(0,"VWAP_Level_04",OBJPROP_FONT,"Verdana");
|
||||
ObjectSetString(0,"VWAP_Level_04",OBJPROP_TEXT," ");
|
||||
|
||||
ObjectCreate(0,"VWAP_Level_05",OBJ_LABEL,0,0,0);
|
||||
ObjectSetInteger(0,"VWAP_Level_05",OBJPROP_CORNER,3);
|
||||
ObjectSetInteger(0,"VWAP_Level_05",OBJPROP_XDISTANCE,180);
|
||||
ObjectSetInteger(0,"VWAP_Level_05",OBJPROP_YDISTANCE,180);
|
||||
ObjectSetInteger(0,"VWAP_Level_05",OBJPROP_COLOR,indicator_color8);
|
||||
ObjectSetInteger(0,"VWAP_Level_05",OBJPROP_FONTSIZE,7);
|
||||
ObjectSetString(0,"VWAP_Level_05",OBJPROP_FONT,"Verdana");
|
||||
ObjectSetString(0,"VWAP_Level_05",OBJPROP_TEXT," ");
|
||||
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnDeinit(const int pReason)
|
||||
{
|
||||
ObjectDelete(0,"VWAP_Daily");
|
||||
ObjectDelete(0,"VWAP_Weekly");
|
||||
ObjectDelete(0,"VWAP_Monthly");
|
||||
ObjectDelete(0,"VWAP_Level_01");
|
||||
ObjectDelete(0,"VWAP_Level_02");
|
||||
ObjectDelete(0,"VWAP_Level_03");
|
||||
ObjectDelete(0,"VWAP_Level_04");
|
||||
ObjectDelete(0,"VWAP_Level_05");
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
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(PERIOD_CURRENT!=LastTimePeriod)
|
||||
{
|
||||
bIsFirstRun=true;
|
||||
LastTimePeriod=PERIOD_CURRENT;
|
||||
}
|
||||
|
||||
if(rates_total>prev_calculated || bIsFirstRun)
|
||||
{
|
||||
ArrayResize(nPriceArr,rates_total);
|
||||
ArrayResize(nTotalTPV,rates_total);
|
||||
ArrayResize(nTotalVol,rates_total);
|
||||
|
||||
if(Enable_Daily) {nIdx = nIdxDaily; nSumDailyTPV = 0; nSumDailyVol = 0;}
|
||||
if(Enable_Weekly) {nIdx = nIdxWeekly; nSumWeeklyTPV = 0; nSumWeeklyVol = 0;}
|
||||
if(Enable_Monthly) {nIdx = nIdxMonthly; nSumMonthlyTPV = 0; nSumMonthlyVol = 0;}
|
||||
|
||||
for(; nIdx<rates_total; nIdx++)
|
||||
{
|
||||
if(CreateDateTime(DAILY,time[nIdx])!=dtLastDay)
|
||||
{
|
||||
nIdxDaily=nIdx;
|
||||
nSumDailyTPV = 0;
|
||||
nSumDailyVol = 0;
|
||||
}
|
||||
if(CreateDateTime(WEEKLY,time[nIdx])!=dtLastWeek)
|
||||
{
|
||||
nIdxWeekly=nIdx;
|
||||
nSumWeeklyTPV = 0;
|
||||
nSumWeeklyVol = 0;
|
||||
}
|
||||
if(CreateDateTime(MONTHLY,time[nIdx])!=dtLastMonth)
|
||||
{
|
||||
nIdxMonthly=nIdx;
|
||||
nSumMonthlyTPV = 0;
|
||||
nSumMonthlyVol = 0;
|
||||
}
|
||||
|
||||
nPriceArr[nIdx] = 0;
|
||||
nTotalTPV[nIdx] = 0;
|
||||
nTotalVol[nIdx] = 0;
|
||||
|
||||
switch(Price_Type)
|
||||
{
|
||||
case OPEN:
|
||||
nPriceArr[nIdx]=open[nIdx];
|
||||
break;
|
||||
case CLOSE:
|
||||
nPriceArr[nIdx]=close[nIdx];
|
||||
break;
|
||||
case HIGH:
|
||||
nPriceArr[nIdx]=high[nIdx];
|
||||
break;
|
||||
case LOW:
|
||||
nPriceArr[nIdx]=low[nIdx];
|
||||
break;
|
||||
case HIGH_LOW:
|
||||
nPriceArr[nIdx]=(high[nIdx]+low[nIdx])/2;
|
||||
break;
|
||||
case OPEN_CLOSE:
|
||||
nPriceArr[nIdx]=(open[nIdx]+close[nIdx])/2;
|
||||
break;
|
||||
case CLOSE_HIGH_LOW:
|
||||
nPriceArr[nIdx]=(close[nIdx]+high[nIdx]+low[nIdx])/3;
|
||||
break;
|
||||
case OPEN_CLOSE_HIGH_LOW:
|
||||
nPriceArr[nIdx]=(open[nIdx]+close[nIdx]+high[nIdx]+low[nIdx])/4;
|
||||
break;
|
||||
default:
|
||||
nPriceArr[nIdx]=(close[nIdx]+high[nIdx]+low[nIdx])/3;
|
||||
break;
|
||||
}
|
||||
|
||||
if(tick_volume[nIdx])
|
||||
{
|
||||
nTotalTPV[nIdx] = (nPriceArr[nIdx] * tick_volume[nIdx]);
|
||||
nTotalVol[nIdx] = (double)tick_volume[nIdx];
|
||||
} else if(volume[nIdx]) {
|
||||
nTotalTPV[nIdx] = (nPriceArr[nIdx] * volume[nIdx]);
|
||||
nTotalVol[nIdx] = (double)volume[nIdx];
|
||||
}
|
||||
|
||||
if(Enable_Daily && (nIdx>=nIdxDaily))
|
||||
{
|
||||
nSumDailyTPV += nTotalTPV[nIdx];
|
||||
nSumDailyVol += nTotalVol[nIdx];
|
||||
|
||||
if(nSumDailyVol)
|
||||
VWAP_Buffer_Daily[nIdx]=(nSumDailyTPV/nSumDailyVol);
|
||||
|
||||
if((sDailyStr!="VWAP Daily: "+(string)NormalizeDouble(VWAP_Buffer_Daily[nIdx],_Digits)) && Show_Daily_Value)
|
||||
{
|
||||
sDailyStr="VWAP Daily: "+(string)NormalizeDouble(VWAP_Buffer_Daily[nIdx],_Digits);
|
||||
ObjectSetString(0,"VWAP_Daily",OBJPROP_TEXT,sDailyStr);
|
||||
}
|
||||
}
|
||||
|
||||
if(Enable_Weekly && (nIdx>=nIdxWeekly))
|
||||
{
|
||||
nSumWeeklyTPV += nTotalTPV[nIdx];
|
||||
nSumWeeklyVol += nTotalVol[nIdx];
|
||||
|
||||
if(nSumWeeklyVol)
|
||||
VWAP_Buffer_Weekly[nIdx]=(nSumWeeklyTPV/nSumWeeklyVol);
|
||||
|
||||
if((sWeeklyStr!="VWAP Weekly: "+(string)NormalizeDouble(VWAP_Buffer_Weekly[nIdx],_Digits)) && Show_Weekly_Value)
|
||||
{
|
||||
sWeeklyStr="VWAP Weekly: "+(string)NormalizeDouble(VWAP_Buffer_Weekly[nIdx],_Digits);
|
||||
ObjectSetString(0,"VWAP_Weekly",OBJPROP_TEXT,sWeeklyStr);
|
||||
}
|
||||
}
|
||||
|
||||
if(Enable_Monthly && (nIdx>=nIdxMonthly))
|
||||
{
|
||||
nSumMonthlyTPV += nTotalTPV[nIdx];
|
||||
nSumMonthlyVol += nTotalVol[nIdx];
|
||||
|
||||
if(nSumMonthlyVol)
|
||||
VWAP_Buffer_Monthly[nIdx]=(nSumMonthlyTPV/nSumMonthlyVol);
|
||||
|
||||
if((sMonthlyStr!="VWAP Monthly: "+(string)NormalizeDouble(VWAP_Buffer_Monthly[nIdx],_Digits)) && Show_Monthly_Value)
|
||||
{
|
||||
sMonthlyStr="VWAP Monthly: "+(string)NormalizeDouble(VWAP_Buffer_Monthly[nIdx],_Digits);
|
||||
ObjectSetString(0,"VWAP_Monthly",OBJPROP_TEXT,sMonthlyStr);
|
||||
}
|
||||
}
|
||||
|
||||
dtLastDay=CreateDateTime(DAILY,time[nIdx]);
|
||||
dtLastWeek=CreateDateTime(WEEKLY,time[nIdx]);
|
||||
dtLastMonth=CreateDateTime(MONTHLY,time[nIdx]);
|
||||
}
|
||||
|
||||
if(Enable_Level_01)
|
||||
{
|
||||
int nStartPos=(prev_calculated>VWAP_Level_01_Period) ?(prev_calculated-VWAP_Level_01_Period) : VWAP_Level_01_Period;
|
||||
for(nIdx=nStartPos; nIdx<rates_total; nIdx++)
|
||||
{
|
||||
double nSumTotalTPV = 0;
|
||||
double nSumTotalVol = 0;
|
||||
VWAP_Buffer_01[nIdx] = EMPTY_VALUE;
|
||||
|
||||
for(int nSubIdx=1; nSubIdx<VWAP_Level_01_Period; nSubIdx++)
|
||||
{
|
||||
nSumTotalTPV += nTotalTPV[nIdx - nSubIdx];
|
||||
nSumTotalVol += nTotalVol[nIdx - nSubIdx];
|
||||
}
|
||||
if(nSumTotalVol)
|
||||
VWAP_Buffer_01[nIdx]=(nSumTotalTPV/nSumTotalVol);
|
||||
else
|
||||
VWAP_Buffer_01[nIdx]=0;
|
||||
if(sLevel01Str!="VWAP Level 01 ("+(string)VWAP_Level_01_Period+"): "+(string)NormalizeDouble(VWAP_Buffer_01[nIdx],_Digits))
|
||||
{
|
||||
sLevel01Str = "VWAP Level 01 (" + (string)VWAP_Level_01_Period + "): " + (string)NormalizeDouble(VWAP_Buffer_01[nIdx], _Digits);
|
||||
ObjectSetString(0,"VWAP_Level_01",OBJPROP_TEXT,sLevel01Str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(Enable_Level_02)
|
||||
{
|
||||
int nStartPos=(prev_calculated>VWAP_Level_02_Period) ?(prev_calculated-VWAP_Level_02_Period) : VWAP_Level_02_Period;
|
||||
for(nIdx=nStartPos; nIdx<rates_total; nIdx++)
|
||||
{
|
||||
double nSumTotalTPV = 0;
|
||||
double nSumTotalVol = 0;
|
||||
VWAP_Buffer_02[nIdx] = EMPTY_VALUE;
|
||||
|
||||
for(int nSubIdx=1; nSubIdx<VWAP_Level_02_Period; nSubIdx++)
|
||||
{
|
||||
nSumTotalTPV += nTotalTPV[nIdx - nSubIdx];
|
||||
nSumTotalVol += nTotalVol[nIdx - nSubIdx];
|
||||
}
|
||||
if(nSumTotalVol)
|
||||
VWAP_Buffer_02[nIdx]=(nSumTotalTPV/nSumTotalVol);
|
||||
else
|
||||
VWAP_Buffer_02[nIdx]=0;
|
||||
if(sLevel02Str!="VWAP Level 02 ("+(string)VWAP_Level_02_Period+"): "+(string)NormalizeDouble(VWAP_Buffer_02[nIdx],_Digits))
|
||||
{
|
||||
sLevel02Str = "VWAP Level 02 (" + (string)VWAP_Level_02_Period + "): " + (string)NormalizeDouble(VWAP_Buffer_02[nIdx], _Digits);
|
||||
ObjectSetString(0,"VWAP_Level_02",OBJPROP_TEXT,sLevel02Str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(Enable_Level_03)
|
||||
{
|
||||
int nStartPos=(prev_calculated>VWAP_Level_03_Period) ?(prev_calculated-VWAP_Level_03_Period) : VWAP_Level_03_Period;
|
||||
for(nIdx=nStartPos; nIdx<rates_total; nIdx++)
|
||||
{
|
||||
double nSumTotalTPV = 0;
|
||||
double nSumTotalVol = 0;
|
||||
VWAP_Buffer_03[nIdx] = EMPTY_VALUE;
|
||||
|
||||
for(int nSubIdx=1; nSubIdx<VWAP_Level_03_Period; nSubIdx++)
|
||||
{
|
||||
nSumTotalTPV += nTotalTPV[nIdx - nSubIdx];
|
||||
nSumTotalVol += nTotalVol[nIdx - nSubIdx];
|
||||
}
|
||||
if(nSumTotalVol)
|
||||
VWAP_Buffer_03[nIdx]=(nSumTotalTPV/nSumTotalVol);
|
||||
else
|
||||
VWAP_Buffer_03[nIdx]=0;
|
||||
if(sLevel03Str!="VWAP Level 03 ("+(string)VWAP_Level_03_Period+"): "+(string)NormalizeDouble(VWAP_Buffer_03[nIdx],_Digits))
|
||||
{
|
||||
sLevel03Str = "VWAP Level 03 (" + (string)VWAP_Level_03_Period + "): " + (string)NormalizeDouble(VWAP_Buffer_03[nIdx], _Digits);
|
||||
ObjectSetString(0,"VWAP_Level_03",OBJPROP_TEXT,sLevel03Str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(Enable_Level_04)
|
||||
{
|
||||
int nStartPos=(prev_calculated>VWAP_Level_04_Period) ?(prev_calculated-VWAP_Level_04_Period) : VWAP_Level_04_Period;
|
||||
for(nIdx=nStartPos; nIdx<rates_total; nIdx++)
|
||||
{
|
||||
double nSumTotalTPV = 0;
|
||||
double nSumTotalVol = 0;
|
||||
VWAP_Buffer_04[nIdx] = EMPTY_VALUE;
|
||||
|
||||
for(int nSubIdx=1; nSubIdx<VWAP_Level_04_Period; nSubIdx++)
|
||||
{
|
||||
nSumTotalTPV += nTotalTPV[nIdx - nSubIdx];
|
||||
nSumTotalVol += nTotalVol[nIdx - nSubIdx];
|
||||
}
|
||||
if(nSumTotalVol)
|
||||
VWAP_Buffer_04[nIdx]=(nSumTotalTPV/nSumTotalVol);
|
||||
else
|
||||
VWAP_Buffer_04[nIdx]=0;
|
||||
if(sLevel04Str!="VWAP Level 04 ("+(string)VWAP_Level_04_Period+"): "+(string)NormalizeDouble(VWAP_Buffer_04[nIdx],_Digits))
|
||||
{
|
||||
sLevel04Str = "VWAP Level 04 (" + (string)VWAP_Level_04_Period + "): " + (string)NormalizeDouble(VWAP_Buffer_04[nIdx], _Digits);
|
||||
ObjectSetString(0,"VWAP_Level_04",OBJPROP_TEXT,sLevel04Str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(Enable_Level_05)
|
||||
{
|
||||
int nStartPos=(prev_calculated>VWAP_Level_05_Period) ?(prev_calculated-VWAP_Level_05_Period) : VWAP_Level_05_Period;
|
||||
for(nIdx=nStartPos; nIdx<rates_total; nIdx++)
|
||||
{
|
||||
double nSumTotalTPV = 0;
|
||||
double nSumTotalVol = 0;
|
||||
VWAP_Buffer_05[nIdx] = EMPTY_VALUE;
|
||||
|
||||
for(int nSubIdx=1; nSubIdx<VWAP_Level_05_Period; nSubIdx++)
|
||||
{
|
||||
nSumTotalTPV += nTotalTPV[nIdx - nSubIdx];
|
||||
nSumTotalVol += nTotalVol[nIdx - nSubIdx];
|
||||
}
|
||||
if(nSumTotalVol)
|
||||
VWAP_Buffer_05[nIdx]=(nSumTotalTPV/nSumTotalVol);
|
||||
else
|
||||
VWAP_Buffer_05[nIdx]=0;
|
||||
if(sLevel05Str!="VWAP Level 05 ("+(string)VWAP_Level_05_Period+"): "+(string)NormalizeDouble(VWAP_Buffer_05[nIdx],_Digits))
|
||||
{
|
||||
sLevel05Str = "VWAP Level 05 (" + (string)VWAP_Level_05_Period + "): " + (string)NormalizeDouble(VWAP_Buffer_05[nIdx], _Digits);
|
||||
ObjectSetString(0,"VWAP_Level_05",OBJPROP_TEXT,sLevel05Str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bIsFirstRun=false;
|
||||
}
|
||||
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
Reference in New Issue
Block a user