Merhabalar,
Aşağıda sizlere yardımcı olabileceğimiz bir şablon örneği paylaştık.
Kendi belirlediğiniz koşulları ekleyerek test edebilirsiniz.
Lütfen inceleyiniz.
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============================================//
// Başlangıçta belirlenen bakiyeye ve elinizdeki estrüman adetine göre strateji çalışmaya başlar.//
// Alış sinyali oluştuysa bakiye varsa bakiye kadar alış yapar. //
// Satış sinyali oluştuysa pozisyonunuz varsa hepsini satar. //
// Backtest yapıp test hesablarından denedikten sonra küçük miktarlarla gerçek hesapta deneyiniz //
namespace Matriks.Lean.Algotrader
{
public class MostBakiye : 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(3)]
public int Period;
[Parameter(2)]
public decimal Percentage;
MOST most;
// Gerekli başla
// Başlangıç bakiyesi
[Output][Parameter(1000)]
public decimal Bakiye;
// Başlangıçta elinde olan adet
[Parameter(0)]
public decimal BaslangıctakiEnstrumanAdedi;
[Parameter(true)]
public bool KomisyonuDahilEt;
[Parameter(0.001)]
public decimal KomisyonOranı;
// Kripto için geçerli
public decimal MinSize;
// Tutar
public decimal Tutar;
// Al sat adedi
[Output]
public decimal Adet;
// Bakiye kontrolü-sil
public bool BakiyeKontrolu = true;
// #Gerekli bitti
/// <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);
most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential);
WorkWithPermanentSignal(true);
SendOrderSequential(true, Side.All);
}
public override void OnDataUpdate(BarDataEventArgs barData)
{
if (CrossAbove(most, most, 1, 0))
{
FX_Alis();
}
if (CrossBelow(most, most, 1, 0))
{
FX_Satis();
}
}
// Gerekli başla
public override void OnInitComplated()
{
var SymbolDetail = GetSymbolDetail(Symbol);
MinSize = 1 / (decimal) Math.Pow(10, SymbolDetail.TradeFraction);
FX_PiyasaTipi();
}
// Sonfiyat çekilir.
public decimal FX_Sonfiyat()
{
var barDataModel = GetBarData();
decimal _close = Ref(barDataModel, OHLCType.Close, 0);
return _close;
}
// hisse
public bool FX_BalanceKontrolu()
{
if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)
{
return (Math.Floor(Bakiye / FX_Sonfiyat()) >0) ? true: false;
}else
{
return true;
}
}
// kriptolar için minimum değişim miktarı
public decimal FX_MinSize(decimal quantity)
{
return Math.Truncate((quantity - (quantity % MinSize)) / MinSize) * MinSize;
}
[Output]
public string Sembol1 = "";
[Output]
public string Sembol2 = "";
enum PiyasaTipleri
{
BISTPP,
BISTVIOP,
KRIPTOBINANCE,
KRIPTOBINANCEFUTURE,
KRIPTOBITMEX,
KRIPTOBTCTURK
}
PiyasaTipleri piyasaTipleri = PiyasaTipleri.BISTPP;
public void FX_PiyasaTipi()
{
Sembol1 = Symbol;
var SymbolDetail = GetSymbolDetail(Symbol);
if (SymbolDetail.ExchangeDetail.ExchangeCode == PiyasaTipleri.BISTPP.ToString())
{
piyasaTipleri = PiyasaTipleri.BISTPP;
}else if (SymbolDetail.ExchangeDetail.ExchangeCode == PiyasaTipleri.BISTVIOP.ToString())
{
piyasaTipleri = PiyasaTipleri.BISTVIOP;
}else if (SymbolDetail.ExchangeDetail.ExchangeCode == "")
{
var _split = Symbol.Split('_');
if (_split.Count() == 3)
{
if (Symbol.Split('_')[2].Contains("BIN"))
{
piyasaTipleri = PiyasaTipleri.KRIPTOBINANCE;
} else if (Symbol.Split('_')[2].Contains("FBIN"))
{
piyasaTipleri = PiyasaTipleri.KRIPTOBINANCEFUTURE;
}else if (Symbol.Split('_')[2].Contains("BMEX"))
{
piyasaTipleri = PiyasaTipleri.KRIPTOBITMEX;
}
}else
{
piyasaTipleri = PiyasaTipleri.KRIPTOBTCTURK;
}
Sembol1 = Symbol.Split('_')[0];
Sembol2 = Symbol.Split('_')[1];
}
}
bool ? AlisMI = null;
public void FX_Alis()
{
decimal _close = FX_Sonfiyat();
if (FX_BalanceKontrolu() && AlisMI != true)
{
// Alabileceği adet
if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)
{
Adet = Math.Floor(Bakiye / _close);
}else
{
Adet = FX_MinSize(Bakiye / _close);
}
SendMarketOrder(Symbol, Adet, (OrderSide.Buy));
Debug("Alış sinyali oluştu. Sinyal fiyatı: " + _close + " - Adet: " + Adet);
}else
{
Debug("Alış sinyali oluştu. Bakiyeniz yetersiz. Bakiye: " + Bakiye);
}
}
public void FX_Satis()
{
if (((Adet != 0 || BaslangıctakiEnstrumanAdedi != 0)) && AlisMI != false)
{
Adet += BaslangıctakiEnstrumanAdedi;
SendMarketOrder(Symbol, Adet, (OrderSide.Sell));
Debug("Satış sinyali oluştu. Sinyal fiyatı: " + FX_Sonfiyat() + " - Adet: " + Adet);
}else
{
Debug("Satış sinyali oluştu. Satılacak enstrüman yok. Bakiye: " + Bakiye);
}
}
decimal _fiyat;
public override void OnOrderUpdate(IOrder order)
{
_fiyat = order.Price;
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
{
// Tutar
Tutar = Adet * _fiyat; ;
// Güncel Bakiye
Bakiye -= Tutar;
BaslangıctakiEnstrumanAdedi = 0;
Debug("Alış gerçekleşti. Gerçekleşen fiyat: " + _fiyat + " - Adet: " + Adet + "- Tutar: " + Tutar + " - Bakiye: " + Bakiye);
Adet += BaslangıctakiEnstrumanAdedi;
if (KomisyonuDahilEt)
{
if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)
{
Bakiye -= (Bakiye * KomisyonOranı);
}else
{
Adet = FX_MinSize(Adet - Adet * KomisyonOranı);
}
}
AlisMI = true;
}
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
{
// Tutar
Tutar = Adet * _fiyat;
// Güncel Bakiye
Bakiye += Tutar;
Debug("Satış gerçekleşti. Gerçekleşen fiyat: " + _fiyat + " - Adet: " + Adet + " - Tutar: " + Tutar + " - Kalan bakiye: " + Bakiye);
Adet = 0;
BaslangıctakiEnstrumanAdedi = 0;
if (KomisyonuDahilEt)
{
Bakiye -= (Bakiye * KomisyonOranı);
}
AlisMI = false;
}
}
// # Gerekli bitti
}
}
İyi çalışmalar.