0 beğenilme 0 beğenilmeme
285 kez görüntülendi
Bir sembolde TL disinda farkli birimlerle (USD/XU100 gibi) nasil strateji ve indikator yazilabilir ve calistirilabilir ?

 

Ornek olarak GARAN USD bazli MOVCross stratejisi nasil uygulanabilir ?
Algoritmik Trading kategorisinde (44 puan) tarafından | 285 kez görüntülendi

1 cevap

3 beğenilme 0 beğenilmeme

Merhaba,

Aşağıdaki örneği inceleyebilirsiniz.

Strateji adının CrossMovUSD olmasına dikkat ediniz.

***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 CrossMovUSD : 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("GARAN")]
		public string Symbol;

		[SymbolParameter("USDTRY")]
		public string Para;

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

		[Parameter(5)]
		public decimal BuyOrderQuantity;

		[Parameter(5)]
		public decimal SellOrderQuantity;

		[Parameter(5)]
		public int MovPeriod;

		[Parameter(22)]
		public int MovPeriod2;

		// indikator tanımları.
		MOV mov;
		MOV mov2;

		public override void OnInit()
		{
			//Symbol = "GARAN";
			//SymbolPeriod = SymbolPeriod.Min5;
			//BuyOrderQuantity = 1;
			//SellOrderQuantity = 1;
			//MovPeriod = 5;
			//MovPeriod2 = 22;
			AddSymbol(Symbol, SymbolPeriod);
			AddSymbol(Para, SymbolPeriod);

			mov = new MOV(MovPeriod, MovMethod.Exponential);
			mov2 = new MOV(MovPeriod2, MovMethod.Exponential);

			SendOrderSequential(true);
			WorkWithPermanentSignal(true);
			//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.
			//SetTimerInterval(3);

			//Alttaki fonksiyon ile tanımlanan sembol ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.
			//AddNewsSymbol(Symbol);

			//Alttaki fonksiyon ile tanımlanan anahtar kelime ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.
			//AddNewsKeyword("KAP");
		}

		/// <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)
		{
			var bardataUSD = GetBarData(Para, SymbolPeriod);
			var id=GetSymbolId(Symbol);
			decimal _symbol = barData.BarData.Close;
			decimal _para = bardataUSD.Close[bardataUSD.Close.Count() -1];

			var index = barData.BarDataIndex;
			var dtime = barData.BarData.Dtime;
			
			if(id==barData.SymbolId){
				mov.Update(_symbol / _para, index, dtime);
				mov2.Update(_symbol / _para, index, dtime);
				
				Debug("mov: "+mov.CurrentValue+" - mov2: "+mov2.CurrentValue);
				Debug("symbol: "+_symbol+" - para: "+_para);
	
				if (CrossAbove(mov, mov2))
				{
					SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
					Debug("Alış Emri Gönderildi");
				}
	
				if (CrossBelow(mov, mov2))
				{
					SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
					Debug("Satış Emri Gönderildi");
				}
			}
			
		}

		/// <summary>
		/// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir.
		/// </summary>
		/// <param name="barData">Emrin son durumu</param>
		public override void OnOrderUpdate(IOrder order)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{

			}
		}
	}
}

 

(15,532 puan) tarafından
0 0

Yanitiniz icin tesekkurler. Bu kodu denedigimde 2 problem ile karsilastim:

1 - MOV'lar sistem calismaya basladiginda hesaplanmaya basladigi icin yavas mov periyodu kadar zaman gecene kadar hatali deger veriyor (eski degerler 0 oldugu icin)

2 - Para close data'si backtest'te bugune gore son kapanisi veriyor eski datayi vermiyor (bu problem gercek zamanli calismada olmayacaktir ama backtest icin hatali sonuc)

Bu iki problemi asmak icin yeni bir indikator yazmak daha dogru olabilir, yine 2 MOV ve 2 Sembol ile calisarak gecmise donuk ve dogru zamanli bardata ise sonuc getiren bir indikator, bunu sistem icin cagirinca sorun kalmayacaktir. MatriksPrime'in sistemleri direk grafikteki kahin menusunden calistirildigi ve test edildigi icin USD birimli bir grafikte calisabildikleri icin bu sorun orda yoktu.

Hoş geldiniz, Matriks Destek Platformu sizlere sorularınızın hızlıca cevaplanması için bir ortam sağlar. 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.



7,574 soru
7,578 cevap
4,427 yorum
9,996 kullanıcı