Anladım fakat aşağıda ki algoda aynı bakiye ile işlem açıyor ve ne kadar tutar girdiysem geçmişe dönük o sembolden alabildiği kadar alıyor arasında ki fark nedir anlayamadım tam olarak ?
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 kopyadeneme : 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.Day)]
public SymbolPeriod SymbolPeriod;
[Parameter(30)]
public int ATRPeriod;
[Parameter(3)]
public int MostPeriod;
[Parameter(2)]
public decimal MostPercent;
MOST most;
ATR atr;
decimal HighAtCross, LowAtCross;
bool CrossAboveFlag, CrossBelowFlag;
// 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 Komisyon;
// strateji hisse senedi ile mi coin ile mi kullanılacak
[Parameter(true)]
public bool HisseSenediMI;
// 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()
{
atr = ATRIndicator(Symbol, SymbolPeriod, OHLCType.Close, ATRPeriod);
most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, MostPeriod, MostPercent, MovMethod.Exponential);
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);
}
/// <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 barDataModel = GetBarData();
var close = barDataCurrentValues.LastUpdate.Close;
var high = barDataCurrentValues.LastUpdate.High;
var low = barDataCurrentValues.LastUpdate.Low;
var close_print = Math.Round(close, 2);
var HighAtCross_print = Math.Round(HighAtCross, 2);
var LowAtCross_print = Math.Round(LowAtCross, 2);
var most_print = Math.Round(most.CurrentValue, 2);
var ATR_print = Math.Round(atr.CurrentValue, 2);
var ATR1_print = Math.Round(HighAtCross + atr.CurrentValue / 2, 2);
var ATR2_print = Math.Round(LowAtCross - atr.CurrentValue / 2, 2);
string header, line1;
Debug("*******************");
header = String.Format("{0,-10} {1,-10} {2,-10} {3,-10} {4,-10} {5,-10} {6,-10}", "Close", "H.@Cross", "L.@Cross", "MOST", "ATR", "High+atr", "Low-atr");
line1 = String.Format("{0,-10} {1,-10} {2,-10} {3,-10} {4,-10} {5,-10} {6,-10}", close_print, HighAtCross_print, LowAtCross_print, most_print, ATR_print, ATR1_print, ATR2_print);
Debug(header);
Debug(line1);
if (CrossAbove(barDataModel, most, OHLCType.Close))
{
HighAtCross = high;
CrossAboveFlag = true;
Debug("Price crossed ABOVE MOST");
}
if (close>most.CurrentValue && close>(HighAtCross + atr.CurrentValue / 2) && CrossAboveFlag) //c>K2+ATR(30)/2
{
Debug("Alış emri verildi.");
FX_Alis();
CrossAboveFlag = false;
}
if (CrossBelow(barDataModel, most, OHLCType.Close))
{
LowAtCross = low;
CrossBelowFlag = true;
Debug("Price crossed BELOW MOST");
}
if (close<most.CurrentValue && close<(LowAtCross - atr.CurrentValue / 2)) //c<K2-ATR(30)/2
{
Debug("Satış emri verildi.");
FX_Satis();
CrossBelowFlag = false;
}
}
// Gerekli başla
public override void OnInitComplated()
{
var SymbolDetail = GetSymbolDetail(Symbol);
if (SymbolDetail != null)
MinSize = 1 / (decimal) Math.Pow(10, SymbolDetail.TradeFraction);
else MinSize = 1;
}
// Sonfiyat çekilir.
public decimal FX_Sonfiyat()
{
var barDataModel = GetBarData();
decimal _close = Ref(barDataModel, OHLCType.Close, 0);
return _close;
}
// hisse
public bool FX_BalanceKontrolu()
{
if (HisseSenediMI)
{
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;
}
bool ? AlisMI = null;
public void FX_Alis()
{
decimal _close = FX_Sonfiyat();
if (FX_BalanceKontrolu() && AlisMI != true)
{
// Alabileceği adet
if (HisseSenediMI)
{
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;
/// <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)
{
_fiyat = order.Price;
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
{
// Tutar
Tutar = Adet * _fiyat; ;
// Güncel Bakiye
Bakiye -= Tutar;
Adet += BaslangıctakiEnstrumanAdedi;
BaslangıctakiEnstrumanAdedi = 0;
Debug("Alış gerçekleşti. Gerçekleşen fiyat: " + _fiyat + " - Adet: " + Adet + "- Tutar: " + Tutar + " - Bakiye: " + Bakiye);
if (KomisyonuDahilEt)
{
if (HisseSenediMI)
{
Bakiye -= (Bakiye * Komisyon);
}else
{
Adet = FX_MinSize(Adet - Adet * Komisyon);
}
}
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 * Komisyon);
}
AlisMI = false;
}
}
// # Gerekli bitti
}
}