Пользовательские индикаторы > ФИЛЬТР КАЛМАНА!

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
Аватара пользователя
Den
Сообщения: 377
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 17 раз
Поблагодарили: 5 раз

ФИЛЬТР КАЛМАНА!

Непрочитанное сообщение Den » 25 ноя 2024, 14:38

Привет всем.
Кто-то пробовал его прикрутить в АД?

Фильтр Калмана — мощный математический инструмент, используемый в различных областях, включая финансы, инженерию и робототехнику. Это рекурсивный алгоритм, который оценивает состояние динамической системы на основе зашумленных измерений.
Последний раз редактировалось Den 25 ноя 2024, 18:36, всего редактировалось 3 раза.

Аватара пользователя
Den
Сообщения: 377
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 17 раз
Поблагодарили: 5 раз

Re: ФИЛЬТР КАЛМАНА!

Непрочитанное сообщение Den » 25 ноя 2024, 14:44

пытаюсь прикрутить его к своему индикатору.
не хочет.

имя GetVariable отсутствует в текущем контексте в строках 29,30,31,32



Код: Выделить всё

function Initialize() {
    // Установка имени индикатора
    IndicatorName = "индикатор";

    // Добавление входного параметра типа свечи
    AddInput("Input", Inputs.Candle);   

    // Установка индикатора в область графика цены
    PriceStudy = true;   

    // Добавление серий для отображения на графике
    AddSeries("H", DrawAs.Custom, Color.Coral);   
    AddSeries("L", DrawAs.Custom, Color.LightGreen);
    AddSeries("D", DrawAs.Custom, Color.HotPink);  // Добавление серии D для визуальных маркеров

    // Добавление параметров и глобальных переменных
    AddParameter("P2", 0.21, "", 1);
    AddGlobalVariable("CurrentPosition", Types.Int, 0);

    // Инициализация переменных фильтра Калмана через AddGlobalVariable
    AddGlobalVariable("kalmanEstimate", Types.Double, 0.0);
    AddGlobalVariable("kalmanErrorCovariance", Types.Double, 1.0);
    AddGlobalVariable("processNoise", Types.Double, 0.01);
    AddGlobalVariable("measurementNoise", Types.Double, 1.0);
}

function Evaluate() {
    // Получение глобальных переменных фильтра Калмана
    var kalmanEstimate = GetVariable("kalmanEstimate");
    var kalmanErrorCovariance = GetVariable("kalmanErrorCovariance");
    var processNoise = GetVariable("processNoise");
    var measurementNoise = GetVariable("measurementNoise");

    // Визуальный маркер для начала выполнения функции Evaluate
    D[0] = Input.Close[0]; // Отобразим линию для каждого выполнения Evaluate

    // Логика фильтра Калмана для сглаживания High
    kalmanErrorCovariance += processNoise;
    var kalmanGainHigh = kalmanErrorCovariance / (kalmanErrorCovariance + measurementNoise);
    kalmanEstimate = kalmanEstimate + kalmanGainHigh * (Input.High[0] - kalmanEstimate);
    kalmanErrorCovariance = (1 - kalmanGainHigh) * kalmanErrorCovariance;
    var smoothedHigh = kalmanEstimate;

    // Обновление глобальных переменных фильтра Калмана
    SetVariable("kalmanEstimate", kalmanEstimate);
    SetVariable("kalmanErrorCovariance", kalmanErrorCovariance);

    // Визуальный маркер для сглаженного High
    H[0] = smoothedHigh;
    H.DrawVertical(Color.Blue, LineStyles.Dot, 1);

    // Логика фильтра Калмана для сглаживания Low (повторно используем ту же переменную kalmanEstimate)
    kalmanErrorCovariance += processNoise;
    var kalmanGainLow = kalmanErrorCovariance / (kalmanErrorCovariance + measurementNoise);
    kalmanEstimate = kalmanEstimate + kalmanGainLow * (Input.Low[0] - kalmanEstimate);
    kalmanErrorCovariance = (1 - kalmanGainLow) * kalmanErrorCovariance;
    var smoothedLow = kalmanEstimate;

    // Обновление глобальных переменных фильтра Калмана
    SetVariable("kalmanEstimate", kalmanEstimate);
    SetVariable("kalmanErrorCovariance", kalmanErrorCovariance);

    // Визуальный маркер для сглаженного Low
    L[0] = smoothedLow;
    L.DrawVertical(Color.Green, LineStyles.Dot, 1);

    // Сравнение значений индикаторов для поиска экстремумов
    if (MY.индикатор(Input, P2).GetValue("W", 0) == MY.индикатор(Input).GetValue("H", 0)) {
        H[0] = smoothedHigh;
        H.DrawVertical(Color.OrangeRed, LineStyles.Dot, 1);
        // Визуальный маркер для экстремума High
        D[0] = smoothedHigh;
    }

    if (MY.индикатор(Input, P2).GetValue("W", 0) == MY.индикатор(Input).GetValue("L", 0)) {
        L[0] = smoothedLow;
        L.DrawVertical(Color.Aqua, LineStyles.Dot, 1);
        // Визуальный маркер для экстремума Low
        D[0] = smoothedLow;
    }
}
Последний раз редактировалось Den 25 ноя 2024, 18:37, всего редактировалось 2 раза.

