1 beğenilme 0 beğenilmeme
678 kez görüntülendi
ott indikatörü ile örnek olarak 1000 dolarlık btc alsın ve satarken hepsini satsın. miktar önemli olmasın. halihazırda bazı başlıklarda bakiyeye göre alım satan algoritma paylaşılmış ama bilgim kıt olduğu için bunu ott indikatörünün içine koyamadım. yardımcı olursanız sevinirim.
Algoritmik Trading kategorisinde (46 puan) tarafından | 678 kez görüntülendi

1 cevap

2 beğenilme 0 beğenilmeme

Merhabalar,

Hisse senedi mi yoksa coin de mi çalıştıracağınıza lütfen dikkat ediniz. Coin'de işlem yapıyor iseniz ve komisyonlarınız BNB üzerinden kesiliyorsa Komisyondahil et kısmını işaretlemenize gerek yoktur.  

Stratejideki MinSize Binance’de geçerli bir değişkendir. İşlem yaptığınız sembole göre giriş yapınız.                                                   

Mesela ADA_USDT_BIN sembolü için MinSize değerini 0.01 girmelisiniz.  (https://www.binance.com/tr/trade-rule

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

//===========================================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 OttTumBakiyeStrategy : 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(2)]
			public int OttPeriod1;

		[Parameter(1.4)]
			public decimal OttOpt1;

		[Parameter(MovMethod.VAR)]
			public MovMethod OttMethod1;

		[Parameter(true)]
			public bool OttSupportLine1;


		OTT ott;


		// Gerekli

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

		// strateji hisse senedi ile mi coin ile mi kullanılacak
		[Parameter(true)]
		public bool HisseSenediMI;

		// Kripto için geçerli
		[Parameter(1)]
		public decimal MinSize;

		// Tutar
		public decimal Tutar;

		// Al sat adedi
		[Output]
		public decimal Adet;

		// Bakiye kontrolü-sil
		public bool BakiyeKontrolu = true;

		// #Gerekli

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

			ott = OTTIndicator(Symbol, SymbolPeriod, OHLCType.Close, OttPeriod1, OttOpt1, OttMethod1, OttSupportLine1);


			// Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur.
			// true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız veya false geçerseniz her işlem olduğunda algoritma tetiklenir.
			WorkWithPermanentSignal(true);

			//Eger backtestte emri bir al bir sat seklinde gonderilmesi isteniyor bu true set edilir. 
			//Alttaki satırı silerek veya false geçerek emirlerin sirayla gönderilmesini engelleyebilirsiniz. 
			SendOrderSequential(true, Side.All);

		}


		/// <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(ott, ott, 1, 0))
			{
				FX_Alis();
			}

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

		// Gerekli

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

		// hisse 
		public bool FX_BalanceKontrolu()
		{
			if (HisseSenediMI)
			{
				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;
		}

		bool ? AlisMI = null;


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

			if (FX_BalanceKontrolu() && AlisMI != true)
			{
				// Alabileceği adet
				if (HisseSenediMI)
				{
					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;
		/// <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)
		{
			_fiyat = order.Price;

			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
			{
				// Tutar
				Tutar = Adet * _fiyat; ;

				// Güncel Bakiye
				Bakiye -= Tutar;

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

				if (KomisyonuDahilEt)
				{
					if (HisseSenediMI)
					{
						Bakiye -= (Bakiye * Komisyon);
					}else
					{
						Adet = FX_MinSize(Adet - Adet * Komisyon);
					}
				}
				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 * Komisyon);
				}

				AlisMI = false;
			}
		}

		// # Gerekli

	}
}


 

 

(11,069 puan) tarafından
tarafından düzenlendi
0 0
Merhaba Elinize sağlık

Bu kodu  bitmexde kullanmak üzere açığa satış yapacak şekilde çevirme imkanınız var mı acaba. Long Laverage farklı, Short farklı şekilde . Örneğin,  long pozisyon aldı ise Laverage 3 ayarlasın, Short pozisyon açar iken laverage 2 ayarlasın . İlginebilirseniz sevinirim, teşekkür ederim.
Hoş geldiniz, Matriks Destek Platformu sizlere sorularınızın hızlıca cevaplanması için bir ortam sağlar. Sorduğunuz ve cevapladığınız soruların ve yorumlarınızın aldığı oylar üzerinden puan kazanırsınız. Puan sistemine bağlı kampanyamızla ücretsiz kullanım avantajlarından faydalanabilirsiniz.



7,591 soru
7,598 cevap
4,441 yorum
10,434 kullanıcı