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

Backtest ile uyumlu olacak şekilde kapanan barda mov cross yazımını nasıl yapabilirim?

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

2 Cevaplar

1 beğenilme 0 beğenilmeme
En İyi Cevap

Merhabalar,

Aşağıda paylaştığım stratejide mov indikatörü kapanışı yukarı kırarsa al, aşağı kırarsa sat sinyali üretmektedir.

İ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 CrossMoving : 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("BTC_USDT_BIN")]
		public string Symbol;

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

		[Parameter(5)]
		public decimal BuyOrderQuantity;

		[Parameter(5)]
		public decimal SellOrderQuantity;

		[Parameter(5)]
		public int MovPeriod;

		[Parameter(MovMethod.Simple)]
		public MovMethod Method;

		MOV mov;

		/// <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()
		{
			mov = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod, Method);

			AddSymbol(Symbol, SymbolPeriod);

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

		}

		/// <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)
		{
			var barData = GetBarData();
			
			if (Ref(mov, 1) < Ref(barData, OHLCType.Close, 1) && Ref(mov, 0) > Ref(barData, OHLCType.Close, 0))
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
				Debug("Alış Emri Gönderildi");
				Debug("Mov : " + Ref(mov, 0));
				Debug("Close : " + Ref(barData, OHLCType.Close, 0));
			}

			if (Ref(mov, 1) > Ref(barData, OHLCType.Close, 1) && Ref(mov, 0) < Ref(barData, OHLCType.Close, 0))
			{
				SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
				Debug("Satış Emri Gönderildi");
				Debug("Mov : " + Ref(mov, 0));
				Debug("Close : " + Ref(barData, OHLCType.Close, 0));
			}
		}

		/// <summary>
		/// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir.
		/// </summary>
		/// <param name="barData">Emrin son durumu</param>
		public override void OnOrderUpdate(IOrder order)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{

			}
		}
	}
}

 

(4,555 puan) tarafından
tarafından seçilmiş
0 0
Çok teşekkür ederim. Emeğinize sağlık.
1 beğenilme 0 beğenilmeme
Merhaba, bunun icin OnInit() icerisinde WorkWithPermanentSignal(true); satirini yazmaniz yeterli olacaktir. Burada backtest kapanan barın acilis zamanını canli strateji ise yeni acilan barin acilis zamanını basacagi icin 1 periyotluk fark var gibi gozukebilir ama islem fiyati ayni olacaktir.
(8,035 puan) tarafından
7,506 soru
7,510 cevap
4,405 yorum
8,691 kullanıcı