02.02.2022
0
2
250
100

Stratejinin genel yapısı iki sembol arasındaki anlık fiyat farkı belirlenen Fark değişkenine geldiğinde

AlinacakSembol'den AlinacakSembolAdedi (lot, kontrat) kadarlık alış emri gönderilir

SatilacakSembol'den SatilacakSembolAdedi (lot, kontrat) kadarlık satış emri gönderilir


1-FarkBelirlenenSeviyedeykenBirSeferSatAl

Bu seçenek seçildiğinde fiyat farkı Fark değişkenine geldiğinde

Bir seferlik AlinacakSembol'den alış SatilacakSembol'den satış emri gönderilecektir.


2-FarkBelirlenenSeviyedeykenBirSeferSatAlveDengeFiyatinaGeldigindePozisyonlariKapat

Bu seçenek 1. seçeneğin devamıdır. Pozisyonlar açıldıktan sonra anlık fiyat farkı Denge değişkenine geldiğinde

Bir seferlik açılan pozisyonlar kapatılır.


3-FarkBelirlenenSeviyedeykenHerzamanSatAlveDengeFiyatinaGeldigindePozisyonlariKapat

Bu seçenek ile 1. ve 2. seçeneklerin sıralı bir şekilde ilerlemesi sağlanır.

Anlık fiyat farkı Fark değişkenine geldiğinde pozisyon açar.

Anlık fiyat farkı Denge değişkenine geldiğinde pozisyon kapatır.


Entrümanlar arasındaki fark kullanılan OranTipi'ne göre aşağıdaki gibi hesaplanmaktadır.

OranTipi Percent (Yüzde) ise -> fark = (AlinacakSembolSatisFiyati - SatilacakSembolAlisFiyati) / AlinacakSembolSatisFiyati * 100;

OranTipi PricePoint (Puan) ise -> fark = AlinacakSembolSatisFiyati - SatilacakSembolAlisFiyati;


*** Stratejide derinlik kullanıldığında en az tek kademe derinlik lisansı gerekir.

*** Bütün semboller için uygundur.

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using System.Windows.Media;
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;
/*

▂ ▃ ▅ ▆ █ KRİPEX █ ▆ ▅ ▃ ▂ 

Stratejinin genel yapısı iki sembol arasındaki anlık fiyat farkı belirlenen Fark değişkenine geldiğinde 
	AlinacakSembol'den AlinacakSembolAdedi (lot, kontrat) kadarlık alış emri gönderilir
	SatilacakSembol'den SatilacakSembolAdedi (lot, kontrat) kadarlık satış emri gönderilir

1-FarkBelirlenenSeviyedeykenBirSeferSatAl
	Bu seçenek seçildiğinde fiyat farkı Fark değişkenine geldiğinde
	Bir seferlik AlinacakSembol'den alış SatilacakSembol'den satış emri gönderilecektir.	

2-FarkBelirlenenSeviyedeykenBirSeferSatAlveDengeFiyatinaGeldigindePozisyonlariKapat
	Bu seçenek 1. seçeneğin devamıdır. Pozisyonlar açıldıktan sonra anlık fiyat farkı Denge değişkenine geldiğinde
	Bir seferlik açılan pozisyonlar kapatılır.

3-FarkBelirlenenSeviyedeykenHerzamanSatAlveDengeFiyatinaGeldigindePozisyonlariKapat
	Bu seçenek ile 1. ve 2. seçeneklerin sıralı bir şekilde ilerlemesi sağlanır.
	Anlık fiyat farkı Fark değişkenine geldiğinde pozisyon açar.
	Anlık fiyat farkı Denge değişkenine geldiğinde pozisyon kapatır.

Entrümanlar arasındaki fark kullanılan OranTipi'ne göre aşağıdaki gibi hesaplanmaktadır.
	OranTipi Percent (Yüzde) ise -> fark = (AlinacakSembolSatisFiyati - SatilacakSembolAlisFiyati) / AlinacakSembolSatisFiyati * 100;
	OranTipi PricePoint (Puan) ise -> fark = AlinacakSembolSatisFiyati - SatilacakSembolAlisFiyati;

*** Stratejide derinlik kullanıldığında en az tek kademe derinlik lisansı gerekir.
*** Bütün semboller için uygundur.

*/

namespace Matriks.Lean.Algotrader
{
	public class ArbitrajStratejisiKripex : MatriksAlgo
	{
		[SymbolParameter("FGARAN")]
		public string AlinacakSembol;

		[Parameter(1)]
		public decimal AlinacakSembolAdedi;

		[SymbolParameter("GARAN")]
		public string SatilacakSembol;

		[Parameter(100)]
		public decimal SatilacakSembolAdedi;

		[Parameter(0.15)]
		public decimal Fark;

		[Parameter(0.10)]
		public decimal Denge;

		[Parameter(SyntheticOrderPriceType.PricePoint)]
		public SyntheticOrderPriceType OranTipi;


		[Parameter(fiyat.Piyasa)]
		public fiyat Fiyat;

		public enum fiyat
		{
			Piyasa, Aktif_Pasif
		}

		[Parameter(devamlilik.FarkBelirlenenSeviyedeykenBirSeferSatAl)]
		public devamlilik Devamlilik;