Аватара пользователя
Den
Сообщения: 377
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 17 раз
Поблагодарили: 5 раз

Re: ФИЛЬТР КАЛМАНА!

Непрочитанное сообщение Den » 25 ноя 2024, 14:45

надеюсь Евгений поможет
Последний раз редактировалось Den 25 ноя 2024, 20:09, всего редактировалось 2 раза.

Аватара пользователя
Den
Сообщения: 377
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 17 раз
Поблагодарили: 5 раз

Re: ФИЛЬТР КАЛМАНА!

Непрочитанное сообщение Den » 25 ноя 2024, 15:10

Есть где-то документация используемой среды, чтобы понять, как правильно управлять сериями и использовать их внутри разных функций?

Кроме древнего файлаTerminal 4.0. Skripti poljzova, v1.29, 2021-04-21
Последний раз редактировалось Den 25 ноя 2024, 20:09, всего редактировалось 1 раз.

ensh
Сообщения: 229
Зарегистрирован: 28 июн 2017, 13:56
Благодарил (а): 4 раза
Поблагодарили: 41 раз

Re: ФИЛЬТР КАЛЬМАНА!

Непрочитанное сообщение ensh » 25 ноя 2024, 17:42

Вобще-то их всегда называли фильтры Калмана, мягкий знак это неправильно

Аватара пользователя
Den
Сообщения: 377
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 17 раз
Поблагодарили: 5 раз

Re: ФИЛЬТР КАЛМАНА!

Непрочитанное сообщение Den » 25 ноя 2024, 18:36

ensh, да есть и такой вариант написания.
У тебя есть немного фильтров Калмана? :)

ensh
Сообщения: 229
Зарегистрирован: 28 июн 2017, 13:56
Благодарил (а): 4 раза
Поблагодарили: 41 раз

Re: ФИЛЬТР КАЛМАНА!

Непрочитанное сообщение ensh » 25 ноя 2024, 20:59

В далеком 2005м году писал систему целеуказания, Калманом считали траекторию цели.
Анонсирую - щас такой пост забабахаю, обчитаетесь, уже готовлю, по индикаторам

Аватара пользователя
Den
Сообщения: 377
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 17 раз
Поблагодарили: 5 раз

Re: ФИЛЬТР КАЛМАНА!

Непрочитанное сообщение Den » 25 ноя 2024, 21:51

ensh писал(а):В далеком 2005м году писал систему целеуказания, Калманом считали траекторию цели.
Анонсирую - щас такой пост забабахаю, обчитаетесь, уже готовлю, по индикаторам


ЖДЁМ!

ensh
Сообщения: 229
Зарегистрирован: 28 июн 2017, 13:56
Благодарил (а): 4 раза
Поблагодарили: 41 раз

Re: ФИЛЬТР КАЛМАНА!

Непрочитанное сообщение ensh » 25 ноя 2024, 22:01

Разобрался.
Вызов метода AddGlobalVariable добавляет к классу соответствующее поле.
Чтобы его использовать нужно просто писать его в коде без всяких уловок
То есть, ненужное я закоментарил:

