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