bakiyem de btc vardı
quantitiy 1 ve 2 ye de bölerek girdim 0.025 ve 0.025 olarak satarken sattı ve usdt ye ekledi satınca.
fakat sonra al sinyali gelip otomatik emir iletince bakiye yetersiz dedi almadı yani btc'yi satınca doğal olarak usdt ye atıyor bakiyeyi fakat al sinyali gelince usdt'den neden btc alımı yapmıyor.
Neyi yanlış yapıyorum kod aşağıda.
Yardımınızı rica ederim. teşekkürler.
using AlphaTrend_IQ = Matriks.Lean.Algotrader.EmbeddedCustom54426694591230893994023139917079371111414384358.AlphaTrend_IQ;
using Matriks.AlgoTrader;
using Matriks.Data.Identifiers;
using System.ComponentModel;
using System;
using System.Collections.Generic;
using System.Linq;
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 alphadeneme : 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 Symbol1;
[Parameter(SymbolPeriod.Day)]
public SymbolPeriod SymbolPeriod1;
[Parameter(1)]
public decimal AlphatrendCoeff1;
[Parameter(14)]
public int AlphatrendPeriod1;
[Parameter(Momentum.MFI)]
public Momentum AlphatrendMomentum1;
[Parameter(100)]
public decimal OrderQuantity1;
[Parameter(100)]
public decimal OrderQuantity2;
[Parameter(true)]
public bool AcigaSatisYapilsin;
MatriksIndicator AlphaTrend_IQ;
public enum Momentum
{
MFI, RSI
}
public override void OnInit()
{
AlphaTrend_IQ = new AlphaTrend_IQ();
AlphaTrend_IQ.SetIndicatorParameters("Coeff", AlphatrendCoeff1);
AlphaTrend_IQ.SetIndicatorParameters("Period", AlphatrendPeriod1);
AlphaTrend_IQ.SetIndicatorParameters("Momentum", AlphatrendMomentum1); RegisterUserIndicator(AlphaTrend_IQ, Symbol1, SymbolPeriod1, OHLCType.Close, 5);
SendOrderSequential(true, Side.All);
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 OnInitCompleted()
{
}
/// <summary>
/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.
/// </summary>
public override void OnTimer()
{
}
/// <summary>
/// AddNewsSymbol ve AddNewsKeyword ile haberlere kayit olunmuşsa bu fonksiyon tetiklenir.
/// </summary>
/// <param name="newsId">Gelen haberin id'si</param>
/// <param name="relatedSymbols">Gelen haberin ilişkili sembolleri</param>
public override void OnNewsReceived(int newsId, List<string> relatedSymbols)
{
}
/// <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(BarDataEventArgs barData)
{
if (CrossBelow(AlphaTrend_IQ, AlphaTrend_IQ, 0, 1) && LastOrderSide.Obj != Side.Buy)
{
if (LastOrderSide.Obj == Side.All && AcigaSatisYapilsin)
{
SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy);
Debug("Alış Emri Gönderildi");
}else
{
SendMarketOrder(Symbol1, OrderQuantity1 * 2, OrderSide.Buy, includeAfterSession:false);
Debug("Alış Emri Gönderildi");
}
}
if (CrossAbove(AlphaTrend_IQ, AlphaTrend_IQ, 0, 1) && LastOrderSide.Obj != Side.Sell)
{
if (LastOrderSide.Obj == Side.All && AcigaSatisYapilsin)
{
SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Sell);
Debug("Satış Emri Gönderildi");
}else
{
SendMarketOrder(Symbol1, OrderQuantity1 * 2, OrderSide.Sell, includeAfterSession:false);
Debug("Satış Emri Gönderildi");
}
}
}
/// <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)
{
}
/// <summary>
/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
/// </summary>
public override void OnStopped()
{
}
}
public class EmbeddedCustom54426694591230893994023139917079371111414384358
{
public enum Momentum
{
MFI, RSI
}
//Ilk parametre indikatörün adı, sınıfın adıyla aynı olmalıdır.
//Ikinci parametre indikatörün Dataserisinin üzerine mi yeni pencereye mi ekleneceğini belirtir. Yeni pencere için ->IndicatorDrawingArea.NewWindow , Data Serisi için IndicatorDrawingArea.OnDataSeries
[IndicatorInformationAttribute("AlphaTrend_IQ", IndicatorDrawingArea.OnDataSeries)]
//Indikatörün çizgilerinin isimleri
[IndicatorLineInformationAttribute(new []
{
"PrevAT(0,1,2)", "AlphaTrend_IQ(0,1,2)"
})]
public class AlphaTrend_IQ : MatriksIndicator
{
//Indicator opsiyon panelinde değerleri değiştirebildiğimiz parametreler. Int, Bool, Decimal ve Enum değerleri alabilir.Tüm değişken tiplerini DefaultValue ile tanımlarız.
[DefaultValue(1)]
public decimal Coeff
{
get; set;
}
[DefaultValue(14)]
public int Period
{
get; set;
}
[DefaultValue(Momentum.MFI)]
public Momentum Momentum
{
get; set;
}
MFI mfi;
RSI rsi;
ATR atr;
public sealed override void OnInit()
{
mfi = MFIIndicator(Symbol, SymbolPeriod, Period);
rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period);
atr = ATRIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period);
}
/// <summary>
/// Seçilen sembolün bardata'ları güncellendikçe bu fonksiyon tetiklenir.
/// </summary>
/// <param name="currentBar">Güncellenen bardata'nın indexteki sırası</param>
/// <param name="inputValue">Seçilen OHLC tipine göre gelen bardata'nın o anki değeri</param>
/// <param name="barDateTime">Bardata'ya gelen güncelleme zamanı</param>
public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime)
{
var L = Instrument.SymbolBarData.Low[currentBar];
var H = Instrument.SymbolBarData.High[currentBar];
if (currentBar < Period)
{
//SetLine fonksiyonu indikatördeki noktaları kuran fonksiyondur
//Ilk paramatre indicatordeki hangi çizginin güncelleneceği bilgisidir.
//Ikinci parametre güncellenecek çizginin hangi indexinin güncelleneceği bilgisidir.
//Ucüncü parametre güncellenecek çizginin indexinin alacağı değerdir.
SetLine(0, currentBar, 0);
SetLine(1, currentBar, 0);
return ;
}
var upT = L - atr.Value[0][CurrentIndex] * Coeff;
var downT = H + atr.Value[0][CurrentIndex] * Coeff;
decimal mom = 0;
switch (Momentum)
{
case Momentum.MFI:
mom = mfi.Value[0][CurrentIndex];
break;
case Momentum.RSI:
mom = rsi.Value[0][CurrentIndex];
break;
}
var PREV = Value[1][currentBar -1];
var AlphaTrend_IQ = mom>50? (upT<PREV? PREV:upT) :(downT>PREV? PREV:downT);
SetLine(0, currentBar, Value[1][currentBar -2]);
SetLine(1, currentBar, AlphaTrend_IQ);
}
}
}
}