Код: Выделить всё

function Initialize() {
    // Установка имени индикатора
    IndicatorName = "калман";

    // Добавление входного параметра типа свечи
    AddInput("Input", Inputs.Candle);   

    // Установка индикатора в область графика цены
    PriceStudy = true;   

    // Добавление серий для отображения на графике
    AddSeries("H", DrawAs.Custom, Color.Coral);   
    AddSeries("L", DrawAs.Custom, Color.LightGreen);
    AddSeries("D", DrawAs.Custom, Color.HotPink);  // Добавление серии D для визуальных маркеров

    // Добавление параметров и глобальных переменных
    AddParameter("P2", 0.21, "", 1);
    AddGlobalVariable("CurrentPosition", Types.Int, 0);

    // Инициализация переменных фильтра Калмана через AddGlobalVariable
    AddGlobalVariable("kalmanEstimate", Types.Double, 0.0);
    AddGlobalVariable("kalmanErrorCovariance", Types.Double, 1.0);
    AddGlobalVariable("processNoise", Types.Double, 0.01);
    AddGlobalVariable("measurementNoise", Types.Double, 1.0);
}

function Evaluate() {
    // Получение глобальных переменных фильтра Калмана
    //var kalmanEstimate = GetVariable("kalmanEstimate");
    //var kalmanErrorCovariance = GetVariable("kalmanErrorCovariance");
    //var processNoise = GetVariable("processNoise");
    //var measurementNoise = GetVariable("measurementNoise");

    // Визуальный маркер для начала выполнения функции Evaluate
    D[0] = Input.Close[0]; // Отобразим линию для каждого выполнения Evaluate

    // Логика фильтра Калмана для сглаживания High
    kalmanErrorCovariance += processNoise;
    var kalmanGainHigh = kalmanErrorCovariance / (kalmanErrorCovariance + measurementNoise);
    kalmanEstimate = kalmanEstimate + kalmanGainHigh * (Input.High[0] - kalmanEstimate);
    kalmanErrorCovariance = (1 - kalmanGainHigh) * kalmanErrorCovariance;
    var smoothedHigh = kalmanEstimate;

    // Обновление глобальных переменных фильтра Калмана
    //SetVariable(kalmanEstimate", kalmanEstimate);
    //SetVariable("kalmanErrorCovariance", kalmanErrorCovariance);

    // Визуальный маркер для сглаженного High
    H[0] = smoothedHigh;
    H.DrawVertical(Color.Blue, LineStyles.Dot, 1);

    // Логика фильтра Калмана для сглаживания Low (повторно используем ту же переменную kalmanEstimate)
    kalmanErrorCovariance += processNoise;
    var kalmanGainLow = kalmanErrorCovariance / (kalmanErrorCovariance + measurementNoise);
    kalmanEstimate = kalmanEstimate + kalmanGainLow * (Input.Low[0] - kalmanEstimate);
    kalmanErrorCovariance = (1 - kalmanGainLow) * kalmanErrorCovariance;
    var smoothedLow = kalmanEstimate;

    // Обновление глобальных переменных фильтра Калмана
    //SetVariable("kalmanEstimate", kalmanEstimate);
    //SetVariable("kalmanErrorCovariance", kalmanErrorCovariance);

    // Визуальный маркер для сглаженного Low
    L[0] = smoothedLow;
    L.DrawVertical(Color.Green, LineStyles.Dot, 1);

    // Сравнение значений индикаторов для поиска экстремумов
    if (MY.индикатор(Input, P2).GetValue("W", 0) == MY.индикатор(Input).GetValue("H", 0)) {
        H[0] = smoothedHigh;
        H.DrawVertical(Color.OrangeRed, LineStyles.Dot, 1);
        // Визуальный маркер для экстремума High
        D[0] = smoothedHigh;
    }

    if (MY.индикатор(Input, P2).GetValue("W", 0) == MY.индикатор(Input).GetValue("L", 0)) {
        L[0] = smoothedLow;
        L.DrawVertical(Color.Aqua, LineStyles.Dot, 1);
        // Визуальный маркер для экстремума Low
        D[0] = smoothedLow;
    }
}



