Merhaba,
Kar al ve zarar durdur eklenmiş hali aşağıdadır.
İyi çalışmalar
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 KriptoBakiye : 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("BTC_USDT_BIN")]
public string Symbol;
[Parameter(SymbolPeriod.Min15)]
public SymbolPeriod SymbolPeriod;
[Parameter(100)]
public decimal Bakiye;
[Parameter(20)]
public int BolPeriod;
[Parameter(2)]
public decimal StandartDeviation;
[Parameter(3)]
public decimal Kar_AL_Yuzde;
[Parameter(5)]
public decimal Stop_Yuzde;
BOLLINGER bollinger;
[Output]
public decimal SonBakiye;
/// <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()
{
bollinger = BollingerIndicator(Symbol, SymbolPeriod, OHLCType.Close, BolPeriod, StandartDeviation, MovMethod.Simple);
// stochasticRSI = StochasticRSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, RsiPeriod, StocPeriod, DPeriod, KPeriod, MovMethod.E);
AddSymbol(Symbol, SymbolPeriod);
WorkWithPermanentSignal(true);
//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);
}
int pozisyon = 0;
bool firstrun = true;
decimal Adet = 0;
/// <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 bardata = GetBarData();
var SonFiyat = barDataCurrentValues.LastUpdate.Close;
if (firstrun) SonBakiye = Bakiye;
var IslemAdedi = SonBakiye / SonFiyat;
IslemAdedi = Math.Truncate(IslemAdedi * 10000) / 10000;
if (CrossAbove(bardata, bollinger.BollingerDown, OHLCType.Close))
{
Debug("Alış emri verildi.");
if (pozisyon == 0 && IslemAdedi >= 0.0001m)
{
pozisyon = 1;
SonBakiye = 0;
Adet = IslemAdedi;
SendMarketOrder(Symbol, IslemAdedi, OrderSide.Buy);
TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_AL_Yuzde);
StopLoss(Symbol, SyntheticOrderPriceType.Percent, Stop_Yuzde);
}else if (pozisyon == -1)
{
pozisyon = 0;
SonBakiye = Bakiye;
SendMarketOrder(Symbol, Adet, OrderSide.Buy);
TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_AL_Yuzde);
StopLoss(Symbol, SyntheticOrderPriceType.Percent, Stop_Yuzde);
Adet = 0;
}
}
if (CrossBelow(bardata, bollinger.BollingerDown, OHLCType.Close))
{
Debug("Satış emri verildi.");
if (pozisyon == 0 && IslemAdedi >= 0.0001m)
{
pozisyon = -1;
SonBakiye = 0;
Adet = IslemAdedi;
SendMarketOrder(Symbol, IslemAdedi, OrderSide.Sell);
TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_AL_Yuzde);
StopLoss(Symbol, SyntheticOrderPriceType.Percent, Stop_Yuzde);
}else if (pozisyon == 1)
{
pozisyon = 0;
SonBakiye = Bakiye;
SendMarketOrder(Symbol, Adet, OrderSide.Sell);
TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_AL_Yuzde);
StopLoss(Symbol, SyntheticOrderPriceType.Percent, Stop_Yuzde);
Adet = 0;
}
}
firstrun = false;
}
/// <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)
{
}
}
}