Финансовая лаборатория

Биржевая торговля и торговые роботы


При построении торговых стратегий может понадобится выполнить некоторые действия, связанные с рисованием графических объектов. К примеру, нарисовать линии поддержки и сопротивления, зоны перекупленности и перепроданности, отметить цели движения цены, волны и тому подобные вещи.

Для этого в библиотеке WealthScript имеется целый набор необходимых для этого методов. Плюс Вы можете самостоятельно запрограммировать те методы, которые будут Вам помогать при работе с графическими объектами.

Рисование графических объектов в Велс Лаб

При рисовании графических объектов сложнее всего найти те точки, которые будут выступать в качестве основы для рисования. Методы PeakBar() и TroughBar() больше всего подходят для этой цели, однако для нахождения координат на графике для рисования различных формаций, треугольников, прямоугольников могут быть использованы любые методы.

Каждый из следующих методов может использоваться на любой области графика. Для более подробного знакомства и изучения примеров с этими методами спотрите справочник QuikRef (F11).

DrawCircle()

Этот метод рисует маленькие кружочки. Подходит для подсветки ключевых точек или целей на графике.

void DrawCircle(ChartPane pane, int radius, int bar, double value, Color color, Color fillColor, LineStyle style, int width, bool behindBars);
void DrawCircle(ChartPane pane, int radius, int bar, double value, Color color, LineStyle style, int width, bool behindBars);

protected void DrawCircle(ChartPane pane, int bar1, double value1, int bar2, double value2, Color color, Color fillColor, LineStyle style, int width, bool behindBars);
protected void DrawCircle(ChartPane pane, int bar1, double value1, int bar2, double value2, Color color, LineStyle style, int width, bool behindBars);

С помощью метода DrawCircle() можно нарисовать (и при желании раскрасить) круги на выбранной области графика. Причем сделать это можно двумя различными способами. Каждый из этих двух методов имеет параметр fillColor, с помощью которого можно указать - надо ли раскрашивать нарисованные круги. Последний параметр метода DrawCircle(), который обозначается behindBars - определяет - как должен быть нарисован круг - впереди либо сзади баров на графике. Круг будет нарисован с использованием определенных Вами цвета, стиля и толщины.

Первый метод рисует круг с радиусом, который указывается в пикселях. При этом центром этого круга будут координаты (X) и (Y). В качестве первой координаты выступает номер бара, а в качестве второй координаты - число, которое указываете Вы.

Второй метод рисует круг, радиус которого определяется линией, проведенной между двумя точками. Координаты каждой из этих двух точек также определяются координатами (X) и (Y). При этом первая координата каждой из этих двух точек это номер бара, а вторая координата - это число.

protected override void Execute()
{
    // Operator overload
    for(int bar = 200; bar < Bars.Count; bar++)
    {
        // Circle any 200 day High
        if ( High[bar] == Highest.Series( High, 200 )[bar] )
            DrawCircle( PricePane, 4, bar, High[bar], Color.Green, Color.DarkGreen, WealthLab.LineStyle.Solid, 1, true );
        // Circle any 200 day Low
        if ( Low[bar] == Lowest.Series( Low, 200 )[bar] )
            DrawCircle( PricePane, bar-1, Low[bar-1], bar, Low[bar-1], Color.Red, Color.DarkRed, WealthLab.LineStyle.Solid, 1, false );
    }
}

DrawEllipse()

Для рисования эллипса Вы должны всего лишь определить противоположный угол воображаемого прямоугольника, который устанавливает границы эллипса.

DrawLine()

Этот метод рисует линию, которая соединяет две точки. Линия может быть продлена с тем же уклоном, при нахождении значения координаты Y на следующем баре с помощью метода LineExtendY() или LineExtendYLog() и передавать значение следующей линии, при следующем вызове метода DrawLine().

DrawHorzLine()

Это подходящий метод для того, чтобы нарисовать линии поддержки и сопротивления на фиксированном уровне через весь график.

DrawPolygon()

Этот метод может использоваться для рисования многоугольника, состоящего из n-сторон.

Как: нарисовать линию тренда и продлить ее вправо по шкале времени.

