MatriksIQ Destek
Matriks Destek
Matriks Web Destek
Matriks Mobile Destek
0 beğenilme 0 beğenilmeme
211 kez görüntülendi

Kıvanç Özbilgiç'in Matriks Prime'a Uyarladığı Wavetrend Oscilattor Matriks IQ İçin Var mı? 

Kendisi şu şekilde hazırlamış, çokta iyi olmuş. Kodlamaya dökemedim.

 

Algoritmik Trading kategorisinde (10 puan) tarafından | 211 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme
En İyi Cevap

Merhaba, wave trend oscillator indikatörünün MatriksIQ için kodu aşağıdadır. Yeni kullanıcı indikatörü oluşturup içerisine kopyalayarak kullanabilirsiniz. Yeni oluşturduğunuz kullanıcı indikatörünün isminin "WTO" ile aynı olmasına dikkat ediniz.

 

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("WTO", IndicatorDrawingArea.NewWindow)]
	//Indikatörün çizgilerinin isimleri
	[IndicatorLineInformationAttribute(new []
		{
			"ObLevel1(0,1)", "ObLevel2(0,1)", "OsLevel1(0,1)", "OsLevel2(0,1)", "WaveTrendOne(0,1)", "WaveTrendTwo(0,1)", "WT(0,1)"
		})]

	public class WTO: 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(10)]
			public int n1
		{
			get; set;
		}
		[DefaultValue(21)]
			public int n2
		{
			get; set;
		}
		[DefaultValue(60)]
			public int oblevel1
		{
			get; set;
		}
		[DefaultValue(53)]
			public int oblevel2
		{
			get; set;
		}
		[DefaultValue(-60)]
			public int oslevel1
		{
			get; set;
		}
		[DefaultValue(-53)]
			public int oslevel2
		{
			get; set;
		}

		MOV movEsa, movD, movWt1, movWt2;

		public sealed override void OnInit()
		{
			movEsa = new MOV(n1, MovMethod.Exponential);
			movD = new MOV(n1, MovMethod.Exponential);
			movWt1 = new MOV(n2, MovMethod.Exponential);
			movWt2 = new MOV(4, MovMethod.Simple);
		}

		/// <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)
		{
			if (currentBar < n2 && currentBar< n1)
			{
				SetLine(0, currentBar, 0);
				SetLine(1, currentBar, 0);
				SetLine(2, currentBar, 0);
				SetLine(3, currentBar, 0);
				SetLine(4, currentBar, 0);
				SetLine(5, currentBar, 0);
				SetLine(6, currentBar, 0);
				SetLine(7, currentBar, 0);
				return ;
			}
			var high = Instrument.SymbolBarData.High[currentBar];
			var low = Instrument.SymbolBarData.Low[currentBar];
			var close = Instrument.SymbolBarData.Close[currentBar];
			var ap = (high + low + close) / 3;
			movEsa.Update(ap, currentBar, barDateTime); var esa = movEsa.CurrentValue;
			movD.Update(Math.Abs(ap - esa), currentBar, barDateTime); var d = movD.CurrentValue;
			if (d == 0) d = 1;
			var ci = (ap - esa) / (0.015m * d);
			movWt1.Update(ci, currentBar, barDateTime); var wt1 = movWt1.CurrentValue;
			movWt2.Update(wt1, currentBar, barDateTime); var wt2 = movWt2.CurrentValue;

			SetLine(0, currentBar, oblevel1);
			SetLine(1, currentBar, oblevel2);
			SetLine(2, currentBar, oslevel1);
			SetLine(3, currentBar, oslevel2);
			SetLine(4, currentBar, wt1);
			SetLine(5, currentBar, wt2);
			SetLine(6, currentBar, (wt1 - wt2));
			SetLine(7, currentBar, 0);
		}
	}
}

 

