ข้ามไปที่เนื้อหา

เหตุการณ์แท่งเทียน

นักพัฒนาอัลกอริทึมมักจำเป็นต้องอ้างอิงถึงเหตุการณ์แท่งเทียนเพื่อดำเนินกลยุทธ์การเทรดให้ทันเวลาตอบสนองต่อราคาที่อัปเดต API มีเหตุการณ์ BarOpened และ BarClosed สำหรับผู้สร้างอัลกอริทึมเพื่อปรับแต่ง cBot และคว้าโอกาสในจุดต่าง ๆ ของวงจรแท่งเทียน

หมายเหตุ

เหตุการณ์แท่งเทียนสามารถจัดการได้เฉพาะเมื่อเขียนโค้ด cBot เท่านั้น อินดิเคเตอร์แทนที่จะมีเมธอด Calculate() ที่ถูกเรียกในทุก tick

ในคู่มือนี้ เราอธิบายความแตกต่างระหว่างเมธอด OnBar() และ OnBarClosed() และให้กรณีการใช้งานหลายกรณี

เหตุการณ์แท่งในหนึ่งนาที!

  • เมธอด OnBar() จะถูกเรียกทุกครั้งที่มีการวาดแท่งใหม่บนกราฟที่มีการเพิ่มอินสแตนซ์ มันจะถูกเรียกสำหรับแท่งที่เพิ่งสร้างขึ้นใหม่
  • ตัวจัดการเหตุการณ์ OnBarClosed() ก็จะถูกเรียกในทุกแท่งใหม่เช่นกัน อย่างไรก็ตาม มันจะถูกเรียกสำหรับแท่งสุดท้ายที่ปิด (นั่นคือ แท่งก่อนหน้าแท่งปัจจุบัน)
  • การอ้างอิงถึงเหตุการณ์แท่งที่ถูกต้อง จะช่วยเพิ่มความแม่นยำในการวิเคราะห์ทางเทคนิคของคุณและเลือกจังหวะเวลาที่เหมาะสมสำหรับการดำเนินการของอัลกอริทึม
  • ประเภทกราฟที่รองรับสำหรับ BarOpened และ BarClosed ได้แก่ กราฟแท่งเวลา, แท่งเทียน, tick, Renko, ช่วง และ Heikin Ashi

ใช้เมธอด OnBar()

การเกิดขึ้นของเหตุการณ์ BarOpened ขึ้นอยู่กับตารางของสัญลักษณ์และความถี่ของราคาที่เข้ามา โดยปกติ ผู้ใช้แพลตฟอร์มสามารถปรับการเกิดขึ้นของ BarClosed ด้วยการตั้งค่ากรอบเวลาของกราฟ

หมายเหตุ

เมธอด OnBar() สามารถถูกเรียกได้บ่อยเท่าที่การตั้งค่ากรอบเวลาของกราฟอนุญาต เมื่อแท่งปิด OnBar() จะไม่ถูกเรียกจนกว่า tick ถัดไปจะมาถึง ซึ่งตามหลักการแล้วจะทำให้เกิดการสร้างแท่งใหม่

เมธอด OnBar() จะถูกเรียกพร้อมกันกับทุกแท่งใหม่ที่วาดบนกราฟที่มีการแนบอัลกอริทึม ดังนั้น ตัวจัดการ OnBar() จึงเป็นที่ที่เหมาะสมในการกำหนดตรรกะการเทรดแบบกำหนดเองที่ cBot ของคุณควรทำซ้ำเป็นประจำ

ในตัวแก้ไขโค้ด คุณสามารถระบุตัวจัดการ OnBar() ได้ดังนี้:

override void OnBar()

ใช้เมธอด OnBarClosed()

Algo API ยังอนุญาตให้ดำเนินการตรรกะสำหรับแท่งสุดท้ายที่ปิด ซึ่งขึ้นอยู่กับกลยุทธ์ที่คุณต้องการใช้ อาจเป็นทางเลือกที่สะดวกและแม่นยำกว่าในการจัดการเหตุการณ์ BarOpened เมื่อแท่งเปิด แท่งใหม่จะปรากฏเป็น (แท่งเทียน doji) และไม่มีข้อมูลที่สมบูรณ์สำหรับการวิเคราะห์ทางเทคนิค