Чтобы нарисовать расширяющуюся линию тренда нужно проделать следующие шаги:

  • Первым делом нарисуйте линию между двумя известными точками, использовав для этого метод DrawLine().
  • Следующим шагом найдите значение координаты Y на том баре, до которого Вы хотите расширить линию тренда.
  • Используйте найденную точку, подставив ее в качестве второго аргумента в метод DrawLine().

Мы можем упростить эту процедуру, создав специальный метод DrawExtended TrendLine().

Именно создание и применение метода DrawExtended TrendLine() приводится в следующем примере.

Пример (как выполнить пример приведенного кода)...


protected override void Execute()
{
   // Находим две последник пятипроцентных вершины и чертим линию до самого конца графика.

   int bar = Bars.Count - 1;
   int pb2 = (int)PeakBar.Value(bar, High, 5, WealthLab.Indicators.PeakTroughMode.Percent);
   int pb1 = pb2;

   if (pb2 > -1)

      pb1 = (int)PeakBar.Value(pb2, High, 5, WealthLab.Indicators.PeakTroughMode.Percent);

   if ((pb2 == -1) || (pb1 == -1))

      DrawLabel(PricePane, "Не могу найти две 5% вершины", Color.Red);

   else
      DrawExtendedTrendline(PricePane, pb1, High[pb1], pb2, High[pb2], bar, Color.Blue); //применяем созданный нами метод
}

//Создаем специальный метод, который рисует тренд и расширяет его до указанного бара.
public void DrawExtendedTrendline(ChartPane pane, int bar1, double val1,  int bar2, double val2, int bar3, Color color)

{
   // рисуем линию для двух известных нам точек на барах №1 и №2

   DrawLine(pane, bar1, val1, bar2, val2, Color.Blue, WealthLab.LineStyle.Solid, 2);

   // расширяем линию до указанного бара 3

   double val3 = LineExtendY(bar1, val1, bar2, val2, bar3); //Ищем значение координаты Y над баром 3, используя имеющуюся линию

   if (pane.LogScale)

      val3 = LineExtendYLog(bar1, val1, bar2, val2, bar3);

   DrawLine(pane, bar2, val2, bar3, val3, color, WealthLab.LineStyle.Solid, 1);         // снова рисуем линию для двух известных нам теперь точек: №2 и №3
}

После выполнения данного кода получается такой график:

Рисуем линию тренда

Демонстрация метода DrawLine()

Как видите, на графике над двумя последними вершинами нарисовлась линия и эта линия расширилась до самого последнего бара графика.

Как: начертить на графике в программе Велс Лаб скоростные линии сопротивления (1/3 - 2/3 линии)

Практически все графические объекты, которые Вы можете начертить вручную могут быть автоматически начерчены на графике с помощью программного кода. При этом исчезает субъективизм подхода. Все будет выполнено согласно строгим наборам правил, которые Вы заранее программируете.

Вот один из примеров использования такого подхода - начертим скоростные линии сопротивления.

Пример (как выполнить пример приведенного кода)...


using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;

namespace WealthLab.Strategies
{
    public class SpeedResistanceDemo : WealthScript
    {
        //создаем специальный методы для черчения скоростных линий сопротивления...
        public void SpeedResistance(int bar1, double price1, int bar2, double price2)
        {
            // Вы можете расширить линию с помощью этой процедуры и используя методы LineExtendY() или LineExtendYLog() при построении на графике semi-log

            double delta = price1 - price2;
            DrawLine(PricePane, bar1, price1, bar2, price2, Color.Red, WealthLab.LineStyle.Solid, 2);
            DrawLine(PricePane, bar1, price1, bar2, price2 + delta / 3, Color.Blue, WealthLab.LineStyle.Dots, 1);
            DrawLine(PricePane, bar1, price1, bar2, price2 + delta * 2 / 3, Color.Blue, WealthLab.LineStyle.Dots, 1);
        }
        protected override void Execute()
        {
            // Находим последние 8% вершину и дно и чертим скоростные линии сопротивления через эти точки.

            int bar = Bars.Count - 1;
            int b1 = (int)PeakBar.Value(bar, Close, 8.0, WealthLab.Indicators.PeakTroughMode.Percent);
            int b2 = (int)TroughBar.Value(bar, Close, 8.0, WealthLab.Indicators.PeakTroughMode.Percent);
            if (b2 > b1)
                SpeedResistance(b1, Close[b1], b2, Close[b2]);
            else
                SpeedResistance(b2, Close[b2], b1, Close[b1]);
        }
    }
}

