Merhaba,
Aşağıdaki indikatörü inceleyip explorerda kullanabilirsiniz.
iyi çalışmalar.
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("Korelasyon", IndicatorDrawingArea.NewWindow)]
//Indikatörün çizgilerinin isimleri
[IndicatorLineInformationAttribute(new []
{
"Korelasyon"
})]
public class KorelasyonKripex : MatriksIndicator
{
int toplmaBarSayisi = 0;
decimal correl = 0.0m;
bool bayrak=true;
[DefaultValue("BTC_USDT_BIN")]
public string Symbol1
{
get; set;
}
public sealed override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod);
AddSymbol(Symbol1, SymbolPeriod);
}
public override void OnInitComplated()
{
toplmaBarSayisi = GetBarData().Close.LastOrDefault().Key;
}
public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime)
{
if (currentBar == toplmaBarSayisi && bayrak)
{
bayrak=false;
var seri1 = GetBarData(Symbol1, SymbolPeriod).Close;
var seri2 = GetBarData().Close;
var adet = seri1.Count;
var siraliSeri1 = new List<decimal>(seri1.Values).OrderBy(s => s).ToList();
var siraliSeri2 = new List<decimal>(seri2.Values).OrderBy(s => s).ToList();
var siralarFarkiKaresiToplami = seri1.Zip(seri2, (x, y) => Math.Pow(siraliSeri1.IndexOf(x.Value) + (siraliSeri1.Count(s => s == x.Value) > 1 ? 1D / siraliSeri1.Count(s => s == x.Value) + 1 : 1) - (siraliSeri2.IndexOf(y.Value) + (siraliSeri2.Count(s => s == y.Value) > 1 ? 1D / siraliSeri2.Count(s => s == y.Value) + 1 : 1)), 2)).Sum();
correl= 1M - 6M * (decimal)siralarFarkiKaresiToplami / (adet * (decimal)(Math.Pow(adet, 2) - 1));
}
SetLine(currentBar, correl);
}
}
}