0 beğenilme 0 beğenilmeme
864 kez görüntülendi
Merhaba  aynı sembolde  3 farklı strateji çalıştırıyorum 3 de farklı fiyatlarda alıma giriyor maliyetime ulaşıp örneğin yüzde 10 düşünce stop olup pozisyonu kapatan  tek kod arıyorum yardımcı olur musunuz teşekkürler ?
Algoritmik Trading kategorisinde (51 puan) tarafından | 864 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhaba,

Algoda bulunan sentetik emirler sadece strateji içerisinde girilen pozisyona kurulabilir. O nedenle ayrı bir stratejide pozisyon bilgisi alınarak sentetik emir kurmak mümkün değil. Bunu ancak stop noktasını manuel hesaplayarak yapabilirsiniz.

Aşağıdaki stratejide parametre olarak verilen sembole sembole ait pozisyon ve ortalama maliyet bilgisi portföyden alınıyor. Daha sonra istenilen stoploss(yüzde veya fiyat) türünde stop noktası belirleniyor. Eğer sembolün son değeri hesaplanan stop değerine ulaşırsa piyasaya eldeki pozisyon adedi kadar satış emri gönderiliyor.

Not : Paylaştığım stratejiyi emin olana kadar gerçek hesaplarda kullanmayınız. Zarar durdur emrinin doğru çalışabilmesi için stratejinizin geçici sinyal ile çalışması ve sıralı emir gönderiminin olamaması gerekmektedir. Kopyaladığınız strateji adının benim paylaştığım strateji adıyla aynı olmasına dikkat ediniz. 

İyi çalışmalar

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using System.Windows.Media;
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 Stoploss : 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.Day)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(5)]
		public decimal StoplossTrigger;

		//Eğer zarar durdur emrinin yüzdeli olarak çalışması isteniyor true set edilmelidir.
		//Fiyat adımı olarak çalışması istenirse false set edilmelidir.
		[Parameter(true)]
		public bool PercentStop;

		//Eğer kripto sembollerinde çalışılacaksa true set edilmelidir.
		[Parameter(true)]
		public bool Kripto;

		string sembol;
		bool Kripto_kontrol = false;

		/// <summary>
		/// Strateji ilk çalıştırıldığında bu fonksiyon tetiklenir. Tüm sembole kayit işlemleri,
		/// indikator ekleme, haberlere kayıt olma işlemleri burada yapılır. 
		/// </summary>
		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);

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

		decimal netPosition = 0;
		decimal ortMaliyet;
		decimal stop;
		/// <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 (PositionReceiveComplated)
			{
				if (netPosition > 0 && stop >= barDataCurrentValues.LastUpdate.Close)
				{
					SendMarketOrder(Symbol, netPosition, OrderSide.Sell);
					Debug("Zarar durdur tetiklendi.");
					Debug("Adet : " + netPosition + " Maliyet : " + ortMaliyet + " Stop : " + stop + " Fiyat : " + barDataCurrentValues.LastUpdate.Close);
				}else if (netPosition < 0 && stop <= barDataCurrentValues.LastUpdate.Close)
				{
					SendMarketOrder(Symbol, netPosition, OrderSide.Buy);
					Debug("Zarar durdur tetiklendi.");
					Debug("Adet : " + netPosition + " Maliyet : " + ortMaliyet + " Stop : " + stop + " Fiyat : " + barDataCurrentValues.LastUpdate.Close);
				}
			}
		}

		/// <summary>
		/// Strateji çalıştığında ve portföyde değişiklik olduğunda tetikelenir.
		/// </summary>
		/// <param name="position">Portföydeki hisselere ait değerleri bulundurur</param>
		public override void OnRealPositionUpdate(AlgoTraderPosition position)
		{
			sembol = Symbol;

			//Binance portföylerinde sembol isimleri BTC - ETH gibi olduğu için aşağıdaki kontrolü yapmalıyız.
			if (Kripto && Symbol.Split('_')[2].Contains("BIN")) sembol = Symbol.Split('_')[0];

			//Portföyde istenilen sembolün olup olmadığını kontrolü sağlanıyor.
			if (position.Symbol.Equals(sembol))
			{
				if (Kripto) Kripto_kontrol = true;
				var P = position;
				Kripto_kontrol = true;
				//Alttaki string formatları portföyden alabileceğiniz verileri kapsamaktadır.
				string Portfoy = String.Format("|{0,-10}|{1,-13}|{2,-10}|{3,-10}|{4,-10}|{5,-10}|{6,-10}|{7,-10}|{8,-10}|{9,-13}|",
				"Hesap", "Sembol", "Birim", "Adet T", "Adet T1", "Adet T2", "Adet T3", "Tutar", "Sat. Adet", "Ort. Maliyet");

				string FormatPortfoy = String.Format("|{0,-10}|{1,-13}|{2,-10}|{3,-10}|{4,-10}|{5,-10}|{6,-10}|{7,-10}|{8,-10}|{9,-13}|\n",
				P.AccountId, P.Symbol, P.Currency, P.QtyT, P.QtyT1, P.QtyT2, P.QtyT3, P.Amount, P.QtyAvailable, P.AvgCost);

				Debug(Portfoy);
				Debug(FormatPortfoy);

				var barData = GetBarData(Symbol, SymbolPeriod);
				netPosition = P.QtyT;
				ortMaliyet = barData.Close[barData.BarDataIndexer.LastBarIndex];
				Debug(ortMaliyet);
				if (PercentStop)
				{
					if (netPosition>0)
					{
						stop = ortMaliyet - (ortMaliyet * StoplossTrigger) / 100;
					}else
					{
						stop = ortMaliyet + (ortMaliyet * StoplossTrigger) / 100;
					}
				}else
				{
					if (netPosition>0)
					{
						stop = ortMaliyet - StoplossTrigger;
					}else
					{
						stop = ortMaliyet + StoplossTrigger;
					}
				}

				Debug("Adet : " + netPosition + " Maliyet : " + ortMaliyet + " Stop : " + stop);

			}
		}
	}
}

 

