Matriks Destek ve Yardım Platformu

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.

0

StochasticSlow_ADX stratejisi, açığa alım satım ve pozisyon takibi ekleme formül hatasına

Soruldu
Görüntülenme
686 görüntülenme
Durum
Cevap bekliyor

merhabalar, 

stratejiyi aşağıdaki gibi oluşturdum, 130. satırda hata mesajı alıyorum ve geçemiyorum.

yapmak istediğim,  açığa al açığa sat işlemlerini pozisyonumu takip ederek gerçekleştirmesi, ilk işlemim işaretlenmesi ve sonrasındaki işlemin 2 katı olarak yapılması. 

stratejiyi durdurup çalıştırdığımda mevcut pozisyona ve miktarına göre işleme devam etmesi. 

 

 

 





using System;
using System.Collections.Generic;
using System.Linq;
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;

//*******************************************************ACIKLAMA*******************************************************//
//StochasticSlow ve ADX indikatörlerini kullanan bir stratejidir. StochasticSlowK, StochasticSlowD'nin üzerinde ve ADX	//
//ADX alım eşiğinin üzerindeyse uzun pozisyon açılır. StochasticSlowK, StochasticSlowD'nin altında ve ADX satım eşiğinin//
//üzerinde ise de pozisyon kapatılır.																					//

namespace Matriks.Lean.Algotrader
{
	public class stoch_slow_adx_viop : 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("EKGYO")]
		public string Symbol;
		[Parameter(SymbolPeriod.Min)]
		public SymbolPeriod SymbolPeriod;
		[Parameter(1)]
		public decimal BuyOrderQuantity;
		[Parameter(1)]
		public decimal SellOrderQuantity;
		[Parameter(51)]
		public int ADX_AlimEsigi;
		[Parameter(41)]
		public int ADX_SatimEsigi;

		

		int FirstRun = 0;
		int realposition = 0;

		[Output]
		public int IlkCalisma;

		[Output]
		public int Pozisyon;
		
		
		StochasticSlow stochasticSlow;
		ADX adx;

		public override void OnInit()
		{
			adx = ADXIndicator(Symbol, SymbolPeriod, OHLCType.Close, 14);
			stochasticSlow = StochasticSlowIndicator(Symbol, SymbolPeriod, OHLCType.Close, 234, 18, 38, MovMethod.Variable);
			//IQ: periodK,periodD,periodSlowK
			//terminal: Parametre olarak “ %K “, ‘’Yavaş %K’’ ve “%D
			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(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)
		{
			if ((stochasticSlow.StochasticSlowK.CurrentValue > stochasticSlow.StochasticSlowD.CurrentValue) && adx.CurrentValue > ADX_AlimEsigi)
			{
				if (FirstRun == 0)
				{
					SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
					Debug("Alış Emri Gönderildi");
					Debug("%K: " + stochasticSlow.StochasticSlowK.CurrentValue);
					Debug("%D: " + stochasticSlow.StochasticSlowD.CurrentValue);
					Debug("ADX: " + adx.CurrentValue);
					FirstRun = 1;
				}
				else
				{
					SendMarketOrder(Symbol, BuyOrderQuantity * 2, (OrderSide.Buy));
					Debug("Alış Emri Gönderildi");
					Debug("%K: " + stochasticSlow.StochasticSlowK.CurrentValue);
					Debug("%D: " + stochasticSlow.StochasticSlowD.CurrentValue);
					Debug("ADX: " + adx.CurrentValue);
				}

				if ((stochasticSlow.StochasticSlowK.CurrentValue < stochasticSlow.StochasticSlowD.CurrentValue) && adx.CurrentValue > ADX_SatimEsigi)
				{
					if (FirstRun == 0)
					{
						SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
						Debug("Satış Emri Gönderildi");
						Debug("%K: " + stochasticSlow.StochasticSlowK.CurrentValue);
						Debug("%D: " + stochasticSlow.StochasticSlowD.CurrentValue);
						Debug("ADX: " + adx.CurrentValue);
						FirstRun = 1;
					}
					else
					{
						SendMarketOrder(Symbol, SellOrderQuantity * 2, OrderSide.Sell);
						Debug("Satış Emri Gönderildi");
						Debug("%K: " + stochasticSlow.StochasticSlowK.CurrentValue);
						Debug("%D: " + stochasticSlow.StochasticSlowD.CurrentValue);
						Debug("ADX: " + adx.CurrentValue);
					}

					IlkCalisma = FirstRun;
					Pozisyon = realposition;

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

 

Paylaş

Yorumlar (1)

Henüz cevap yok

Cevabınız

Cevap yazmak için giriş yapın.Giriş yapKayıt ol