Yeni bir örnek oluştururken belirtilenin yanı sıra birden fazla sembolde işlem yapan bir cBot geliştirebilirsiniz.
Bunu mümkün kılan, Symbolsişlem hesabınızda bulunan tüm sembollerin bir koleksiyonudur. Döngüler kullanarak üzerinde yineleme yapabilirsiniz; alternatif olarak, belirli sembolleri bulmak için üzerinde arama yapabilirsiniz.
Birden fazla sembolle doğru şekilde çalışmak için cBot'ların aşağıdaki bilgilere ihtiyacı vardır:
İzin verilen minimum ve maksimum hacim
Hacim adımı
Pip tik boyutu
Pip tik değeri (hesap yatırma para birimindeki bir pip veya tikin parasal değeri)
Bu veriler bir Symbol nesnesinden öğrenilebilir. Aşağıdaki kodda, adında "GBPUSD" olan bir sembol buluyor ve ardından bunun için bir piyasa emri oluşturuyoruz. Ayrıca, izin verilen minimum hacmini emir hacmi olarak kullanıyoruz.
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)
Pipleri tick'lere dönüştür
cBot'ları kodlarken, bazı değişken değerlerinin birim cinsinden, diğer değerlerin ise pip cinsinden hesaplanmasından kaynaklanan hatalarla karşılaşmak kolaydır.
Aşağıdaki SymbolExtensions sınıfı, piplerin tick'lere nasıl dönüştürülebileceğini gösterir. Ayrıca piplerin mutlak bir fiyat değerine nasıl eklenebileceğini de gösterir.
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 hesaplar için para yatırma ve para çekme hakkında veri sağlayan türler içerir. Bu türler, hesaplar için işlem ayrıntılarına programlı olarak erişmenizi ve bunları yönetmenizi sağlar.
İşlem türü (para yatırma veya para çekme), miktar, zaman damgaları, işlem kimliği, bakiye ayrıntıları, net varlık özellikleri vb. hakkında veri alabilirsiniz.
cTrader, kullanıcıların tamamlanmış piyasa emirleri ve gerçekleştirilen veya iptal edilen bekleyen emirler dahil olmak üzere emirler hakkında bilgi almasını sağlamak için HistoricalOrder koleksiyonunu sunar. Alınabilecek ayrıntılar arasında emir kimliği, türü, etiketi, hedef fiyatı, son kullanma tarihi vb. bulunur.
Aşağıdaki cBot kodu, geçmiş emirlerin ayrıntılarını nasıl alacağınızı gösterir:
cBot'ları kodlarken, hesap geçmişinize erişiminiz vardır. Bu, geçmiş işlemleriniz üzerinde yineleme yapabileceğiniz ve verilerini sahip olduğunuz herhangi bir amaç için kullanabileceğiniz anlamına gelir.
Aşağıdaki kod parçacığı, tüm geçmiş işlemlerimizi ve işlem verilerini içeren bir .CSV dosyası oluşturur.
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());}}}
İşlemler hakkında bilgi alın
cTrader'da işlemler emirleri gerçekleştirir ve pozisyonların açılmasına veya kapanmasına neden olur. Piyasa likiditesine bağlı olarak, bir emir tamamen tek bir işlemle veya birkaç işlemle kısmen doldurulabilir. Daha fazla bilgi edinmek için Pozisyonlar ve işlemler bölümüne bakın.
Aşağıdaki cBot kodu, tek bir pozisyonda bulunan birden fazla işlem hakkında bilgi almayı nasıl yapacağınızı gösterir:
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
Lotları birimlere dönüştür
Varsayılan olarak, cTrader algoları hacmi lot yerine birim cinsinden hesaplar. Ancak, bazı durumlarda lotlarla çalışmanın daha kullanışlı ve tanıdık olduğunu görebilirsiniz.
Symbol.QuantityToVolumeUnits() metodunu kullanarak lotları birimlere dönüştürebilirsiniz.
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)
Alternatif olarak, birimleri lotlara dönüştürmek için Symbol.VolumeInUnitsToQuantity() metodunu kullanabilirsiniz.
Renklerle çalışın
cBot'lar çeşitli işlemler gerçekleştirirken özel renkler kullanabilir (örneğin, işlem grafiklerinde metin görüntülerken). Rengi özelleştirilebilir bir parametre olarak eklemek için, aşağıdaki kodu parametre bildirimlerinize ekleyin.
Böyle bir parametrenin DefaultValue değerini tanımlarken hem onaltılık renk kodlarını hem de renk adlarını (örneğin "red") kullanabilirsiniz.
Renk parametrelerinin nasıl çalıştığını göstermek için, başlatıldığında üzerinde çalıştığı işlem grafiğine metin yazacak basit bir cBot oluşturacağız. Bu metnin rengi, TextColor parametresi aracılığıyla özelleştirilebilir olacaktır.
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)