1 beğenilme 0 beğenilmeme
1,783 kez görüntülendi
Malumunuz BTC borsalarında zaman çok önemli ve stratejim dakikalık çalışırken sonraki dakika gelipte tekrar çalışamadan(bardata dakikalık çalışıyor mınımum) ilgili koşul oluşuyor ve sonra aynı dakika içinde toparlanıyor. Haliyle istediğim şekilde alış veya satış yapamıyorum bununla ilgili neler yapabilirim. İlgilenirseniz çok müteşekkir olurum. Saygılarımla,
Algoritmik Trading kategorisinde (326 puan) tarafından | 1,783 kez görüntülendi

2 Cevaplar

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

Merhaba, ornek kod ektedir. Hazir stratejiler icerisinde Derinlik3Timer ismi ile bulabilirsiniz.

Stratejiyi OnTimer'da calistirmak icin OnInit fonksiyonu icerisinde SetTimerInterval(1); seklinde tanimlama yaparsaniz OnTimer fonksiyonu her saniye calisacaktir. Daha sonra stratejinizi public override void OnTimer() fonksiyonu icerisine yazin.

OnTimer icerisinde data cekmek icin ise orn. kapanis datasi

var barDataModel = GetBarData();
var close = barDataModel.Close[barDataModel.Close.Count - 1];

seklinde tanimlama yaparak cekebilirsiniz.

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*************************************************//
// Derinlik datasi kullanarak ZAMAN AYARLI (belirlenen kadar saniyede bir) calisir. 						//
// SADECE ilk seviye ya da 2. seviye kutusunun secilmesi gerekmektedir. 									//
// Ikisi birden ya da hicbiri secildiginde hata verecektir. Secilen seviye sayisina gore alis ve satista	//
// bekleyen emirlerin lot sayilarini karsilastirir. Ornegin ilk 2 seviye secer ve ÇARPANA 5 degeri atarsak	//
// bu 2 seviyedeki alislari ve satislari toplar, alislarin toplami satislarin toplaminin 5 katindan buyukse	// 
// alim emri gonderir, satis emri de ayni mantikla yapilir. Bilgiler debug ve output penceresine			//
// basilmaktadir.																							//

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

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

		[Parameter(1)]
		public int saniye;

		[Parameter(1)]
		public decimal SellOrderQuantity;

		[Parameter(1)]
		public decimal BuyOrderQuantity;

		[Parameter(true)]
		public bool ilk_Seviye;

		[Parameter(false)]
		public bool ilk_2_Seviye;

		[Parameter(8)]
		public float çarpan;

		[Output]
		public float SatisUstKademe_Fiyat;
		[Output]
		public float SatisUstKademe1_Miktar;
		[Output]
		public float SatisUstKademe2_Miktar;
		[Output]
		public float AlisUstKademe_Fiyat;
		[Output]
		public float AlisUstKademe1_Miktar;
		[Output]
		public float AlisUstKademe2_Miktar;

		List<SessionTimeInfo> sessiontime;

		/// <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);
			AddSymbolMarketDepth(Symbol);

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

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

		public override void OnTimer()
		{
			var barDataModel = GetBarData();
			var depths = GetMarketDepth(Symbol);
			//var sessiontime = new SessionTimeInfo GetSessionTimes(Symbol);
			//var sessiontime = GetSessionTimes(Symbol);
			var sessiontime = GetSessionTimes(Symbol);
			//var timespan = TimeSpan.FromMinutes.TotalDays;
			var endhour = sessiontime[0].End.Hours;
			var endminute = sessiontime[0].End.Minutes;
			var endsecond = sessiontime[0].End.Seconds;

			var asktime = depths.AskRows[1].DateTime;
			var bardatatime = barDataModel.Time;

			float BO_size = (float) depths.AskRows[0].Size;
			float BO1_size = (float) depths.AskRows[1].Size;
			float BO = (float) depths.AskRows[0].Price;
			float BO1 = (float) depths.AskRows[1].Price;

			float BB_size = (float) depths.BidRows[0].Size;
			float BB1_size = (float) depths.BidRows[1].Size;
			float BB = (float) depths.BidRows[0].Price;
			float BB1 = (float) depths.BidRows[1].Price;

			Debug("best offer " + BO + " size = " + BO_size + ", " + BO1_size);
			Debug("best bid " + BB + " size = " + BB_size + ", " + BB1_size);
			Debug(endhour);

			SatisUstKademe_Fiyat = BO;
			SatisUstKademe1_Miktar = BO_size;
			SatisUstKademe2_Miktar = BO1_size;

			AlisUstKademe_Fiyat = BB;
			AlisUstKademe1_Miktar = BB_size;
			AlisUstKademe2_Miktar = BB1_size;

			if (DateTime.Now.TimeOfDay.Hours < endhour || (DateTime.Now.TimeOfDay.Hours == endhour && DateTime.Now.TimeOfDay.Minutes < endminute)
				|| (DateTime.Now.TimeOfDay.Hours == endhour && DateTime.Now.TimeOfDay.Minutes == endminute
				&& DateTime.Now.TimeOfDay.Seconds < endsecond))
			{
				if (ilk_Seviye == true && ilk_2_Seviye == false)
				{
					Debug("Current Ratio(BB_1/BO_1 size) = " + Math.Round(BB_size / BO_size, 2));
					Debug("*******************************************************");
					if (BO_size > çarpan * BB_size)
					{
						SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
						Debug("Satış Emri Gönderildi");
					}

					if (BB_size > çarpan * BO_size)
					{
						SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
						Debug("Alış Emri Gönderildi");
					}
				}

				if (ilk_Seviye == false && ilk_2_Seviye == true)
				{
					Debug("Current Ratio(BB_2/BO_2 size) = " + Math.Round((BB_size + BB1_size) / (BO_size + BO1_size), 2));
					Debug("*******************************************************");
					if ((BO_size + BO1_size) > çarpan * (BB_size + BB1_size))
					{
						SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
						Debug("Satış Emri Gönderildi");
					}

					if ((BB_size + BB1_size) > çarpan * (BO_size + BO1_size))
					{
						SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
						Debug("Alış Emri Gönderildi");
					}
				}
				if ((ilk_Seviye == false && ilk_2_Seviye == false) || (ilk_Seviye == true && ilk_2_Seviye == true))
				{
					Debug("ERROR: 1 YA DA 2 SEVIYE KULLANILMALIDIR");
				}
			}
			else
			{
				Debug("Sürekli işlem seansı kapanmıştır. Stratejide alım/satım emir iletimi durduruldu");
			}
		}


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

		}
	}
}

 

