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

วิธีจัดการอีเวนต์แท่งเทียน

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

  • แท่งเทียน - หมายถึงวัตถุประเภทต่าง ๆ ที่ถูกวาดบนแผนภูมิการเทรดโดย cTrader ตามลำดับ อาจเป็นแท่งเทียน อิฐ Renko แท่ง Range หรือแม้แต่แท่งเทียน Heiken Ashi

จัดการอีเวนต์ BarOpened

อีเวนต์แท่งเทียนเกิดขึ้นเมื่อแท่งเทียนใหม่เริ่มถูกพล็อตบนแผนภูมิการเทรดที่เชื่อมโยงกับ cBot อีเวนต์ BarOpened เกิดขึ้นสำหรับแท่งเทียนใหม่ที่เพิ่งเริ่มถูกวาดบนแผนภูมิ

การจัดการอีเวนต์นี้ทำได้ผ่านเมธอด OnBar() ซึ่งเป็นเมธอดที่สืบทอดมาจากคลาส Robot พื้นฐาน ตอนนี้เราจะสร้าง cBot ที่จัดการอีเวนต์ BarOpened เป็นส่วนหนึ่งของกลยุทธ์ของเราในการวิเคราะห์ความรู้สึกของตลาด เราจะลบเมธอด OnStart() และ OnStop() ออกจากเทมเพลตและแทนที่ตัวจัดการ OnTick() ด้วยตัวจัดการ OnBar()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
protected override void OnBar()
{
    var previousBar = Bars[Bars.Count - 2];
    var priceDifference = ((Bars.LastBar.Open - previousBar.Open) / previousBar.Open) * 100;
    if (priceDifference > 1)
    {
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000);
    }
    else if (priceDifference < -1)
    {
        ExecuteMarketOrder(TradeType.Sell, SymbolName, 10000);
    }
    else 
    {
        foreach (var position in Positions) 
        {
            position.Close();
        }
    }
}

cBot นี้ควรถูกเปิดใช้งานบนแผนภูมิที่มีกรอบเวลา D1 (รายวัน) ในทุกแท่งเทียน มันจะเปรียบเทียบความแตกต่างของราคาเปิดกับราคาเปิดของแท่งเทียนก่อนหน้าและส่งคำสั่งใหม่ในทิศทางที่เหมาะสม หากความแตกต่างของราคาไม่มีนัยสำคัญ บอทจะปิดโพสิชันที่เปิดอยู่ทั้งหมดแทน

หากเรารัน backtest ของบอทง่าย ๆ นี้ ผลลัพธ์ดูน่าพอใจ

จัดการอีเวนต์ BarClosed

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

ในการจัดการอีเวนต์ BarClosed API เปิดเผยเมธอด OnBarClosed

หมายเหตุ

ในตัวอย่างก่อนหน้านี้ เราใช้คุณสมบัติ Bars.LastBar.Open เพื่อรับราคาเปิดของแท่งเทียนที่เพิ่งเปิด หากเราใช้คุณสมบัติเดียวกันในเมธอด OnBarClosed() เราจะได้ราคาเปิดของแท่งเทียนที่เพิ่งปิด

เราจะสร้าง cBot ง่าย ๆ ที่ใช้ตัวจัดการ OnBarClosed() ดังต่อไปนี้

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnBarClosed()
{
    var lowCloseDifference = ((Bars.LastBar.Close - Bars.LastBar.Low) / Bars.LastBar.Close) * 100;
    if (lowCloseDifference > 0.5)
    {
        foreach (var position in Positions)
        {
            position.Close();
        }
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, null, null, 50);

    }
}

cBot ตรวจจับรูปแบบขาขึ้น (ค้อน) โดยประเมินความยาวของไส้ด้านล่างของแท่งเทียน หากตรวจพบรูปแบบค้อน โพสิชันที่เปิดไว้ก่อนหน้าทั้งหมดจะถูกปิดและคำสั่งซื้อใหม่จะถูกส่งพร้อมกับ Stop Loss 50 pips

หากเรา backtest บอท เราจะได้ผลลัพธ์ที่ดี

เพิ่มตัวจัดการอีเวนต์แบบกำหนดเอง

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

หมายเหตุ

ตัวจัดการอีเวนต์แบบกำหนดเองต้องถูกเพิ่มในเมธอด OnStart() ตัวจัดการแบบกำหนดเองต้องรับอาร์กิวเมนต์ของประเภท BarOpenedEventArgs (สำหรับอีเวนต์ BarOpened) หรือ BarClosedEventArgs (สำหรับอีเวนต์ BarClosed)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
protected override void OnStart() 
{
    Bars.BarClosed += BarClosedHandler;
    Bars.BarClosed += AnotherClosedHandler;
    Bars.BarOpened += BarOpenedHandler;
}

void BarClosedHandler(BarClosedEventArgs args) {}
void AnotherClosedHandler(BarClosedEventArgs args) {}
void BarOpenedHandler(BarOpenedEventArgs args) {}

เราจะสร้าง cBot อีกตัวที่ใช้ตัวจัดการแบบกำหนดเองสองตัวสำหรับอีเวนต์ BarOpened เพื่อตอบสนองต่อการกลับตัวที่อาจเกิดขึ้นทั้งขาขึ้นและขาลง

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
protected override void OnStart() 
{
    Bars.BarOpened += BullishReversal;
    Bars.BarOpened += BearishReversal;

}

private void BullishReversal(BarOpenedEventArgs args) 
{
    if (Bars.LastBar.Open > Bars.Last(1).Close && Bars.LastBar.Open > Bars.Last(2).Close) 
    {
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, null, 10, 50);
    }
}

private void BearishReversal(BarOpenedEventArgs args) 
{
    if (Bars.LastBar.Open < Bars.Last(1).Close && Bars.LastBar.Open < Bars.Last(2).Close) 
    {
        ExecuteMarketOrder(TradeType.Sell, SymbolName, 10000, null, 10, 50);
    }
}

cBot ตรวจสอบว่าราคาเปิดของแท่งเทียนที่เพิ่งเปิดสูงกว่าราคาปิดของสองแท่งก่อนหน้าหรือไม่ หากเป็นเช่นนั้น คำสั่งซื้อจะถูกส่ง หากราคาเปิดต่ำกว่าราคาปิดของสองแท่งก่อนหน้า คำสั่งขายจะถูกส่ง การใช้ตัวจัดการอีเวนต์แยกกันสองตัวช่วยให้เราสามารถแบ่งตรรกะการเทรดของเราออกเป็นส่วนประกอบย่อย ๆ ซึ่งเราสามารถแก้ไขได้ง่ายในภายหลังหากจำเป็น

ผลลัพธ์ของการ backtesting บนกรอบเวลา D1 ก็เป็นบวกเช่นกัน

สรุป

การเรียนรู้วิธีจัดการอีเวนต์แท่งเทียนอย่างเหมาะสมจะช่วยให้คุณสามารถทำให้ cBot ของคุณทำสิ่งที่คุณต้องการได้อย่างแม่นยำและตามที่คุณต้องการให้ทำ