AverageTrueRange by md.safari.ci55

486 downloads / 497 views / Created: 19.01.2024
 Average Rating: 0

Indicator Description

AverageTrueRange

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 AverageTrueRange : Indicator { public AverageTrueRange() { IndicatorName = "Average True Range"; PossibleSlots = SlotTypes.OpenFilter | SlotTypes.CloseFilter; SeparatedChart = true; IndicatorAuthor = "Miroslav Popov"; IndicatorVersion = "2.0"; IndicatorDescription = "Bundled in FSB distribution."; } public override void Initialize(SlotTypes slotType) { SlotType = slotType; // The ComboBox parameters IndParam.ListParam[0].Caption = "Logic"; IndParam.ListParam[0].ItemList = new[] { "ATR rises", "ATR falls", "ATR is higher than the Level line", "ATR is lower than the Level line", "ATR crosses the Level line upward", "ATR crosses the Level line downward", "ATR changes its direction upward", "ATR changes its direction downward" }; 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.Simple; IndParam.ListParam[1].Text = IndParam.ListParam[1].ItemList[IndParam.ListParam[1].Index]; IndParam.ListParam[1].Enabled = true; IndParam.ListParam[1].ToolTip = "The Moving Average method used for smoothing the ATR."; IndParam.ListParam[2].Caption = "Base price"; IndParam.ListParam[2].ItemList = new[] {"Bar range"}; IndParam.ListParam[2].Index = 0; IndParam.ListParam[2].Text = IndParam.ListParam[2].ItemList[IndParam.ListParam[2].Index]; IndParam.ListParam[2].Enabled = true; IndParam.ListParam[2].ToolTip = "ATR uses the range of the current bar"; // The NumericUpDown parameters IndParam.NumParam[0].Caption = "Smoothing period"; IndParam.NumParam[0].Value = 14; IndParam.NumParam[0].Min = 1; IndParam.NumParam[0].Max = 200; IndParam.NumParam[0].Enabled = true; IndParam.NumParam[0].ToolTip = "The period of ATR smoothing."; IndParam.NumParam[1].Caption = "Level [points]"; IndParam.NumParam[1].Value = 100; IndParam.NumParam[1].Min = 0; IndParam.NumParam[1].Max = 2000; IndParam.NumParam[1].Point = 0; IndParam.NumParam[1].Enabled = true; IndParam.NumParam[1].ToolTip = "A critical level in points(for the appropriate logic)."; // 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 var maMethod = (MAMethod) IndParam.ListParam[1].Index; var period = (int) IndParam.NumParam[0].Value; double level = Point*IndParam.NumParam[1].Value; int prev = IndParam.CheckParam[0].Checked ? 1 : 0; // Calculation int firstBar = period + 2; var atr = new double[Bars]; for (int bar = 1; bar < Bars; bar++) atr[bar] = Math.Max(High[bar], Close[bar - 1]) - Math.Min(Low[bar], Close[bar - 1]); atr = MovingAverage(period, 0, maMethod, atr); // Saving the components Component = new IndicatorComp[3]; Component[0] = new IndicatorComp { CompName = "Average True Range", DataType = IndComponentType.IndicatorValue, ChartType = IndChartType.Line, ChartColor = Color.Blue, FirstBar = firstBar, Value = atr }; Component[1] = new IndicatorComp { ChartType = IndChartType.NoChart, FirstBar = firstBar, Value = new double[Bars] }; Component[2] = new IndicatorComp { ChartType = IndChartType.NoChart, FirstBar = firstBar, Value = new double[Bars] }; // Sets the Component's type if (SlotType == SlotTypes.OpenFilter) { Component[1].DataType = IndComponentType.AllowOpenLong; Component[1].CompName = "Is long entry allowed"; Component[2].DataType = IndComponentType.AllowOpenShort; Component[2].CompName = "Is short entry allowed"; } else if (SlotType == SlotTypes.CloseFilter) { Component[1].DataType = IndComponentType.ForceCloseLong; Component[1].CompName = "Close out long position"; Component[2].DataType = IndComponentType.ForceCloseShort; Component[2].CompName = "Close out short position"; } // Calculation of the logic var indLogic = IndicatorLogic.It_does_not_act_as_a_filter; switch (IndParam.ListParam[0].Text) { case "ATR rises": indLogic = IndicatorLogic.The_indicator_rises; break; case "ATR falls": indLogic = IndicatorLogic.The_indicator_falls; break; case "ATR is higher than the Level line": indLogic = IndicatorLogic.The_indicator_is_higher_than_the_level_line; SpecialValues = new[] {level}; break; case "ATR is lower than the Level line": indLogic = IndicatorLogic.The_indicator_is_lower_than_the_level_line; SpecialValues = new[] {level}; break; case "ATR crosses the Level line upward": indLogic = IndicatorLogic.The_indicator_crosses_the_level_line_upward; SpecialValues = new[] {level}; break; case "ATR crosses the Level line downward": indLogic = IndicatorLogic.The_indicator_crosses_the_level_line_downward; SpecialValues = new[] {level}; break; case "ATR changes its direction upward": indLogic = IndicatorLogic.The_indicator_changes_its_direction_upward; break; case "ATR changes its direction downward": indLogic = IndicatorLogic.The_indicator_changes_its_direction_downward; break; } // ATR rises equal signals in both directions! NoDirectionOscillatorLogic(firstBar, prev, atr, level, ref Component[1], indLogic); Component[2].Value = Component[1].Value; } public override void SetDescription() { string levelLong = IndParam.NumParam[1].ValueToString; string levelShort = levelLong; EntryFilterLongDescription = ToString() + " "; EntryFilterShortDescription = ToString() + " "; ExitFilterLongDescription = ToString() + " "; ExitFilterShortDescription = ToString() + " "; switch (IndParam.ListParam[0].Text) { case "ATR rises": EntryFilterLongDescription += "rises"; EntryFilterShortDescription += "rises"; ExitFilterLongDescription += "rises"; ExitFilterShortDescription += "rises"; break; case "ATR falls": EntryFilterLongDescription += "falls"; EntryFilterShortDescription += "falls"; ExitFilterLongDescription += "falls"; ExitFilterShortDescription += "falls"; break; case "ATR is higher than the Level line": EntryFilterLongDescription += "is higher than the Level " + levelLong; EntryFilterShortDescription += "is higher than the Level " + levelShort; ExitFilterLongDescription += "is higher than the Level " + levelLong; ExitFilterShortDescription += "is higher than the Level " + levelShort; break; case "ATR is lower than the Level line": EntryFilterLongDescription += "is lower than the Level " + levelLong; EntryFilterShortDescription += "is lower than the Level " + levelShort; ExitFilterLongDescription += "is lower than the Level " + levelLong; ExitFilterShortDescription += "is lower than the Level " + levelShort; break; case "ATR crosses the Level line upward": EntryFilterLongDescription += "crosses the Level " + levelLong + " upward"; EntryFilterShortDescription += "crosses the Level " + levelShort + " upward"; ExitFilterLongDescription += "crosses the Level " + levelLong + " upward"; ExitFilterShortDescription += "crosses the Level " + levelShort + " upward"; break; case "ATR crosses the Level line downward": EntryFilterLongDescription += "crosses the Level " + levelLong + " downward"; EntryFilterShortDescription += "crosses the Level " + levelShort + " downward"; ExitFilterLongDescription += "crosses the Level " + levelLong + " downward"; ExitFilterShortDescription += "crosses the Level " + levelShort + " downward"; break; case "ATR changes its direction upward": EntryFilterLongDescription += "changes its direction upward"; EntryFilterShortDescription += "changes its direction upward"; ExitFilterLongDescription += "changes its direction upward"; ExitFilterShortDescription += "changes its direction upward"; break; case "ATR changes its direction downward": EntryFilterLongDescription += "changes its direction downward"; EntryFilterShortDescription += "changes its direction downward"; ExitFilterLongDescription += "changes its direction downward"; ExitFilterShortDescription += "changes its direction downward"; break; } } public override string ToString() { return IndicatorName + (IndParam.CheckParam[0].Checked ? "* (" : " (") + IndParam.ListParam[1].Text + ", " + // Method IndParam.NumParam[0].ValueToString + ")"; // Period } } }
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 - 2024, Forex Software Ltd.;