2 beğenilme 0 beğenilmeme
388 kez görüntülendi
Merhabalar,

Algoritmayı ilk çalıştırmaya başladığımda direk olarak yeni emir gönderiyor. Çalıştırdığım bardan itibaren al sat koşullarının oluşmasını sağlamayı nasıl yapabilirim?

Örneğin, AL EMİR şöyle olsun A>B ve C>D .   çalıştırmaya başladığım barın 20 bar öncesinde bu koşul sağlandığı için çalıştırdığım barda emir göndermektedir.

Not: Örnek stratejiler arasında bulamadım. Hangi örnekte hangi yöntemler var bir liste olsa iyi olurdu.
Algoritmik Trading kategorisinde (143 puan) tarafından | 388 kez görüntülendi
0 0
koşulu aşağıdaki gibi yazdığımızda istediğim gibi çalışır diye düşünüyorum

(CrossAbove(A;B) && C>D) || (A>B && CrossAbove(C;D))  şeklinde koşul koyduğumuzda

1 cevap

1 beğenilme 0 beğenilmeme

Kosul saglandigi anda islem yapmasini istiyorsaniz CrossAbove ve CrossBelow fonksiyonlarini kullanabilirsiniz. Bu fonksiyon CrossMov stratejisi dahil bir cok ornekte bulunmaktadir.

Eger relational operatorleri (>, <,...) kullanmaya devam etmek isterseniz (cogu durumda daha saglikli sonuc verebiliyor) o zaman sadece ilk emriniz icin bir kontrol koyabilir, stratejinin bundan sonraki emirlerde normal sekilde devam etmesini saglayabilirsiniz.

NOT: SendOrderSequential true set edilmistir. Eger emri bir al bir sat seklinde gonderilmesini istiyorsaniz bu true set edilir. Bu fonksiyon satırıni silerek veya false geçerek emirlerin sirayla gönderilmesini engelleyebilirsiniz. Fakat bu durumda da pozisyon takibi yapmazsaniz strateji her barda islem yapacaktir. Pozisyon takibi ile ilgili bu forumda bilgi bulunmaktadir.

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 APollo : MatriksAlgo
	{
		[SymbolParameter("XBT_USD_BMEX")]
		public string Symbol;
		[Parameter(1)]
		public decimal OrderQuantity;
		int FirstRun = 0;

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

		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);
			SendOrderSequential(true);
			WorkWithPermanentSignal(true);
		}

		public override void OnInitComplated()
		{

		}

		public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
		{
			var bardata = GetBarData();
			//OnDataUpdate bar acilisinda yeni data geldigi anda calistigi icin eger Ref almazsak
			//Open ve Close bar acilisinda her zaman esit oldugu icin stratejimiz calismayacaktir
			//Bu yuzden asagida Ref alarak bir onceki bar'in kapanis ve acilisina bakmamiz gerekiyor
			//(Bar acildigi anda mevcut barin acilis bilgisi mevcut fakat kapanis degeri bilinmemektedir)
			var open = Ref(bardata, OHLCType.Open, 0);
			var close = Ref(bardata, OHLCType.Close, 0);
			var prevOpen = Ref(bardata, OHLCType.Open, 1);
			var prevClose = Ref(bardata, OHLCType.Close, 1);
			Debug($"Open = {open}, Close = {close}, FirstRun = {FirstRun}");
			Debug($"Previous bar (open-1) = {prevOpen}, (close-1) = {prevClose}");
			if (close > open)
			{
				if (FirstRun == 1)
				{
					SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Buy));
					Debug("Alış emri verildi.");
				}
				else if (FirstRun == 0 && prevClose < prevOpen) //2 onceki barda A<B ise ve bu barda A>B ise durum yeni olusmus
				{
					SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Buy));
					Debug("Alış emri verildi.");
					FirstRun = 1;
				}
				else
				{
					Debug("Alis durumu olustu fakat strateji yeni calistirildigi icin gonderilmedi.");
				}
			}
			if (close < open)
			{
				if (FirstRun == 1)
				{
					SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Sell));
					Debug("Satış emri verildi.");
				}
				else if (FirstRun == 0 && prevClose > prevOpen)
				{
					SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Sell));
					Debug("Satış emri verildi.");
					FirstRun = 1;
				}
				else
				{
					Debug("Satis durumu olustu fakat strateji yeni calistirildigi icin gonderilmedi.");
				}
			}

		}
	}
}

 

(8,035 puan) tarafından
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.



8,635 soru
8,589 cevap
4,821 yorum
19,781 kullanıcı