0 beğenilme 0 beğenilmeme
391 kez görüntülendi
Merhaba,

Kripto piyasasında robotum çalışıyor. Her şey yolunda. Ama yapmak istediğim bir şey var. Yardımınızı rica ederim;

Robot satıyor ama feyk satış oluyor.Elimde 50 ( 100 adet x coin ) dolarlık ürün varken feykten dolayı aynı coini ( 100 adet x coin ) 55 dolardan alım yapması gerekiyor. Yeterli bakiye olmadığı için. Alış emrini gönderemiyor.

Hesabımın toplamı kadar al hesabın toplamı kadar sat daha sonra tekrar hesabımın toplamı kadarını nasıl aldırırım.

Sayenizde kendimi o kadar geliştirdim ki ... Çok teşekkür ederim
Algoritmik Trading kategorisinde (16 puan) tarafından | 391 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar,

Aşağıda sizlere yardımcı olabileceğimiz bir şablon örneği paylaştık.

Kendi belirlediğiniz koşulları ekleyerek test edebilirsiniz.

Lütfen inceleyiniz.

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;

//===========================================ACIKLAMA============================================//
// 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.                                     //
// Backtest yapıp test hesablarından denedikten sonra küçük miktarlarla gerçek hesapta deneyiniz //

namespace Matriks.Lean.Algotrader
{
	public class MostBakiye : 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.Min5)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(3)]
		public int Period;

		[Parameter(2)]
		public decimal Percentage;

		MOST most;

		// 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 KomisyonOranı;

		// 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()
		{
			AddSymbol(Symbol, SymbolPeriod);

			most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential);

			WorkWithPermanentSignal(true);

			SendOrderSequential(true, Side.All);
		}

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (CrossAbove(most, most, 1, 0))
			{
				FX_Alis();
			}

			if (CrossBelow(most, most, 1, 0))
			{
				FX_Satis();
			}
		}

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


			FX_PiyasaTipi();
		}

		// 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(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;
		}

		[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 if (SymbolDetail.ExchangeDetail.ExchangeCode == "")
			{
				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];
			}
		}

		bool ? AlisMI = null;

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

			if (FX_BalanceKontrolu() && AlisMI != true)
			{
				// Alabileceği adet
				if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)
				{
					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;

		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;

				BaslangıctakiEnstrumanAdedi = 0;
				Debug("Alış gerçekleşti. Gerçekleşen fiyat: " + _fiyat + " - Adet: " + Adet + "- Tutar: " + Tutar + " - Bakiye: " + Bakiye);
				Adet += BaslangıctakiEnstrumanAdedi;

				if (KomisyonuDahilEt)
				{
					if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)
					{
						Bakiye -= (Bakiye * KomisyonOranı);
					}else
					{
						Adet = FX_MinSize(Adet - Adet * KomisyonOranı);
					}
				}

				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 * KomisyonOranı);
				}

				AlisMI = false;
			}
		}

		// # Gerekli bitti

	}
}


İyi çalışmalar.

 

(11,069 puan) tarafından
7,516 soru
7,519 cevap
4,405 yorum
8,752 kullanıcı