MatriksIQ Destek
Matriks Destek
Matriks Web Destek
Matriks Mobile Destek
0 beğenilme 0 beğenilmeme
601 kez görüntülendi
Merhaba. Ben Matriks IQ , IQ Algo ' da Pmax Stratejisinde alım gerçekleştiği andan sonra %1de kar almasını istiyorum ve eğer AL sinyalini ilettikten sonra %1 yapmazsa direk kendi stratejisinde satmasını istiyorum. Ve bu robot sürekli çalışacağı için de ilk koşul gerçekleştikten sonra da aynı şekilde devam etmesini istiyorum. Bu konuda yardımcı olabilirseniz çok sevirim. Teşekkürler.Saygılarımla...
Algoritmik Trading kategorisinde (20 puan) tarafından | 601 kez görüntülendi

1 cevap

2 beğenilme 0 beğenilmeme

merhaba, ekteki kodu inceleyin. ben kapanış fiyatına göre, açığa satış olmayacak şekilde yaptım. isterseniz derinlik kullanarak da yapabilirsiniz. Fakat derinlik verilerini kullandığınızda backtest yapamazsınız. Kod döngüye girerse istenmeyen sonuçlar ortaya çıkabilir derinlik verisinde. Ola ki derinlik verileriyle yapmak isterseniz döngülere karşı korunmak için Sayaç tanımladım. If bloğu içerisinde 5 değerini şart olarak koydum. Yani 5 alış emri gönderir ve durur. İhtiyaç olursa kullanırsınız. bu haliyle sayaç değerine gerek yok İf bloğu içerisinde silin veya yüksek bir int değer girin şarta. 

Gelelim eksik yönlere. kapanış fiyatına göre işlem yaptığı için seans açıkken son değer kapanış olarak geçecek. Yani 4.00 alış. Kar al %1, 4,04 satış olması lazım ama alış 4.03 satış 4.04 iken 4,04 tetiklendiğinde kapanış 4,04 olacağı için kar al tetiklenip 4,03 e satar. diğer eksik husus 4,00 aldınız ama işlemler çok hızlı geçti sizin kod alış maliyetini yazacağı anda 4,01 işlem geçerse maliyet 4,01 olarak kaydedilecek sistemde. Kar al noktası değişecek. 

Stratejide bana göre eksik yön, %1 kar al yaptınız. Trend oluştu ve fiyatlar yukarı gidiyor. Sizin tekrar pozisyona girebilmeniz için önce Pmax K, St line aşağı kesecek. sonra dönüp yukarı kesecek ki işleme girsin. Peki Trend devam ederse??? tekrar işleme girmek için gerekli şart sağlanmayacak. Yani trend devam ederse dışarıda kalıp izlemiş olursunuz. Bu sebeple tekrar pozisyona giriş için ayrıca şart belirleyin. Garan 60dk periyod da bakın, son işlemde Kar Al dan sonra tekrar pozisyona giriş şartı olmadığı için güzel bir trendi kaçırıyor. 

Bu haliyle size fikir versin diye attım,  iyi sonuç vermez bence bu hali bu sebeple gerçek ortamda denemeyin. Strateji adını dstk4 olarak kaydedin. Hata, eksik varsa affola  Saygılarımla.

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using System.Windows.Media;
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 dstk4 : 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(1)]
		public decimal BuyOrderQuantity;
		[Parameter(1)]
		public decimal SellOrderQuantity;
		[Parameter(10)]
		public int ATRPeriod;
		[Parameter(10)]
		public int MovPeriod;
		[Parameter(3)]
		public decimal Coefficient;
		[Parameter(MovMethod.E)]
		public MovMethod MovMethod;
		[Parameter(0)]
		public int Sayac;
		public decimal Maliyet;

		int FirstRun = 0;
		int realposition = 0;
		PMaxIndicator pmax;


		/// <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);
			
			pmax = PMaxIndicators(Symbol, SymbolPeriod, ATRPeriod, MovPeriod, (decimal) Coefficient, MovMethod);

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

		}





		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			

			var pmaxKline = Math.Round(pmax.KLine.CurrentValue, 2);
			var pmaxSTline = Math.Round(pmax.StLine.CurrentValue, 2);
			/*   Debug("***********************************************");
            Debug("pmaxSTline = " + pmaxSTline);
            Debug("pmaxKline = " + pmaxKline);*/

			if (CrossAbove(pmax.KLine, pmax.StLine) && FirstRun == 0 && Sayac<5)
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
				Maliyet = barData.BarData.Close;
				Sayac += 1;
				Debug("Alış emri gonderildi." + "Alış Maliyeti:" + Maliyet + "Gönderilen Alış Emri Adedi:" + Sayac);
				FirstRun = 1;

			}

			if ((CrossBelow(pmax.KLine, pmax) && FirstRun == 1) || (FirstRun == 1 && Maliyet * 1.01m <= barData.BarData.Close))
			{
				if (Maliyet * 1.01m <= barData.BarData.Close)
				{
					SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
					Debug("Kar Al Tetiklendi.");
					FirstRun = 0;
				}
				else
				{
					SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
					Debug("Satış emri gonderildi.");
					FirstRun = 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;
				Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
			}
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
			{
				var positionChange = order.OrderQty;
				realposition -= (int) positionChange;
				Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
			}
		}
	}
}

 

(48 puan) tarafından
0 0
Efendim şöyle ben bu formülü sadece kripto paralarda kullanmak istiyorum. Normal Bist100 endeksinde kullanmayacağım. O yüzden %1 kar seçeneği faydalı olmaz mı?
0 0
Kripto paralarda işlem yapmadım hiç, bu sebeple bir şey söylemem doğru olmaz, yanlış yönlendirmiş olmayayım. Backtest de çıkar zaten kabaca ne yaptığı.
0 0
Teşekkür ederim efendim yardımınız için.
Bu stratejide tanımlanan sayaç hakkında
4,534 soru
4,522 cevap
3,048 yorum
3,368 kullanıcı