(4,555 puan) tarafından
tarafından düzenlendi
0 0
Merhaba testnet  de deneme yaptım stop noktasında satış yapmıyor stratejide bir sorun var sanırım teşekkür ederim...
0 0

Merhaba, bitmex portföyünde ortalama maliyet kolonu veya herhangi bir fiyat bilgisi bulunmamakta. Yapılabilecek birkaç şey var o nedenle ya ort. maliyet değerini manuel olarak gireceksiniz yada stratejiyi çalıştırdığınız andaki sembolün değerini ort maliyet olarak alacaksınız.

Bir diğer sorunda netposition değerini çekerken yaşanmış. Bitmexde netposition değerini aşağıdaki gibi düzenlerseniz. Portföydeki pozisyonu alabilirsiniz.

netPosition = P.QtyT;

 

0 0
Merhaba, portföy pozisyon bilgisini alıyorum ama stop noktaları kriptoda  da  manuel ve decimal olarak çalışmıyor.
0 0
Merhaba, yukarıdaki kodu güncelledim. Ortalama maliyet değerini strateji çalıştırıldığındaki barın son değerini alarak çalışıyor. Bunu isterseniz kod içerisinden manuel değer atayarak da yapabilirsiniz. Yalnız portföydeki adedi çektiğimiz için backtestte kod çalışmayacaktır.
0 0
Merhaba yüzde olarak stop çalışmıyor false olarak rakamla çalışıyor bir diğer sorun ise short pozisyonda çalışmıyor sadece long da çalışmaktadır teşekkür ederim...
0 0

Merhaba,

Hangi sembolde çalışıyorsunuz?

Stratejiyi çalıştırdığınızda Debug tabında yazan yazıyı atabilir misiniz? Aşağıdaki kod parçasının çıktısını.

Debug("Adet : " + netPosition + " Maliyet : " + ortMaliyet + " Stop : " + stop);

Birde paylaştığım kod sadece portföyden alınan adet ve maliyet bilgisine göre çalışmaktadır. Eğer sonradan emir veriyorsanız portföye etki etmediği sürece çalışmayacaktır. Yani strateji içerisinde verilen emirler üzerine kurulmaz.

0 0

Merhaba,

kripto sembollerde kullanıyorum sonradan emir girmiyorum fakat  normal strateji çalışmasına  ikinci strateji olarak stoplos stratejisini çalıştırıyorum strateji long veya short açtığında mantıken stoploss stratejisi kendini yenilemesi lağzım ama yenilemiyor.

 yüzde olarak ne longda nede short pozisyonda çalışmıyor ve manuel emir girmiyorum

(''Yani strateji içerisinde verilen emirler üzerine kurulmaz.'') sorun bu olabilir ama long veya shortta stratejilere  ikinci bir stop olarak çalışma imkanı olursa sevinirim teşekkür... ederim...https://destek.matriksdata.com/?qa=blob&qa_blobid=14107304057611783953

0 0
Merhaba, yukarıdaki kodu short pozisyon için çalışabilir hale getirdim. Test edebilirsiniz.
1 0
Her sorumuza yardımcı olduğunuz için teşekkür ederim...
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,636 soru
8,590 cevap
4,821 yorum
19,790 kullanıcı