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.
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.
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.
Kabul edilen 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);
}
}
}
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)
{
}
}
}
}
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.../dosya/cgscl2nzipyssulzdsws82fig/6.png
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
Sitenin çalışması için gerekli çerezleri kullanıyoruz. Ziyaretleri anlamak için analitik çerezleri yalnızca onayınızla kullanırız. Çerez Politikası
Teşekkürler