Рефлектором в папке %appdata%/local/Alfa-direct/Scripts/Indicators/Bin посмотрел код скомпилированого индикатора "калман.alfa" но эта обычная C# dll

Код: Выделить всё

// MY._user_indicator_3a040000300400003b0400003c040000300400003d040000
using System.Drawing;
using AD.Common.DataStructures;
using TA.Script;

public class _user_indicator_3a040000300400003b0400003c040000300400003d040000 : ScriptedIndicator, IScriptedIndicator
{
   private AdsInput __input_Input = new AdsInput
   {
      Name = "Input",
      Type = DataPointsEnum.DpOhlcv
   };

   private AdsFuncParameter __P2 = new AdsFuncParameter("P2", enumAllowedTypes.Double, AdsFuncParameter.ExtractDouble(0.21), 1.0);

   private XSeries __H = new XSeries
   {
      Name = "H",
      Style = DrawAs.Custom,
      Color = Color.Coral,
      Visible = true
   };

   private XSeries __L = new XSeries
   {
      Name = "L",
      Style = DrawAs.Custom,
      Color = Color.LightGreen,
      Visible = true
   };

   private XSeries __D = new XSeries
   {
      Name = "D",
      Style = DrawAs.Custom,
      Color = Color.HotPink,
      Visible = true
   };

   public override AdsInput Input
   {
      get
      {
         return __input_Input;
      }
      set
      {
         SetInput(__input_Input, value);
      }
   }

   [ParameterProperty]
   public AdsFuncParameter P2
   {
      get
      {
         return __P2;
      }
      set
      {
         SetParameter(__P2, value);
      }
   }

   public XSeries H
   {
      get
      {
         return __H;
      }
      set
      {
         SetSeries(__H, value);
      }
   }

   public XSeries L
   {
      get
      {
         return __L;
      }
      set
      {
         SetSeries(__L, value);
      }
   }

   public XSeries D
   {
      get
      {
         return __D;
      }
      set
      {
         SetSeries(__D, value);
      }
   }

   [GlobalVariable]
   protected int CurrentPosition { get; set; }

   [GlobalVariable]
   protected double kalmanEstimate { get; set; }

   [GlobalVariable]
   protected double kalmanErrorCovariance { get; set; }

   [GlobalVariable]
   protected double processNoise { get; set; }

   [GlobalVariable]
   protected double measurementNoise { get; set; }

   public override void Initialize()
   {
      base.IndicatorName = "калман";
      AddInput("Input", Inputs.Candle);
      base.PriceStudy = true;
      AddSeries("H", DrawAs.Custom, Color.Coral);
      AddSeries("L", DrawAs.Custom, Color.LightGreen);
      AddSeries("D", DrawAs.Custom, Color.HotPink);
      AddParameter("P2", 0.21, "", 1.0);
      AddGlobalVariable("CurrentPosition", Types.Int, 0);
      AddGlobalVariable("kalmanEstimate", Types.Double, 0.0);
      AddGlobalVariable("kalmanErrorCovariance", Types.Double, 1.0);
      AddGlobalVariable("processNoise", Types.Double, 0.01);
      AddGlobalVariable("measurementNoise", Types.Double, 1.0);
   }

   public override void Evaluate()
   {
      D[0] = Input.Close[0];
      kalmanErrorCovariance += processNoise;
      double num = kalmanErrorCovariance / (kalmanErrorCovariance + measurementNoise);
      kalmanEstimate += num * (Input.High[0] - kalmanEstimate);
      kalmanErrorCovariance = (1.0 - num) * kalmanErrorCovariance;
      double value = kalmanEstimate;
      H[0] = value;
      H.DrawVertical(Color.Blue, LineStyles.Dot, 1);
      kalmanErrorCovariance += processNoise;
      double num2 = kalmanErrorCovariance / (kalmanErrorCovariance + measurementNoise);
      kalmanEstimate += num2 * (Input.Low[0] - kalmanEstimate);
      kalmanErrorCovariance = (1.0 - num2) * kalmanErrorCovariance;
      double value2 = kalmanEstimate;
      L[0] = value2;
      L.DrawVertical(Color.Green, LineStyles.Dot, 1);
      if (CustomIndicator("индикатор", Input, P2).GetValue("W") == CustomIndicator("индикатор", Input).GetValue("H"))
      {
         H[0] = value;
         H.DrawVertical(Color.OrangeRed, LineStyles.Dot, 1);
         D[0] = value;
      }
      if (CustomIndicator("индикатор", Input, P2).GetValue("W") == CustomIndicator("индикатор", Input).GetValue("L"))
      {
         L[0] = value2;
         L.DrawVertical(Color.Aqua, LineStyles.Dot, 1);
         D[0] = value2;
      }
   }