เหตุการณ์ BarClosed เป็นนามแฝงของเหตุการณ์ BarOpened ซึ่งหมายความว่ามันจะเกิดขึ้นเฉพาะในกรณีที่เหตุการณ์ BarOpened เกิดขึ้น ตัวอย่างเช่น เหตุการณ์ BarClosed สำหรับแท่งสุดท้ายในวันศุกร์จะเกิดขึ้นพร้อมกับแท่งแรกที่เปิดในวันจันทร์ หากสัญลักษณ์นั้นไม่มีการเทรดในช่วงสุดสัปดาห์

หมายเหตุ

เมธอด OnBarClosed() จะไม่ถูกเรียกจนกว่า tick จะมาถึงเพื่อสร้างแท่งใหม่

ตัวจัดการเหตุการณ์ OnBarClosed() สามารถประกาศได้ดังนี้:

override void OnBarClosed()

ในส่วนของเมธอด OnBarClosed() คุณสามารถกำหนดการกระทำที่เชื่อมโยงกันซึ่ง cBot ของคุณจะดำเนินการเมื่อเหตุการณ์ BarClosed ถูกเรียก (เช่น ดำเนินการคำสั่ง, ร่างรูปแบบ, วาดภาพการวิเคราะห์ทางเทคนิค เป็นต้น)

เมื่อเข้าถึงในตัวจัดการเหตุการณ์นี้ คอลเลกชัน Bars จะไม่มีแท่งปัจจุบันที่มีชีวิต ในขณะที่คอลเลกชันอื่น ๆ (เช่น Positions, Symbols ฯลฯ) จะมีข้อมูลจริง

ตัวจัดการเหตุการณ์ OnBar() และ OnBarClosed() ทำงานตามที่ตั้งใจในการทดสอบย้อนหลังและการปรับให้เหมาะสม ทั้งสองเมธอดสามารถใช้ได้กับประเภทกราฟต่าง ๆ รวมถึงกราฟแท่งเวลา, แท่งเทียน, tick, Renko, ช่วง และ Heikin Ashi

สร้าง cBot ตัวอย่าง

ตัวอย่าง cBot ต่อไปนี้จะวางคำสั่ง Market เมื่อทุกแท่งที่สามบนกราฟ EURCHF เปิด

 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
    public class ThirdBarMarketOrderBot : Robot
    {
        private int barCount;

        protected override void OnStart()
        {
            barCount = 0;
        }

        protected override void OnBar()
        {
            barCount++;

            if (barCount % 3 == 0)
            {
                var symbol = Symbols.GetSymbol("EURCHF");
                ExecuteMarketOrder(TradeType.Buy, symbol, 100);
            }
        }
    }
}

เนื่องจาก cBot ถูกเปิดใช้งานบนกราฟ m1 ช่วงเวลาโดยประมาณระหว่างคำสั่ง Market ที่ดำเนินการคือสามนาที

Image title

ด้านล่างนี้เป็นตัวอย่าง cBot ที่มีอินดิเคเตอร์ Directional Movement System (DMS) ฝังอยู่ ซึ่งจะพิมพ์ (Uptrend!) หากค่า DI+ (เส้นสีเขียว) เกินค่า DI- (เส้นสีแดง)

Image title

เมื่อ DI- มากกว่า DI+ จะพิมพ์ (Downtrend!) ในเหตุการณ์ BarClosed

Image title

 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class OnBarClosedTest : Robot
    {

        private DirectionalMovementSystem _dms;

        [Parameter("DMS Period", DefaultValue = 14)]
        public int Period { get; set; }

        protected override void OnStart()
        {
            _dms = Indicators.DirectionalMovementSystem(Period);
        }

        protected override void OnBarClosed() 
        {

            if (_dms.DIPlus.LastValue > _dms.DIMinus.LastValue) 
            {
                Print("Uptrend!");
            }
            else if (_dms.DIPlus.LastValue == _dms.DIMinus.LastValue) 
            {
                Print("Undecided!");
            }
            else 
            {
                Print("Downtrend!");
            }

        }
    }
}

สรุป

ความหลากหลายของเหตุการณ์แท่งที่มีอยู่ใน Algo API ช่วยให้นักพัฒนาอัลกอริทึมสามารถเลือกจังหวะเวลาที่แม่นยำสำหรับเมธอดที่เรียก เมธอด OnBar() สามารถถูกเรียกด้วยความถี่ที่แตกต่างกันขึ้นอยู่กับตารางของสัญลักษณ์และการตั้งค่ากรอบเวลาของกราฟ ซึ่งยังเพิ่มฟังก์ชันการทำงานให้กับ cBot เมธอด OnBarClosed() เป็นนามแฝงที่สะดวกของ OnBar() สำหรับการทำงานกับอินดิเคเตอร์