Matriks Destek ve Yardım Platformu

Matriks Ürünleri ile ilgili tüm sorularınız için bizlere buradan ulaşabilirsiniz. Daha önce sorulan soruları ve verilen cevapları ilgili sekmelerden ve arama üzerinden inceleyebilirsiniz. Sağ taraftaki kategoriler üzerinden İlgilendiğiniz özelliklerle ilgili soruları filtreleyebilirsiniz. Soru ve cevapları sosyal medyada paylaşabilirsiniz. Sorduğunuz ve cevapladığınız soruların ve yorumlarınızın aldığı oylar üzerinden puan kazanırsınız. Puan sistemine bağlı kampanyamızla ücretsiz kullanım avantajlarından faydalanabilirsiniz.

2 Cevap

2

Merhaba, örnek Ott İndikatörü stratejisi aşağıdadır.

İyi çalışmalar

using System;
using System.Collections.Generic;
using System.Linq;
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
{
	public class OttIndicator  : MatriksAlgo
	{
		// Strateji çalıştırılırken kullanacağımız parametreler. Eğer sembolle ilgili bir parametre ise,
		// "SymbolParameter" ile, değilse "Parameter" ile tanımlama yaparız. Parantez içindeki değerler default değerleridir.

		[SymbolParameter("XU100")]
		public string Symbol;

		[Parameter(SymbolPeriod.Day)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(100)]
		public decimal BuyOrderQuantity;

		[Parameter(100)]
		public decimal SellOrderQuantity;

		[Parameter(2)]
		public int Period;

		[Parameter(1.4)]
		public decimal Opt;

		[Parameter(MovMethod.VAR)]
		public MovMethod Method;

		OTT ott;

		public override void OnInit()
		{
			ott = OTTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Opt, MovMethod.VAR, true);

			AddSymbol(Symbol, SymbolPeriod);

			// Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur.
			// true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız veya false geçerseniz her işlem olduğunda algoritma tetiklenir.
			WorkWithPermanentSignal(true);

			//Eger backtestte emri bir al bir sat seklinde gonderilmesi isteniyor bu true set edilir. 
			//Alttaki satırı silerek veya false geçerek emirlerin sirayla gönderilmesini engelleyebilirsiniz. 
			SendOrderSequential(true);
		}


		/// <summary>
		/// Eklenen sembollerin bardata'ları ve indikatorler güncellendikçe bu fonksiyon tetiklenir. 
		/// </summary>
		/// <param name="barData">Bardata ve hesaplanan gerçekleşen işleme ait detaylar</param>
		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (CrossAbove(ott.ottSupportLine, ott.ottLine))
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
				Debug("Alış emri verildi.");
				Debug("Ott SupportLine :" + ott.ottSupportLine);
				Debug("Ott Line : " + ott.ottLine);
			}if (CrossBelow(ott.ottSupportLine, ott.ottLine))
			{
				SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
				Debug("Satış emri verildi.");
				Debug("Ott SupportLine : " + ott.ottSupportLine);
				Debug("Ott Line : " + ott.ottLine);
			}
		}
	}
}

 

BağlantıBayraklaOrçunMatriks Destek4.555

Yorumlar (14)

  • ▲0
    çok teşekkür ederim sizede iyi çalışmalar
  • ▲0

    Merhaba, stratejiyi İQ ya eklemeye çalışırken  böyle bir hata ile karşılaşıyorum. Nerede yanlış yapıyor olabilirim? 

  • ▲0
    Merhaba.

    resimde hata net okunamıyor maalesef. İlk akla gelen strateji adını kodun içindeki gibi yazmadığınız olabilir.

    Strateji adını: OttIndicator olarak yapmadı iseniz, öyle yapıp deneyiniz lütfen.

    Sorun o değil ise, hatanın resmini rahatça okunacak şekilde gönderiniz

    iyi çalışmalar
  • ▲0
    Merhaba, hata belirtmiş olduğunuz gibi strateji adından kaynaklanıyormuş. Çok teşekkür ederim. İyi çalışmalar.
  • ▲0
    Strateji için teşekkürler.

    Stratejide Period ve Opt ideal ayarları yapabilmemiz için hangi alt ve üst sınırı ile basamağı kullanacağımı bilemedim, yardımcı olursanız sevinirim.
