Iyi aksamlar, cross fonksiyonunun icerisine Intellisense ile baktigimizda asagidaki gibi indicator ile indicator, ya da diger belirtilen degerlerle yazilmasi gerektigi gozukuyor. (yukari asagi oklarina tiklayarak alabilecegi degerleri gorebilirsiniz)

Bu yuzden dediginiz gibi CrossAbove(ichimoku.SenkaSenAValue, ichimoku.SenkaSenBValue) yapamiyoruz, cunku bunlar decimal degerler veriyor ve 2 sabit degerin birbirini cross edip etmedigini bilemeyiz. Bunun icin seri degerlere ihtiyacimiz var.
Yani Ichimoku indikatoru icerisinde bu degerler seri olarak saklansaydi dediginiz gibi yapabilirdik. Fakat bu degerler mevcut degil / erisim yok.
Bu yuzden if (ichiMoku.SenkouSpanAValue > ichiMoku.SenkouSpanBValue) seklinde bir yol izlemeniz uygun olacaktir. Bu cross gibi calismayacak ama orn. bir pozisyon flag'i koyarak ayni sonuca rahatlikla ulasabilirsiniz.
Cross degil de relational operatorlerle (<, >...) islem yapan stratejilere ornek olarak Kademeli_Bitmex ve KaliciGeciciSinyal stratejilerine bakabilirsiniz.
if (barData.IsNewBar == true || startflag == 0)
{
startflag = 1;
Debug("***");
}
if (mov.CurrentValue < close && startflag == 1)
{
Debug("Close @ " + close + " is ABOVE move @ " + mov.CurrentValue);
if (counter < BuyCounter)
{
SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
counter++;
Debug(Symbol + ", Alış Emri Gönderildi");
Debug("*******************");
}
if (counter >= BuyCounter)
{
Debug(Symbol + " Hissesi için Belirlenen üst alım limitine ulaşıldı. Alış Emri GÖNDERİLMEDİ");
Debug("*******************");
}
}
if (mov.CurrentValue > close && startflag == 1)
{
Debug("Counter = " + counter);
if (counter > SellCounter)
{
SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
counter--;
Debug(Symbol + ", Satış Emri Gönderildi");
Debug("*******************");
}
if (counter <= SellCounter)
{
Debug(Symbol + " Hissesi için Belirlenen üst satım limitine ulaşıldı. Satış Emri GÖNDERİLMEDİ");
Debug("*******************");
}
}
merhaba, konuyla ilgili belki yardımım dokunabilir.
öncelikli olarak belirtmem gerekir ki ben yazılımcı vs değilim. Kod bilgim çok zayıf, ben de yeni öğreniyorum buradaki çoğu kişi gibi. o yüzden tam olarak istediğiniz şey olmayabilir. en azından fikir verir.
Span A,B değerlerinin 1 barlık Hareketli ortalamasını alın. yani bu değerleri MOV indikatörüne gömün. 1 barlık herhangi bir hareketli ortalama yöntemi kendi değerini verir zaten. Cross Ref fonksiyonları indikatör değeri vs istiyor. Bizim Kullanmak istediğimiz Span A,B değerlerini MOV içine gömmüştük zaten. olay tamam yani, şimdi Cross ve Ref fonksiyonlarının kafasına vurup al ulen sana indikatör diyebilirsiniz :)))
indikatörü eklerken adını dstk1 yapın yoksa hata verir
using System; using System.Collections.Generic; using System.Linq; using System.ComponentModel; using Matriks.Data.Identifiers; using Matriks.Data.Symbol; using Matriks.Engines; using Matriks.Indicators; using Matriks.Symbols; using Matriks.AlgoTrader; using Matriks.Trader.Core; using Matriks.Trader.Core.Fields; using Matriks.Trader.Core.TraderModels; using Matriks.Lean.Algotrader.AlgoBase; using Matriks.Lean.Algotrader.Models; using Matriks.Lean.Algotrader.Trading; namespace Matriks.Lean.Algotrader { //Ilk parametre indikatörün adı, sınıfın adıyla aynı olmalıdır. //Ikinci parametre indikatörün Dataserisinin üzerine mi yeni pencereye mi ekleneceğini belirtir. Yeni pencere için ->IndicatorDrawingArea.NewWindow , Data Serisi için IndicatorDrawingArea.OnDataSeries [IndicatorInformationAttribute("dstk1", IndicatorDrawingArea.NewWindow)] //Indikatörün çizgilerinin isimleri [IndicatorLineInformationAttribute(new [] { "dstk1(0)" })] public class dstk1 : MatriksIndicator { //Indicator opsiyon panelinde değerleri değiştirebildiğimiz parametreler. Int, Bool, Decimal ve Enum değerleri alabilir.Tüm değişken tiplerini DefaultValue ile tanımlarız. [DefaultValue(5)] public int Period { get; set; } public decimal res { get; set; } MOV mov; MOV mov2; IchiMoku ichiMoku; public sealed override void OnInit() { mov = new MOV(1, MovMethod.Simple); mov2 = new MOV(1, MovMethod.Simple); ichiMoku = IchiMokuIndicator(Symbol, SymbolPeriod, 9, 26, 26, 52, 26); } /// <summary> /// Seçilen sembolün bardata'ları güncellendikçe bu fonksiyon tetiklenir. /// </summary> /// <param name="currentBar">Güncellenen bardata'nın indexteki sırası</param> /// <param name="inputValue">Seçilen OHLC tipine göre gelen bardata'nın o anki değeri</param> /// <param name="barDateTime">Bardata'ya gelen güncelleme zamanı</param> public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime) { SetLine(currentBar, 0); decimal k = ichiMoku.SenkouSpanAValue; decimal l = ichiMoku.SenkouSpanBValue; mov.Update(k, currentBar, barDateTime); mov2.Update(l, currentBar, barDateTime); if (currentBar < Period) { return ; } if (Input.Count >= Period) { if (CrossAbove(mov, mov2)) // kullandığın periyoda göre Span A,B için Ref() ayarlarsın { // Ref(mov,-1) Ref(mov2,-1) yapıp Span A,B 1 önceki değeri alabilirsin res = 1; } else res = 0; SetLine(currentBar, res); } } } }