using System; using System.Collections.Generic; using System.Text; using System.Drawing; using WealthLab; namespace IgorChechet.Indicators { #region Описание индикаторов public class SMADHelper : IndicatorHelper { private static object[] _paramDefaults = { CoreDataSeries.Close, new RangeBoundInt32(3, 2, 5) }; private static string[] _paramNames = { "Source", "Period" }; public override IList ParameterDefaultValues { get { return _paramDefaults; } } public override IList ParameterDescriptions { get { return _paramNames; } } public override string TargetPane { get { return "SMAD"; } } public override Color DefaultColor { get { return Color.Red; } } public override Type IndicatorType { get { return typeof(SMAD); } } public override string Description { get { return @"SMA based on daily period."; } } public override string URL { get { return @"http://ichechet.livejournal.com"; } } } #endregion #region SMAD public class SMAD : DataSeries { public SMAD(DataSeries ds, int period, string description) : base(ds, description) { FirstValidValue = 0; for (int i = 1; i < period + 2; i++) // Берем 2 лишних дня, чтобы быть уверенными, что все часы будут присутствовать в нужном периоде FirstValidValue = GetNextBar(ds, FirstValidValue); for (int bar = FirstValidValue; bar < ds.Count; bar++) { int prevBar = bar; double sum = ds[bar]; for (int i = 1; i < period; i++) { prevBar = GetPrevBar(ds, prevBar); sum += ds[prevBar]; } //this[bar] = sum / period; // Значение SMAD this[bar] = 100 / (sum / period) * ds[bar] - 100; // Отклонение SMAD от текущего значения в % } } public static SMAD Series(DataSeries ds, int period) { string description = "SMAD(" + ds.Description + "," + period + ")"; if (ds.Cache.ContainsKey(description)) return (SMAD)ds.Cache[description]; SMAD smad = new SMAD(ds, period, description); ds.Cache[description] = smad; return smad; } private int GetNextBar(DataSeries DS, int Bar) { int hour = DS.Date[Bar].Hour; // Запоминаем часы int minute = DS.Date[Bar].Minute; // и минуты заданного бара for (int bar = Bar + 1; bar < DS.Count; bar++) // Будем пробегаться со следующего бара до конца if (DS.Date[bar].Hour == hour && DS.Date[bar].Minute == minute) // Если время бара совпадает с заданным return bar; // то вернуть его номер return -1; // Если ничего не найдено, то вернуть -1 } private int GetPrevBar(DataSeries DS, int Bar) { int hour = DS.Date[Bar].Hour; // Запоминаем часы int minute = DS.Date[Bar].Minute; // и минуты заданного бара for (int bar = Bar - 1; bar >= 0; bar--) // Будем пробегаться с предыдующего бара до начала if (DS.Date[bar].Hour == hour && DS.Date[bar].Minute == minute) // Если время бара совпадает с заданным return bar; // то вернуть его номер return -1; // Если ничего не найдено, то вернуть -1 } } #endregion }