(3,021 puan) tarafından
tarafından seçilmiş
0 0
Teşekkür ederim. Peki bu yeşil çizgi kırmızıyı kestiğinde yani indikatör al verdiğinde nasıl alım yaptırtabilirim otomatik olarak?

Teşekkürler
0 0

Merhaba, istediğiniz gerçekleştirecek kodu aşağıda paylaştım.

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;

namespace Matriks.Lean.Algotrader
{
	public class WTO_Stratejisi : 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;

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

		[Parameter(5)]
		public decimal Quantity;

		[Parameter(10)]
		public decimal n1;
		
		[Parameter(21)]
		public decimal n2;
		MatriksIndicator WTO;

		/// <summary>
		/// Strateji ilk çalıştırıldığında bu fonksiyon tetiklenir. Tüm sembole kayit işlemleri,
		/// indikator ekleme, haberlere kayıt olma işlemleri burada yapılır. 
		/// </summary>
		public override void OnInit()
		{
			WTO = new WTO();
			WTO.SetIndicatorParameters("n1", n1);
			WTO.SetIndicatorParameters("n2", n2);
			WTO.SetIndicatorParameters("oblevel1", 60);
			WTO.SetIndicatorParameters("oblevel2", 53);
			WTO.SetIndicatorParameters("oslevel1", -60);
			WTO.SetIndicatorParameters("oslevel2", -53);

			RegisterUserIndicator(WTO, Symbol, SymbolPeriod, OHLCType.Close, 5);

			AddSymbol(Symbol, SymbolPeriod);
			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>
		/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir
		/// </summary>
		public override void OnInitComplated()
		{

		}

		/// <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(BarDataCurrentValues barDataCurrentValues)
		{
			var index = barDataCurrentValues.LastUpdate.BarDataIndex;
			var wt1 = WTO.Value[4][index];
			var Prevwt1 = WTO.Value[4][index -1];
			var wt2 = WTO.Value[5][index];
			var Prevwt2 = WTO.Value[5][index -1];
			if (Prevwt1<Prevwt2 && wt1>wt2)
			{
				SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
				Debug("Alış emri verildi.");
			}
			if (Prevwt1>Prevwt2 && wt1<wt2)
			{
				SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
				Debug("Satış emri verildi.");
			}
		}

		/// <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)
			{

			}
		}
	}
}

 

0 0
Benim de işime yaradı teşekkür ederim. Peki tradingvievdeki sürümünde oscilator üzerinde oluşan negatif ve pozitif uyumsuzluk tespitleri gösteriliyor. Buna nasıl ekleyebiliriz ? Veya Macd stratejisi üzerine negatif ve pozitif uyumsuzlukları nasıl ekleyebiliriz ?
0 0
Bahsettiğiniz uyumsuzluklar 2 bandın farkıyla oluşan değerler mi? Daha fazla açıklayabilirseniz yardımcı olabilirim.
0 0

Merhaba wto stratejisine bazı eklemeler yapabilir misiniz ?  Yeşil kırmızıyı sadece -53 altında keserse alıma geçmesi ve tam tersi de satışa geçmesi yani aralarda alım ve satıma geçmesin ekran görüntüsünde daha net anlatabilmişimdir umarım teşekkür ederim...https://destek.matriksdata.com/?qa=blob&qa_blobid=7579965802285643671

0 0

Merhaba, istediğiniz strateji için sadece koşulları aşağıdaki gibi düzenlemeniz yeterli. Yalnız bu koşullarda emirler sıralı gelmeyecektir ve stratejide sıralı emir gönderimi aktif o durumu da göz önünde bulundurunuz.

if (Prevwt1<Prevwt2 && wt1>wt2 && wt1<-53)
{
	SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
	Debug("Alış emri verildi.");
}
if (Prevwt1>Prevwt2 && wt1<wt2 && wt2>53)
{
	SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
	Debug("Satış emri verildi.");	
}

İyi çalışmalar

1,400 soru
1,396 cevap
1,509 yorum
877 kullanıcı