Merhaba, aşağıda ki kodlama sayesinde belirlenen bakiye ile işleme girmesi sağlanabilir.
Dilerseniz, bu örneği inceleyebilirsiniz.
Örnek hakkında sorularınız olursa iqdestek@matriksdata.com adresine mail atabilirsiniz.
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks;
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;
//========================================== by KRIPEX ==========================================//
// 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. //
// ***** Bu strtaeji Bist ve Binance Spot piyasası için uygundur. //
namespace Matriks.Lean.Algotrader
{
public class BAKIYEYE_GORE_AL_SAT : 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("THYAO")]
public string Symbol1;
[Parameter(SymbolPeriod.Min5)]
public SymbolPeriod SymbolPeriod1;
[Parameter(3)]
public int MostPeriod1;
[Parameter(2)]
public decimal MostPercentage1;
[Parameter(MovMethod.E)]
public MovMethod MostMovMethod1;
MOST most;
public override void OnInit()
{
//_________________ BURAYI KOPYALA ______________//
AddSymbol(Symbol1, SymbolPeriod1);
//_________________ BURAYI KOPYALA ______________//
most = MOSTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, MostPeriod1, MostPercentage1, MostMovMethod1);
SendOrderSequential(true, Side.Buy);
WorkWithPermanentSignal(true);
//_________________ BURAYI KOPYALA ______________//
// Gerekli - Timestamp
SetTimerInterval(1);
// #Gerekli - Timestamp
//_________________ BURAYI KOPYALA ______________//
//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");
}
//_________________ BURAYI KOPYALA ______________//
// Gerekli - Bakiyeye Göre
[Output][Parameter(50)][RestoreLastValueOnResume]
public decimal Bakiye;
[Parameter(0)][RestoreLastValueOnResume]
public decimal BaslangıctakiEnstrumanAdedi;
[Parameter(false)]
public bool KomisyonuDahilEt;
[Parameter(0.001)]
public decimal KomisyonOranı;
[RestoreLastValueOnResume]
public decimal Adet;
decimal priceStep, quantityStep = 1;
int exchangeID;
//_________________ BURAYI KOPYALA ______________//
/// <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()
{
//_________________ BURAYI KOPYALA ______________//
var symbolDetail = GetSymbolDetail(Symbol1);
if (symbolDetail != null)
{
exchangeID = symbolDetail.ExchangeDetail.ExchangeID;
var close = FX_Sonfiyat(Symbol1); ;
if (exchangeID != (int) ExchangeType.Ise && exchangeID != (int) ExchangeType.Viop)
{
priceStep = 1 / (decimal) Math.Pow(10, symbolDetail.DecimalCount);
quantityStep = 1 / (decimal) Math.Pow(10, symbolDetail.TradeFraction);
}else
{
priceStep = GetPriceStepForBistViop(Symbol1, close);
}
}
//_________________ BURAYI KOPYALA ______________//
}
//_________________ BURAYI KOPYALA ______________//
public bool FX_BalanceKontrolu(string sembol)
{
bool _sonuc = false;
if ((int) ExchangeType.Ise == exchangeID)
{
_sonuc = (Math.Floor(Bakiye / FX_Sonfiyat(sembol)) >0) ? true: false;
}else if ((int) ExchangeType.Crypto == exchangeID)
{
_sonuc = Bakiye >= 10.5m? true:false;
}
return _sonuc;
}
public void FX_Alis(string sembol)
{
decimal _close = FX_Sonfiyat(sembol);
decimal _adet = 0;
if (FX_BalanceKontrolu(sembol) && LastOrderSide.Obj != Side.Buy)
{
if ((int) ExchangeType.Ise == exchangeID)
{
_adet = Math.Floor(Bakiye / _close);
}else if ((int) ExchangeType.Crypto == exchangeID)
{
_adet = FX_LotAyarla(Bakiye / _close);
}
if (_adet != 0)
{
SendMarketOrder(sembol, _adet, (OrderSide.Buy));
Debug("Alış sinyali oluştu. Sinyal fiyatı: " + _close + " - Adet: " + _adet);
}
}else
{
Debug("XXXXX - Alış sinyali oluştu ama emir gönderilmedi. Bakiye: " + Bakiye);
Debug(" 1 - Bakiyenin işlem açmak için yeterli olup olmadığınız kontrol ediniz.");
Debug(" 2 - Enstrümanın Bist ya da Binance Spot piyasasından olup olmadığını kontrol ediniz.");
}
}
public void FX_Satis(string sembol)
{
if (((Adet != 0 || BaslangıctakiEnstrumanAdedi != 0)) && LastOrderSide.Obj != Side.Sell)
{
Adet += BaslangıctakiEnstrumanAdedi;
SendMarketOrder(sembol, Adet, (OrderSide.Sell));
Debug("Satış sinyali oluştu. Sinyal fiyatı: " + FX_Sonfiyat(sembol) + " - Adet: " + Adet);
}else
{
Debug("Satış sinyali oluştu. Satılacak enstrüman yok. Bakiye: " + Bakiye);
}
}
public decimal FX_LotAyarla(decimal quantity)
{
return Math.Floor(quantity / quantityStep) * quantityStep;
}
public decimal FX_FiyatAyarla(decimal price)
{
return Math.Floor(price / priceStep) * priceStep;
}
public decimal FX_Sonfiyat(string sembol)
{
return GetSelectedValueFromBarData(GetBarData(sembol, SymbolPeriod1), OHLCType.Close);
}
// # Gerekli - Bakiyeye Göre
// Gerekli - Timestamp
public class OrderListTimestamp
{
public string ID;
public string Sembol;
public decimal Adet;
public decimal Fiyat;
public OrdType EmirTipi;
public OrderSide orderSide;
public string EmirYonu;
public DateTime TetiklenmeZamani;
public int Sayac;
public bool AktifMI;
}
Dictionary<string, OrderListTimestamp> timestampDict = new Dictionary<string, OrderListTimestamp>();
[Parameter(3)]
public int AyniEmirKacSeferGonderilsin;
[Parameter(10)]
public int KacSaniyeSonraTekrarGonderilsin;
string orderIDTimestamp = string.Empty;
//_________________ BURAYI KOPYALA ______________//
/// <summary>
/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.
/// </summary>
public override void OnTimer()
{
//_________________ BURAYI KOPYALA ______________//
if ((int) ExchangeType.Crypto == exchangeID)
{
var tutt = timestampDict.Where(x => x.Value.AktifMI == true && DateTime.Now >= x.Value.TetiklenmeZamani);
if (tutt.Count() >0)
{
foreach (var deger in tutt)
{
LastOrderSide.Obj = deger.Value.orderSide == OrderSide.Buy? Side.Sell:Side.Buy;
if (deger.Value.EmirTipi.Obj == OrdType.Limit)
{
orderIDTimestamp = SendLimitOrder(deger.Value.Sembol, deger.Value.Adet, deger.Value.orderSide, deger.Value.Fiyat);
Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
}else if (deger.Value.EmirTipi.Obj == OrdType.Market)
{
orderIDTimestamp = SendMarketOrder(deger.Value.Sembol, deger.Value.Adet, deger.Value.orderSide);
Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
}
deger.Value.ID = orderIDTimestamp;
deger.Value.AktifMI = false;
timestampDict[orderIDTimestamp] = deger.Value;
timestampDict.Remove(deger.Key);
}
}
}
//_________________ BURAYI KOPYALA ______________//
}
/// <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 (CrossAbove(most, most, 1, 0))
{
//_________________ BURAYI KOPYALA ______________//
// Gerekli - Bakiyeye Göre
FX_Alis(Symbol1);
// # Gerekli - Bakiyeye Göre
//_________________ BURAYI KOPYALA ______________//
}
if (CrossBelow(most, most, 1, 0))
{
//_________________ BURAYI KOPYALA ______________//
// Gerekli - Bakiyeye Göre
FX_Satis(Symbol1);
// # Gerekli - Bakiyeye Göre
//_________________ BURAYI KOPYALA ______________//
}
}
/// <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)
{
//_________________ BURAYI KOPYALA ______________//
// Gerekli - Bakiyeye Göre
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
{
var tutar = order.OrderQty * order.Price;
Bakiye -= tutar;
Adet += BaslangıctakiEnstrumanAdedi + order.OrderQty;
BaslangıctakiEnstrumanAdedi = 0;
if (KomisyonuDahilEt)
{
if ((int) ExchangeType.Ise == exchangeID)
{
Bakiye -= (Bakiye * KomisyonOranı);
}else if ((int) ExchangeType.Crypto == exchangeID)
{
Adet = FX_LotAyarla(Adet - (Adet * KomisyonOranı));
}
}
Debug("================ ALIŞ GERÇEKLEŞTİ ================");
Debug("Adet: " + order.OrderQty + " Fiyat: " + order.Price + " Tutar: " + tutar);
Debug("Bakiye: " + Bakiye + " Toplam Adet: " + Adet);
}
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("================ SATIŞ GERÇEKLEŞTİ ================");
Debug("Adet: " + order.OrderQty + " Fiyat: " + order.Price);
Debug("Tutar: " + tutar + " - Kalan bakiye: " + Bakiye);
}
// # Gerekli - Bakiyeye Göre
// Gerekli - Timestamp
if (order.OrdStatus.Obj == OrdStatus.Filled)
{
if (timestampDict.ContainsKey(order.CliOrdID))
{
timestampDict.Remove(order.CliOrdID);
Debug("Timestamp hatasına takılan emriniz gerçekleşti.");
}
}
if (order.OrdStatus.Obj == OrdStatus.Rejected)
{
if (!timestampDict.ContainsKey(order.CliOrdID))
{
OrderListTimestamp orderList = new OrderListTimestamp();
orderList.ID = order.CliOrdID;
orderList.Sembol = order.Symbol;
orderList.Adet = order.OrderQty;
orderList.Fiyat = order.Price;
orderList.EmirTipi = order.OrdType;
orderList.TetiklenmeZamani = DateTime.Now;
orderList.Sayac = 0;
orderList.AktifMI = false;
if (order.Side.Obj == Side.Buy)
{
orderList.orderSide = OrderSide.Buy;
orderList.EmirYonu = "Alış";
}else