(8,035 puan) tarafından
tarafından düzenlendi
0 0
error CS0019: * işleci 'IDıctıonary<int,decimal>' ve 'double' türündeki işlenenlere uygulanamaz. Hatası alıyorum. Kod ise:

var GIRIS = barDataModel.Close;

Debug("GİRİŞŞ " + GIRIS);

var Yuzde_azalan = (GIRIS - (GIRIS * 0.01));   // hata bu kodda

Debug("Yuzde_azalan " + Yuzde_azalan);

Yuzde_artan = (GIRIS + (GIRIS * 0.01);     // hata ve bu kodda

Debug("Yuzde_artan " + Yuzde_artan);
0 0
var barDataModel = GetBarData();
var GIRIS = barDataModel.Close[barDataModel.Close.Count - 1];
Debug("GİRİŞŞ " + GIRIS);			
var Yuzde_azalan = (GIRIS - (GIRIS * 0.01m));			
Debug("Yuzde_azalan " + Yuzde_azalan);			
var Yuzde_artan = (GIRIS + (GIRIS * 0.01m));			
Debug("Yuzde_artan " + Yuzde_artan);

 

2 beğenilme 0 beğenilmeme

Merhaba,

WorkWithPermanentSignal(false); 

ile çalıştırırsaniz barın degismesini beklemeden her işlem olduğunda stratejinin çalışmasını sağlayabilirsiniz. Ayrıca timer kullanarak saniyede bir de işlem yapabilirsiniz.


Seçkin Durgay
(4,631 puan) tarafından
1 0
Çok teşekkürler, ellerinize sağlık
0 0
İyi günler, her işlemde strratejimi çalıştırdığımda anlık çok fazla işlem olduğunda MatrıksİQ kasıyor ve donuyor. Stratejımı çalıştırırken bardatadan fiyat vb. veri çekiyorum. Ancak ontımer de 1 saniyelik çalıştırmak istediğimde veri çekemiyorum. Acaba örnek olarak ontımer kullanıp stratejımı(OnDataUpdate(BarDataEventArgs barData) de tanımlanmış) saniyelik olarak çalıştırmayı gösteren ornek kod yazmanız mumkun mu?

 

Saniyede çalışsın ve bardatadan saniyelik çalıştıgın da fiyat çekmesi yeterli örnek kodda,şimdiden teşekkürler
0 0
Merhaba, yukarida orneklerle aciklamaya calistim.
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.



7,509 soru
7,511 cevap
4,405 yorum
8,717 kullanıcı