Sampel kod cBot
Halaman ini menyediakan beberapa contoh kod Python dan C# untuk mencipta robot dagangan dan membangunkan algoritma. Perhatikan bahawa tiada cBot yang disenaraikan di bawah menjamin sebarang pulangan kewangan. Pastikan untuk melakukan ujian belakang dan menyesuaikan cBot anda sebelum melaksanakan sebarang instans pada akaun langsung.
Repositori sampel cBot
Sampel kod cBot yang komprehensif, termasuk templat sedia untuk pelbagai strategi automatik dan gaya dagangan, tersedia dalam repositori Python dan C# yang berasingan di GitHub.
Operasi segerak
Semua cBot dalam bahagian ini melaksanakan operasi mereka secara segerak.
Laksanakan pesanan pasaran
-
Sebuah cBot mudah yang melakukan operasi berjaya
Robot dagangan berikut mencipta pesanan pasaran semasa permulaan dan menyimpan hasilnya dalam pembolehubah
result.Jika pelaksanaan pesanan berjaya, harga kemasukan akan dicetak dalam log.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
[Robot()] public class Sample_cBot : Robot { protected override void OnStart() { var result = ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000); if (result.IsSuccessful) { var position = result.Position; Print("Position entry price is {0}", position.EntryPrice); } } }1 2 3 4 5 6 7
class Sample_cBot(): def on_start(self): result = api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 10000) if result.IsSuccessful: position = result.Position api.Print(f"Position entry price is {position.EntryPrice}")Output log
- cBot "New cBot" telah berjaya dimulakan untuk EURUSD, h1.
- Melaksanakan Pesanan Pasaran untuk Beli 10000 EURUSD
- Melaksanakan Pesanan Pasaran untuk Beli 10000 EURUSD BERJAYA, Posisi PID14576001
- Harga kemasukan posisi ialah 1.19067
-
Sebuah cBot mudah dengan parameter yang boleh disesuaikan
Apabila mengisytiharkan pelbagai sifat cBot, anda boleh menjadikannya parameter yang boleh disesuaikan menggunakan pengisytiharan
[Parameter()]. Apabila instans baru cBot anda dilancarkan, anda (atau pengguna lain) akan dapat menetapkan nilai tersuai kepada parameter ini.Pertimbangkan contoh berikut.
1 2
[Parameter("SMA Period", DefaultValue = 14)] public int SmaPeriod { get; set; }Nota
cBot Python menggunakan parameter yang boleh disesuaikan yang diisytiharkan dalam fail
.csmereka.1 2
[Parameter("SMA Period", DefaultValue = 14)] public int SmaPeriod { get; set; }Dalam contoh di atas, kami menentukan ciri-ciri berikut:
- Nama parameter. Ia akan, seterusnya, muncul dalam UI cTrader (
"SMA Period"). - Nilai lalai parameter yang akan digunakan untuk semua instans baru melainkan ia diubah oleh pengguna (
DefaultValue = 14).
Dalam kod di bawah, kami menunjukkan bagaimana sifat
SmaPeriodboleh digunakan dalam robot dagangan sebenar.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class SamplecBotReferenceSMA : Robot { [Parameter("Source")] public DataSeries Source { get; set; } [Parameter("SMA Period", DefaultValue = 14)] public int SmaPeriod { get; set; } private SampleSMA sma; protected override void OnStart() { sma = Indicators.GetIndicator<SampleSMA>(Source, SmaPeriod); } protected override void OnTick() { Print("{0}", sma.Result.LastValue); } }Nota
cBot Python menggunakan parameter yang boleh disesuaikan yang diisytiharkan dalam fail
.csmereka.1 2 3 4 5 6
class Sample_cBot(): def on_start(self): self.sma = api.Indicators.GetIndicator<SampleSMA>(api.Source, api.SmaPeriod) def on_tick(self): api.Print(f"{self.sma.Result.LastValue}")Bot kami mengambil sifat
SmaPeriodyang boleh disesuaikan dan, pada permulaan, menghantar nilainya kepada kaedahIndicators.GetIndicator<SampleSMA>(). Kaedah ini mengembalikan nilai purata bergerak mudah untuk tempoh yang ditentukan.Apabila mencipta instans cBot, semua parameter yang boleh disesuaikan boleh ditetapkan dalam tetingkap Tambah instans.
Apabila dilancarkan, cBot akan memaklumkan kami tentang nilai purata bergerak mudah terakhir pada setiap tik.
Output log
- Instans CBot [Sample cBot Reference SMA, EURUSD, h1] telah dimulakan.
- 0.975685714285714
- 0.975681428571429
- 0.97568
- Instans CBot [Sample cBot Reference SMA, EURUSD, h1] dihentikan oleh pengguna.
- Nama parameter. Ia akan, seterusnya, muncul dalam UI cTrader (
-
Laksanakan pesanan pasaran dengan lebih banyak argumen
Dalam contoh sebelumnya, kami menghantar bilangan argumen minimum yang mungkin kepada kaedah
ExecuteMarketOrder(). Ia adalah jenis dagangan (TradeType.Buy), simbol (Symbol) dan volum (-1).Kaedah
ExecuteMarketOrder()boleh dipanggil dengan argumen tambahan sepertiLabel,StopLoss,TakeProfitdanComment. Contoh di bawah menentukan label ("order 1"), mekanisme perlindungan henti rugi (10) dan tahap ambilan untung (10).1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[Robot(TimeZone = TimeZones.UTC)] public class Sample_cBot : Robot { protected override void OnStart() { var result = ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, "order 1", 10, 10); if (result.IsSuccessful) { var position = result.Position; Print("Position entry price is {0}", position.EntryPrice); Print("Position SL price is {0}", position.StopLoss); } } }1 2 3 4 5 6 7 8
class Sample_cBot(): def on_start(self): result = api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 10000, "order 1", 10, 10) if result.IsSuccessful: position = result.Position api.Print(f"Position entry price is {position.EntryPrice}") api.Print(f"Position SL price is {position.StopLoss}")Output log
- cBot "New cBot" telah berjaya dimulakan untuk EURUSD, h1.
- Melaksanakan Pesanan Pasaran untuk Beli 10000 EURUSD (SL: 10, TP: 10)
- Melaksanakan Pesanan Pasaran untuk Beli 10000 EURUSD (SL: 10, TP: 10) BERJAYA, Posisi PID14576098
- Harga kemasukan posisi ialah 1.1896
- Harga SL posisi ialah 1.1886
Ubah suai posisi
Dalam contoh di bawah, kami hanya menambah nilai ambilan untung (10) apabila pesanan dilaksanakan. Selepas itu, kami mengubah suai posisi untuk menambah henti rugi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 | |
Output log
Tutup posisi
-
Lakukan penutupan penuh
Sampel kod di bawah meletakkan pesanan pasaran. Jika keuntungan kasar posisi yang terhasil melebihi nilai tertentu (
null && position.GrossProfit > 10), ia akan ditutup.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[Robot()] public class Sample_cBot : Robot { protected override void OnStart() { ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, "myLabel"); } protected override void OnTick() { var position = Positions.Find("myLabel"); if (position != null && position.GrossProfit > 10) { ClosePosition(position); Stop(); } } }1 2 3 4 5 6 7 8 9
class Sample_cBot(): def on_start(self): api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 10000, "myLabel") def on_tick(self): position = api.Positions.Find("myLabel") if position is not None and position.GrossProfit > 10: api.ClosePosition(position) api.Stop()Output log
- cBot "New cBot" telah berjaya dimulakan untuk EURUSD, h1.
- Melaksanakan Pesanan Pasaran untuk Beli 10000 EURUSD
- Melaksanakan Pesanan Pasaran untuk Beli 10000 EURUSD BERJAYA, Posisi PID14576180
-
Lakukan penutupan separa
Kami akan mengubah suai contoh sebelumnya untuk mencipta dua pesanan pasaran dengan label yang sama (
"myLabel"). Pada setiap bar baharu, robot dagangan kami akan menutup tepat separuh daripada salah satu pesanan ini tetapi hanya jika volumnya sama dengan atau melebihi 20,000.Kami juga menggunakan kaedah
Positions.FindAll(). Ia mengembalikan senarai posisi yang boleh kami ulangi.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
[Robot()] public class Sample_cBot : Robot { protected override void OnStart() { ExecuteMarketOrder(TradeType.Buy, SymbolName, 20000, "myLabel"); ExecuteMarketOrder(TradeType.Buy, SymbolName, 30000, "myLabel"); } protected override void OnBar() { var positions = Positions.FindAll("myLabel", SymbolName, TradeType.Buy); foreach (var position in positions) { if (position.VolumeInUnits >= 20000) { ClosePosition(position, 15000); } } } }1 2 3 4 5 6 7 8 9 10
class Sample_cBot(): def on_start(self): api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 20000, "myLabel") api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 30000, "myLabel") def on_tick(self): positions = api.Positions.FindAll("myLabel", api.SymbolName, TradeType.Buy) for position in positions: if position.VolumeInUnits >= 20000: api.ClosePosition(position, 15000)Output log
- cBot "New cBot" telah berjaya dimulakan untuk EURUSD, h1.
- Melaksanakan Pesanan Pasaran untuk Beli 20000 EURUSD
- Melaksanakan Pesanan Pasaran untuk Beli 20000 EURUSD BERJAYA, Posisi PID14579299
- Melaksanakan Pesanan Pasaran untuk Beli 30000 EURUSD
- Melaksanakan Pesanan Pasaran untuk Beli 30000 EURUSD BERJAYA, Posisi PID14579300
Buat pesanan tertangguh
-
Buat pesanan had dan henti
Pesanan had dan henti adalah pesanan tertangguh; walaupun begitu, ia dibuat sama seperti pesanan pasaran. Walau bagaimanapun, apabila membuat pesanan had dan henti, anda juga perlu menentukan harga sasaran mereka dan tiada julat pasaran.
cBot ini mencipta dua pesanan had dan satu pesanan henti. Ia kemudian mengulangi pesanan tersebut dan mencetak label dan ID mereka ke log.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
[Robot()] public class Sample_cBot : Robot { protected override void OnStart() { PlaceLimitOrder(TradeType.Buy, SymbolName, 10000, Symbol.Bid, "myLimitOrder"); PlaceLimitOrder(TradeType.Buy, SymbolName, 20000, Symbol.Bid-2*Symbol.PipSize, "myLimitOrder"); PlaceStopOrder(TradeType.Buy, SymbolName, 10000, Symbol.Ask, "myStopOrder"); foreach (var pendingOrder in PendingOrders) { Print("Order placed with label {0}, id {1}", pendingOrder.Label, pendingOrder.Id); } } }1 2 3 4 5 6 7 8
class Sample_cBot(): def on_start(self): api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 10000, api.Symbol.Bid, "myLimitOrder") api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 20000, api.Symbol.Bid - 2 * api.Symbol.PipSize, "myLimitOrder") api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 10000, api.Symbol.Ask, "myStopOrder") for pendingOrder in api.PendingOrders: Print(f"Order placed with label {pendingOrder.Label}, id {pendingOrder.Id}")Output log
- cBot "New cBot" telah berjaya dimulakan untuk EURUSD, h1.
- Meletakkan Pesanan Had untuk Beli 10000 EURUSD (Harga: 1.19036)
- Meletakkan Pesanan Had untuk Beli 10000 EURUSD (Harga: 1.19036) BERJAYA, PesananTertangguh OID25220794
- Meletakkan Pesanan Had untuk Beli 20000 EURUSD (Harga: 1.19017)
- Meletakkan Pesanan Had untuk Beli 20000 EURUSD (Harga: 1.19017) BERJAYA, PesananTertangguh OID25220795
- Meletakkan Pesanan Henti untuk Beli 10000 EURUSD (Harga: 1.19040)
- Meletakkan Pesanan Henti untuk Beli 10000 EURUSD (Harga: 1.19040) BERJAYA, PesananTertangguh OID25220796
- Pesanan diletakkan dengan label myLimitOrder, id 25220794
- Pesanan diletakkan dengan label myLimitOrder, id 25220795
- Pesanan diletakkan dengan label myStopOrder, id 25220796
-
Buat pesanan tertangguh dengan lebih banyak parameter
Seperti dalam kes pesanan pasaran, anda juga boleh menentukan label pesanan, pelbagai mekanisme perlindungan, tarikh tamat tempoh pesanan dan memberikan komen.
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
[Robot()] public class Sample_cBot : Robot { protected override void OnStart() { var midnight = Server.Time.AddDays(1).Date; PlaceLimitOrder(TradeType.Buy, SymbolName, 10000, Symbol.Bid, "mySample_cBot", 10, null, midnight, "First"); PlaceStopOrder(TradeType.Buy, SymbolName, 10000, Symbol.Ask, "mySample_cBot", 10, 10, null, "Second"); foreach (var order in PendingOrders) { var sl = order.StopLoss == null ? "" : "SL: " + order.StopLoss; var tp = order.TakeProfit == null ? "" : " TP: " + order.TakeProfit; var text = string.Format("{0} {1}", sl, tp); if (order.OrderType == PendingOrderType.Limit) Print(order.Comment + " Limit Order " + text); else Print(order.Comment + " Stop Order " + text); } } }1 2 3 4 5 6 7 8 9 10 11 12
class Sample_cBot(): def on_start(self): midnight = api.Server.Time.AddDays(1).Date api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 10000, api.Symbol.Bid, "mySample_cBot", 10, None, midnight, "First") api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 10000, api.Symbol.Ask, "mySample_cBot", 10, 10, None, "Second") for order in api.PendingOrders: sl = "" if order.StopLoss is None else f"SL: {order.StopLoss}" tp = "" if order.TakeProfit is None else f"TP: {order.TakeProfit}" api.Print(f"{order.Comment} {order.OrderType} Order {sl} {tp}")Output log
- cBot "New cBot" telah berjaya dimulakan untuk EURUSD, h1.
- Meletakkan Pesanan Had untuk Beli 10000 EURUSD (Harga: 1.19049, SL: 10, ExpireTime: 12/05/2018 00:00:00)
- Meletakkan Pesanan Had untuk Beli 10000 EURUSD (Harga: 1.19049, SL: 10, ExpireTime: 12/05/2018 00:00:00) BERJAYA, PesananTertangguh OID25220807
- Meletakkan Pesanan Henti untuk Beli 10000 EURUSD (Harga: 1.19053, SL: 10, TP: 10)
- Meletakkan Pesanan Henti untuk Beli 10000 EURUSD (Harga: 1.19053, SL: 10, TP: 10) BERJAYA, PesananTertangguh OID25220808
- Pesanan Had
- Pesanan Had Pertama SL: 1.18949
- Pesanan Henti Kedua SL: 1.18953 TP: 1.19153
Ubah suai pesanan tertangguh
Adalah mungkin untuk mengubah suai beberapa ciri pesanan tertangguh.
Contoh di bawah menunjukkan cara mengubah suai harga sasaran, tahap perlindungan atau tarikh dan masa tamat tempoh pesanan tertangguh.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
Output log
Batalkan pesanan tertangguh
Sintaks untuk membatalkan pesanan ialah CancelPendingOrder(order), di mana order adalah jenis PendingOrder.
Contoh di bawah menunjukkan pembatalan semua pesanan dengan label "myLabel".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 | |
Peristiwa posisi
Adalah mungkin untuk melanggan peristiwa yang berkaitan dengan pelbagai operasi dagangan. Sebagai contoh, untuk menguji sama ada posisi dibuka, kita melanggan peristiwa yang dibangkitkan untuk semua objek Position pada pembukaan.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 | |
Output log
Begitu juga, adalah mungkin untuk melanggan peristiwa yang dibangkitkan setiap kali posisi ditutup.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Output log
Penukaran koordinat
cBot di bawah membolehkan pengguna meletakkan pesanan had dalam arah yang sesuai hanya dengan mengklik kanan pada carta. Ia mencapai ini dengan menukar koordinat Y tetikus kepada koordinat Y carta (yang, untuk simbol, sepadan dengan harga simbol).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 | |
Pelaksanaan tak segerak
Sampel kod di atas direka untuk melaksanakan robot dagangan menggunakan pelaksanaan segerak. C# dan Python kedua-duanya menyokong operasi tak segerak, membolehkan cBot anda melakukan beberapa tindakan dalam tempoh masa yang sama.
Laksanakan pesanan pasaran secara tak segerak
Sintaks kaedah tak segerak adalah serupa dengan kaedah segerak. Walaupun mereka menerima jenis argumen yang sama, jenis pulangan mereka ialah TradeOperation dan bukannya TradeResult.
-
Operasi tak segerak asas
cBot berikut menunjukkan bagaimana operasi tak segerak berfungsi. Pesanan pasaran dicipta; dalam keadaan bersyarat seterusnya, cBot menyemak sama ada operasi sedang dilaksanakan.
1 2 3 4 5 6 7 8 9 10 11 12 13
[Robot()] public class Sample_cBot : Robot { protected override void OnStart() { var operation = ExecuteMarketOrderAsync(TradeType.Buy, SymbolName, 10000); if (operation.IsExecuting) { Print("Operation Is Executing"); } } }1 2 3 4 5 6
class Sample_cBot(): def on_start(self): operation = api.ExecuteMarketOrderAsync(TradeType.Buy, api.SymbolName, 10000) if operation.IsExecuting: api.Print("Operation Is Executing")Output log
- cBot "New cBot" telah berjaya dimulakan untuk EURUSD, h1.
- Melaksanakan Pesanan Pasaran untuk Beli 10000 EURUSD
- Operasi Sedang Dilaksanakan
- Melaksanakan Pesanan Pasaran untuk Beli 10000 EURUSD BERJAYA, Position PID14579532
-
Laksanakan pesanan
Contoh seterusnya menyerlahkan perbezaan antara kaedah segerak dan tak segerak.
cBot menyemak sama ada operasi sedang dilaksanakan sejurus selepas memanggil kaedah tak segerak. Ia melakukannya sekali lagi selepas memanggil kaedah segerak. Output log untuk kedua-dua tindakan ini adalah berbeza.
1 2 3 4 5 6 7 8 9 10 11
[Robot()] public class Sample_cBot : Robot { protected override void OnStart() { var operation = ExecuteMarketOrderAsync(TradeType.Buy, SymbolName, 10000); Print(operation.IsExecuting ? "Operation Is Executing" : "Operation executed"); ExecuteMarketOrder(TradeType.Buy, SymbolName, 20000); Print(operation.IsExecuting ? "Operation Is Executing" : "Operation executed"); } }1 2 3 4 5 6
class Sample_cBot(): def on_start(self): operation = api.ExecuteMarketOrderAsync(TradeType.Buy, api.SymbolName, 10000) api.Print("Operation Is Executing" if operation.IsExecuting else "Operation executed") api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 20000) api.Print("Operation Is Executing" if operation.IsExecuting else "Operation executed")Output log
- cBot "New cBot" telah berjaya dimulakan untuk EURUSD, h1.
- Melaksanakan Pesanan Pasaran untuk Beli 10000 EURUSD
- Operasi Sedang Dilaksanakan
- Melaksanakan Pesanan Pasaran untuk Beli 20000 EURUSD
- Melaksanakan Pesanan Pasaran untuk Beli 10000 EURUSD BERJAYA, Position PID14579541
- Melaksanakan Pesanan Pasaran untuk Beli 20000 EURUSD BERJAYA, Position PID14579542
- Operasi dilaksanakan
-
Laksanakan pesanan dengan lebih banyak parameter
cBot berikut meletakkan pesanan dengan menentukan labelnya (
"myLabel"), tahap perlindungan (10, 10), simbol (SymbolName) dan volum (10000).Contoh ini juga mengandungi koleksi
Positionsdan kaedahFindAll().Find()danFindAll()boleh digunakan untuk mencari posisi dengan label, simbol dan jenis dagangan yang sama.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[Robot()] public class Sample_cBot : Robot { protected override void OnStart() { ExecuteMarketOrderAsync(TradeType.Buy, SymbolName, 10000, "myLabel", 10, 10); } protected override void OnTick() { var positions = Positions.FindAll("myLabel", SymbolName, TradeType.Buy); if (positions.Length == 0) return; foreach (var position in positions) Print("Buy at {0} SL {1}", position.EntryPrice, position.StopLoss); Stop(); } }1 2 3 4 5 6 7 8 9 10 11 12 13 14
class Sample_cBot(): def on_start(self): api.ExecuteMarketOrderAsync(TradeType.Buy, api.SymbolName, 10000, "myLabel", 10, 10) def on_tick(self): positions = api.Positions.FindAll("myLabel", api.SymbolName, TradeType.Buy) if positions.Length == 0: return for position in positions: api.Print(f"Buy at {position.EntryPrice} SL {position.StopLoss}") api.Stop()Output log
- cBot "New cBot" telah berjaya dimulakan untuk EURUSD, h1.
- Melaksanakan Pesanan Pasaran untuk Beli 10000 EURUSD (SL: 10, TP: 10)
- Melaksanakan Pesanan Pasaran untuk Beli 10000 EURUSD (SL: 10, TP: 10) BERJAYA, Position PID14579719
- Beli pada 1.19087 SL null
- Beli pada 1.19357 SL 1.19257
- cBot "New cBot" telah dihentikan untuk EURUSD, h1.
Ubah suai posisi secara tak segerak
cBot di bawah meletakkan pesanan pasaran dan kemudian mengubah suai posisi yang baru dibuka.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Output log
Tutup posisi secara tak segerak
Contoh seterusnya menunjukkan menutup posisi secara tak segerak jika ia wujud.
Kaedah Find() digunakan untuk mencari koleksi Positions untuk posisi dengan label tertentu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
Output log
Letakkan pesanan had dan henti secara tak segerak
Seperti yang dinyatakan di atas, meletakkan pesanan tertangguh adalah serupa dengan mencipta pesanan pasaran.
Walau bagaimanapun, terdapat beberapa perbezaan kecil dalam argumen antara kedua-dua kaedah ini. Julat pasaran tiada dalam senarai argumen. Selain itu, anda perlu menentukan harga sasaran, dan anda boleh menghantar argumen pilihan yang menentukan tarikh tamat tempoh pesanan.
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 | |
Output log
Ubah suai pesanan tertangguh secara asinkron
cBot berikut mengubah suai pesanan had secara asinkron.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 | |
Output log
Batalkan pesanan tertangguh secara asinkron
-
Batalkan semua pesanan tertangguh
cBot di bawah membatalkan semua pesanan tertangguh semasa secara asinkron.
1 2 3 4 5 6 7 8 9 10 11
[Robot()] public class Sample_cBot : Robot { protected override void OnBar() { foreach (var pendingOrder in PendingOrders) { CancelPendingOrderAsync(pendingOrder); } } }1 2 3 4
class Sample_cBot(): def on_bar(self): for order in api.PendingOrders: api.CancelPendingOrderAsync(order)Output log
- cBot "batalkan pesanan tertangguh" telah bermula dengan berjaya untuk EURUSD, h1.
- Membatalkan pesanan tertangguh OID274705
- Membatalkan pesanan tertangguh OID274706
- Membatalkan pesanan tertangguh OID274707
- Membatalkan pesanan tertangguh OID274708
- Membatalkan pesanan tertangguh OID274709
- Membatalkan pesanan tertangguh OID274705 BERJAYA, PendingOrder OID274705
- Membatalkan pesanan tertangguh OID274706 BERJAYA, PendingOrder OID274706
- Membatalkan pesanan tertangguh OID274707 BERJAYA, PendingOrder OID274707
- Membatalkan pesanan tertangguh OID274708 BERJAYA, PendingOrder OID274708
- Membatalkan pesanan tertangguh OID274709 BERJAYA, PendingOrder OID274709
-
Batalkan pesanan tertangguh dengan label tertentu
cBot ini hanya membatalkan pesanan tertangguh dengan label tertentu.
1 2 3 4 5 6 7 8 9 10 11 12
[Robot()] public class Sample_cBot : Robot { protected override void OnBar() { foreach (var pendingOrder in PendingOrders) { if (pendingOrder.Label == "myLabel") CancelPendingOrderAsync(pendingOrder); } } }1 2 3 4 5
class Sample_cBot(): def on_bar(self): for order in api.PendingOrders: if order.Label == "myLabel": api.CancelPendingOrderAsync(order)
Fungsi panggilan balik untuk kaedah asinkron
Setelah keputusan dikembalikan, penggunaan operasi asinkron sering memerlukan kawalan pelaksanaan. Untuk mengendalikan ini, anda boleh menambah fungsi panggilan balik pada akhir senarai parameter semua kaedah asinkron.
Fungsi ini akan dipanggil sebaik sahaja respons diterima dari pelayan. Sebagai contoh, ia boleh dipanggil apabila posisi dibuka, diubah suai atau ditutup.
-
Pesanan pasaran asinkron dengan panggilan balik
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
[Robot()] public class Sample_cBot : Robot { protected override void OnStart() { var operation = ExecuteMarketOrderAsync(TradeType.Buy, SymbolName, 10000, PositionOpened); if (operation.IsExecuting) Print(operation.ToString()); else Print(operation.TradeResult.ToString()); } private void PositionOpened(TradeResult tradeResult) { var position = tradeResult.Position; Print(tradeResult.ToString()); if (tradeResult.IsSuccessful) Print("Position {0} opened at {1}", position.Id, position.EntryPrice); } }1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
from System import Action class Sample_cBot(): def on_start(self): operation = api.ExecuteMarketOrderAsync(TradeType.Buy, api.SymbolName, 10000, Action[TradeResult](self.on_position_opened)) if (operation.IsExecuting) api.Print(operation.ToString()) else api.Print(operation.TradeResult.ToString()) def on_position_opened(self, tradeResult): position = tradeResult.Position api.Print(tradeResult.ToString()) if tradeResult.IsSuccessful: api.Print(f"Position {position.Id} opened at {position.EntryPrice}")Output log
- cBot "New cBot" telah berjaya dimulakan untuk EURUSD, h1.
- Melaksanakan Pesanan Pasaran untuk Membeli 10000 EURUSD
- TradeOperation (Melaksanakan Pesanan Pasaran untuk Membeli 10000 EURUSD SEDANG DILAKSANAKAN)
- Melaksanakan Pesanan Pasaran untuk Membeli 10000 EURUSD BERJAYA, Position PID14579835
- TradeResult (Berjaya, Position: PID14579835)
- Posisi 14579835 dibuka pada 1.19414
-
Menggunakan ungkapan lambda
Daripada menentukan kaedah panggilan balik bernama, anda boleh menggunakan ungkapan lambda.
Dalam contoh berikut, apabila pesanan diletakkan, keterangan hasil akan dicetak ke log.
1 2 3 4 5 6 7 8 9
[Robot()] public class Sample_cBot : Robot { protected override void OnStart() { PlaceLimitOrderAsync(TradeType.Buy, SymbolName, 10000, Symbol.Ask - 20 * Symbol.PipSize, "myLabel", result => Print(result.ToString())); } }1 2 3 4 5
from System import Action class Samples(): def on_start(self): operation = api.PlaceLimitOrderAsync(TradeType.Buy, api.SymbolName, 10000, api.Symbol.Ask - 20 * api.Symbol.PipSize, "myLabel", Action[TradeResult](lambda result: api.Print(result.ToString())))Output Log
- cBot "New cBot" telah dimulakan dengan jayanya untuk EURUSD, h1.
- Meletakkan Pesanan Had untuk Membeli 10000 EURUSD (Harga: 1.19320)
- Meletakkan Pesanan Had untuk Membeli 10000 EURUSD (Harga: 1.19320) BERJAYA, PendingOrder OID25222083
- TradeResult (Berjaya, PendingOrder: OID25222083)
