Anda boleh membangunkan cBot yang berdagang pelbagai simbol selain daripada yang ditetapkan semasa mencipta contoh baharu.
Membuatkannya mungkin, Symbols adalah koleksi semua simbol yang tersedia untuk akaun dagangan anda. Anda boleh mengulanginya dengan menggunakan gelung; sebagai alternatif, anda boleh mencarinya untuk mencari simbol tertentu.
Untuk bekerja dengan betul dengan pelbagai simbol, cBot perlu mengetahui maklumat berikut:
Volum minimum dan maksimum yang dibenarkan
Langkah volum
Saiz tik pip
Nilai tik pip (nilai kewangan satu pip atau tik dalam mata wang deposit akaun)
Data ini boleh dipelajari daripada objek Symbol. Dalam kod di bawah, kita mencari simbol dengan "GBPUSD" sebagai namanya dan kemudian mencipta pesanan pasaran untuknya. Kita juga menggunakan volum minimum yang dibenarkan sebagai volum pesanan.
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)
Tukar pip kepada tik
Apabila mengekod cBot, adalah mudah untuk menghadapi pepijat yang timbul daripada fakta bahawa beberapa nilai pembolehubah dikira dalam unit manakala nilai lain dikira dalam pip.
Kelas SymbolExtensions di bawah menunjukkan bagaimana pip boleh ditukar kepada tik. Ia juga menunjukkan bagaimana pip boleh ditambah kepada nilai harga mutlak.
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 mengandungi jenis yang menyediakan data tentang deposit dan pengeluaran untuk akaun. Jenis ini membolehkan anda mengakses dan menguruskan butiran transaksi untuk akaun secara programatik.
Anda boleh mendapatkan data tentang jenis transaksi (deposit atau pengeluaran), jumlah, cap masa, ID transaksi, butiran baki, ciri-ciri ekuiti, dan sebagainya.
cBot ini mendapatkan dan mencetak butiran transaksi:
cTrader menyediakan koleksi HistoricalOrder untuk membolehkan pengguna mendapatkan maklumat tentang pesanan, termasuk pesanan pasaran yang telah selesai dan pesanan tertangguh yang telah dilaksanakan atau dibatalkan. Butiran yang boleh didapati termasuk ID pesanan, jenisnya, label, harga sasaran, tamat tempoh, dan sebagainya.
Kod cBot di bawah menunjukkan kepada anda cara untuk mendapatkan butiran untuk pesanan sejarah:
Semasa mengekod cBot, anda mempunyai akses kepada sejarah akaun anda. Ini bermakna anda boleh mengulangi dagangan lalu anda dan menggunakan data mereka untuk apa jua tujuan yang anda ada.
Cebisan kod di bawah mencipta fail .CSV yang mengandungi semua dagangan lalu anda dan data dagangan 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 maklumat mengenai dagangan
Dalam cTrader, dagangan melaksanakan pesanan dan menyebabkan posisi dibuka atau ditutup. Bergantung pada kecairan pasaran, pesanan mungkin diisi sepenuhnya oleh satu dagangan atau sebahagian demi sebahagian oleh beberapa dagangan. Lihat Posisi dan dagangan untuk mengetahui lebih lanjut.
Kod cBot di bawah menunjukkan kepada anda cara untuk mendapatkan maklumat tentang beberapa dagangan yang wujud 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
Tukar lot kepada unit
Secara lalai, algoritma cTrader mengira volum dalam unit dan bukannya lot. Walau bagaimanapun, dalam sesetengah kes anda mungkin mendapati bahawa bekerja dengan lot adalah lebih mudah dan biasa.
Anda boleh menukar lot kepada unit dengan menggunakan kaedah 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)
Sebagai alternatif, anda boleh menggunakan kaedah Symbol.VolumeInUnitsToQuantity() untuk menukar unit kepada lot.
Bekerja dengan warna
cBot boleh menggunakan warna tersuai semasa melakukan pelbagai operasi (contohnya, semasa memaparkan teks pada carta dagangan). Untuk menambah warna sebagai parameter yang boleh disuaikan, tambahkan kod berikut pada pengisytiharan parameter anda.
Anda boleh menggunakan kedua-dua kod warna heksadesimal dan nama warna (seperti red") semasa menentukan DefaultValue parameter tersebut."
Untuk menggambarkan bagaimana parameter warna berfungsi, kita akan mencipta cBot mudah yang, apabila dimulakan, akan menulis teks pada carta dagangan di mana ia beroperasi. Warna teks ini akan boleh disuaikan 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)