9 yorum daha göster
  • ▲0
    Merhaba,

    Bu değerler birçok etkene bağlıdır. Stratejiye optimizasyon yaparak istediğiniz aralıklarda backtestler yapabilirsiniz. Çıkan rapor penceresinden en idealini seçebilirsiniz.

    İyi çalışmalar
    OrçunMatriks DestekBayrakla
  • ▲0
    Orçun Bey,

    Sorunu tam anlatamadım sanırım. Optimizasyon için alt ve üst sınırı yani hangi değerler arasında (örn. 1-100 arası 1'er basamaklı mı yoksa 0-1 arası 0.1 basamaklı mı) backtest yapmalıyım onu sormuştum.
  • ▲0
    Merhaba, stratejideki Period parametresi integer tipinde yani tam sayı değerler girmeniz gerekli. Opt parametresi ise decimal tipinde bu değere ister tam sayı isterseniz de ondalıklı sayı girebilirsiniz. Dediğim kurallara uyarak istediğiniz aralıkta istediğiniz basamakta optimizasyon yaptırabilirsiniz.
    OrçunMatriks DestekBayrakla
  • ▲0

    Merhaba,

    Linkteki doküman, veri terminali temelli hazırlanmıştır.

    Bununla beraber optimizasyon konusunda tüm genel seçenekleri / tarifleri / açıklamaları içerir.

    Sorunuz açısından açıklayıcı olacağını düşünüyorum.

    İyi çalışmalar

    https://www.matriksdata.com/website/bireysel-urunler/matriks-veri-terminali/dokumanlar/sistem-tester-optimizasyon-ip-uclari

     

     

  • ▲0

    Verdiğiniz dokuman çok yararlı oldu, teşekkürler.

     
  • ▲0
    Öncelikle teşekkürler. Yazmış olduğunuz stratejide açığa satış da var mı? Yoksa nasıl ekleyebiliriz?
  • ▲0

    Merhabalar,

    Lütfen aşağıdaki stratejiyi inceleyiniz.

    ***STRATEJİLERİ TEST/DENEME ORTAMINDA SINAMADAN VE SİZİN İSTEDİĞİNİZ ŞEKİLDE ÇALIŞTIĞINA EMİN OLMADAN GERÇEK ORTAMDA HİÇBİR ZAMAN ÇALIŞTIRMAYINIZ ***

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Matriks.Data.Symbol;
    using Matriks.Engines;
    using Matriks.Indicators;
    using Matriks.Symbols;
    using Matriks.Trader.Core;
    using Matriks.Trader.Core.Fields;
    using Matriks.Lean.Algotrader.AlgoBase;
    using Matriks.Lean.Algotrader.Models;
    using Matriks.Lean.Algotrader.Trading;
    
    namespace Matriks.Lean.Algotrader
    {
    	public class OttAcıgaSatısStrategy : MatriksAlgo
    	{
    		[SymbolParameter("GARAN")]
    		public string Symbol;
    
    		[Parameter(SymbolPeriod.Min5)]
    		public SymbolPeriod SymbolPeriod;
    
    		[Parameter(5)]
    		public decimal BuyOrderQuantity;
    
    		[Parameter(5)]
    		public decimal SellOrderQuantity;
    
    		[Parameter(2)]
    		public int Period;
    
    		[Parameter(1.4)]
    		public decimal Opt;
    
    		[Parameter(MovMethod.VAR)]
    		public MovMethod Method;
    
    		OTT ott;
    
    		public override void OnDataUpdate(BarDataEventArgs barData)
    		{
    			if (CrossAbove(ott.ottSupportLine, ott.ottLine))
    			{
    				FX_Alis();
    				// sentetik emirler OnOrderUpdate() methodundan eklenmesi gerekir - örnekteki gibi 
    			}
    
    			if (CrossBelow(ott.ottSupportLine, ott.ottLine))
    			{
    				FX_Satis();
    				// sentetik emirler OnOrderUpdate() methodundan eklenmesi gerekir - örnekteki gibi 
    			}
    		}
    
    		public override void OnInit()
    		{
    			AddSymbol(Symbol, SymbolPeriod);
    			ott = OTTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Opt, MovMethod.VAR, true);
    
    			// Gerekli			
    			WorkWithPermanentSignal(true);
    
    			if (AcigaSatisYapilsin)
    			{
    				SendOrderSequential(true, Side.All);
    				SendOrderSequentialForShort(true, Side.All);
    			}else
    			{
    				SendOrderSequential(true, Side.Buy);
    			}
    			// #Gerekli
    		}
    
    		// Gerekli
    		[Parameter(true)]
    		public bool AcigaSatisYapilsin;
    
    		[Parameter(false)]
    		public bool AksamSeansiniDahilEt;
    
    		List<string> orderIDList = new List<string>();
    
    		string orderID;
    
    		public override void OnInitComplated()
    		{
    			FX_PiyasaTipi();
    		}
    
    		public void FX_Alis()
    		{
    			if (LastOrderSide.Obj != Side.Buy)
    			{
    				if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
    				{
    					orderID = SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
    					orderIDList.Add(orderID);
    					Debug("Alış emri gönderildi.[ " + BuyOrderQuantity + " adet ]");
    				}else
    				{
    					if (piyasaTipleri == PiyasaTipleri.BISTPP)
    					{
    						// Açık pozisyonu kapat
    						orderID = SendMarketCloseShortOrder(Symbol, BuyOrderQuantity);
    						orderIDList.Add(orderID);
    						Debug("Açık pozisyonlar kapatıldı.[ " + BuyOrderQuantity + " adet ]");
    
    						// Al
    						orderID = SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
    						orderIDList.Add(orderID);
    						Debug("Alış emri gönderildi.[ " + BuyOrderQuantity + " adet ]");
    					}else
    					{
    						// pozsiyon kapat ve al
    						orderID = SendMarketOrder(Symbol, BuyOrderQuantity * 2, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
    						orderIDList.Add(orderID);
    						Debug("Alış emri gönderildi.[ " + (BuyOrderQuantity * 2) + " adet ]");
    					}
    				}
    				LastOrderSide.Obj = Side.Buy;
    			}
    		}
    
    		public void FX_Satis()
    		{
    			if (LastOrderSide.Obj != Side.Sell)
    			{
    				if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
    				{
    					if (piyasaTipleri == PiyasaTipleri.BISTPP)
    					{
    						if (AcigaSatisYapilsin)
    						{
    							orderID = SendShortSaleMarketOrder(Symbol, SellOrderQuantity);
    							orderIDList.Add(orderID);
    							Debug("Açığa satış yapıldı.[ " + (SellOrderQuantity) + " adet ]");
    						}else
    						{
    							orderID = SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
    							orderIDList.Add(orderID);
    							Debug("Satış emri gönderildi.[ " + (SellOrderQuantity) + " adet ]");
    						}
    					}else
    					{
    						orderID = SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
    						orderIDList.Add(orderID);
    						Debug("Satış emri gönderildi.[ " + (SellOrderQuantity) + " adet ]");
    					}
    
    				}else
    				{
    					if (piyasaTipleri == PiyasaTipleri.BISTPP)
    					{
    						orderID = SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
    						orderIDList.Add(orderID);
    						Debug("Satış emri gönderildi.[ " + (SellOrderQuantity) + " adet ]");
    
    						orderID = SendShortSaleMarketOrder(Symbol, SellOrderQuantity);
    						orderIDList.Add(orderID);
    						Debug("Açığa satış yapıldı.[ " + (SellOrderQuantity) + " adet ]");
    					}else
    					{
    						orderID = SendMarketOrder(Symbol, SellOrderQuantity * 2, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
    						orderIDList.Add(orderID);
    						Debug("Satış emri gönderildi.[ " + (SellOrderQuantity * 2) + " adet ]");
    					}
    				}
    				LastOrderSide.Obj = Side.Sell;
    			}
    		}
    
    		[Output]
    		public string Sembol1 = "";
    
    		[Output]
    		public string Sembol2 = "";
    
    		enum PiyasaTipleri
    		{
    			BISTPP,
    			BISTVIOP,
    			KRIPTOBINANCE,
    			KRIPTOBINANCEFUTURE,
    			KRIPTOBITMEX,
    			KRIPTOBTCTURK
    		}
    
    		PiyasaTipleri piyasaTipleri = PiyasaTipleri.BISTPP;
    
    		public void FX_PiyasaTipi()
    		{
    			Sembol1 = Symbol;
    			Sembol2 = Symbol;
    
    			var SymbolDetail = GetSymbolDetail(Symbol);
    
    			if (SymbolDetail.ExchangeDetail.ExchangeCode == PiyasaTipleri.BISTPP.ToString())
    			{
    				piyasaTipleri = PiyasaTipleri.BISTPP;
    			}else if (SymbolDetail.ExchangeDetail.ExchangeCode == PiyasaTipleri.BISTVIOP.ToString())
    			{
    				piyasaTipleri = PiyasaTipleri.BISTVIOP;
    			}else if (SymbolDetail.ExchangeDetail.ExchangeCode == "")
    			{
    				Sembol1 = Symbol.Split('_')[0];
    				Sembol2 = Symbol.Split('_')[1];
    
    				var _split = Symbol.Split('_');
    
    				if (_split.Count() == 3)
    				{
    					if (Symbol.Split('_')[2].Contains("BIN"))
    					{
    						piyasaTipleri = PiyasaTipleri.KRIPTOBINANCE;
    					} else if (Symbol.Split('_')[2].Contains("FBIN"))
    					{
    						piyasaTipleri = PiyasaTipleri.KRIPTOBINANCEFUTURE;
    						Sembol1 = Symbol;
    						Sembol2 = Symbol;
    
    					}else if (Symbol.Split('_')[2].Contains("BMEX"))
    					{
    						piyasaTipleri = PiyasaTipleri.KRIPTOBITMEX;
    					}
    				}else
    				{
    					piyasaTipleri = PiyasaTipleri.KRIPTOBTCTURK;
    				}
    
    			}
    		}
    
    
    		public override void OnOrderUpdate(IOrder order)
    		{
    			//	if (order.OrdStatus.Obj == OrdStatus.Filled){
    			//		StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, 0.3m);
    			//		TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, 0.3m);
    			//	}
    
    			if (order.OrdStatus.Obj == OrdStatus.Filled && !orderIDList.Contains(order.CliOrdID) && AcigaSatisYapilsin)
    			{
    				if (order.Side.Obj == Side.Buy)
    				{
    					Debug("Sentetik emir tetiklendi ");
    					LastOrderSide.Obj = Side.Sell;
    
    					orderID = SendMarketOrder(Symbol, order.OrderQty, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
    					orderIDList.Add(orderID);
    					LastOrderSide.Obj = Side.Buy;
    
    					Debug("Sentetik emrin kalan kısmı için alış emri gönderildi.[ " + order.OrderQty + " adet ]");
    
    				}else
    				{
    					Debug("Sentetik emir tetiklendi ");
    					LastOrderSide.Obj = Side.Buy;
    
    					if (piyasaTipleri == PiyasaTipleri.BISTPP)
    					{
    						orderID = SendShortSaleMarketOrder(Symbol, order.OrderQty);
    						orderIDList.Add(orderID);
    					}else
    					{
    						orderID = SendMarketOrder(Symbol, order.OrderQty, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
    						orderIDList.Add(orderID);
    					}
    					LastOrderSide.Obj = Side.Sell;
    
    					Debug("Sentetik emrin kalan kısmı için satış emri gönderildi.[ " + order.OrderQty + " adet ]");
    				}
    			}
    		}
    		// #Gerekli
    	}
    }
    

    İyi çalışmalar.

  • ▲0
    stratejiyi içeri koplayalamadım arkadaşlar.. script olarak copy paste yaptım olmadı.. ayrıca bir dosya haline getirip "strateji al" butonuyla da denedim olmadı..

    yardımcı olursanız sevinirim..
  • ▲0
    tamamdır.. ilgili dökümana ulaştım ve kaydettim.. teşekkürler

Cevabınız

Cevap yazmak için giriş yapın.Giriş yapKayıt ol