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

การดำเนินการเทรดของ cBot

ในคู่มือนี้ เราอธิบายรายละเอียดเกี่ยวกับการดำเนินการเทรดที่สำคัญที่คุณสามารถดำเนินการโดยใช้ cBot ที่พัฒนาผ่าน Algo API

ต่อไปนี้คือการดำเนินการบางส่วนที่รองรับสำหรับ cBot:

  • การส่งคำสั่ง Market
  • การส่งคำสั่งที่รอดำเนินการ
  • การแก้ไขคำสั่งที่รอดำเนินการและโพสิชันที่เปิดอยู่
  • การปิดโพสิชันและยกเลิกคำสั่ง
  • การสมัครรับข้อมูลเหตุการณ์การเทรด (โพสิชัน คำสั่ง และกิจกรรมที่เกี่ยวข้อง)

ส่งคำสั่ง Market

คำสั่ง Market จะถูกส่งไปยังเซิร์ฟเวอร์การเทรดเมื่อมีการเรียกใช้เมธอด ExecuteMarketOrder() หลังจากสร้าง cBot ใหม่ คุณสามารถเพิ่มเมธอดนี้พร้อมกับคุณสมบัติที่กำหนดไว้หลายอย่างของคำสั่ง Market (สัญลักษณ์ ปริมาณ Take Profit, Stop Loss ฯลฯ) ตัวอย่างด้านล่างนี้จะส่งคำสั่ง Market เมื่อ cBot เริ่มต้น

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
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 TradeOperations : Robot
    {
        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "", 10, 10, "", false);
        }       
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import clr

clr.AddReference("cAlgo.API")

from cAlgo.API import *
from robot_wrapper import *

class TradeOperations():
    def on_start(self):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "", 10, 10, "", False)

เคล็ดลับ

ในตัวอย่าง พารามิเตอร์คำสั่งหลายตัวถูกตั้งค่าเป็น "" โดยเจตนา ตรวจสอบ References สำหรับลายเซ็นและลำดับของพารามิเตอร์ ExecuteMarketOrder() ทั้งหมด

เมื่อสร้าง cBot และเพิ่มอินสแตนซ์ คุณจะเห็นว่าคำสั่ง Market ที่มีพารามิเตอร์ที่ระบุได้ถูกดำเนินการเมื่อเริ่มต้น แท็บ Positions และ Log ในแผง Trade Watch จะแสดงรายการโพสิชันและบันทึกที่เกี่ยวข้อง

Positions

Log

ส่งคำสั่งที่รอดำเนินการ

cTrader รองรับคำสั่งที่รอดำเนินการสามประเภท ได้แก่ คำสั่ง Stop, คำสั่ง Limit และคำสั่ง Stop-limit เพื่อส่งคำสั่งที่รอดำเนินการเมื่อเริ่มต้น คุณสามารถแทนที่คำสั่ง Market ด้วยโค้ดสนิปเป็ตต่อไปนี้ในตัวอย่าง cBot ก่อนหน้านี้

1
2
3
PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
PlaceLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask - (Symbol.PipSize * 10), "", 10, 10, null, "", false);
PlaceStopLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), 2, "", 10, 10, null, "", false);
1
2
3
api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask - (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
api.PlaceStopLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), 2, "", 10, 10, None, "", False)

เคล็ดลับ

เพื่อตรวจสอบพารามิเตอร์ของเมธอดอย่างรวดเร็ว ให้เริ่มพิมพ์ชื่อเมธอดและวงเล็บเปิด คุณจะเห็นป๊อปอัพ IntelliSense ที่มีข้อมูลเพิ่มเติม

Image title

เคล็ดลับ

หากคุณคลิกที่เมธอด/พารามิเตอร์ใน cTrader Algo และกด F1 แผงช่วยเหลือทางด้านขวาของหน้าต่างโค้ดจะแสดงผลการค้นหาที่ตรงกัน หากเคอร์เซอร์ข้อความอยู่นอกหน้าต่างโค้ดและคุณกด F1 หน้าต่าง Help Centre จะปรากฏขึ้นเพื่อช่วยเหลือคุณ

คุณจะเห็นบันทึกต่อไปนี้ในแผง Trade Watch หลังจากการสร้างและรัน cBot สำเร็จ

Orders

Log

คำสั่งที่รอดำเนินการและโพสิชันที่เปิดอยู่

เมื่อมีการวางคำสั่งที่รอดำเนินการ คำสั่งเหล่านั้นจะปรากฏใน cBot PendingOrders collection ของคุณ คุณสามารถเข้าถึงและแก้ไขคำสั่งเหล่านั้นผ่าน collection นี้ คำสั่งที่รอดำเนินการที่มีอยู่สามารถแก้ไขได้โดยการปรับระดับ Stop Loss ดังต่อไปนี้

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnStart()
{
    PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
    PlaceLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask - (Symbol.PipSize * 10), "", 10, 10, null, "", false);
    PlaceStopLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), 2, "", 10, 10, null, "", false);

    foreach(var order in PendingOrders.Where(p => p.SymbolName == SymbolName))
    {
        order.ModifyStopLossPips(20);
    }
}     
1
2
3
4
5
6
7
8
def on_start(self):
    api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
    api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask - (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
    api.PlaceStopLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), 2, "", 10, 10, None, "", False)

    for order in api.PendingOrders:
        if order.SymbolName == api.SymbolName:
            order.ModifyStopLossPips(20)

