Merhaba aşağıda sizin oluşturduğunuz most için olan bakiyeye göre al sat stratejisini benim için super trende uyarlayabilir misiniz lütfen ?
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 BakiyeyeGoreAlSat : MatriksAlgo { [SymbolParameter("BTC_USDT_BIN")] public string Symbol; [Parameter(SymbolPeriod.Min5)] public SymbolPeriod SymbolPeriod; [Parameter(3)] public int Period; [Parameter(2)] public decimal Percentage; MOST most; public override void OnDataUpdate(BarDataEventArgs barData) { if (CrossAbove(most, most, 1, 0)) { FX_Alis(); } if (CrossBelow(most, most, 1, 0)) { FX_Satis(); } } public override void OnInit() { AddSymbol(Symbol, SymbolPeriod); most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential); WorkWithPermanentSignal(true); SendOrderSequential(true, Side.All); } // Gerekli başla public override void OnInitComplated() { var SymbolDetail = GetSymbolDetail(Symbol); MinSize = 1 / (decimal) Math.Pow(10, SymbolDetail.TradeFraction); FX_PiyasaTipi(); } [Output][Parameter(50)] public decimal Bakiye; [Parameter(0)] public decimal BaslangıctakiEnstrumanAdedi; [Parameter(true)] public bool KomisyonuDahilEt; [Parameter(0.001)] public decimal KomisyonOranı; public decimal MinSize; public decimal Adet; // 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 { 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]; } } public void FX_Alis() { decimal _close = FX_Sonfiyat(); if (FX_BalanceKontrolu() && LastOrderSide.Obj != Side.Buy) { // Alabileceği adet if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP) { Adet = Math.Floor(Bakiye / _close); }else { Adet = FX_MinSize(Bakiye / _close); } if (Adet != 0) { 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)) && LastOrderSide.Obj != Side.Sell) { 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); } } public override void OnOrderUpdate(IOrder order) { if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy) { var tutar = order.OrderQty * order.Price; Bakiye -= tutar; BaslangıctakiEnstrumanAdedi = 0; Adet += BaslangıctakiEnstrumanAdedi; if (KomisyonuDahilEt) { if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP) { Bakiye -= (Bakiye * KomisyonOranı); }else { Adet = FX_MinSize(Adet - Adet * KomisyonOranı); } } Debug("Alış gerçekleşti. Gerçekleşen fiyat: " + order.Price + " - Adet: " + order.OrderQty + "- Tutar: " + tutar + " - Bakiye: " + Bakiye); } if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell) { var tutar = order.OrderQty * order.Price; Bakiye += tutar; Adet = 0; BaslangıctakiEnstrumanAdedi = 0; if (KomisyonuDahilEt) { Bakiye -= (Bakiye * KomisyonOranı); } Debug("Satış gerçekleşti. Gerçekleşen fiyat: " + order.Price + " - Adet: " + order.OrderQty + " - Tutar: " + tutar + " - Kalan bakiye: " + Bakiye); } } // # Gerekli bitti } }