1 beğenilme 0 beğenilmeme
510 kez görüntülendi
Aşağıda verdiğim stratejide başlangıç bakiyesini 10.000 tl olarak giriyorum. ilk alış işleminde 10.000 tl kadar bir alım gerçekleşiyor, lakin örneğin satış işleminde 5.000 tl kar yaptı ise toplam bakiye 15.000 tl olduğu için bu seferki alış işlemi 15.000 tl lik oluyor. Bunu nasıl her seferinde 10.000 tl de sabit kalacak şekilde ayarlayacağız..??

Teşekkür ederim...

-----------------------------------------------------------------------------------------------------

using System;

using System.Collections.Generic;

using System.Linq;

using Matriks.Data.Symbol;

using Matriks.Engines;

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;

 

//========================================== 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 SablonBakiyeyeGoreAlSatV1 : MatriksAlgo

{

[SymbolParameter("FENER")]

public string Symbol;

 

[Parameter(SymbolPeriod.Min30)]

public SymbolPeriod SymbolPeriod;

 

[Parameter(22)]

public int TOTTPeriod;

 

[Parameter(3.4)]

public decimal TOTTOpt;

 

[Parameter(0.001d)]

public decimal TwinOttCoef;

 

[Parameter(MovMethod.Variable)]

public MovMethod TottMovMethod;

 

TOTT tott;

 

public override void OnDataUpdate(BarDataEventArgs barData)

{

if (CrossAbove(tott.Mov, tott.OttUp))

{

FX_Alis(Symbol);

}

 

if (CrossBelow(tott.Mov, tott.OttDown))

{

FX_Satis(Symbol);

}

}

 

public override void OnInit()

{

AddSymbol(Symbol, SymbolPeriod);

 

tott = TOTTIndicator(Symbol, SymbolPeriod, OHLCType.Close, TOTTPeriod, TOTTOpt, TwinOttCoef, TottMovMethod);

 

 

WorkWithPermanentSignal(true);

 

SendOrderSequential(true, Side.All);

 

// Gerekli - Timestamp

SetTimerInterval(1);

// #Gerekli - Timestamp

}

 

// Gerekli - Bakiyeye  Göre

[Output][Parameter(50)]

public decimal Bakiye;

 

[Parameter(0)]

public decimal BaslangıctakiEnstrumanAdedi;

 

[Parameter(true)]

public bool KomisyonuDahilEt;

 

[Parameter(0.0003)]

public decimal KomisyonOranı;

 

public decimal Adet;

 

decimal priceStep;

double tradeFraction;

double decimalCount;

int exchangeID;

 

public override void OnInitComplated()

{

var symbolDetail = GetSymbolDetail(Symbol);

 

if (symbolDetail != null)

{

tradeFraction = symbolDetail.TradeFraction;

decimalCount = symbolDetail.DecimalCount;

exchangeID = symbolDetail.ExchangeDetail.ExchangeID;

}

}

 

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)

{

double _kuvvet = Math.Pow(10, tradeFraction);

return (decimal)(Math.Truncate((double) quantity * _kuvvet) / _kuvvet);

}

 

public decimal FX_FiyatAyarla(decimal price)

{

double _kuvvet = Math.Pow(10, decimalCount);

return (decimal)(Math.Truncate((double) price * _kuvvet) / _kuvvet);

}

 

public decimal FX_Sonfiyat(string sembol)

{

return GetSelectedValueFromBarData(GetBarData(sembol, SymbolPeriod), 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;

 

public override void OnTimer()

{

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);

 

}

}

}

}

// #Gerekli - Timestamp

 

public override void OnOrderUpdate(IOrder order)

{

// 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

{

orderList.orderSide = OrderSide.Sell;

orderList.EmirYonu = "Satış";

}

 

timestampDict[order.CliOrdID] = orderList;

}

 

if (order.Text.Contains("Timestamp"))

{

if (timestampDict.ContainsKey(order.CliOrdID))

{

if (timestampDict[order.CliOrdID].Sayac < AyniEmirKacSeferGonderilsin)

{

timestampDict[order.CliOrdID].TetiklenmeZamani = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);

timestampDict[order.CliOrdID].Sayac++;

timestampDict[order.CliOrdID].AktifMI = true;

 

Debug("Emir Timestamp hatasından dolayı iptal oldu tekrar gönderilecek");

}else

{

timestampDict.Remove(order.CliOrdID);

Debug("Aynı emir üst üste " + AyniEmirKacSeferGonderilsin + " defa gönderildi.");

}

}

}

}

// #Gerekli - Timestamp

}

}

}
Algoritmik Trading kategorisinde (47 puan) tarafından | 510 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar,

Sabit bakiye kullanarak çalıştırabileceğiniz strateji aşağıda verilmiştir.

Lütfen inceleyiniz.

