Langkau tajuk talian

Operasi dagangan cBot

Dalam panduan ini, kami menerangkan secara terperinci operasi dagangan utama yang boleh anda laksanakan menggunakan cBot yang dibangunkan melalui API Algo.

Berikut adalah beberapa operasi yang disokong untuk cBot:

  • Menghantar pesanan pasaran.
  • Membuat pesanan tertangguh.
  • Mengubah suai pesanan tertangguh dan posisi terbuka.
  • Menutup posisi dan membatalkan pesanan.
  • Melanggan kepada peristiwa dagangan (posisi, pesanan dan aktiviti berkaitan).

Hantar pesanan pasaran

Pesanan pasaran dihantar ke pelayan dagangan apabila kaedah ExecuteMarketOrder() dipanggil. Selepas membuat cBot baharu, anda boleh menambah kaedah ini dengan beberapa sifat pesanan pasaran yang ditakrifkan (simbol, volum, ambilan untung, henti rugi, dan lain-lain). Contoh di bawah membuat pesanan pasaran apabila cBot bermula.

 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)

Petua

Dalam contoh ini, beberapa parameter pesanan sengaja dibiarkan tidak ditakrifkan "". Semak Rujukan untuk tandatangan dan susunan semua parameter ExecuteMarketOrder().

Setelah membina cBot dan menambah satu contoh, anda akan melihat bahawa pesanan pasaran dengan parameter yang dinyatakan telah dilaksanakan pada permulaan. Tab Posisi dan Log dalam panel Pantau Dagangan memaparkan entri posisi dan log yang sepadan.

Positions

Log

Buat pesanan tertangguh

cTrader menyokong tiga jenis pesanan tertangguh, iaitu pesanan henti, pesanan had dan pesanan henti had. Untuk membuat pesanan tertangguh pada permulaan, anda boleh menggantikan pesanan pasaran dengan cebisan kod 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)

Petua

Untuk memeriksa parameter kaedah dengan cepat, mula taip nama kaedah dan tanda kurung pembuka. Anda akan melihat tetingkap timbul IntelliSense dengan maklumat tambahan.

Image title

Petua

Jika anda klik pada kaedah/parameter dalam cTrader Algo dan tekan F1, panel bantuan di sebelah kanan tetingkap kod akan menunjukkan hasil carian yang sepadan. Jika kursor teks kekal di luar tetingkap kod dan anda menekan F1, tetingkap Pusat Bantuan akan muncul untuk membantu anda.

Anda akan melihat rekod berikut dalam panel Pantau Dagangan selepas berjaya membina dan menjalankan cBot.

Orders

Log

Ubah suai pesanan tertangguh dan posisi terbuka

Apabila pesanan tertangguh dibuat, ia akan tersedia dalam koleksi PendingOrders cBot anda. Melalui koleksi ini, anda boleh mengakses dan mengubah suainya. Pesanan tertangguh yang sedia ada boleh diubah suai dengan melaraskan tahap henti rugi mereka seperti 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 Pantau Dagangan memaparkan bahawa ketiga-tiga pesanan tertangguh telah berjaya diubah suai serta-merta selepas dibuat.

Image title

Selepas pelbagai jenis pesanan dilaksanakan dengan jayanya, posisi akan dibuka untuk akaun anda. Semua posisi terbuka tersedia dalam koleksi Positions cBot anda. Sama seperti mengubah suai pesanan tertangguh dalam contoh sebelumnya, anda boleh mengubah suai posisi terbuka. Memandangkan pesanan pasaran adalah cara terpantas untuk membuka posisi, mari kita tambahkan kaedah OnBar() dengan tindakan pengubahsuaian posisi kepada 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 ditunjukkan dalam log, posisi terbuka telah diubah suai pada bar pertama yang dibuka.

Image title

Tutup posisi dan batalkan pesanan

Anda boleh melihat contoh cBot di bawah yang menutup semua posisi terbuka dan membatalkan semua pesanan tertangguh pada hari Jumaat pada pukul 11:00 (UTC) dengan memanggil kaedah 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

Langgan kepada peristiwa dagangan

cTrader membolehkan pembangun algoritma melanggan kepada peristiwa dagangan dan memantau aktiviti dagangan, tidak kira sama ada ia telah dimulakan oleh cBot atau secara manual. Ia dicapai dengan mendengar peristiwa yang tersedia dalam dua koleksi yang ditunjukkan sebelum ini, Positions dan PendingOrders.

Terdapat tiga peristiwa yang tersedia untuk posisi:

  • Open
  • Modified
  • Closed

Ia dicetuskan apabila anda membuka, mengubah suai dan menutup posisi pada akaun anda, masing-masing.

Dalam cebisan kod di bawah, ketiga-tiga peristiwa diisytiharkan dalam kaedah OnStart() dan kaedah yang akan dipanggil ditugaskan. Ini akan secara automatik membuat tandatangan kod untuk kita gunakan. Selepas itu, kenyataan Print() ditambahkan kepada setiap kaedah 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")

Sama ada anda atau cBot yang melaksanakan peristiwa Open, Modified dan Closed, algoritma akan mencapainya setiap kali dengan mesej yang dicetak seperti yang ditunjukkan dalam log di bawah.

Image title

Begitu juga, anda boleh melanggan kepada peristiwa yang berkaitan dengan pesanan tertangguh. Terdapat empat peristiwa yang tersedia untuk pesanan tertangguh:

  • Created
  • Modified
  • Filled
  • Cancelled

Keempat-empat peristiwa diisytiharkan dalam kaedah OnStart(), dan pengendali peristiwa ditambahkan seperti 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 melanggan kepada peristiwa yang berkaitan dengan pesanan tertangguh, cBot akan bertindak balas kepada aktiviti dagangan manual dan yang diprogramkan.

Image title

Ringkasan

Kesimpulannya, cTrader melengkapkan pembangun algoritma dengan pelbagai operasi dagangan yang mengesankan yang boleh dilaksanakan oleh cBot. Dengan menggunakannya secara mahir, anda boleh mengejar strategi dagangan yang disesuaikan dan canggih.

Image title