		public enum devamlilik
		{
			FarkBelirlenenSeviyedeykenBirSeferSatAl,
			FarkBelirlenenSeviyedeykenBirSeferSatAlveDengeFiyatinaGeldigindePozisyonlariKapat,
			FarkBelirlenenSeviyedeykenHerzamanSatAlveDengeFiyatinaGeldigindePozisyonlariKapat
		}

		[Output]
		public decimal AlinacakSembolAlisFiyati;

		[Output]
		public decimal AlinacakSembolSatisFiyati;

		[Output]
		public decimal SatilacakSembolAlisFiyati;

		[Output]
		public decimal SatilacakSembolSatisFiyati;

		[Output]
		public bool StratejiAktifMI = true;

		public override void OnInit()
		{
			AddSymbol(AlinacakSembol, SymbolPeriod.Min);
			AddSymbol(SatilacakSembol, SymbolPeriod.Min);

			AddSymbolMarketDepth(AlinacakSembol);
			AddSymbolMarketDepth(SatilacakSembol);

			SendOrderSequential(false);
			WorkWithPermanentSignal(false);
		}

		bool bayrak = true;

		[Output]
		public decimal fark;

		[Output]
		public decimal denge;

		public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
		{
			if (StratejiAktifMI)
			{
				var derinlikAlinacakSembol = GetMarketDepth(AlinacakSembol);

				if (derinlikAlinacakSembol? .AskRows == null || derinlikAlinacakSembol.AskRows.Count < 1 || derinlikAlinacakSembol? .BidRows == null || derinlikAlinacakSembol.BidRows.Count < 1)
				{
					Debug("AlinacakSembol - Derinlik verisi bekleniyor."); return ;
				}

				var derinlikSatilacakSembol = GetMarketDepth(SatilacakSembol);

				if (derinlikSatilacakSembol? .AskRows == null || derinlikSatilacakSembol.AskRows.Count < 1 || derinlikSatilacakSembol? .BidRows == null || derinlikSatilacakSembol.BidRows.Count < 1)
				{
					Debug("SatilacakSembol - Derinlik verisi bekleniyor."); return ;
				}

				AlinacakSembolAlisFiyati = derinlikAlinacakSembol.BidRows[0].Price;
				AlinacakSembolSatisFiyati = derinlikAlinacakSembol.AskRows[0].Price;

				SatilacakSembolAlisFiyati = derinlikSatilacakSembol.BidRows[0].Price;
				SatilacakSembolSatisFiyati = derinlikSatilacakSembol.AskRows[0].Price;

				if (OranTipi == SyntheticOrderPriceType.Percent)
				{
					fark = (AlinacakSembolSatisFiyati - SatilacakSembolAlisFiyati) / AlinacakSembolSatisFiyati * 100;
					denge = (AlinacakSembolAlisFiyati - SatilacakSembolSatisFiyati) / AlinacakSembolAlisFiyati * 100;
				}else if (OranTipi == SyntheticOrderPriceType.PricePoint)
				{
					fark = AlinacakSembolSatisFiyati - SatilacakSembolAlisFiyati;
					denge = AlinacakSembolAlisFiyati - SatilacakSembolSatisFiyati;
				}				

				if (fark >= Fark && bayrak)
				{
					Debug("Belirlenen oranda fark oluştu işleme girilecek.");
					
					if (Fiyat == fiyat.Piyasa)
					{
						SendMarketOrder(AlinacakSembol, AlinacakSembolAdedi, OrderSide.Buy);
						SendMarketOrder(SatilacakSembol, SatilacakSembolAdedi, OrderSide.Sell);
					}else if (Fiyat == fiyat.Aktif_Pasif)
					{
						SendLimitOrder(AlinacakSembol, AlinacakSembolAdedi, OrderSide.Buy, AlinacakSembolSatisFiyati);
						SendLimitOrder(SatilacakSembol, SatilacakSembolAdedi, OrderSide.Sell, SatilacakSembolAlisFiyati);
					}

					bayrak = false;

					if (Devamlilik == devamlilik.FarkBelirlenenSeviyedeykenBirSeferSatAl)
					{
						StratejiAktifMI = false;
						bayrak = true;
					}
				}
				
				if (denge <= Denge && !bayrak)
				{
					Debug("Pozsiyonlar kapatılacak.");

					if (Fiyat == fiyat.Piyasa)
					{
						SendMarketOrder(AlinacakSembol, AlinacakSembolAdedi, OrderSide.Sell);
						SendMarketOrder(SatilacakSembol, SatilacakSembolAdedi, OrderSide.Buy);
					}else if (Fiyat == fiyat.Aktif_Pasif)
					{
						SendLimitOrder(AlinacakSembol, AlinacakSembolAdedi, OrderSide.Sell, AlinacakSembolAlisFiyati);
						SendLimitOrder(SatilacakSembol, SatilacakSembolAdedi, OrderSide.Buy, SatilacakSembolSatisFiyati);
					}

					bayrak = true;

					if (Devamlilik == devamlilik.FarkBelirlenenSeviyedeykenBirSeferSatAlveDengeFiyatinaGeldigindePozisyonlariKapat)
					{
						StratejiAktifMI = false;
						bayrak = false;
					}
				}
			}
		}
	}
}

0 Yorum