0 beğenilme 0 beğenilmeme
1,030 kez görüntülendi
Pmax stratejisini diğer indikatörler ile birlikte kullanmak istersek nasıl ayarlayabiliriz?
Algoritmik Trading kategorisinde (1,701 puan) tarafından
tarafından yeniden gösterildi | 1,030 kez görüntülendi

1 cevap

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

Merhaba,

Öncelikle hazır stratejilerdeki PMAX_Strategy stratejisini kullanıcı stratejilerine kopyalayınız.

Daha sonra kopyalayarak oluşturduğunuz stratejiyi düzenleyebilirsiniz.

Pmax indikatörüyle birlikte kullanmak istediğiniz indikatörü indikatörler sekmesinde çift tıklayarak stratejiye ekleyeniz. 

İf bloğunda alış ve satış satırlarına eklediğiniz indikatörle ilgili şartınızı ekleyeniz.

Örnek olması açasından ben pmax ve rsi birlikte kullandım.

İsterseniz linkteki dosyayı kullanıcı stratejilerinden strateji al ile sisteme entegre edebilirsiniz.

Link:

https://destek.matriksdata.com/?qa=blob&qa_blobid=15175981707264533612

Kod:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;

//*******************************************************ACIKLAMA*******************************************************//
//Kıvanç Özbilgiç'in hazirladigi PMAX indikatorunun kullanildigi bir stratejidir. Alim/Satim sinyalleri Cross Fonksiyonu 
//kullanilarak elde edilir. Strateji LONG/SHORT pozisyon almaktadir. Kalici sinyal ve sirasiz emir ile calismaktadir.
//Ilk emir gonderildiginde isaretlenir, ve daha sonraki emirler ilk emrin 2 kati olarak gonderilir. Boylece pozisyon 1/0 
//seklinde degil, 1/-1 seklinde alinabilmektedir (LONG/NEUTRAL yerine LONG/SHORT). Ek olarak OnOrderUpdate fonksiyonu ile
//Algo icerisinde gercek zamanli pozisyon takibi de yapilmaktadir. AcigaSatisYapilsin kutusu isaretlenmedigi taktirde
//aciga satis yapilmayacaktir ve emirler sirali olarak gonderilecektir.

namespace Matriks.Lean.Algotrader
{
	public class PmaxRsiKripex : 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("XBT_USD_BMEX")]
		public string Symbol;
		[Parameter(SymbolPeriod.Min60)]
		public SymbolPeriod SymbolPeriod;
		[Parameter(100)]
		public int BuyOrderQuantity;
		[Parameter(100)]
		public int SellOrderQuantity;
		[Parameter(10)]
		public int ATRPeriod;
		[Parameter(10)]
		public int MovPeriod;
		[Parameter(3)]
		public decimal Coefficient;
		[Parameter(MovMethod.E)]
		public MovMethod MovMethod;
		[Parameter(true)]
		public bool AcigaSatisYapilsin;

		int FirstRun = 0;
		int realposition = 0;
		PMaxIndicator pmax;

		RSI rsi;

		public override void OnInit()
		{
			rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, 14);

			pmax = PMaxIndicators(Symbol, SymbolPeriod, ATRPeriod, MovPeriod, (decimal) Coefficient, MovMethod);

			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(!AcigaSatisYapilsin);
		}


		/// <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 (!AcigaSatisYapilsin) FirstRun = 0;
			var pmaxKline = Math.Round(pmax.KLine.CurrentValue, 2);
			var pmaxSTline = Math.Round(pmax.StLine.CurrentValue, 2);
			Debug("***********************************************");
			Debug("pmaxSTline = " + pmaxSTline);
			Debug("pmaxKline = " + pmaxKline);
			if (CrossAbove(pmax.KLine, pmax.StLine) && rsi.CurrentValue<30)
			{
				if (FirstRun == 0)
				{
					SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
					Debug("Alış emri gonderildi.");
					FirstRun = 1;
				}
				else
				{
					SendMarketOrder(Symbol, BuyOrderQuantity * 2, (OrderSide.Buy));
					Debug("Alış emri gonderildi.");
				}
			}
			if (CrossBelow(pmax.KLine, pmax) && rsi.CurrentValue>70)
			{
				if (FirstRun == 0)
				{
					SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
					Debug("Satış emri gonderildi.");
					FirstRun = 1;
				}
				else
				{
					SendMarketOrder(Symbol, SellOrderQuantity * 2, (OrderSide.Sell));
					Debug("Satış emri gonderildi.");
				}
			}
		}

		public override void OnOrderUpdate(IOrder order)
		{
			//Gercek zamanli pozisyon takibi
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
			{
				var positionChange = order.OrderQty;
				realposition += (int) positionChange;
				Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
			}
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
			{
				var positionChange = order.OrderQty;
				realposition -= (int) positionChange;
				Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
			}
		}
	}
}

 

(15,902 puan) tarafından
tarafından seçilmiş
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.



8,724 soru
8,668 cevap
4,862 yorum
20,485 kullanıcı