0 beğenilme 0 beğenilmeme
431 kez görüntülendi
Merhaba,

Herhangi bir strateji çalıştığında pozisyondayken, zararına satmama opsiyonu var mıdır. Örneğin bir alış yaptı, ilgili strateji tersine döndü ve satıyor ama istediğim, ancak kar oluştuğunda ve strateji tersine döndüğünde satması. Bu şekilde konfigüre etmek mümkün müdür.
Algoritmik Trading kategorisinde (40 puan) tarafından | 431 kez görüntülendi

1 cevap

0 beğenilme 1 beğenilmeme
Merhaba.

Bu yapabileceğiniz ama tavsiye etmeyeceğimiz bir şeydir.

Sat koşulunuz oluştu ve zararda diye sattırmadınız. Zarar büyümeye devam ederse ne yapacaksınız.

IQ tarafında, kod yazarak çözmeniz gerekir. Veri terminali ürünümüzün Sistem tester tarafında, Stop sekmesinde ek bir seçenek olarak vardır.

İyi çalışmalar
(12,790 puan) tarafından
0 0
Merhaba,

Evet kesinlikle ben de bu riski görüyorum, fakat optimizasyonda belli başlı indikatörlerde nasıl sonuç vereceğini test etmek istiyorum. ayrıca stop seviyesini oluşturacağım senaryoda stop seviyesini biraz da manuel yönetmek aslında derdim.

Kodları yazarken yararlanabileceğimiz bir kütüphane var mıdır, örneğin, alış yaptığında ki fiyatı bir değişkene atmak için aktif fiyatı çekebileceğim, sonra da aktif fiyatın buna göre kontrolü için hangi değişkenleri kullanabilirim. barDataCurrentValues çalışmadı çünkü.
0 0

Merhaba,

Yukarıdaki uyarılar doğrultusunda aşağıdaki stratejiyi inceleyebilirsiniz.

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;


namespace Matriks.Lean.Algotrader
{
	public class KarZararKontrolu : 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.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;

		int realposition = 0;
		PMaxIndicator pmax;



		public override void OnInit()
		{
			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(true);
		}


		/// <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)
		{
			var sFiyat = barData.BarData.Close;

			
			if (CrossAbove(pmax.KLine, pmax.StLine))
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
				Debug("Alış emri gonderildi.");
				if(!LiveMode){
					_gerceklesenFiyat = sFiyat;
				}
			}
			if (CrossBelow(pmax.KLine, pmax) && kontrolEt(sFiyat) >= 0)
			{
				SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
				Debug("Satış emri gonderildi.");
				if(!LiveMode){
					_gerceklesenFiyat=0;
				}
			}
		}
		
		decimal _gerceklesenFiyat = 0;

		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;
				if(LiveMode){
					_gerceklesenFiyat = order.LastPx;
				}
				
			}

			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
			{
				var positionChange = order.OrderQty;
				realposition -= (int) positionChange;
				if(LiveMode){
					_gerceklesenFiyat = 0;
				}
			}
		}

		public decimal kontrolEt(decimal sonFiyat)
		{
			if (_gerceklesenFiyat != 0)
			{
				decimal oran = (sonFiyat - _gerceklesenFiyat) / _gerceklesenFiyat * 100;
				return oran;
			}else
			{
				return 0;
			}
		}
	}
}

 

0 0

Merhaba, Cevabınız için teşekkürler. Daha fazla indikatör eklemeden, sadece RSI için denemek istedim. Aslında hangi indikatör için denediğimin bir önemi yok fakat Backtest'te 01 kasımdan sonra 15 dk'lıkta çalıştırdığımda yine gerçekleşen fiyat kontrolünü yapmıyor. Ya aldığım bar fiyatlarında problem var ya da kontrolEt fonksiyonunun içine girmiyor. Kontrol edebilir misiniz. Bir de trace alabileceğimiz bir yer var mı, kod akışını görmek için.

 

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;

using System.Windows.Media;
using Matriks.Symbols;
using Matriks.AlgoTrader;
using Matriks.Trader.Core.TraderModels;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;



namespace Matriks.Lean.Algotrader
{
	public class TTRAK_RSI3 : 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("TTRAK")]
		public string Symbol;
		[Parameter(SymbolPeriod.Min15)]
		public SymbolPeriod SymbolPeriod;
		[Parameter(50)]
		public int BuyOrderQuantity;
		[Parameter(50)]
		public int SellOrderQuantity;
		[Parameter(14)]
		public int Period;
		[Parameter(65)]
		public int UpLevel;
		[Parameter(35)]
		public int DownLevel;
		RSI rsi;

		/*
		public int MovPeriod;
		[Parameter(3)]
		public decimal Coefficient;
		[Parameter(MovMethod.E)]
		public MovMethod MovMethod;*/

		int realposition = 0;
		/*PMaxIndicator pmax;*/



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

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

			//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.
			//SetTimerInterval(3);

			//Alttaki fonksiyon ile tanımlanan sembol ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.
			//AddNewsSymbol(Symbol);

			//Alttaki fonksiyon ile tanımlanan anahtar kelime ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.
			//AddNewsKeyword("KAP");
		}


		/// <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)
		{
			var sFiyat = barData.BarData.Close;


			if (CrossAbove(rsi, DownLevel))
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
				Debug("Alış emri gonderildi.");
				if (!LiveMode)
				{
					_gerceklesenFiyat = sFiyat;

				}
			}
			if (CrossBelow(rsi, UpLevel) && kontrolEt(sFiyat) >= 0)
			{
				SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
				Debug("Satış emri gonderildi.");
				if (!LiveMode)
				{
					_gerceklesenFiyat = 0;

				}
			}
		}

		decimal _gerceklesenFiyat = 0;

		
		

		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;

				
				if (LiveMode)
				{
					_gerceklesenFiyat = order.LastPx;

				}

			}

			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
			{
				var positionChange = order.OrderQty;
				realposition -= (int) positionChange;
				if (LiveMode)
				{
					_gerceklesenFiyat = 0;

				}
			}
		}

		public decimal kontrolEt(decimal sonFiyat)
		{
			if (_gerceklesenFiyat != 0)
			{
				decimal oran = (sonFiyat - _gerceklesenFiyat) / _gerceklesenFiyat * 100;
				return oran;

			}else
			{
				return 0;
			}
		}
	}
}

 

 

0 0
Merhaba,

Yukarıda ki kodu inceleme fırsatınız oldu mu, bir problem var ama çözemiyorum.
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,516 soru
7,519 cevap
4,405 yorum
8,753 kullanıcı