Lewati ke isi

Operasi trading cBot

Dalam panduan ini, kami menjelaskan secara rinci operasi trading utama yang dapat Anda jalankan menggunakan cBot yang dikembangkan melalui Algo API.

Berikut adalah beberapa operasi yang didukung untuk cBot:

  • Mengirim order pasar.
  • Memasang order pending.
  • Memodifikasi order pending dan posisi terbuka.
  • Menutup posisi dan membatalkan order.
  • Berlangganan ke peristiwa trading (posisi, order, dan aktivitas terkait).

Kirim order pasar

Order pasar dikirim ke server trading ketika metode ExecuteMarketOrder() dipanggil. Setelah membuat cBot baru, Anda dapat menambahkan metode ini dengan beberapa properti order pasar yang ditentukan (simbol, volume, take profit, stop loss, dll.). Contoh di bawah ini memasang order pasar ketika cBot dimulai.

 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)

Kiat

Dalam contoh tersebut, beberapa parameter order sengaja dibiarkan tidak terdefinisi "". Periksa Referensi untuk tanda tangan dan urutan semua parameter ExecuteMarketOrder().

Setelah membangun cBot dan menambahkan instance, Anda akan melihat bahwa order pasar dengan parameter yang ditentukan telah dieksekusi pada awal. Tab Posisi dan Log di panel Pemantau Trading menampilkan entri posisi dan log yang sesuai.

Positions"

Log

Pasang order pending

cTrader mendukung tiga jenis order pending, yaitu order stop, order limit, dan order stop-limit. Untuk memasang order pending pada awal, Anda dapat mengganti order pasar dengan cuplikan kode berikut dalam contoh cBot sebelumnya.

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)

Kiat

Untuk memeriksa parameter metode dengan cepat, mulailah mengetik nama metode dan tanda kurung buka. Anda akan melihat pop-up IntelliSense dengan informasi tambahan.

Image title

Kiat

Jika Anda mengklik metode/parameter di cTrader Algo dan menekan F1, panel bantuan di sebelah kanan jendela kode akan menampilkan hasil pencarian yang cocok. Jika kursor teks tetap berada di luar jendela kode dan Anda menekan F1, jendela Pusat Bantuan akan muncul untuk membantu Anda.

Anda akan melihat catatan berikut di panel Pemantau Trading setelah berhasil membangun dan menjalankan cBot.

Orders

Log

Modifikasi order pending dan posisi terbuka

Ketika order pending ditempatkan, mereka tersedia dalam koleksi PendingOrders cBot Anda. Melalui koleksi ini, Anda dapat mengakses dan memodifikasinya. Order pending yang ada dapat dimodifikasi dengan menyesuaikan level stop loss mereka sebagai berikut.

 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)

Tab Log panel Pemantau Trading menampilkan bahwa ketiga order pending berhasil dimodifikasi segera setelah ditempatkan.

Image title

Setelah berbagai jenis order berhasil dieksekusi, posisi akan dibuka untuk akun Anda. Semua posisi terbuka tersedia dalam koleksi Positions cBot Anda. Sama seperti memodifikasi order pending dalam contoh sebelumnya, Anda dapat memodifikasi posisi terbuka. Karena order pasar adalah cara tercepat untuk membuka posisi, mari tambahkan metode OnBar() dengan tindakan modifikasi posisi ke cBot pertama dalam panduan ini.

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)

Seperti yang tercermin dalam log, posisi terbuka dimodifikasi pada bar pertama yang dibuka.

Image title

Tutup posisi dan batalkan order

Anda dapat menemukan contoh cBot di bawah ini yang menutup semua posisi terbuka dan membatalkan semua order pending pada hari Jumat pukul 11:00 (UTC) dengan memanggil metode 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

Berlangganan ke peristiwa trading

cTrader memungkinkan pengembang algoritma untuk berlangganan ke peristiwa trading dan memantau aktivitas trading, tidak peduli apakah ini telah dimulai oleh cBot atau secara manual. Ini dicapai dengan mendengarkan peristiwa yang tersedia dalam dua koleksi yang ditunjukkan sebelumnya, Positions dan PendingOrders.

Ada tiga peristiwa yang tersedia untuk posisi:

  • Open
  • Modified
  • Closed

Mereka dipicu ketika Anda membuka, memodifikasi, dan menutup posisi di akun Anda, masing-masing.

Dalam cuplikan kode di bawah ini, ketiga peristiwa dideklarasikan dalam metode OnStart() dan metode yang akan dipanggil ditugaskan. Ini akan secara otomatis membuat tanda tangan kode untuk kita gunakan. Setelah itu, pernyataan Print() ditambahkan ke masing-masing metode peristiwa.

 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")

Baik itu Anda atau cBot yang melakukan peristiwa Open, Modified dan Closed, algoritma akan meresponsnya setiap kali dengan pesan yang dicetak seperti yang ditunjukkan dalam log di bawah ini.

Image title

Demikian pula, Anda dapat berlangganan ke peristiwa yang terkait dengan order pending. Ada empat peristiwa yang tersedia untuk order pending:

  • Created
  • Modified
  • Filled
  • Cancelled

Keempat peristiwa dideklarasikan dalam metode OnStart(), dan penangan peristiwa ditambahkan sebagai berikut.

 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")

Jika berlangganan ke peristiwa yang terkait dengan order pending, cBot akan bereaksi terhadap aktivitas trading manual dan terprogram.

Image title

Ringkasan

Sebagai kesimpulan, cTrader membekali pengembang algoritma dengan arsenal operasi trading yang mengesankan yang dapat dijalankan oleh cBot. Dengan menerapkannya secara terampil, Anda dapat mengejar strategi trading yang disesuaikan dan canggih.

Image title