Bỏ qua

Cách vẽ Andrews' Pitchfork

Andrews' pitchfork là một công cụ phân tích kỹ thuật phổ biến được sử dụng, đôi khi kết hợp với các chỉ báo khác, để xác định các mức hỗ trợ và kháng cự tiềm năng trong một thị trường có xu hướng. Các mức này đóng vai trò là nền tảng quan trọng cho các chiến lược giao dịch thành công, mang lại cho các nhà giao dịch sự rõ ràng, cấu trúc và tự tin trong quyết định của họ.

Bài viết này và video tương ứng sẽ minh họa cách tạo một cBot vẽ Andrews' Pitchfork trên biểu đồ, và lập trình pitchfork để tự động cập nhật khi biểu đồ thay đổi.

Vẽ Andrews' Pitchfork trên biểu đồ

Andrews' Pitchfork bao gồm một đường trung tuyến (đường trung tâm) và hai đường song song tạo thành một kênh. Các đối tượng này giúp các nhà giao dịch hình dung xu hướng, dự báo biến động giá và xác định các điểm vào lệnh và thoát lệnh tiềm năng cho giao dịch.

Andrews' Pitchfork được vẽ trên biểu đồ giá bằng cách sử dụng ba điểm chính: một đỉnh, một đáy và một điểm đỉnh hoặc đáy tiếp theo. Biến động giá trong kênh này thường dao động giữa đường trên và đường dưới, trong khi đường trung tuyến

Chúng ta sẽ tạo một cBot vẽ mô hình Andrews pitchfork đi lên, thường yêu cầu hai mức thấp và một mức cao ở giữa. Ngược lại đối với mô hình Andrews pitchfork đi xuống: cần hai mức cao và một mức thấp ở giữa.

Trong cTrader Algo, nhấp vào nút New để tạo một cBot và nhập tên cho nó, sau đó nhấp vào Create.

Andrews's Pitchfork yêu cầu sáu tham số để lưu trữ những điều sau: chỉ số của mức cao và hai mức thấp, hai giá tối thiểu và một giá cao. Khai báo sáu tham số.

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

Phát hiện hai giá tối thiểu và giá cao cần thiết cho các điểm pitchfork.

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

cTrader Algo cho phép bạn xác định vị trí thời gian thông qua các phương thức cung cấp thời gian tuyệt đối hoặc chỉ số thanh tương đối. Phương thức được sử dụng để vẽ pitchfork trên biểu đồ giới thiệu các ghi đè có liên quan. Trong trường hợp này, chúng ta đã chọn chỉ số thanh tương đối.

Viết mã để phát hiện các chỉ số của giá cao và giá thấp.

 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;
}

Vẽ pitchfork trên biểu đồ.

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

Bạn có thể sao chép toàn bộ mã bên dưới:

 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
        }
    }
}

Để xây dựng cBot, sử dụng phím tắt Ctrl+B hoặc nhấp vào Build.

Thêm một phiên bản cục bộ của cBot: nhấp vào Add instance, chọn tùy chọn Locally, sau đó nhấp vào Add instance.

Nhấp vào phiên bản và điều hướng đến tab Backtesting. Chọn một giai đoạn cho backtesting, bật tùy chọn Visual mode và sau đó nhấp vào biểu tượng phát.

Bạn sẽ thấy Andrews' Pitchfork được vẽ trên biểu đồ.

Cập nhật Andrews' Pitchfork

Quay lại ứng dụng Algo và lập trình cBot để cập nhật pitchfork khi biểu đồ thay đổi.

Tạo một phương thức mới để vẽ pitchfork và di chuyển logic ban đầu vào phương thức đó.

 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);
}

Gọi phương thức mới trong phương thức OnBar().

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

Vì chỉ cần các thiết lập xu hướng tăng, hãy viết logic điều kiện xác minh rằng các giá trị tối thiểu và tối đa ở đúng thứ tự.

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

Bạn có thể sao chép toàn bộ mã bên dưới:

 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
        }
    }
}

Xây dựng lại cBot và chạy backtest.

Tăng tốc độ của chế độ trực quan và nhấp vào biểu tượng play.

Lần này, bạn sẽ thấy cách pitchfork liên tục được vẽ lại khi biểu đồ thay đổi.

Tổng quan

Bài viết này đã giải thích cách vẽ Andrews' Pitchfork trên biểu đồ ký hiệu và lập trình pitchfork để tự cập nhật khi biểu đồ thay đổi.