   protected override void ReinitGlobalVariables()
   {
      CurrentPosition = 0;
      kalmanEstimate = 0.0;
      kalmanErrorCovariance = 1.0;
      processNoise = 0.01;
      measurementNoise = 1.0;
   }

   public override bool CheckCompilerVersion(string version)
   {
      return string.Equals("{AC74EA46-E630-4E75-9B75-873E3ABF6D4B}", version);
   }

   public override bool CheckScriptHash(string hash)
   {
      return string.Equals("A4D7A7E6CBF8DF18941A87E0DFBFF570", hash);
   }
}


ensh
Сообщения: 229
Зарегистрирован: 28 июн 2017, 13:56
Благодарил (а): 4 раза
Поблагодарили: 41 раз

Re: ФИЛЬТР КАЛМАНА!

Непрочитанное сообщение ensh » 25 ноя 2024, 22:05

Класс XSeries определяется так, из рефлектора сборки TA.dll:
Вот что с ним можно проделывать:

Код: Выделить всё

// TA.Script.XSeries
using System;
using System.Collections.Generic;
using System.Drawing;
using AD.Common.DataStructures;
using TA.Script;

public class XSeries
{
   public string Name;

   public DrawAs Style;

   public Color Color;

   public LineStyles LineStyle;

   public int LineWidth = 1;

   public SortedList<long, double> Points;

   public AxesKindList _PriceStudy;

   private bool _NewArea = true;

   private int _AxisSize = 100;

   private ScriptedCode _Owner;

   public double LastValue;

   public const int DefaultAlpha = 50;

   public const int DefaultAlphaFigure = 100;

   public bool Visible { get; set; }

   public bool PriceStudy => GetPriceStudy();

   public bool ZeroBased { get; set; }

   public bool NeedToCorrect { get; set; }

   public bool NewArea
   {
      get
      {
         return _NewArea;
      }
      set
      {
         _NewArea = value;
      }
   }

   public int AxisSize
   {
      get
      {
         return _AxisSize;
      }
      set
      {
         if (value >= 10 && value <= 100)
         {
            _AxisSize = value;
            return;
         }
         throw new ArgumentOutOfRangeException("AxisSize", "Parameter should be in the range [10, 100]!");
      }
   }

   public ScriptedCode Owner
   {
      get
      {
         return _Owner;
      }
      set
      {
         SetOwner(value);
      }
   }

   public double this[int index]
   {
      get
      {
         return GetValue(index);
      }
      set
      {
         SetValue(index, value);
      }
   }

   public double this[AdsFuncParameter index]
   {
      get
      {
         return GetValue((int)(double)index);
      }
      set
      {
         SetValue((int)(double)index, value);
      }
   }

   private bool GetPriceStudy()
   {
      if (Owner is ScriptedIndicator)
      {
         if (_PriceStudy != 0)
         {
            return _PriceStudy == AxesKindList.Parent;
         }
         return (Owner as ScriptedIndicator).PriceStudy;
      }
      return _PriceStudy == AxesKindList.Parent;
   }

   private void SetOwner(ScriptedCode value)
   {
      _Owner = value;
   }

   public XSeries()
   {
      Init();
   }

   public void Init()
   {
      Points = new SortedList<long, double>();
   }

   public static implicit operator double(XSeries value)
   {
      return value[0];
   }

   public static implicit operator XSeries(double value)
   {
      return new XSeries
      {
         LastValue = value
      };
   }

   public static implicit operator XSeries(AdsInputStream value)
   {
      return new XSeries
      {
         LastValue = value[0]
      };
   }

