1 beğenilme 0 beğenilmeme
2,740 kez görüntülendi
Merhabalar,

StopLoss - TakeProfit - TrailingStopLoss fonksiyonları için örnek kod paylaşabilir misiniz? Nasıl bir mantıkla çalışıyorlar.

StopLoss fonksiyonu denediğimde sembolden sonra yğzde veya puan yönteminden birini seçmemi söylüyor. Ancak seçim için nasıl bir ifade kullanmam gerektiğini göremedim.

Çalışma mantığı olarak; x hissesini 5,50 den aldığımızı düşünelim. OnDataUpdate içine stoploos fonkiyonu ile 5,30 için stop loss seviyesi belirledik. Her bar güncellendiğinde stoploss fonksiyonu çalışacak ve fiyat 5,30 ise tüm x hissesini satacak mı?

Bunun tam tersi durumda açığa satış yaptığımızda stoploss bu sefer alış mı yapacak?

Not: Hazır stratejilerin açıklamalarına baktım. Örnek bir kod göremedim.
Algoritmik Trading kategorisinde (143 puan) tarafından | 2,740 kez görüntülendi

1 cevap

1 beğenilme 0 beğenilmeme

Merhaba,

"Çalışma mantığı olarak; x hissesini 5,50 den aldığımızı düşünelim. OnDataUpdate içine stoploos fonkiyonu ile 5,30 için stop loss seviyesi belirledik. Her bar güncellendiğinde stoploss fonksiyonu çalışacak ve fiyat 5,30 ise tüm x hissesini satacak mı?

Bunun tam tersi durumda açığa satış yaptığımızda stoploss bu sefer alış mı yapacak?"

Evet dediginiz gibi ancak fiyat farki ya da yuzde fark olarak belirliyoruz, bu durumda pozisyona 5.50'den long girdiyseniz, 

StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, 0.20); satirini yazdigimizda, 5.30'a geldiginde zarar durduracaktir.

TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, 0.25); 5.75'e geldiginde kar alacaktir.

Ornek kod olarak SMA_Bitmex_TPSL mevcuttur. Buraya da ekliyorum, sormak istediginiz varsa buraya yazabilirsiniz.

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===================================================//
// SMA indikatöründe, fiyat çubuklarınının SMA bandının üstüne kırdığı anda al,								//
// altına kırdığı anda sat sinyali üretilir. Cross değil relational operator (<, >) kullanır				//
// Emirler piyasa fiyatından gönderilir ve Emir gönderimi ile birlikte strateji raporunda 					//
// Debug sekmesine "Alış emri gönderildi ve "Satış emri gönderildi." ifadesi yazdırılmaktadır. 				//
// Normal SMA stratejisine ek olarak Kar al ve Zarar durdur fonksiyonlarinin kullanımı örneklendirilmiştir. //

