Puede desarrollar un cBot que opere con múltiples símbolos además del especificado al crear una nueva instancia.
Haciéndolo posible, Symbols es una colección de todos los símbolos disponibles para su cuenta de operaciones. Puede iterar sobre él usando bucles; alternativamente, puede buscar en él para encontrar símbolos específicos.
Para trabajar correctamente con múltiples símbolos, los cBots necesitan conocer la siguiente información:
El volumen mínimo y máximo permitido
El paso del volumen
El tamaño del pip tick
El valor del pip tick (el valor monetario de un pip o tick en la moneda de depósito de la cuenta)
Estos datos se pueden obtener de un objeto Symbol. En el código siguiente, encontramos un símbolo con "GBPUSD" como su nombre y luego creamos una orden de mercado para él. También usamos su volumen mínimo permitido como volumen de la orden.
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)
Convertir pips a ticks
Al programar cBots, es fácil encontrar errores que surgen del hecho de que algunos valores de variables se calculan en unidades mientras que otros valores se calculan en pips.
La clase SymbolExtensions a continuación muestra cómo se pueden convertir los pips a ticks. También demuestra cómo se pueden añadir pips a un valor de precio absoluto.
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 contiene tipos que proporcionan datos sobre depósitos y retiradas de cuentas. Estos tipos le permiten acceder y gestionar programáticamente los detalles de las transacciones de las cuentas.
Puede recuperar datos sobre el tipo de transacción (depósito o retirada), cantidad, marcas de tiempo, ID de transacción, detalles del saldo, propiedades del capital, etc.
Este cBot recupera e imprime los detalles de las transacciones:
cTrader proporciona la colección HistoricalOrder para permitir a los usuarios recuperar información sobre órdenes, incluyendo órdenes de mercado completadas y órdenes pendientes que fueron ejecutadas o canceladas. Los detalles recuperables incluyen el ID de la orden, su tipo, etiqueta, precio objetivo, vencimiento, etc.
El código del cBot a continuación le muestra cómo obtener los detalles de las órdenes históricas:
Al programar cBots, tiene acceso al historial de su cuenta. Esto significa que puede iterar sobre sus operaciones pasadas y usar sus datos para cualquier propósito que tenga.
El fragmento de código a continuación crea un archivo .CSV que contiene todas nuestras operaciones pasadas y sus datos de operación.
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());}}}
Obtener información sobre transacciones
En cTrader, las transacciones ejecutan órdenes y hacen que se abran o cierren posiciones. Dependiendo de la liquidez del mercado, una orden puede ser completada enteramente por una sola transacción o en partes por varias transacciones. Consulte Posiciones y transacciones para obtener más información.
El código del cBot a continuación le muestra cómo recuperar información sobre múltiples transacciones que existen en una sola posición:
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
Convertir lotes a unidades
Por defecto, los algoritmos de cTrader calculan el volumen en unidades en lugar de lotes. Sin embargo, en algunos casos puede encontrar que trabajar con lotes es más conveniente y familiar.
Puede convertir lotes a unidades usando el método 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)
Alternativamente, puede usar el método Symbol.VolumeInUnitsToQuantity() para convertir unidades a lotes.
Trabajar con colores
Los cBots pueden usar colores personalizados al realizar varias operaciones (por ejemplo, al mostrar texto en gráficos de operaciones). Para añadir color como un parámetro personalizable, agregue el siguiente código a sus declaraciones de parámetros.
Puede usar tanto códigos de color hexadecimales como nombres de colores (como red") al definir el DefaultValue de dicho parámetro."
Para ilustrar cómo funcionan los parámetros de color, crearemos un cBot simple que, al iniciarse, escribirá texto en el gráfico de operaciones en el que está operando. El color de este texto será personalizable a través del parámetro 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)