แท็บ Log ของแผงควบคุม Trade Watch แสดงว่าคำสั่งที่รอดำเนินการทั้งสามรายการได้รับการแก้ไขสำเร็จทันทีหลังจากที่วางคำสั่ง

Image title

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

1
2
3
4
5
6
7
protected override void OnBar()
{
    foreach(var position in Positions.Where(p => p.SymbolName == SymbolName))
    {
        position.ModifyTakeProfitPips(20);
    }
}
1
2
3
4
def on_bar(self):
    for position in api.Positions:
        if position.SymbolName == api.SymbolName:
            position.ModifyTakeProfitPips(20)

ตามที่แสดงในบันทึก โพสิชันที่เปิดได้รับการแก้ไขในแท่งเทียนแรกที่เปิด

Image title

ปิดโพสิชันและยกเลิกคำสั่ง

คุณสามารถดูตัวอย่าง cBot ด้านล่างที่ปิดโพสิชันที่เปิดทั้งหมดและยกเลิกคำสั่งที่รอดำเนินการทั้งหมดในวันศุกร์เวลา 11:00 (UTC) โดยเรียกใช้เมธอด OnTick()

 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
namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class TradeOperations : Robot
    {
        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "", 10, 10, "", false);
            PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
        }  

        protected override void OnTick()
        {
            if(Server.Time.DayOfWeek == DayOfWeek.Friday && Server.Time.Hour >= 11)
            {
                foreach(var position in Positions.Where(p => p.SymbolName == SymbolName))
                {
                    position.Close();    
                }

                foreach(var order in PendingOrders.Where(p => p.SymbolName == SymbolName))
                {
                    order.Cancel();
                }
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class TradeOperations():
    def on_start(self):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "", 10, 10, "", False)
        api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)

    def on_tick(self):
        # Friday == 5 (Sunday=0)
        if api.Server.Time.DayOfWeek == 5 and api.Server.Time.Hour >= 11:
            for position in api.Positions:
                if position.SymbolName == api.SymbolName:
                    position.Close()
            for order in api.PendingOrders:
                if order.SymbolName == api.SymbolName:
                    order.Cancel()

Image title

สมัครรับข้อมูลเหตุการณ์การเทรด

cTrader อนุญาตให้นักพัฒนาอัลกอริทึมสมัครรับข้อมูลเหตุการณ์การเทรดและติดตามกิจกรรมการเทรด ไม่ว่าจะเริ่มต้นโดย cBot หรือด้วยตนเอง สิ่งนี้สามารถทำได้โดยการรับฟังเหตุการณ์ที่มีอยู่ในสอง collection ที่แสดงก่อนหน้านี้ ได้แก่ Positions และ PendingOrders

มีสามเหตุการณ์ที่มีให้สำหรับโพสิชัน:

  • Open
  • Modified
  • Closed

เหตุการณ์เหล่านี้จะถูกเรียกใช้เมื่อคุณเปิด แก้ไข และปิดโพสิชันในบัญชีของคุณตามลำดับ

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
protected override void OnStart()
{
    Positions.Opened += Positions_Opened;
    Positions.Modified += Positions_Modified;
    Positions.Closed += Positions_Closed;                    
}  

private void Positions_Opened(PositionOpenedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was opened");
}

private void Positions_Modified(PositionModifiedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was modified");
}

private void Positions_Closed(PositionClosedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was closed");
}   
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def on_start(self):
    api.Positions.Opened += self.positions_opened
    api.Positions.Modified += self.positions_modified
    api.Positions.Closed += self.positions_closed

def positions_opened(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was opened")

def positions_modified(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was modified")

def positions_closed(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was closed")

ไม่ว่าจะเป็นคุณหรือ cBot ที่ดำเนินการเหตุการณ์ Open, Modified และ Closed อัลกอริทึมจะตอบสนองทุกครั้งด้วยข้อความที่พิมพ์ออกมาตามที่แสดงในบันทึกด้านล่าง

Image title

ในทำนองเดียวกัน คุณสามารถสมัครรับข้อมูลเหตุการณ์ที่เกี่ยวข้องกับคำสั่งที่รอดำเนินการได้ มีสี่เหตุการณ์ที่มีให้สำหรับคำสั่งที่รอดำเนินการ:

  • Created
  • Modified
  • Filled
  • Cancelled

เหตุการณ์ทั้งสี่ถูกประกาศในเมธอด OnStart() และมีการเพิ่มตัวจัดการเหตุการณ์ดังต่อไปนี้

 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
protected override void OnStart()
{
    PendingOrders.Created += PendingOrders_Created;
    PendingOrders.Modified += PendingOrders_Modified;
    PendingOrders.Filled += PendingOrders_Filled;
    PendingOrders.Cancelled += PendingOrders_Cancelled;
}

private void PendingOrders_Created(PendingOrderCreatedEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was created");
}

private void PendingOrders_Modified(PendingOrderModifiedEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was modified");
}

private void PendingOrders_Filled(PendingOrderFilledEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was filled");
}

private void PendingOrders_Cancelled(PendingOrderCancelledEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was cancelled");
}       
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
def on_start(self):
    api.PendingOrders.Created += self.pending_orders_created
    api.PendingOrders.Modified += self.pending_orders_modified
    api.PendingOrders.Filled += self.pending_orders_filled
    api.PendingOrders.Cancelled += self.pending_orders_cancelled

def pending_orders_created(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was created")

def pending_orders_modified(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was modified")

def pending_orders_filled(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was filled")

def pending_orders_cancelled(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was cancelled")

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

Image title

สรุป

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

Image title