namespace Matriks.Lean.Algotrader
{
	public class sma_Bitmex_TPSL_Release : 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.Min)]
		public SymbolPeriod SymbolPeriod;
		[Parameter(100)]
		public decimal BuyOrderQuantity;
		[Parameter(100)]
		public decimal SellOrderQuantity;
		[Parameter(60)]
		public int Period;

		//Kar Al/Zarar Durdur Parametreleri
		[Parameter(true)]
		public bool Kar_AL;
		[Parameter(10)]
		public decimal Kar_AL_FiyatMiktari;
		[Parameter(true)]
		public bool Zarar_Durdur;
		[Parameter(50)]
		public decimal Zarar_Durdur_FiyatMiktari;


		SMA sma;
		SMA sma200;
		ISyntheticOrderPrices TP, SL;
		int FirstRun = 0;
		int SystemPosition = 0;
		int realposition = 0;
		int OnOrderUpdate_Executed = 0;

		public override void OnInit()
		{
			sma = SMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period);
			//sma200 = SMAIndicator(Symbol, SymbolPeriod.Day, OHLCType.Close, 200);
			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(false);
		}


		/// <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 Close = barData.BarData.Close;
			var Sma = Math.Round(sma.CurrentValue, 2);
			Debug("==============================");
			Debug("Close:" + Close);
			Debug("Sma:" + Sma);
			var barDataModel = GetBarData();

			if (Close > Sma)
			{
				if (realposition == 0 && SystemPosition == 0)
				{
					SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
					Debug("Alış emri verildi.");
					SystemPosition = 1;
					if (Kar_AL) TP = TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, Kar_AL_FiyatMiktari);
					if (Zarar_Durdur) SL = StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, Zarar_Durdur_FiyatMiktari);
					Debug(TP + " ," + SL);
				}
				else if (realposition == -1 * SellOrderQuantity && SystemPosition == -1)
				{
					SendMarketOrder(Symbol, BuyOrderQuantity * 2, (OrderSide.Buy));
					Debug("Alış emri verildi.");
					SystemPosition = 1;
					TP = TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, Kar_AL_FiyatMiktari);
					SL = StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, Zarar_Durdur_FiyatMiktari);
					Debug(TP + " ," + SL);
				}
			}
			if (Close < Sma)
			{
				if (realposition == 0 && SystemPosition == 0)
				{
					SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
					Debug("Satış emri verildi.");
					SystemPosition = -1;
					if (Kar_AL) TP = TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, Kar_AL_FiyatMiktari);
					if (Zarar_Durdur) SL = StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, Zarar_Durdur_FiyatMiktari);
					Debug(TP + " ," + SL);
				}
				else if (realposition == 1 * BuyOrderQuantity && SystemPosition == 1)
				{
					SendMarketOrder(Symbol, SellOrderQuantity * 2, (OrderSide.Sell));
					Debug("Satış emri verildi.");
					SystemPosition = -1;
					if (Kar_AL) TP = TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, Kar_AL_FiyatMiktari);
					if (Zarar_Durdur) SL = StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, Zarar_Durdur_FiyatMiktari);
					Debug(TP + " ," + SL);
				}
			}
		}
		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 (realposition == 0)
				{
					SystemPosition = 0;
					Debug("Kar AL / Zarar Durdur tetiklendi");
				}
			}
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
			{
				var positionChange = order.OrderQty;
				realposition -= (int) positionChange;
				Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
				if (realposition == 0)
				{
					SystemPosition = 0;
					Debug("Kar AL / Zarar Durdur tetiklendi");
				}
			}
		}
	}
}

 

(8,035 puan) tarafından
0 0
Bilgilendirme için teşekkür ederim.

TrailingStopLoss  fonksiyonu Matriks Veri Terminalindeki KADEMELİ HAREKETLİ KAR STOP  gibi mi çalışıyor?

Amacım 5,50 aldığım hisseyi takip edip 5,75 olduktan sonra 5,6 geri çekilir ise kar al yapması.

takeprofit komutunu al/sat emri gönderirken değil de fiyat hareketlerine göre kar al yapmak konusunda örnek var mı?
0 0
Rica ederiz.

Hayir kademeli hareketli kar stop gibi calismamakta. IQ'daki trailing stop loss, hareketli zarar durdur emridir. Sizin dediginiz de bu ama belli bir fiyata geldiginde aktive olmasini istiyorsunuz. IQ algo'da bu da yapilabilir fakat bunun icin emir fiyat takibi yapan bir strateji icerisinde fiyat takibi bittikten sonra trailing stoploss emrini calistiran bir kod gerekmekte.

Tam bahsettiginiz ornek senaryoyu iqdestek@matriksdata.com adresine strateji talebi olarak gonderebilir misiniz. Imkanimiz olursa stratejiyi yazip size ulastiralim.
0 0
Sormak istediğim birkaç soru var. 1. Stoploss , takeprofit ,trailingstoploss fonksiyonları bar açılışlarını bekleyerek mi çalışıyor. Backtest lerde bar açılışını bekliyor gibi. 2. Sendmarketorder ve stoploss peşpeşe kullandıktan sonra ters yönde sadece sendmarketorder kullandığımızda daha önce verdiğiniz stoploss iptal mi oluyor 3. Fiyat takibi yapıp trailingstoploss aktif etmek için bar açılışını beklemek yerine anlik fiyata bakmamız gerekiyor değil mi. Ondataupdate de fiyat takibi yapmak mantıklı mı? Yazılım tecrübem biraz var. Eğer yapamazsam mail atmayı düşünüyorum.
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,635 soru
8,589 cevap
4,821 yorum
19,779 kullanıcı