0 beğenilme 0 beğenilmeme
668 kez görüntülendi
Merhaba, stratejime bir emir eklemek istiyorum. Örneğin son 5 bardır pozisyon açıksa pozisyonu kapasın. Kar al veya zarar durdur değil yani, sadece belirli bir süredir pozisyon açıksa nakite geçmesi için. Nasıl bir kod satırı ve nereye ekleyebilirim bunu
Algoritmik Trading kategorisinde (54 puan) tarafından | 668 kez görüntülendi

1 cevap

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

Merhabalar,

Dilerseniz aşağıdaki yapıyı inceleyebilirsiniz.

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;

namespace Matriks.Lean.Algotrader
{
	public class SablonXBardırPozisyonVarsa : 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.Day)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(1)]
		public decimal BuyOrderQuantity;

		[Parameter(3)]
		public int Period;

		[Parameter(2)]
		public decimal Percentage;
		[Parameter(8)]
		public int BarSayisi;

		MOST most;

		public override void OnInit()
		{
			most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential);

			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, Side.Buy);
		}


		int ilkIslem = 0;
		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (ilkIslem + BarSayisi == barData.BarDataIndex && Adet != 0)
			{
				SendMarketOrder(Symbol, Adet, (OrderSide.Sell));
				Adet = 0;
				ilkIslem = 0;
				Debug("Satış emri verildi.");
				Debug("Most.ExMov:" + most.ExMOV.CurrentValue);
				Debug("Most:" + most.CurrentValue);
			}
			else if(CrossAbove(most.ExMOV, most))
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
				ilkIslem = barData.BarDataIndex;
				Adet += BuyOrderQuantity;
				Debug("Alış emri verildi.");
				Debug("Most.ExMov:" + most.ExMOV.CurrentValue);
				Debug("Most:" + most.CurrentValue);
				Debug("sayı:" + barData.BarDataIndex);
			}
		}


		public decimal Adet = 0;

		public override void OnOrderUpdate(IOrder order)
		{

		}
	}
}

Burada bar saydırma işlemini barData.BarDataIndex; fonksiyonu ile yaptırdık.

Bu zamana kadarki alım işlemlerinizi de Adet += BuyOrderQuantity; kod satırında tuttuk.

Lütfen inceleyiniz.

İyi çalışmalar.

(11,059 puan) tarafından
tarafından seçilmiş
0 0

Merhaba, bir süredir bu yapıyı inceliyorum ve farklı denemeler yapıyorum fakat hiçbirinde barData.BarDataIndex; fonksiyonu ile saydırmayı başaramadım. Rica etsem kendi stratejimde deneyebilmem için sadece bar saydırma kısmı olan bir cevap atabilir misiniz

0 0
Merhabalar,

Kullanmak istediğiniz yapıyı özetleyebilirseniz yardımcı olmaya çalışalım.

İyi çalışmalar.
0 0
Merhaba, örneğin son 5 bardır pozisyon açıksa pozisyonu kapasın. Kar al veya zarar durdur değil yani, sadece belirli bir süredir pozisyon açıksa nakite geçmesi için. Böyle bir yapı eklemek istiyorum sistemime fakat sizin attığınız örneğin benzeri bir yapıyı ekleyemedim. Teşekkürler
0 0

Merhaba,

aşağıdaki yapıyı kullnabilirsiniz.

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;

namespace Matriks.Lean.Algotrader
{
	public class Test2 : MatriksAlgo
	{
		[SymbolParameter("GARAN")]
		public string Symbol;

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

		[Parameter(1)]
		public decimal BuyOrderQuantity;
		
		[Parameter(1)]
		public decimal SellOrderQuantity;

		[Parameter(3)]
		public int Period;

		[Parameter(2)]
		public decimal Percentage;
		
		[Parameter(5)]
		public int BarSayisi;

		MOST most;

		public override void OnInit()
		{
			most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential);
			AddSymbol(Symbol, SymbolPeriod);
			WorkWithPermanentSignal(true);
			SendOrderSequential(true, Side.Buy);
		}

		int pozisyonAcildigiBar = int.MaxValue;
		bool bayrak=false;
		
		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if(CrossAbove(most,most,1,0)){
				SendMarketOrder(Symbol,BuyOrderQuantity,OrderSide.Buy);
				Debug("Alış emri gönderildi");
			}
			
			if(CrossBelow(most,most,1,0)){
				SendMarketOrder(Symbol,SellOrderQuantity,OrderSide.Sell);
				Debug("Satış emri gönderildi");
			}
			
			if(bayrak && barData.BarDataIndex>=pozisyonAcildigiBar+BarSayisi){
				TakeProfit(Symbol,SyntheticOrderPriceType.PricePoint,0);
				Debug("Pozisyon "+BarSayisi+" bardır açık olduğu için kapatıldı.");
				pozisyonAcildigiBar=int.MaxValue;
				bayrak=false;
			}
		}

		public override void OnOrderUpdate(IOrder order)
		{
			if(order.OrdStatus.Obj==OrdStatus.Filled){
				pozisyonAcildigiBar=GetBarData().BarDataIndexer.LastBarIndex;		
				if(GetPortfolio().ContainsKey(Symbol)){
					bayrak=GetPortfolio()[Symbol]!=0?true:false;					
				}
			}
		}		
	}
}

 

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,639 soru
8,593 cevap
4,826 yorum
19,844 kullanıcı