В результате получается вот такой график скоростных линий сопротивления:

Рисование скоростных линий сопротивления

Чертеж скоростных линий сопротивления

Как: выделить зону на графике в виде многоугольника

И снова используя подходящие вершины и впадины мы можем определить 4 (или более) углов для того, чтобы начертить на графике многоугольник.

Пример (как выполнить пример приведенного кода)...


protected override void Execute()
{
   // Находим две последник пятипроцентных вершины и чертим линию до самого конца графика.

   int bar = Bars.Count - 1;
   int pb2 = (int)PeakBar.Value(bar, High, 5, WealthLab.Indicators.PeakTroughMode.Percent);
   int pb1 = pb2;

   if (pb2 > -1)

      pb1 = (int)PeakBar.Value(pb2, High, 5, WealthLab.Indicators.PeakTroughMode.Percent);

   if ((pb2 == -1) || (pb1 == -1)) {

      DrawLabel(PricePane, "Не могу найти две 5% вершины", Color.Red);
      return;
   }

   int tb2 = (int)TroughBar.Value(bar, Low, 5, WealthLab.Indicators.PeakTroughMode.Percent);
   int tb1 = tb2;

   if (tb2 > -1)

      tb1 = (int)TroughBar.Value(pb2, Low, 5, WealthLab.Indicators.PeakTroughMode.Percent);

   if ((tb2 == -1) || (tb1 == -1)){

      DrawLabel(PricePane, "Не могу найти две 5% впадины", Color.Red);

      return;
   }

    //рисуем многоугольник по 4-м найденным точкам:

     DrawPolygon(PricePane, Color.LightBlue, Color.LightBlue, WealthLab.LineStyle.Invisible, 1, true,

      pb1, High[pb1], pb2, High[pb2], tb2, Low[tb2], tb1, Low[tb1]);
}

Вот что получится в итоге:

Рисуем многоугольник в Велс Лаб

Как в Велс Лаб нарисовать многоугольник

Как видите, используя 4 найденных точки мы смогли нарисовать многоугольник. Точно так же можно поступать и для того, чтобы нарисовать многоугольник с большим количеством углов.

Сегодня мы увидели, как используя существующие методы WealthScript и создавая собственные методы можно чертить на графике в программе Wealth-Lab различные графические объекты. В следующий раз перейдем уже к более интересной и близкой к построению стратегий теме - индикаторы в программе Wealth-Lab. Чтобы не пропустить новые статьи - не забывайте подписываться по RSS на обновления нашего блога.

Рубрики: Painting the Chart, WealthScript

Комментариев: 7

  1. Дмитрий пишет:

    Здравствуйте. А возможно ли изменение/удаление уже нарисованных на графике объектов?
    Спасибо.

    • Дмитрий Власов пишет:

      Вы имеете изменение или удаление нарисованных вручную объектов с помощью кода? Нет, так сделать нельзя. А если изменять или удалять объекты, которые написаны с помощью кода – тогда без проблем.

  2. Дмитрий пишет:

    Да, мне хочется с помощью кода изменять и удалять объекты, нарисованные с помощью кода. В QuiсkRef не нахожу упоминаний о такой возможности. :(

  3. Юрий пишет:

    Несколько корректировок к последнему коду.
    1)В первом комментарии убрать ” и чертим линию до самого конца графика”, т.к. никакая линия здесь не чертиться.
    2)По аналогии с первым комментарием вставить вторым комментарием “// Находим две последние пятипроцентные впадины.”
    3)В операторе tb1 = (int)TroughBar.Value(pb2, Low, 5, WealthLab.Indicators.PeakTroughMode.Percent);
    вместо pb2 надо поставить tb2. Тогда вместо треугольника будет рисоваться необходимый 4-х угольник.
    Я об этих исправлениях написал на форум Wealth-Lab (Wealth-Lab 101). Они с ними согласились.

Оставить комментарий