Anda dapat mengembangkan cBot yang melakukan trading beberapa simbol selain yang ditentukan saat membuat instance baru.
Membuatnya mungkin, Symbols adalah kumpulan semua simbol yang tersedia untuk akun trading Anda. Anda dapat mengiterasi melaluinya dengan menggunakan loop; atau, Anda dapat mencari di dalamnya untuk menemukan simbol tertentu.
Untuk bekerja dengan benar dengan beberapa simbol, cBot perlu mengetahui informasi berikut:
Volume minimum dan maksimum yang diizinkan
Langkah volume
Ukuran tick pip
Nilai tick pip (nilai moneter dari satu pip atau tick dalam mata uang deposit akun)
Data ini dapat dipelajari dari objek Symbol. Dalam kode di bawah ini, kita menemukan simbol dengan "GBPUSD" sebagai namanya dan kemudian membuat order pasar untuknya. Kita juga menggunakan volume minimum yang diizinkan sebagai volume order.
importclrclr.AddReference("cAlgo.API")# Import cAlgo API typesfromcAlgo.APIimport*fromcAlgo.API.Internalsimport*# Import trading wrapper functionsfromrobot_wrapperimport*classSample_cBot():defon_start(self):symbol=api.Symbols.GetSymbol("GBPUSD")ifsymbolisnotNone:api.ExecuteMarketOrder(TradeType.Sell,symbol.Name,symbol.VolumeInUnitsMin)
Mengonversi pip ke tick
Saat mengkodekan cBot, mudah menemui bug yang muncul dari fakta bahwa beberapa nilai variabel dihitung dalam satuan sementara nilai lain dihitung dalam pip.
Kelas SymbolExtensions di bawah ini menunjukkan bagaimana pip dapat dikonversi menjadi tick. Ini juga mendemonstrasikan bagaimana pip dapat ditambahkan ke nilai harga absolut.
usingSystem;usingcAlgo.API;usingcAlgo.API.Internals;namespaceSamples{[Robot(AccessRights = AccessRights.None)]publicclassSample:Robot{protectedoverridevoidOnStart(){varspreadInPips=Symbol.NormalizePips(Symbol.ToPips(Symbol.Spread));Print(spreadInPips);varspreadInTicks=Math.Round(Symbol.ToTicks(Symbol.Spread));Print(spreadInTicks);/* Calculating a long position stop loss using the absolute price value. */varstopLossInPips=60;/* We use 'NormalizePips' to avoid the 'invalid decimal places' error in case our stop loss value has too many decimals. */varstopLossInPrice=Symbol.Ask-(Symbol.NormalizePips(stopLossInPips)*Symbol.PipSize);Print(stopLossInPrice);}}publicstaticclassSymbolExtensions{/// <summary>/// Returns a symbol pip value/// </summary>/// <param name="symbol"></param>/// <returns>double</returns>publicstaticdoubleGetPip(thisSymbolsymbol){returnsymbol.TickSize/symbol.PipSize*Math.Pow(10,symbol.Digits);}/// <summary>/// Returns a price value in terms of pips/// </summary>/// <param name="symbol"></param>/// <param name="price">The price level</param>/// <returns>double</returns>publicstaticdoubleToPips(thisSymbolsymbol,doubleprice){returnprice*symbol.GetPip();}/// <summary>/// Returns a price value in terms of ticks/// </summary>/// <param name="symbol"></param>/// <param name="price">The price level</param>/// <returns>double</returns>publicstaticdoubleToTicks(thisSymbolsymbol,doubleprice){returnprice*Math.Pow(10,symbol.Digits);}/// <summary>/// Rounds a price level to the number of symbol digits/// </summary>/// <param name="symbol">The symbol</param>/// <param name="price">The price level</param>/// <returns>double</returns>publicstaticdoubleRound(thisSymbolsymbol,doubleprice){returnMath.Round(price,symbol.Digits);}/// <summary>/// Normalize x Pips amount decimal places to something that can be used as a stop loss or take profit for an order./// For example if symbol is EURUSD and you pass to this method 10.456775 it will return back 10.5/// </summary>/// <param name="symbol">The symbol</param>/// <param name="pips">The amount of Pips</param>/// <returns>double</returns>publicstaticdoubleNormalizePips(thisSymbolsymbol,doublepips){varcurrentPrice=Convert.ToDecimal(symbol.Bid);varpipSize=Convert.ToDecimal(symbol.PipSize);varpipsDecimal=Convert.ToDecimal(pips);varpipsAddedToCurrentPrice=Math.Round((pipsDecimal*pipSize)+currentPrice,symbol.Digits);vartickSize=Convert.ToDecimal(symbol.TickSize);varresult=(pipsAddedToCurrentPrice-currentPrice)*tickSize/pipSize*Convert.ToDecimal(Math.Pow(10,symbol.Digits));returndecimal.ToDouble(result);}}}
Transactions berisi tipe yang menyediakan data tentang deposit dan penarikan dana untuk akun. Tipe-tipe ini memungkinkan Anda untuk mengakses dan mengelola detail transaksi untuk akun secara terprogram.
Anda dapat mengambil data tentang jenis transaksi (deposit atau penarikan dana), jumlah, timestamp, ID transaksi, detail saldo, properti ekuitas, dll.
cTrader menyediakan koleksi HistoricalOrder untuk memungkinkan pengguna mengambil informasi tentang order, termasuk order pasar yang selesai dan order pending yang dieksekusi atau dibatalkan. Detail yang dapat diambil termasuk ID order, jenisnya, label, harga target, kedaluwarsa, dll.
Kode cBot di bawah ini menunjukkan cara mendapatkan detail untuk order historis:
Saat mengkodekan cBot, Anda memiliki akses ke riwayat akun Anda. Ini berarti Anda dapat mengiterasi melalui trading masa lalu Anda dan menggunakan data mereka untuk tujuan apa pun yang Anda miliki.
Cuplikan kode di bawah ini membuat file .CSV yang berisi semua trading masa lalu kita dan data trading mereka.
usingSystem;usingcAlgo.API;usingSystem.Text;usingSystem.IO;namespaceSamples{/* We provide the access rights required for reading and writing in locally stored files. */[Robot(AccessRights = AccessRights.FullAccess)]publicclassSample:Robot{protectedoverridevoidOnStart(){varstringBuilder=newStringBuilder();_=stringBuilder.AppendLine($"PositionId,TradeType,SymbolName,VolumeInUnits,EntryTime,EntryPrice,ClosingTime,ClosingPrice,NetProfit,Balance");// All trades are inside the 'History' collectionforeach(vartradeinHistory){_=stringBuilder.AppendLine($"{trade.PositionId},{trade.TradeType},{trade.SymbolName},{trade.VolumeInUnits},{trade.EntryTime:o},{trade.EntryPrice},{trade.ClosingTime:o},{trade.ClosingPrice},{trade.NetProfit},{trade.Balance}");}// We will save the CSV file on our desktopvardesktopPath=Environment.GetFolderPath(Environment.SpecialFolder.Desktop);varfilePath=Path.Combine(desktopPath,$"{Account.Number}_History.csv");File.WriteAllText(filePath,stringBuilder.ToString());}}}
Dapatkan informasi tentang deal
Di cTrader, deal mengeksekusi order dan menyebabkan posisi dibuka atau ditutup. Tergantung pada likuiditas pasar, sebuah order dapat tereksekusi sepenuhnya oleh satu deal atau sebagian oleh beberapa deal. Lihat Posisi dan deal untuk mempelajari lebih lanjut.
Kode cBot di bawah ini menunjukkan cara mengambil informasi tentang beberapa deal yang ada dalam satu posisi:
importclrclr.AddReference("cAlgo.API")# Import cAlgo API typesfromcAlgo.APIimport*fromcAlgo.API.Internalsimport*# Import trading wrapper functionsfromrobot_wrapperimport*classDealsExample():defon_start(self):position=api.ExecuteMarketOrder(TradeType.Buy,"EURUSD",10000)deals=position.Position.Dealsfordealindeals:api.Print(f"{deal.ExecutionTime}{deal.Status}{deal.Id}")api.ClosePosition(position.Position,3000)api.ClosePosition(position.Position,7000)closing_deals=api.History.FindByPositionId(position.Position.Id)forclosing_dealinclosing_deals:api.Print(f"{closing_deal.ClosingDeal.ExecutionTime}{closing_deal.ClosingDeal.VolumeInUnits}")defon_stop(self):pass
Konversi lot ke unit
Secara default, algo cTrader menghitung volume dalam unit, bukan lot. Namun, dalam beberapa kasus Anda mungkin merasa bahwa bekerja dengan lot lebih nyaman dan familiar.
Anda dapat mengkonversi lot ke unit dengan menggunakan metode Symbol.QuantityToVolumeUnits().
importclrclr.AddReference("cAlgo.API")# Import cAlgo API typesfromcAlgo.APIimport*fromcAlgo.API.Internalsimport*# Import trading wrapper functionsfromrobot_wrapperimport*classSample():defon_start(self):lots=2.5volume_in_units=api.Symbol.QuantityToVolumeInUnits(lots)api.ExecuteMarketOrder(TradeType.Sell,api.SymbolName,volume_in_units)
Atau, Anda dapat menggunakan metode Symbol.VolumeInUnitsToQuantity() untuk mengkonversi unit ke lot.
Bekerja dengan warna
cBot dapat menggunakan warna kustom saat melakukan berbagai operasi (misalnya, saat menampilkan teks pada grafik trading). Untuk menambahkan warna sebagai parameter yang dapat disesuaikan, tambahkan kode berikut ke deklarasi parameter Anda.
Anda dapat menggunakan kode warna heksadesimal dan nama warna (seperti red") saat mendefinisikan DefaultValue dari parameter tersebut."
Untuk mengilustrasikan cara kerja parameter warna, kita akan membuat cBot sederhana yang, saat dijalankan, akan menulis teks pada grafik trading tempat cBot tersebut beroperasi. Warna teks ini akan dapat disesuaikan melalui parameter TextColor.
1 2 3 4 5 6 7 8 910111213141516171819202122232425
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingcAlgo.API;usingcAlgo.API.Collections;usingcAlgo.API.Indicators;usingcAlgo.API.Internals;namespacecAlgo.Robots{[Robot(AccessRights = AccessRights.None)]publicclassSampleColorcBot:Robot{[Parameter("Text Color", DefaultValue = "red")]publicColorTextColor{get;set;}protectedoverridevoidOnStart(){varstaticText=Chart.DrawStaticText("static","Sample text to demonstrate how color works",VerticalAlignment.Center,HorizontalAlignment.Center,TextColor);}}}
1 2 3 4 5 6 7 8 91011121314151617181920
importclrclr.AddReference("cAlgo.API")# Import cAlgo API typesfromcAlgo.APIimport*fromcAlgo.API.Internalsimport*# Import trading wrapper functionsfromrobot_wrapperimport*classSampleColorcBot():defon_start(self):api.Chart.DrawStaticText("static","Sample text to demonstrate how color works",VerticalAlignment.Center,HorizontalAlignment.Center,api.TextColor)