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.;
Copyright © 2006 - 2024, Forex Software Ltd.;