***STRATEJİLERİ TEST/DENEME ORTAMINDA SINAMADAN VE SİZİN İSTEDİĞİNİZ ŞEKİLDE ÇALIŞTIĞINA EMİN OLMADAN GERÇEK ORTAMDA HİÇBİR ZAMAN ÇALIŞTIRMAYINIZ ***

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
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 SablonSabitBakiye : MatriksAlgo
	{
		[SymbolParameter("GARAN")]
		public string Symbol;

		[Parameter(SymbolPeriod.Min5)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(22)]
		public int TOTTPeriod;

		[Parameter(3.4)]
		public decimal TOTTOpt;

		[Parameter(0.001d)]
		public decimal TwinOttCoef;

		[Parameter(MovMethod.Variable)]
		public MovMethod TottMovMethod;

		TOTT tott;

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (CrossAbove(tott.Mov, tott.OttUp))
			{
				FX_Alis();
			}

			if (CrossBelow(tott.Mov, tott.OttDown))
			{
				FX_Satis();
			}
		}

		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);
			tott = TOTTIndicator(Symbol, SymbolPeriod, OHLCType.Close, TOTTPeriod, TOTTOpt, TwinOttCoef, TottMovMethod);

			WorkWithPermanentSignal(true);

			SendOrderSequential(true, Side.Buy);
		}

		// Gerekli başla		
		public override void OnInitComplated()
		{
			var SymbolDetail = GetSymbolDetail(Symbol);
			MinSize = 1 / (decimal) Math.Pow(10, SymbolDetail.TradeFraction);
			FX_PiyasaTipi();
		}

		[Output][Parameter(250)]
		public decimal AlisTutari;

		[Parameter(true)]
		public bool KomisyonuDahilEt;

		[Parameter(0.001)]
		public decimal KomisyonOranı;

		public decimal MinSize;
		public int PiyasaID;

		public decimal Adet;

		// Sonfiyat çekilir.
		public decimal FX_Sonfiyat()
		{
			var barDataModel = GetBarData();
			decimal _close = Ref(barDataModel, OHLCType.Close, 0);
			return _close;
		}

		// hisse 
		public bool FX_BalanceKontrolu()
		{
			if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)
			{
				return (Math.Floor(AlisTutari / 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;
		}

		[Output]
		public string Sembol1 = "";

		[Output]
		public string Sembol2 = "";

		enum PiyasaTipleri
		{
			BISTPP,
			BISTVIOP,
			KRIPTOBINANCE,
			KRIPTOBINANCEFUTURE,
			KRIPTOBITMEX,
			KRIPTOBTCTURK
		}

		PiyasaTipleri piyasaTipleri = PiyasaTipleri.BISTPP;

		public void FX_PiyasaTipi()
		{
			Sembol1 = Symbol;

			var SymbolDetail = GetSymbolDetail(Symbol);

			if (SymbolDetail.ExchangeDetail.ExchangeCode == PiyasaTipleri.BISTPP.ToString())
			{
				piyasaTipleri = PiyasaTipleri.BISTPP;
			}else if (SymbolDetail.ExchangeDetail.ExchangeCode == PiyasaTipleri.BISTVIOP.ToString())
			{
				piyasaTipleri = PiyasaTipleri.BISTVIOP;
			}else
			{
				var _split = Symbol.Split('_');
				if (_split.Count() == 3)
				{
					if (Symbol.Split('_')[2].Contains("BIN"))
					{
						piyasaTipleri = PiyasaTipleri.KRIPTOBINANCE;
					} else if (Symbol.Split('_')[2].Contains("FBIN"))
					{
						piyasaTipleri = PiyasaTipleri.KRIPTOBINANCEFUTURE;
					}else if (Symbol.Split('_')[2].Contains("BMEX"))
					{
						piyasaTipleri = PiyasaTipleri.KRIPTOBITMEX;
					}
				}else
				{
					piyasaTipleri = PiyasaTipleri.KRIPTOBTCTURK;
				}
				Sembol1 = Symbol.Split('_')[0];
				Sembol2 = Symbol.Split('_')[1];
			}
		}

		public void FX_Alis()
		{
			decimal _close = FX_Sonfiyat();

			if (FX_BalanceKontrolu() && LastOrderSide.Obj != Side.Buy)
			{
				// Alabileceği adet
				if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)
				{
					Adet = Math.Floor(AlisTutari / _close);
				}else
				{
					Adet = FX_MinSize(AlisTutari / _close);
				}

				if (Adet != 0)
				{
					SendMarketOrder(Symbol, Adet, (OrderSide.Buy));
					Debug("Alış sinyali oluştu. Sinyal fiyatı: " + _close + " - Adet: " + Adet);
				}
			}else
			{
				Debug("Alış sinyali oluştu. Bakiyeniz yetersiz. AlisTutari: " + AlisTutari);
			}
		}

		public void FX_Satis()
		{
			if (Adet != 0 && LastOrderSide.Obj != Side.Sell)
			{
				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. ");
			}
		}


		public override void OnOrderUpdate(IOrder order)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
			{
				Adet = order.OrderQty;

				if (KomisyonuDahilEt)
				{
					if (piyasaTipleri == PiyasaTipleri.KRIPTOBINANCE)
					{
						Adet = FX_MinSize(Adet - Adet * KomisyonOranı);
					}
				}
				Debug("Alış gerçekleşti. Gerçekleşen fiyat: " + order.Price + " - Adet: " + Adet);

			}
		}
		// # Gerekli bitti

	}
}


İyi çalışmalar.

(11,059 puan) tarafından
8,636 soru
8,590 cevap
4,821 yorum
19,786 kullanıcı