Waddah Attar Explosion by footon
44287 downloads / 3926 views / Created: 24.05.2013  Average Rating: 0 
Comments
//==============================================================
// Forex Strategy Builder
// Copyright © Miroslav Popov. All rights reserved.
//==============================================================
// THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE.
//==============================================================
using System;
using System.Drawing;
using ForexStrategyBuilder.Infrastructure.Entities;
using ForexStrategyBuilder.Infrastructure.Enums;
using ForexStrategyBuilder.Infrastructure.Interfaces;
namespace ForexStrategyBuilder.Indicators.Store
{
    public class WaddahAttarExplosion : Indicator
    {
        public WaddahAttarExplosion()
        {
            IndicatorName = "Waddah Attar Explosion";
            PossibleSlots = SlotTypes.OpenFilter;
            SeparatedChart = true;
            IndicatorAuthor = "Footon";
            IndicatorVersion = "2.0";
            IndicatorDescription = "Custom";
        }
        public override void Initialize(SlotTypes slotType)
        {
            SlotType = slotType;
            // The ComboBox parameters
            IndParam.ListParam[0].Caption = "Logic";
            if (SlotType == SlotTypes.OpenFilter)
                IndParam.ListParam[0].ItemList = new[]
                    {
                        "Long if buy signal",
						"Long if sell signal"
                    };
            else
                IndParam.ListParam[0].ItemList = new[]
                    {
                        "Not Defined"
                    };
            IndParam.ListParam[0].Index = 0;
            IndParam.ListParam[0].Text = IndParam.ListParam[0].ItemList[IndParam.ListParam[0].Index];
            IndParam.ListParam[0].Enabled = true;
            IndParam.ListParam[0].ToolTip = "Logic of application of the indicator.";
            IndParam.ListParam[1].Caption  = "Smoothing method";
            IndParam.ListParam[1].ItemList = Enum.GetNames(typeof(MAMethod));
            IndParam.ListParam[1].Index    = (int)MAMethod.Exponential;
            IndParam.ListParam[1].Text     = IndParam.ListParam[1].ItemList[IndParam.ListParam[1].Index];
            IndParam.ListParam[1].Enabled  = true;
            IndParam.ListParam[1].ToolTip  = "The smoothing method of Moving Averages.";
 
            IndParam.ListParam[2].Caption  = "Base price";
            IndParam.ListParam[2].ItemList = Enum.GetNames(typeof(BasePrice));
            IndParam.ListParam[2].Index    = (int)BasePrice.Close;
            IndParam.ListParam[2].Text     = IndParam.ListParam[2].ItemList[IndParam.ListParam[2].Index];
            IndParam.ListParam[2].Enabled  = true;
            IndParam.ListParam[2].ToolTip  = "The price the Moving Averages and BB are based on";
 
            IndParam.ListParam[3].Caption  = "BB method";
            IndParam.ListParam[3].ItemList = Enum.GetNames(typeof(MAMethod));
            IndParam.ListParam[3].Index    = (int)MAMethod.Simple;
            IndParam.ListParam[3].Text     = IndParam.ListParam[3].ItemList[IndParam.ListParam[3].Index];
            IndParam.ListParam[3].Enabled  = true;
            IndParam.ListParam[3].ToolTip  = "BB method";
 
            // The NumericUpDown parameters
            IndParam.NumParam[0].Caption = "Sensitivity";
            IndParam.NumParam[0].Value   = 150;
            IndParam.NumParam[0].Min     = 1;
            IndParam.NumParam[0].Max     = 1000;
            IndParam.NumParam[0].Enabled = true;
            IndParam.NumParam[0].ToolTip = "Sensitivity";
 
            IndParam.NumParam[1].Caption = "DeadZonePip";
            IndParam.NumParam[1].Value   = 30;
            IndParam.NumParam[1].Min     = 1;
            IndParam.NumParam[1].Max     = 200;
            IndParam.NumParam[1].Enabled = true;
            IndParam.NumParam[1].ToolTip = "DeadZonePip";
 
            IndParam.NumParam[2].Caption = "ExplosionPower";
            IndParam.NumParam[2].Value   = 15;
            IndParam.NumParam[2].Min     = 1;
            IndParam.NumParam[2].Max     = 200;
            IndParam.NumParam[2].Enabled = true;
            IndParam.NumParam[2].ToolTip = "ExplosionPower";
			
			IndParam.NumParam[3].Caption = "TrendPower";
            IndParam.NumParam[3].Value   = 15;
            IndParam.NumParam[3].Min     = 1;
            IndParam.NumParam[3].Max     = 200;
            IndParam.NumParam[3].Enabled = true;
            IndParam.NumParam[3].ToolTip = "TrendPower";
            // The CheckBox parameters
            IndParam.CheckParam[0].Caption = "Use previous bar value";
            IndParam.CheckParam[0].Enabled = true;
            IndParam.CheckParam[0].ToolTip = "Use the indicator value from the previous bar";
        }
        public override void Calculate(IDataSet dataSet)
        {
            DataSet = dataSet;
            // Reading the parameters
            MAMethod  maMethod  = (MAMethod )IndParam.ListParam[1].Index;
            MAMethod  slMethod  = (MAMethod )IndParam.ListParam[3].Index;
            BasePrice basePrice = (BasePrice)IndParam.ListParam[2].Index;
            int       nSlow     = 40;
			int		Sensetive   = (int)IndParam.NumParam[0].Value;
            int       nFast     = 20;
			int		DeadZonePip = (int)IndParam.NumParam[1].Value;
            int ExplosionPower  = (int)IndParam.NumParam[2].Value;
			int TrendPower		= (int)IndParam.NumParam[3].Value;
            int previous = IndParam.CheckParam[0].Checked ? 1 : 0;
            // Calculation
			int firstBar = Math.Max(nSlow, Math.Max(nFast, 20)) + 3;
			double point = (Digits == 5 || Digits == 3) ? 10 * Point : Point;
			double[] adMACD = new double[Bars];
			double[] buy = new double[Bars];
			double[] sell = new double[Bars];
			double[] ind_buffer1 = new double[Bars];
			double[] ind_buffer2 = new double[Bars];
			double[] ind_buffer3 = new double[Bars];
			double[] ind_buffer4 = new double[Bars];
		
			double Trend1 = 0;
			double Trend2 = 0; 
			double Explo1 = 0; 
			double Explo2 = 0; 
			double Dead = point * DeadZonePip;
			double pwrt = 0;
			double pwre = 0;
			
			double[] adMASlow = MovingAverage(nSlow, 0, maMethod, Price(basePrice));
            double[] adMAFast = MovingAverage(nFast, 0, maMethod, Price(basePrice));
			
			double[] price = Price(basePrice);
            double[] ma = MovingAverage(20, 0, slMethod, price);
            double[] upperBand = new double[Bars];
			double[] lowerBand = new double[Bars];
			
			for (int bar = firstBar; bar < Bars; bar++)
            {
				double sum = 0;
                for (int i = 0; i < 20; i++)
                {
                    double delta = (price[bar - i] - ma[bar]);
                    sum += delta * delta;
                }
                double stdDev = Math.Sqrt(sum / 20);
                upperBand[bar] = ma[bar] + 2.0 * stdDev;
				lowerBand[bar] = ma[bar] - 2.0 * stdDev;
				
				adMACD[bar] = adMAFast[bar] - adMASlow[bar];
			
				Trend1 = (adMACD[bar-1] - adMACD[bar-2]) * Sensetive;
				Trend2 = (adMACD[bar-3] - adMACD[bar-4]) * Sensetive;
				Explo1 = upperBand[bar-1] - lowerBand[bar-1];
				Explo2 = upperBand[bar-2] - lowerBand[bar-2];
			
				if(Trend1 >= 0)
					ind_buffer1[bar] = Trend1;
				
				if(Trend1 < 0)
					ind_buffer2[bar] = (-1*Trend1);
				
				ind_buffer3[bar] = Explo1;
				ind_buffer4[bar] = Dead;
			
				if(Trend1 > 0 && Trend1 > Explo1 && Trend1 > Dead && Explo1 > Dead && Explo1 > Explo2 && Trend1 > Trend2)
				{
					pwrt = 100*(Trend1 - Trend2) / Trend1;
					pwre = 100*(Explo1 - Explo2) / Explo1;
					
				
					if(pwre >= ExplosionPower && pwrt >= TrendPower)
					{
						if (IndParam.ListParam[0].Index == 1) sell[bar] = 1;
						else buy[bar] = 1;
					}	
				}
			
				if(Trend1 < 0 && Math.Abs(Trend1) > Explo1 && Math.Abs(Trend1) > Dead && Explo1 > Dead && Explo1 > Explo2 && Math.Abs(Trend1) > Math.Abs(Trend2))
				{
					pwrt = 100*(Math.Abs(Trend1) - Math.Abs(Trend2)) / Math.Abs(Trend1);
					pwre = 100*(Explo1 - Explo2) / Explo1;
					
				
					if(pwre >= ExplosionPower && pwrt >= TrendPower)
					{
						if (IndParam.ListParam[0].Index == 1) buy[bar] = 1;
						else sell[bar] = 1;
					}
				}
			}
            // Saving the components
            Component = new IndicatorComp[6];
            Component[0] = new IndicatorComp
                {
                    CompName = "Histogram",
                    DataType = IndComponentType.IndicatorValue,
                    ChartType = IndChartType.Histogram,
                    ChartColor = Color.Blue,
                    FirstBar = firstBar,
                    Value = ind_buffer1
                };
            Component[1] = new IndicatorComp
                {
                    CompName = "Line",
                    DataType = IndComponentType.IndicatorValue,
                    ChartType = IndChartType.Line,
                    ChartColor = Color.Gold,
                    FirstBar = firstBar,
                    Value = ind_buffer3
                };
            Component[2] = new IndicatorComp
                {
                    CompName = "Line",
                    DataType = IndComponentType.IndicatorValue,
                    ChartType = IndChartType.Line,
                    ChartColor = Color.Blue,
                    FirstBar = firstBar,
                    Value = ind_buffer4
                };
            Component[3] = new IndicatorComp
                {
                    CompName = "Allow entry",
                    DataType = IndComponentType.AllowOpenLong,
					ChartType = IndChartType.NoChart,
                    FirstBar = firstBar,
                    Value = buy
                };
            Component[4] = new IndicatorComp
                {
                    CompName = "Allow entry",
                    DataType = IndComponentType.AllowOpenShort,
					ChartType = IndChartType.NoChart,
                    FirstBar = firstBar,
                    Value = sell
                };
				
			Component[5] = new IndicatorComp
                {
                    CompName = "Histogram",
                    DataType = IndComponentType.IndicatorValue,
                    ChartType = IndChartType.Histogram,
                    ChartColor = Color.Blue,
                    FirstBar = firstBar,
                    Value = ind_buffer2
                };
        }
        public override void SetDescription()
        {
            EntryFilterLongDescription  = "Long if buy signal";
            EntryFilterShortDescription = "Short if sell signal";
			ExitFilterLongDescription   = "Close long if exit long signal";
            ExitFilterShortDescription  = "Close short if exit sell signal";
        }
        public override string ToString()
        {
            string sString = IndicatorName +
                (IndParam.CheckParam[0].Checked ? "* (" : " (") +
                IndParam.ListParam[1].Text         + ", " + // Method
                IndParam.ListParam[2].Text         + ", " + // Price
                IndParam.ListParam[3].Text         + ", " + // Signal MA Method
                IndParam.NumParam[0].ValueToString + ", " + // Slow MA period
                IndParam.NumParam[1].ValueToString + ", " + // Fast MA period
                IndParam.NumParam[2].ValueToString + ")";   // Signal MA period
 
            return sString;
        }
    }
}
        //+--------------------------------------------------------------------+ //| Copyright: (C) 2016 Forex Software Ltd. | //| Website: http://forexsb.com/ | //| Support: http://forexsb.com/forum/ | //| License: Proprietary under the following circumstances: | //| | //| This code is a part of Forex Strategy Builder. It is free for | //| use as an integral part of Forex Strategy Builder. | //| One can modify it in order to improve the code or to fit it for | //| personal use. This code or any part of it cannot be used in | //| other applications without a permission. | //| The contact information cannot be changed. | //| | //| NO LIABILITY FOR CONSEQUENTIAL DAMAGES | //| | //| In no event shall the author be liable for any damages whatsoever | //| (including, without limitation, incidental, direct, indirect and | //| consequential damages, damages for loss of business profits, | //| business interruption, loss of business information, or other | //| pecuniary loss) arising out of the use or inability to use this | //| product, even if advised of the possibility of such damages. | //+--------------------------------------------------------------------+ #property copyright "Copyright (C) 2016 Forex Software Ltd." #property link "http://forexsb.com" #property version "2.00" #property strict #include <Forexsb.com/Indicator.mqh> #include <Forexsb.com/Enumerations.mqh> //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class WaddahAttarExplosion : public Indicator { public: WaddahAttarExplosion(SlotTypes slotType) { SlotType=slotType; IndicatorName="Waddah Attar Explosion"; WarningMessage = ""; IsAllowLTF = true; ExecTime = ExecutionTime_DuringTheBar; IsSeparateChart = false; IsDiscreteValues = false; IsDefaultGroupAll = false; } virtual void Calculate(DataSet &dataSet); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void WaddahAttarExplosion::Calculate(DataSet &dataSet) { Data=GetPointer(dataSet); MAMethod maMethod = (MAMethod )ListParam[1].Index; MAMethod slMethod = (MAMethod )ListParam[3].Index; BasePrice basePrice = (BasePrice)ListParam[2].Index; int nSlow = 40; int Sensetive = (int)NumParam[0].Value; int nFast = 20; int DeadZonePip = (int)NumParam[1].Value; int ExplosionPower = (int)NumParam[2].Value; int TrendPower = (int)NumParam[3].Value; int previous=CheckParam[0].Checked ? 1 : 0; int firstBar = MathMax(nSlow, MathMax(nFast, 20)) + 3; double point = (Data.Digits == 5 || Data.Digits == 3) ? 10 * Data.Point : Data.Point; double adMACD[]; ArrayResize(adMACD,Data.Bars); ArrayInitialize(adMACD,0); double upperBand[]; ArrayResize(upperBand,Data.Bars); ArrayInitialize(upperBand,0); double lowerBand[]; ArrayResize(lowerBand,Data.Bars); ArrayInitialize(lowerBand,0); double buy[]; ArrayResize(buy,Data.Bars); ArrayInitialize(buy,0); double sell[]; ArrayResize(sell,Data.Bars); ArrayInitialize(sell,0); double ind_buffer1[]; ArrayResize(ind_buffer1,Data.Bars); ArrayInitialize(ind_buffer1,0); double ind_buffer2[]; ArrayResize(ind_buffer2,Data.Bars); ArrayInitialize(ind_buffer2,0); double ind_buffer3[]; ArrayResize(ind_buffer3,Data.Bars); ArrayInitialize(ind_buffer3,0); double ind_buffer4[]; ArrayResize(ind_buffer4,Data.Bars); ArrayInitialize(ind_buffer4,0); double Trend1 = 0; double Trend2 = 0; double Explo1 = 0; double Explo2 = 0; double Dead = point * DeadZonePip; double pwrt = 0; double pwre = 0; double price[]; Price(basePrice,price); double adMASlow[]; MovingAverage(nSlow, 0, maMethod, price, adMASlow); double adMAFast[]; MovingAverage(nFast, 0, maMethod, price, adMAFast); double ma[]; MovingAverage(20, 0, slMethod, price, ma); for (int bar = firstBar; bar < Data.Bars; bar++) { double sum = 0; for (int i = 0; i < 20; i++) { double delta = (price[bar - i] - ma[bar]); sum += delta * delta; } double stdDev = MathSqrt(sum / 20); upperBand[bar] = ma[bar] + 2.0 * stdDev; lowerBand[bar] = ma[bar] - 2.0 * stdDev; adMACD[bar] = adMAFast[bar] - adMASlow[bar]; Trend1 = (adMACD[bar-1] - adMACD[bar-2]) * Sensetive; Trend2 = (adMACD[bar-3] - adMACD[bar-4]) * Sensetive; Explo1 = upperBand[bar-1] - lowerBand[bar-1]; Explo2 = upperBand[bar-2] - lowerBand[bar-2]; if(Trend1 >= 0) ind_buffer1[bar] = Trend1; if(Trend1 < 0) ind_buffer2[bar] = (-1*Trend1); ind_buffer3[bar] = Explo1; ind_buffer4[bar] = Dead; if(Trend1 > 0 && Trend1 > Explo1 && Trend1 > Dead && Explo1 > Dead && Explo1 > Explo2 && Trend1 > Trend2) { pwrt = 100*(Trend1 - Trend2) / Trend1; pwre = 100*(Explo1 - Explo2) / Explo1; if(pwre >= ExplosionPower && pwrt >= TrendPower) { if (ListParam[0].Index == 1) sell[bar] = 1; else buy[bar] = 1; } } if(Trend1 < 0 && MathAbs(Trend1) > Explo1 && MathAbs(Trend1) > Dead && Explo1 > Dead && Explo1 > Explo2 && MathAbs(Trend1) > MathAbs(Trend2)) { pwrt = 100*(MathAbs(Trend1) - MathAbs(Trend2)) / MathAbs(Trend1); pwre = 100*(Explo1 - Explo2) / Explo1; if(pwre >= ExplosionPower && pwrt >= TrendPower) { if (ListParam[0].Index == 1) buy[bar] = 1; else sell[bar] = 1; } } } ArrayResize(Component[0].Value,Data.Bars); Component[0].CompName = "Histogram"; Component[0].DataType = IndComponentType_IndicatorValue; Component[0].FirstBar = firstBar; ArrayCopy(Component[0].Value,ind_buffer1); ArrayResize(Component[1].Value,Data.Bars); Component[1].CompName = "Line"; Component[1].DataType = IndComponentType_IndicatorValue; Component[1].FirstBar = firstBar; ArrayCopy(Component[1].Value,ind_buffer3); ArrayResize(Component[2].Value,Data.Bars); Component[2].CompName = "Line"; Component[2].DataType = IndComponentType_IndicatorValue; Component[2].FirstBar = firstBar; ArrayCopy(Component[2].Value,ind_buffer4); ArrayResize(Component[3].Value,Data.Bars); ArrayInitialize(Component[3].Value,0); Component[3].DataType = IndComponentType_AllowOpenLong; Component[3].CompName = "Allow entry"; Component[3].FirstBar=firstBar; ArrayCopy(Component[3].Value,buy); ArrayResize(Component[4].Value,Data.Bars); ArrayInitialize(Component[4].Value,0); Component[4].DataType = IndComponentType_AllowOpenShort; Component[4].CompName = "Allow entry"; Component[4].FirstBar=firstBar; ArrayCopy(Component[4].Value,sell); ArrayResize(Component[5].Value,Data.Bars); Component[5].CompName = "Histogram"; Component[5].DataType = IndComponentType_IndicatorValue; Component[5].FirstBar = firstBar; ArrayCopy(Component[5].Value,ind_buffer2); } //+------------------------------------------------------------------+
                    Risk warning: Forex, spread bets and CFD are leveraged products. They may not be suitable for you as they carry a high degree of risk to your capital and you can lose more than your initial investment. You should ensure you understand all of the risks.                     
Copyright © 2006 - 2025, Forex Software Ltd.;
            Copyright © 2006 - 2025, Forex Software Ltd.;