0 beğenilme 0 beğenilmeme
543 kez görüntülendi
Merhaba,

Manuel olarak kendim bir kaç Al - Sat seviyesi belirledim.

Bunun için örneğin iki farklı al sat kanalı için , fiyat bazlı Al Sat yapan strateji oluşturabilirmiyiz.

Örneğin ETH fiyatı 3000 e değince ( Bar kapanışını beklemeden ) tetikleme olsun ve PYS fiyatından Buy emri versin,

ve ETH fiyatı 4000 olunca aynı şekilde bar kapanışını beklemeden tetikleme oluşsun ve Sell emri versin.

4200 e gelirse alsın, 4500 de satsın gibi.

Ayrıca Bar kapanışlı kısmını da yazabilirmiyiz.

Teşekkürler.
Algoritmik Trading kategorisinde (32 puan) tarafından | 543 kez görüntülendi

1 cevap

1 beğenilme 0 beğenilmeme

Merhaba,

aşağıdaki stratejideki gibi alış ve satış seviyelerini belirleyip deneyebilirsiniz.

oninitcomplate methodunu kendi seviylerinize göre düzenleyiniz.

1800-> kademe

Quantity-> alış satış adedi,

orderSide-> emir yönü alış için OrderSide.Buy, satış için OrderSide.Sell olmalı

Yon-> gönderilen emrin debug çıktışı için "Alış","Satış" yazılabilir yada isteneilen başka birşey çok önemli değil

kademeList[1800] = new orderDetail{

Quantity = 2, orderSide = OrderSide.Buy, Yon = "Alış"

};

burada şunada dikkat edilmeli fiyat belirlediğiniz seviyeye eşit olmama durumlarından dolayı fark diye bir değişken var belirlediğiniz seviyenin belirlenen fark kadar aşağısı ve yukarısını dahil eder.

istediğiniz gibi çalıştığından emin olmadan canlıda çalıştırmayınız.

deneme hesabında küçük miktarlarla deneyiniz.

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 KademeliAlSAtList : 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(25)]
		public decimal fark;

		decimal aktifKademe = 0;

		public class orderDetail
		{
			public decimal Quantity;
			public OrderSide orderSide;
			public string Yon;
		}

		Dictionary<decimal, orderDetail> kademeList = new Dictionary<decimal, orderDetail>();

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

			//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()
		{
			kademeList[1800] = new orderDetail
			{
				Quantity = 2, orderSide = OrderSide.Buy, Yon = "Alış"
			};
			kademeList[1900] = new orderDetail
			{
				Quantity = 3, orderSide = OrderSide.Sell, Yon = "Satış"
			};
			kademeList[2000] = new orderDetail
			{
				Quantity = 2, orderSide = OrderSide.Buy, Yon = "Alış"
			};
			kademeList[2100] = new orderDetail
			{
				Quantity = 2, orderSide = OrderSide.Sell, Yon = "Satış"
			};
		}

		/// <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 close = barDataCurrentValues.LastUpdate.Close;

			var tut = kademeList.FirstOrDefault(x => x.Key >= close - fark && x.Key <= close + fark);

			if (tut.Value != null && aktifKademe != tut.Key)
			{
				aktifKademe = tut.Key;
				SendMarketOrder(Symbol, tut.Value.Quantity, tut.Value.orderSide);
				Debug(tut.Value.Yon + " emri gönderildi. Teiklenen fiyat: "+close);
			}

		}

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

			}
		}
	}
}

 

(15,422 puan) tarafından
7,509 soru
7,511 cevap
4,405 yorum
8,750 kullanıcı