Перейти к содержанию

Как нарисовать вилы Эндрюса

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

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

Нарисуйте вилы Эндрюса на графике

Вилы Эндрюса состоят из медианной линии (центральной линии) и двух параллельных линий, которые образуют канал. Эти объекты помогают трейдерам визуализировать тренды, прогнозировать движения цен и определять потенциальные точки входа и выхода из сделок.

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

Мы создадим сиБота, который рисует восходящие вилы Эндрюса, для которых обычно требуются два минимума и максимум между ними. Обратное справедливо для нисходящих вил Эндрюса: потребуются два максимума и минимум между ними.

В cTrader Algo нажмите кнопку Создать, чтобы создать сиБота, и введите имя для него, затем нажмите Создать.

Вилы Эндрюса требуют шести параметров для хранения следующего: индексов максимума и двух минимумов, двух минимальных цен и максимальной цены. Объявите шесть параметров.

1
2
3
4
5
6
private int _highIndex;
private int _lowIndex1;
private int _lowIndex2;
private double _max;
private double _min1;
private double _min2;

Определите две минимальные цены и максимальную цену, необходимые для точек вил.

1
2
3
_max = Bars.HighPrices.Maximum(50);
_min1 = Bars.LowPrices.Minimum(50);
_min2 = Bars.LowPrices.Minimum(10);

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

Напишите код для определения индексов максимальных и минимальных цен.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
for (int i = 0; i <= 50; i++)
{
    if (Bars.HighPrices.Last(i) == _max)
        _highIndex = Bars.Count - i - 1;
}

for (int i = 0; i <= 50; i++)
{
    if (Bars.LowPrices.Last(i) == _min1)
        _lowIndex1 = Bars.Count - i - 1;
}

for (int i = 0; i <= 10; i++)
{
    if (Bars.LowPrices.Last(i) == _min2)
        _lowIndex2 = Bars.Count - i - 1;
}

Нарисуйте вилы на графике.

1
Chart.DrawAndrewsPitchfork("AndrewsPitchfork", _lowIndex1, _min1, _highIndex, _max, _lowIndex2, _min2, Color.Red);

Вы можете скопировать полный код ниже:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class AndrewsPitchfork : Robot
    {
        private int _highIndex;
        private int _lowIndex1;
        private int _lowIndex2;
        private double _max;
        private double _min1;
        private double _min2;

        protected override void OnStart()
        {
            _max = Bars.HighPrices.Maximum(50);
            _min1 = Bars.LowPrices.Minimum(50);
            _min2 = Bars.LowPrices.Minimum(10);

            for (int i = 0; i <= 50; i++)
            {
                if (Bars.HighPrices.Last(i) == _max)
                    _highIndex = Bars.Count - i - 1;
            }

            for (int i = 0; i <= 50; i++)
            {
                if (Bars.LowPrices.Last(i) == _min1)
                    _lowIndex1 = Bars.Count - i - 1;
            }

            for (int i = 0; i <= 10; i++)
            {
                if (Bars.LowPrices.Last(i) == _min2)
                    _lowIndex2 = Bars.Count - i - 1;
            }

            Chart.DrawAndrewsPitchfork("AndrewsPitchfork", _lowIndex1, _min1, _highIndex, _max, _lowIndex2, _min2, Color.Red);

        }

        protected override void OnTick()
        {
            // Handle price updates here
        }

        protected override void OnStop()
        {
            // Handle cBot stop here
        }
    }
}

Чтобы собрать сиБота, используйте горячую клавишу Ctrl+B или нажмите Собрать.

Добавьте локальный экземпляр сиБота: нажмите Добавить экземпляр, выберите опцию Локально, затем нажмите Добавить экземпляр.

Нажмите на экземпляр и перейдите на вкладку Бэктестинг. Выберите период для бэктестинга, включите опцию Визуальный режим, а затем нажмите на значок воспроизведения.

Вы должны увидеть Вилы Эндрюса, нарисованные на графике.

Обновление вил Эндрюса

Вернитесь в приложение Algo и напишите код сиБота для обновления вил по мере изменения графика.

Создайте новый метод для рисования вил и перенесите исходную логику в этот метод.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private void DrawAndrewsPitchfork()
{
    _max = Bars.HighPrices.Maximum(50);
    _min1 = Bars.LowPrices.Minimum(50);
    _min2 = Bars.LowPrices.Minimum(10);

    for (int i = 0; i <= 50; i++)
    {
        if (Bars.HighPrices.Last(i) == _max)
            _highIndex = Bars.Count - i - 1;
    }

    for (int i = 0; i <= 50; i++)
    {
        if (Bars.LowPrices.Last(i) == _min1)
            _lowIndex1 = Bars.Count - i - 1;
    }

    for (int i = 0; i <= 10; i++)
    {
        if (Bars.LowPrices.Last(i) == _min2)
            _lowIndex2 = Bars.Count - i - 1;
    }

    if (_lowIndex1 < _highIndex && _highIndex < _lowIndex2)
        Chart.DrawAndrewsPitchfork("AndrewsPitchfork", _lowIndex1, _min1, _highIndex, _max, _lowIndex2, _min2, Color.Red);
}

Вызовите новый метод в методе OnBar().

1
2
3
4
protected override void OnBar()
{
    DrawAndrewsPitchfork();
}

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

1
2
if (_lowIndex1 < _highIndex && _highIndex < _lowIndex2)
    Chart.DrawAndrewsPitchfork("AndrewsPitchfork", _lowIndex1, _min1, _highIndex, _max, _lowIndex2, _min2, Color.Red);

Вы можете скопировать полный код ниже:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class AndrewsPitchfork : Robot
    {
        private int _highIndex;
        private int _lowIndex1;
        private int _lowIndex2;
        private double _max;
        private double _min1;
        private double _min2;

        protected override void OnStart()
        {

        DrawAndrewsPitchfork(); 

        }

        private void DrawAndrewsPitchfork() 
        {
           _max = Bars.HighPrices.Maximum(50);
            _min1 = Bars.LowPrices.Minimum(50);
            _min2 = Bars.LowPrices.Minimum(10);

            for (int i = 0; i <= 50; i++)
            {
                if (Bars.HighPrices.Last(i) == _max)
                    _highIndex = Bars.Count - i - 1;
            }

            for (int i = 0; i <= 50; i++)
            {
                if (Bars.LowPrices.Last(i) == _min1)
                    _lowIndex1 = Bars.Count - i - 1;
            }

            for (int i = 0; i <= 10; i++)
            {
                if (Bars.LowPrices.Last(i) == _min2)
                    _lowIndex2 = Bars.Count - i - 1;
            }

            if (_lowIndex1 < _highIndex && _highIndex < _lowIndex2)
                 Chart.DrawAndrewsPitchfork("AndrewsPitchfork", _lowIndex1, _min1, _highIndex, _max, _lowIndex2, _min2, Color.Red);
        }

        protected override void OnBar()
        {
            DrawAndrewsPitchfork(); 
        }

        protected override void OnStop()
        {
            // Handle cBot stop here
        }
    }
}

Снова соберите сиБота и протестируйте его.

Увеличьте скорость визуального режима и нажмите на значок воспроизведения.

На этот раз вы должны увидеть, как вилы постоянно перерисовываются по мере изменения графика.

Обзор

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