0 beğenilme 0 beğenilmeme
304 kez görüntülendi

Aslında yapmak istediğim;

al, sat ve açığa sat işlemlerini PMAX ile yaparken (bar kapanışında)

HighestHighIndicator ve LowestLowIndicator ile; eğer sistem alda ise fiyat 5 periyodluk LowestLowIndicator altına indiğinde bar kapanışı beklemeden stop olmak, satta iken de fiyat 5 periyodluk HighestHighIndicator altına inince stop olmak.

ama bir türlü başaramadım.

public bool FX_Stop(string sembol, decimal quantity)
{
	StopLoss(sembol,SyntheticOrderPriceType.Percent,0);
}

olarak kullanamadım ama

public void FX_Stop(string sembol, decimal quantity)
{
	StopLoss(sembol,SyntheticOrderPriceType.Percent,0);
}

şeklinde yazınca oldu. yalnız bu sefer de alımdan sonraki ilk düşüşte stop oldu benim koşuluma hiç bakmadı.

kodun tamamı aşağıda

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks;
using Matriks.Data.Symbol;
using Matriks.Data.Tick;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
using Matriks.AI;
using Matriks.AI.AiParameters;
using Matriks.AI.Data;
using Matriks.Trader.Core.TraderModels;
using Matriks.Enumeration;
using Matriks.IntermediaryInstitutionAnalysis.Enums;

