Merhabalar,
Yazmak istediğiniz sistemin şablon kodu aşağıdaki gibidir.
Kendi indikatörünüzü ve al sat noktalarınızı değiştirerek stratejinizi tamamlayabilirsiniz.
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 MostBakiyeyeGoreAlSatStrategy : 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
}
}
Backtest yaparken, stratejide, Bakiye kısmına lütfen işlem yapmak istediğiniz miktarı giriniz.
Elinizde alıp satmak istediğiniz enstrümandan varsa lütfen miktarını giriniz, yoksa 0 (sıfır) yazabilirsiniz.
Dilerseniz Komisyon dahil edebilirsiniz. Eğer komisyon dahil etmek istemiyorsanız mavi işareti kaldırmanız yeterlidir. BINANCE üzerinden işlem yapıyor ve komisyonlarınız BNB üzerinden kesiliyor ise işaretlemenize gerek yoktur.
Son olarak ise Hisse Senedi Mi diye bir seçenek karşımıza çıkıyor. Eğer Hisse Senedi ile çalışıyorsanız işaretleyiniz, Coin ile çalışıyorsanız işareti kaldırınız.
İleri dediğinizde bar sayısı ve başlangıç bakiyesi girmeniz gerekmektedir. Bu kısımdaki başlangıç bakiyesi kısmına da kullanmak istediğiniz miktarı giriniz.
İyi çalışmalar.