Możesz opracować cBota, który handluje wieloma symbolami oprócz tego określonego podczas tworzenia nowej instancji.
Umożliwiając to, Symbols jest kolekcją wszystkich symboli dostępnych dla Twojego konta handlowego. Możesz iterować po niej za pomocą pętli; alternatywnie możesz przeszukać ją, aby znaleźć określone symbole.
Aby poprawnie pracować z wieloma symbolami, cBoty muszą znać następujące informacje:
Minimalny i maksymalny dozwolony wolumen
Krok wolumenu
Rozmiar tiku pipsa
Wartość tiku pipsa (wartość pieniężna jednego pipsa lub tiku w walucie depozytu konta)
Te dane można uzyskać z obiektu Symbol. W poniższym kodzie znajdujemy symbol z "GBPUSD" jako jego nazwą, a następnie tworzymy dla niego zlecenie rynkowe. Używamy również jego minimalnego dozwolonego wolumenu jako wolumenu zlecenia.
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)
Konwertuj pipsy na tiki
Podczas kodowania cBotów łatwo napotkać błędy wynikające z faktu, że niektóre wartości zmiennych są obliczane w jednostkach, podczas gdy inne wartości są obliczane w pipsach.
Poniższa klasa SymbolExtensions pokazuje, jak pipsy mogą być konwertowane na tiki. Demonstruje również, jak pipsy mogą być dodawane do bezwzględnej wartości ceny.
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 zawiera typy, które dostarczają danych o wpłatach i wypłatach dla kont. Te typy umożliwiają programowy dostęp do szczegółów transakcji dla kont i zarządzanie nimi.
Możesz pobrać dane dotyczące typu transakcji (wpłata lub wypłata), kwoty, znaczników czasu, identyfikatora transakcji, szczegółów salda, właściwości kapitału itp.
Ten cBot pobiera i wyświetla szczegóły transakcji:
cTrader udostępnia kolekcję HistoricalOrder, aby umożliwić użytkownikom pobieranie informacji o zleceniach, w tym zrealizowanych zleceniach rynkowych i zleceniach oczekujących, które zostały wykonane lub anulowane. Szczegóły, które można pobrać, obejmują identyfikator zlecenia, jego typ, etykietę, cenę docelową, wygaśnięcie itp.
Poniższy kod cBota pokazuje, jak uzyskać szczegóły dla historycznych zleceń:
Podczas kodowania cBotów masz dostęp do historii swojego konta. Oznacza to, że możesz iterować po swoich wcześniejszych transakcjach i wykorzystywać ich dane do dowolnych celów.
Poniższy fragment kodu tworzy plik .CSV zawierający wszystkie nasze wcześniejsze transakcje i ich dane.
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());}}}
Uzyskaj informacje o transakcjach
W cTrader transakcje wykonują zlecenia i powodują otwarcie lub zamknięcie pozycji. W zależności od płynności rynku zlecenie może zostać zrealizowane w całości przez jedną transakcję lub częściowo przez kilka transakcji. Zobacz Pozycje i transakcje, aby dowiedzieć się więcej.
Poniższy kod cBota pokazuje, jak pobrać informacje o wielu transakcjach, które istnieją w ramach jednej pozycji:
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
Konwertuj loty na jednostki
Domyślnie algorytmy cTrader obliczają wolumen w jednostkach zamiast w lotach. Jednak w niektórych przypadkach możesz uznać, że praca z lotami jest wygodniejsza i bardziej znajoma.
Możesz konwertować loty na jednostki za pomocą metody 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)
Alternatywnie możesz użyć metody Symbol.VolumeInUnitsToQuantity(), aby konwertować jednostki na loty.
Pracuj z kolorami
cBoty mogą używać niestandardowych kolorów podczas wykonywania różnych operacji (na przykład podczas wyświetlania tekstu na wykresach handlowych). Aby dodać kolor jako konfigurowalny parametr, dodaj następujący kod do deklaracji parametrów.
Możesz używać zarówno szesnastkowych kodów kolorów, jak i nazw kolorów (takich jak "red") podczas definiowania DefaultValue takiego parametru.
Aby zilustrować, jak działają parametry kolorów, stworzymy prostego cBota, który po uruchomieniu zapisze tekst na wykresie handlowym, na którym działa. Kolor tego tekstu będzie konfigurowalny za pomocą parametru 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)