0 beğenilme 0 beğenilmeme
2,775 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 (73 puan) tarafından | 2,775 kez görüntülendi

1 cevap

1 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);
		}
	}
}

 

(4,555 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

0 0
burada bu kodda hata alıyorum yardımcı olur musnuz

 

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);
0 0
Merhaba, bu indikatörü gömülü indikatörler arasına ekledik. Grafik üzerinden WaveTrendOscillator olarak bulabilirsiniz. Strateji için algoritma sihirbazını kullanabilirsiniz.
0 0
merhaba,

wavetrend de -53 altında kalan ve yeşilin kırmızı ile kesişimi tarayacak explorer oluşturmak istiyorum. Explorer olrak yazamadım yardımcı olur musunuz?
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,509 soru
7,511 cevap
4,405 yorum
8,746 kullanıcı