콘텐츠로 이동

앤드류스 피치포크 그리기

앤드류스 피치포크는 때때로 다른 지표와 함께 사용되어 추세 시장에서 잠재적인 지지 및 저항 수준을 식별하는 데 사용되는 인기 있는 기술 분석 도구입니다. 이러한 수준은 성공적인 트레이딩 전략의 중요한 기초가 되어 트레이더에게 명확성, 구조 및 결정에 대한 자신감을 제공합니다.

이 글과 해당 동영상은 차트에 앤드류스 피치포크를 그리는 cBot을 만드는 방법과 차트가 변경됨에 따라 피치포크가 자동으로 업데이트되도록 코딩하는 방법을 보여줍니다.

차트에 앤드류스 피치포크 그리기

앤드류스 피치포크는 중간선(중심선)과 두 개의 평행선으로 구성되어 채널을 형성합니다. 이러한 객체는 트레이더가 추세를 시각화하고 가격 움직임을 예측하며 거래의 잠재적인 진입 및 퇴장 지점을 식별하는 데 도움을 줍니다.

앤드류스 피치포크는 세 가지 주요 점(고점, 저점 및 후속 고점 또는 저점)을 사용하여 가격 차트에 그려집니다. 이 채널 내의 가격 움직임은 종종 상단선과 하단선 사이에서 진동하며 중간선은 되돌림 지점 역할을 합니다.

우리는 두 개의 저점과 그 사이의 고점이 필요한 상승 추세의 앤드류스 피치포크를 그리는 cBot을 만들 것입니다. 하락 추세의 앤드류스 피치포크의 경우 반대로 두 개의 고점과 그 사이의 저점이 필요합니다.

cTrader Algo에서 새로 만들기 버튼을 클릭하여 cBot을 생성하고 이름을 입력한 다음 생성을 클릭하세요.

Andrews's Pitchfork는 두 개의 최저가와 하나의 최고가, 두 개의 최소 가격 및 하나의 최고 가격을 저장하기 위해 여섯 개의 매개변수가 필요합니다. 여섯 개의 매개변수를 선언하세요.

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

cBot을 빌드하려면 Ctrl+B 단축키를 사용하거나 빌드를 클릭하세요.

cBot의 로컬 인스턴스를 추가하세요: 인스턴스 추가를 클릭하고, 로컬 옵션을 선택한 다음, 인스턴스 추가를 클릭하세요.

인스턴스를 클릭하고 백테스트 탭으로 이동하세요. 백테스트를 위한 기간을 선택하고, 시각 모드 옵션을 활성화한 다음 재생 아이콘을 클릭하세요.

차트에 Andrews' Pitchfork가 그려진 것을 볼 수 있어야 합니다.

Andrews' Pitchfork 업데이트

Algo 앱으로 돌아가서 차트가 변경됨에 따라 피치포크를 업데이트하도록 cBot을 코딩하세요.

피치포크를 그리는 새로운 메서드를 생성하고 원래 로직을 해당 메서드로 이동하세요.

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

cBot을 다시 빌드하고 백테스트를 실행하세요.

시각 모드의 속도를 높이고 재생 아이콘을 클릭하세요.

이번에는 차트가 변경됨에 따라 피치포크가 지속적으로 다시 그려지는 것을 볼 수 있어야 합니다.

요약

이 글은 심볼 차트에 Andrews' Pitchfork를 그리고 차트가 변경됨에 따라 피치포크를 업데이트하는 방법을 설명했습니다.