   public static implicit operator XSeries(AdsFuncParameter value)
   {
      return new XSeries
      {
         LastValue = value
      };
   }

   private void SetValue(int index, double value)
   {
      if (Owner.TryGetTime(index, out var time))
      {
         long key = DataPoint.SecondsFromDateTime(time);
         if (Points.ContainsKey(key))
         {
            Points[key] = value;
         }
         else
         {
            Points.Add(key, value);
         }
      }
   }

   private double GetValue(int index)
   {
      double value = double.NaN;
      if (Owner.TryGetTime(index, out var time))
      {
         long key = DataPoint.SecondsFromDateTime(time);
         Points.TryGetValue(key, out value);
      }
      return value;
   }

   private double GetValueByTime(long time)
   {
      return Points[time];
   }

   private void SetValueByTime(long time, double value)
   {
      if (Points.ContainsKey(time))
      {
         Points[time] = value;
      }
      else
      {
         Points.Add(time, value);
      }
   }

   public void Clear()
   {
      if (Points != null)
      {
         Points.Clear();
      }
   }

   public string Prepare4Compiler()
   {
      return "XSeries __" + Name + " = new XSeries() {" + $" Name = \"{Name}\", Style = DrawAs.{Style.ToString()}, Color = Color.{Color.ToKnownColor().ToString()}, Visible = {Visible.ToString().ToLower()} " + "};\npublic XSeries " + Name + "\n{ get { return __" + Name + "; } set { " + $"SetSeries(__{Name}, value);" + "}}";
   }

   public void Hide()
   {
      Owner.CustomDrawPoint(this, DrawPointAs.Hidden);
   }

   public void DrawLine(Color color, LineStyles style, int width)
   {
      Owner.CustomDrawPoint(this, DrawPointAs.Line, color, style, width, true);
   }

   public void DrawLine()
   {
      DrawLine(Color.Empty, LineStyle, LineWidth);
   }

   public void DrawDash(Color color, LineStyles style, int width, int delta = 0)
   {
      Owner.CustomDrawPoint(this, DrawPointAs.HorizontalLine, color, style, width, delta, true);
   }

   public void DrawDash(int delta = 0)
   {
      DrawDash(Color.Empty, LineStyle, LineWidth, delta);
   }

   public void DrawVertical(XSeries series)
   {
      Owner.CustomDrawPoint(this, DrawPointAs.VerticalLine, Color.Empty, LineStyle, LineWidth, (series != null) ? series.Name : string.Empty, true);
   }

   public void DrawVertical(XSeries series, Color color, LineStyles style = LineStyles.Solid, int width = 1)
   {
      Owner.CustomDrawPoint(this, DrawPointAs.VerticalLine, color, style, width, (series != null) ? series.Name : string.Empty, true);
   }

   public void DrawVertical(Color color, LineStyles style, int width)
   {
      DrawVertical(null, color, style, width);
   }

   public void DrawVertical()
   {
      DrawVertical(Color.Empty, LineStyle, LineWidth);
   }

   public void DrawFigure(PointFigure figure, Color color, LineStyles style, int width, Color fill, int alpha = 100)
   {
      Owner.CustomDrawPoint(this, DrawPointAs.Point, figure, true, color, style, width, fill, alpha);
   }

   public void DrawCircle(Color color, LineStyles style, int width, Color fill, int alpha = 100)
   {
      DrawFigure(PointFigure.Circle, color, style, width, fill, alpha);
   }

   public void DrawCircle()
   {
      DrawCircle(Color.Empty, LineStyles.Solid, 1, Color.Empty);
   }

   public void DrawSquare(Color color, LineStyles style, int width, Color fill, int alpha = 100)
   {
      DrawFigure(PointFigure.Square, color, style, width, fill, alpha);
   }

   public void DrawSquare()
   {
      DrawSquare(Color.Empty, LineStyles.Solid, 1, Color.Empty);
   }

   public void DrawArrowUp(Color color, LineStyles style, int width, Color fill, int alpha = 100)
   {
      DrawFigure(PointFigure.Up, color, style, width, fill, alpha);
   }

