using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
using Matriks.AI;
using Matriks.AI.AiParameters;
using Matriks.AI.Data;
using Matriks.Trader.Core.TraderModels;
namespace Matriks.Lean.Algotrader
{
public class XRPSUPER : 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("XRP_USDT_BIN")]
public string Symbol;
[Parameter(SymbolPeriod.Min5)]
public SymbolPeriod SymbolPeriod1;
[Parameter(10)]
public int SupertrendPeriod1;
[Parameter(3)]
public decimal SupertrendCoeff1;
[Parameter(100)]
public decimal BuyOrderQuantity;
[Parameter(100)]
public decimal SellOrderQuantity;
[Parameter(1)]
public int Period;
[Parameter(4)]
public decimal Percentage;
SuperTrend superTrend;
int FirstRun = 0;
int realposition = 0;
[Output]
public int IlkCalisma;
[Output]
public decimal SuperTrend;
[Output]
public decimal BarData;
[Output]
public int Pozisyon;
public override void OnInit()
{
superTrend = SuperTrendIndicator(Symbol, SymbolPeriod1, SupertrendPeriod1, SupertrendCoeff1);
SendOrderSequential(false);
WorkWithPermanentSignal(true);
//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.
// SetTimerInterval(3600);
//Alttaki fonksiyon ile tanımlanan sembol ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.
//AddNewsSymbol(Symbol);
//Alttaki fonksiyon ile tanımlanan anahtar kelime ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.
//AddNewsKeyword("KAP");
}
/// <summary>
/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir
/// </summary>
public override void OnInitComplated()
{
}
public override void OnDataUpdate(BarDataCurrentValues barData)
{
var barData1 = GetBarData(Symbol, SymbolPeriod1);
var sinyalFiyatı=barData.LastUpdate.Close;
if (CrossAbove(superTrend, barData1, OHLCType.Close, 0))
{
if (FirstRun == 0)
{
SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy, includeAfterSession:false);
Debug("Alış Emri Verildi");
Debug(BuyOrderQuantity+" adet alış emri gönderilsi.");
FirstRun = 1;
}
else
{
SendMarketOrder(Symbol, BuyOrderQuantity * 2, OrderSide.Buy,includeAfterSession:false);
Debug("Alış Emri Verildi");
}
}
if (CrossBelow(superTrend, barData1, OHLCType.Close, 0))
{
if (FirstRun == 0)
{
SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell, includeAfterSession:false);
Debug("Satış Emri Verildi");
Debug(SellOrderQuantity+" adet satış emri gönderilsi.");
FirstRun = 1;
}
else
{
SendMarketOrder(Symbol, SellOrderQuantity * 2, OrderSide.Sell,includeAfterSession:false);
Debug("Satış Emri Verildi");
}
}
IlkCalisma = FirstRun;
Pozisyon=realposition;
}
/// <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)
{
//Gercek zamanli pozisyon takibi
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
{
var positionChange = order.OrderQty;
realposition += (int)positionChange;
Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
}
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
{
var positionChange = order.OrderQty;
realposition -= (int)positionChange;
Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
}
}
}
}
Back test yaptığımda en uzun hem kısa posizyon açıyor onda problem 100 adet alıyor 200 adet satıyor nette 100 adet pozisyonla ileriyor bact test sırasıda 05/08/2021 tarihinde işlemlerde bir anda 300 adet işlem gönderdiğini gösteriyor debug kayıtlarında ancak Emir bölümüne geldiğimde adet olarak 200 gözüküyor, debug da neden böyle bir hata oluşuyor