namespace Matriks.Lean.Algotrader
{
	public class PMAX_STOPLU : 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("X30YVADE")]
			public string Symbol;


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


		[Parameter(Side.All)]
			public Side orderSide;


		[Parameter(10)]
			public int PmaxindicatorAtrPeriod;

		[Parameter(10)]
			public int PmaxindicatorMovPeriod;

		[Parameter(3)]
			public decimal PmaxindicatorCoeff;

		[Parameter(MovMethod.E)]
			public MovMethod PmaxindicatorMovMethod;

		[Parameter(5)]
			public int HighesthighPeriod;

		[Parameter(5)]
			public int LowestlowPeriod;

		[Parameter(1)]
			public decimal OrderQuantity;

		PMaxIndicator pmaxIndicator;
		HighestHigh highestHigh;
		LowestLow lowestLow;



		public override void OnInit()
		{

			pmaxIndicator = PMaxIndicators(Symbol, SymbolPeriod, PmaxindicatorAtrPeriod, PmaxindicatorMovPeriod, PmaxindicatorCoeff, PmaxindicatorMovMethod);
			highestHigh = HighestHighIndicator(Symbol, SymbolPeriod, OHLCType.Close, HighesthighPeriod);
			lowestLow = LowestLowIndicator(Symbol, SymbolPeriod, OHLCType.Close, LowestlowPeriod);


			SendOrderSequential(true, orderSide);
			SendOrderSequentialForShort(true, Side.Sell);

			WorkWithPermanentSignal(true);

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

			//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>
		/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir
		/// </summary>
		public override void OnInitCompleted()
		{

		}

		/// <summary>
		/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.
		/// </summary>
		public override void OnTimer()
		{

		}

		/// <summary>
		/// AddNewsSymbol ve AddNewsKeyword ile haberlere kayit olunmuşsa bu fonksiyon tetiklenir.
		/// </summary>
		/// <param name="newsId">Gelen haberin id'si</param>
		/// <param name="relatedSymbols">Gelen haberin ilişkili sembolleri</param>
		public override void OnNewsReceived(int newsId, List<string> relatedSymbols)
		{

		}

		/// <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 barData1 = GetBarData(Symbol, SymbolPeriod);
			var close = GetSelectedValueFromBarData(barData1, OHLCType.Close);
			if (CrossAbove(pmaxIndicator, pmaxIndicator, 1, 0))
			{
				FX_Alis();
			}
			if (CrossBelow(pmaxIndicator, pmaxIndicator, 1, 0))
			{
				FX_Satis();
			}
			if (pmaxIndicator.Value[1][pmaxIndicator.CurrentIndex] > pmaxIndicator.Value[0][pmaxIndicator.CurrentIndex] && lowestLow.Value[0][lowestLow.CurrentIndex - 1] > close)
			{
				FX_Stop();
			}
			if (pmaxIndicator.Value[0][pmaxIndicator.CurrentIndex] > pmaxIndicator.Value[1][pmaxIndicator.CurrentIndex] && highestHigh.Value[0][highestHigh.CurrentIndex - 1] < close)
			{
				FX_Stop();
			}

		}

		/// <summary>
		/// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir.
		/// </summary>
		/// <param name="barData">Emrin son durumu</param>
		
		// Gerekli başla - Açığa satış
		[Parameter(false)]
		public bool AcigaSatisYapilsin;

		[Parameter(false)]
		public bool AksamSeansiniDahilEt;

		List<string> orderIDList = new List<string>();

		public void FX_Alis()
		{
			string _orderID = string.Empty; ;
			decimal _quantity = 0;

			if (LastOrderSide.Obj != Side.Buy)
			{
				if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
				{
					_orderID = SendMarketOrder(Symbol, OrderQuantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
					_quantity = OrderQuantity;
				}else
				{
					if (LastOrderSideForShort.Obj == Side.All)
					{
						_orderID = SendMarketOrder(Symbol, OrderQuantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
						_quantity = OrderQuantity;
					}else
					{
						_orderID = SendMarketOrder(Symbol, OrderQuantity * 2, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
						_quantity = OrderQuantity * 2;
					}
				}

				if (_orderID != string.Empty && _quantity != 0)
				{
					orderIDList.Add(_orderID);
					Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");
					LastOrderSide.Obj = Side.Buy;
					LastOrderSideForShort.Obj = Side.Buy;
				}
			}
		}

		public void FX_Satis()
		{
			string _orderID = string.Empty; ;
			decimal _quantity = 0;

			if (LastOrderSide.Obj != Side.Sell)
			{
				if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
				{
					_orderID = SendMarketOrder(Symbol, OrderQuantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
					_quantity = OrderQuantity;
				}else
				{
					if (LastOrderSideForShort.Obj == Side.All)
					{
						_orderID = SendMarketOrder(Symbol, OrderQuantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
						_quantity = OrderQuantity;

					}else
					{
						_orderID = SendMarketOrder(Symbol, OrderQuantity * 2, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
						_quantity = OrderQuantity * 2;
					}
				}


				if (_orderID != string.Empty && _quantity != 0)
				{
					orderIDList.Add(_orderID);
					Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");
					LastOrderSide.Obj = Side.Sell;
					LastOrderSideForShort.Obj = Side.Sell;
				}
			}
		}
		
		public void FX_Stop()
		{
			StopLoss(Symbol,SyntheticOrderPriceType.Percent,0);
			Debug("Pozisyon STOP oldu.");
		}

		public override void OnOrderUpdate(IOrder order)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{
				// Senntetik emirler tanımlanıyor
				//				StopLoss(Symbol, SyntheticOrderPriceType.Percent, 1);
				//				TakeProfit(Symbol, SyntheticOrderPriceType.Percent, 1);
				if (!orderIDList.Contains(order.CliOrdID) && AcigaSatisYapilsin)
				{
					LastOrderSideForShort.Obj = Side.All;
					Debug("Sentetik emir tetiklendi");
				}
			}
		}
		// #Gerekli bitti - Açığa satış

		/// <summary>
		/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
		/// </summary>
		public override void OnStopped()
		{
		}
	}
}

 

Algoritmik Trading kategorisinde (26 puan) tarafından | 304 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme
Sistemdeki stop koşulu hatalı bu görülüyor ama tanımladığınız stop kurgusunu biraz daha açmanız konuyu dahada netleştirecektir.

Grafik üzerinden şuna karar vermeniz gerekiyor,
1) Alım yaptığım fiyattaki bardata ve önceki 5 bar içinde en düşük fiyata seviyesine mi stop koymak istiyorum ?

2)Alım yaptıktan sonra bardata lowestlow indikatör'üne değince mi stop olmak istiyorum.

 

İlk ihtimal'i kullanmak daha makul görünüyor şimdilik,eğer birisini seçerseniz onun üzerinden ilerlemek daha doğru olacaktır.Lowestlow ve highesthigh indikatörleri Fiyatı takip ettiği için etkin bir stop noktası konusunda yardımcı olmayabilir.

Alım emri gönderirken "LowestLow(ohlcType.low, 5);" bu seviyeyi bir listeye kayıt ettirip daha sonra fiyat eğer bu seviyenin altına düşerse eldeki adetleri sat demek mantıklı bir kurgu olabilir. Chatgpt yardımcı olacaktır bu konuda eğer yapamazsanız 1 veya 2. yoldan birisine karar verdiğinizde yardımcı olmaya çalışırım
(406 puan) tarafından
8,639 soru
8,593 cevap
4,826 yorum
19,832 kullanıcı