MatriksIQ Destek
Matriks Destek
Matriks Web Destek
Matriks Mobile Destek
5 beğenilme 0 beğenilmeme
126 kez görüntülendi

Merhaba,

FFP'de alarmı sürekli aldığım için tavsiyeniz üzerine hazır stratejilerden CrossMov ile çalışma yapmak istiyordum. C# fazla bilmiyorum.

Yapmak istediğim 3 hareketli ortalama artışa geçecek (kendi bir önceki değerinin üstüne çıkacak) alım yapacağım, tersi olunca da satış olacak. Aşağı kesme olmadıkça yeni emir vermesini istemiyorum

Değişkenleri şekildeki gibi ekledim. Kodu Derle deyince hata almadım.

Ancak 1 önceki gün değeri nasıl tanımlanır bulamadım, nasıl yapabilirim?. 
Ayrıca MovMethod.Exponential yerine direk  MovMethod.Weighted ve MovMethod.Triangular yazınca ağırlılı ve üçgensel hareketli ortalama yazmış oluyor muyum?

Teşekkürler

 

bir cevap ile ilgili: Cross ile İndikatör Alarmı
Uygulama Alarmları kategorisinde (120 puan) tarafından | 126 kez görüntülendi

1 cevap

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

Merhaba,

Bildiğim kadarıyla yanıtlamaya çalışayım. 

MovMethod.Weighted ve MovMethod.Triangular yazınca ağırlılı ve üçgensel hareketli ortalama yazmış oluyor muyum? evet oluyorsunuz.

 

aşağıdaki kod daha iyisi forum yöneticileri paylaşana kadar işinizi görecektir diye düşünüyorum.

 

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 mov3 : 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.Min5)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(1)]
		public decimal SellOrderQuantity;

		[Parameter(1)]
		public decimal BuyOrderQuantity;

		[Parameter(40)]
		public int movperiod1;

		[Parameter(40)]
		public int movperiod2;

		[Parameter(200)]
		public int movperiod3;

		MOV mov1;

		MOV mov2;

		MOV movthird;

		/// <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()
		{
			mov1 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, movperiod1, MovMethod.Exponential);

			mov2 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, movperiod2, MovMethod.Weighted);

			movthird = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, movperiod3, MovMethod.Triangular);

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

		}

		Dictionary<int, decimal> m1 = new Dictionary<int, decimal>();
		Dictionary<int, decimal> m2 = new Dictionary<int, decimal>();
		Dictionary<int, decimal> m3 = new Dictionary<int, decimal>();
		decimal m1prevvalue, m2prevvalue, m3prevvalue;

		/// <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 barDataModel = GetBarData();

			var Index = barData.BarDataIndex;


			m1[Index] = mov1.CurrentValue;
			m1prevvalue = m1[Index -1];

			m2[Index] = mov2.CurrentValue;
			m2prevvalue = m2[Index -1];

			m3[Index] = movthird.CurrentValue;
			m3prevvalue = m3[Index -1];


			if (m1[Index] > m1prevvalue & m2[Index] > m2prevvalue & m3[Index] > m3prevvalue)
			{

				SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
				Debug("AlışEmri Gönderildi");

			}
			
			
			if (m1[Index] < m1prevvalue & m2[Index] < m2prevvalue & m3[Index] < m3prevvalue)
			{

				SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
				Debug("Satış Emri Gönderildi");

			}




		}

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

			}
		}
	}
}

 

(125 puan) tarafından
tarafından seçilmiş
1 0

Çok teşekkür ederim, elinize sağlık. smiley

0 0
İstediğim duruma oldukça yakın, ona uyarlayabilirim. Ama en büyük sıkıntım alarmın bar oluşur oluşmaz çalışması. Ben bar kapandıktan sonra alarmın emri tetiklemesini istiyorum.
1 0
Merhaba, OnInit icerisinde WorkWithPermanentSignal(true); yazarsaniz sadece bar acilislarinda calisir.
0 0
Merhaba,

Bar kapanışında çalışması için ne yapmalıyım acaba?
1 0
Merhaba, sistemler bar acilisina gore calisir hep. Bar kapanisi icin timer fonksiyonu ile gelistirmeler yapmaniz lazim. Bir cok durumda bar acilisi kurtariyor zaten. Ama bar kapanisini istiyorsaniz periyoda ozel kod yazmaniz gerekiyor. Hazir birsey yok
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.



305 soru
342 cevap
408 yorum
199 kullanıcı