   public void DrawArrowUp()
   {
      DrawArrowUp(Color.Empty, LineStyles.Solid, 1, Color.Empty);
   }

   public void DrawArrowDown(Color color, LineStyles style, int width, Color fill, int alpha = 100)
   {
      DrawFigure(PointFigure.Down, color, style, width, fill, alpha);
   }

   public void DrawArrowDown()
   {
      DrawArrowDown(Color.Empty, LineStyles.Solid, 1, Color.Empty);
   }

   public void DrawArrowLeft(Color color, LineStyles style, int width, Color fill, int alpha = 100)
   {
      DrawFigure(PointFigure.Left, color, style, width, fill, alpha);
   }

   public void DrawArrowLeft()
   {
      DrawArrowLeft(Color.Empty, LineStyles.Solid, 1, Color.Empty);
   }

   public void DrawArrowRight(Color color, LineStyles style, int width, Color fill, int alpha = 100)
   {
      DrawFigure(PointFigure.Right, color, style, width, fill, alpha);
   }

   public void DrawArrowRight()
   {
      DrawArrowRight(Color.Empty, LineStyles.Solid, 1, Color.Empty);
   }

   public void DrawHistogram(XSeries series, Color color, LineStyles style, int width, Color fill, int alpha = 50)
   {
      Owner.CustomDrawPoint(this, DrawPointAs.Histogram, color, style, width, true, fill, alpha, (series != null) ? series.Name : string.Empty);
   }

   public void DrawHistogram(Color color, LineStyles style, int width, Color fill, int alpha = 50)
   {
      Owner.CustomDrawPoint(this, DrawPointAs.Histogram, color, style, width, true, fill, alpha, string.Empty);
   }

   public void DrawHistogram(Color color, int alpha = 50)
   {
      DrawHistogram(null, color, LineStyles.Solid, 1, color, alpha);
   }

   public void DrawHistogram(Color color, Color fill, int alpha = 50)
   {
      DrawHistogram(null, color, LineStyles.Solid, 1, fill, alpha);
   }

   public void DrawHistogram(XSeries series, Color fill, int alpha = 50)
   {
      DrawHistogram(series, Color.Empty, LineStyles.Solid, 1, fill, alpha);
   }

   public void DrawHistogram(XSeries series)
   {
      DrawHistogram(series, Color.Empty, LineStyles.Solid, 1, Color.Empty);
   }

   public void DrawHistogram()
   {
      DrawHistogram(Color.Empty, LineStyles.Solid, 1, Color.Empty);
   }

   public void DrawArea(Color color, LineStyles style, int width, Color fill, int alpha = 50)
   {
      Owner.CustomDrawPoint(this, DrawPointAs.Area, color, style, width, true, fill, alpha);
   }

   public void DrawArea(Color fill, int alpha)
   {
      DrawArea(Color.Empty, LineStyle, LineWidth, fill, alpha);
   }

   public void DrawArea()
   {
      DrawArea(Color.Empty, 30);
   }

   public void DrawChannel(Color fill, int alpha)
   {
      DrawArea(Color.Empty, LineStyle, LineWidth, fill, alpha);
   }

   public void DrawChannel(XSeries series, Color fill, int alpha)
   {
      Owner.CustomDrawPoint(this, DrawPointAs.Area, Color.Empty, LineStyle, LineWidth, true, fill, alpha, (series != null) ? series.Name : string.Empty);
   }

   public void DrawChannel(XSeries series)
   {
      DrawChannel(series, Color.Empty, 30);
   }

   public void DrawSection(Color color, LineStyles style, int width, int delta)
   {
      Owner.CustomDrawPoint(this, DrawPointAs.TrendLine, color, style, width, delta, true);
   }

   public void DrawSection(int delta)
   {
      DrawSection(Color.Empty, LineStyle, LineWidth, delta);
   }

   public static int PercentToAlpha(int percent)
   {
      int num = percent * 255 / 100;
      if (num < 0 || num > 255)
      {
         num = 120;
      }
      return num;
   }

   public static int AlphaToPercent(int alpha)
   {
      int num = alpha * 100 / 255;
      if (num < 0 || num > 100)
      {
         num = 50;
      }
      return num;
   }
}



Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей