Sie können einen cBot entwickeln, der zusätzlich zu dem beim Erstellen einer neuen Instanz angegebenen Symbol mehrere Symbole handelt.
Um dies zu ermöglichen, ist Symbols eine Sammlung aller Symbole, die für Ihr Handelskonto verfügbar sind. Sie können darüber iterieren, indem Sie Schleifen verwenden; alternativ können Sie danach suchen, um bestimmte Symbole zu finden.
Um korrekt mit mehreren Symbolen zu arbeiten, müssen cBots die folgenden Informationen kennen:
Das minimal und maximal zulässige Volumen
Die Volumenstufe
Die Pip-Tick-Größe
Der Pip-Tick-Wert (der monetäre Wert eines Pips oder Ticks in der Einzahlungswährung des Kontos)
Diese Daten können aus einem Symbol-Objekt abgerufen werden. Im folgenden Code finden wir ein Symbol mit "GBPUSD" als Namen und erstellen dann eine Markt-Order dafür. Wir verwenden auch sein minimal zulässiges Volumen als Ordervolumen.
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)
Pips in Ticks umrechnen
Beim Codieren von cBots kann man leicht auf Fehler stoßen, die daraus resultieren, dass einige Variablenwerte in Einheiten berechnet werden, während andere Werte in Pips berechnet werden.
Die folgende SymbolExtensions-Klasse zeigt, wie Pips in Ticks umgerechnet werden können. Sie demonstriert auch, wie Pips zu einem absoluten Kurswert addiert werden können.
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 enthält Typen, die Daten zu Einzahlungen und Auszahlungen für Konten bereitstellen. Diese Typen ermöglichen es Ihnen, auf Transaktionsdetails für Konten programmgesteuert zuzugreifen und diese zu verwalten.
Sie können Daten zum Transaktionstyp (Einzahlung oder Auszahlung), Betrag, Zeitstempeln, Transaktions-ID, Saldodetails, Eigenkapitaleigenschaften usw. abrufen.
Dieser cBot ruft Transaktionsdetails ab und gibt sie aus:
cTrader stellt die HistoricalOrder-Sammlung bereit, um Benutzern den Abruf von Informationen über Orders zu ermöglichen, einschließlich abgeschlossener Markt-Orders und ausstehender Orders, die ausgeführt oder storniert wurden. Die abrufbaren Details umfassen die Order-ID, ihren Typ, Label, Zielpreis, Ablauf usw.
Der folgende cBot-Code zeigt Ihnen, wie Sie die Details für historische Orders abrufen:
Beim Codieren von cBots haben Sie Zugriff auf Ihren Kontoverlauf. Das bedeutet, dass Sie über Ihre vergangenen Geschäfte iterieren und deren Daten für beliebige Zwecke verwenden können.
Der folgende Codeausschnitt erstellt eine .CSV-Datei, die alle unsere vergangenen Geschäfte und deren Handelsdaten enthält.
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());}}}
Informationen über Transaktionen abrufen
In cTrader führen Transaktionen Orders aus und bewirken, dass Positionen eröffnet oder geschlossen werden. Abhängig von der Marktliquidität kann eine Order vollständig durch eine einzelne Transaktion oder teilweise durch mehrere Transaktionen abgeschlossen werden. Siehe Positionen und Transaktionen, um mehr zu erfahren.
Der folgende cBot-Code zeigt Ihnen, wie Sie Informationen über mehrere Transaktionen abrufen, die in einer einzigen Position existieren:
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
Lots in Einheiten umrechnen
Standardmäßig berechnen cTrader-Algos das Volumen in Einheiten anstelle von Lots. In einigen Fällen kann es jedoch praktischer und vertrauter sein, mit Lots zu arbeiten.
Sie können Lots in Einheiten umrechnen, indem Sie die Methode Symbol.QuantityToVolumeUnits() verwenden.
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)
Alternativ können Sie die Methode Symbol.VolumeInUnitsToQuantity() verwenden, um Einheiten in Lots umzurechnen.
Mit Farben arbeiten
cBots können benutzerdefinierte Farben verwenden, wenn sie verschiedene Operationen ausführen (zum Beispiel beim Anzeigen von Text auf Handelscharts). Um Farbe als anpassbaren Parameter hinzuzufügen, fügen Sie den folgenden Code zu Ihren Parameterdeklarationen hinzu.
Sie können sowohl hexadezimale Farbcodes als auch Farbnamen (wie "red") verwenden, wenn Sie den DefaultValue eines solchen Parameters definieren.
Um zu veranschaulichen, wie Farbparameter funktionieren, erstellen wir einen einfachen cBot, der beim Start Text auf dem Handelschart schreibt, auf dem er arbeitet. Die Farbe dieses Textes wird über den Parameter TextColor anpassbar sein.
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)