0 beğenilme 0 beğenilmeme
647 kez görüntülendi
Merhaba yapay zeka için kullanıcı indikatörlerinden bir tanesini ekleyip opt yapmak istiyorum fakat önceden tanımlı indikatörler dışında farklı bir tercihte bulunamıyorum. Ayrıca modül oluşturduktan sonra opt yapıp ardından backtest ve eğit diyorum sonrasında algoritma oluşturduktan sonra al sat yapabilmesi için ne yapmam gerekiyor ?
Algoritmik Trading kategorisinde (70 puan) tarafından | 647 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar,

Merhaba yapay zeka için kullanıcı indikatörlerinden bir tanesini ekleyip opt yapmak istiyorum fakat önceden tanımlı indikatörler dışında farklı bir tercihte bulunamıyorum.

Doğrudur, yapay zekada şu an için sadece MatriksIQ içerindeki gömülü indikatörleri kullanarak model oluşturabilirsiniz.

Ayrıca modül oluşturduktan sonra opt yapıp ardından backtest ve eğit diyorum sonrasında algoritma oluşturduktan sonra al sat yapabilmesi için ne yapmam gerekiyor ?

Aşağıda paylaşmış olduğum örnek stratejiyi 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.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;

namespace Matriks.Lean.Algotrader
{
	public class yapayzeka : 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("XRP_USDT_BIN")]
public string Symbol;

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

		[Parameter(1)]
public decimal BuyOrderQuantity;

		[Parameter(1)]
public decimal SellOrderQuantity;

		[Parameter(60)]
public decimal Olasilik;

		MOST most;

		public MOV indexer;

		IClassifier AiModel;
		AiDataSet DataSet;

		TimeSpan sessionStart;
		TimeSpan sessionEnd;

		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);

			most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, 3, 2m, MovMethod.E);


			// Bu indikator, backtest esnasında sembolün son indeksini elde etmek amacıyla kullanılmaktadır.
			// Aynı sembol ve periyod için eklenilen başka bir indikatör de kullanılabilir.
			indexer = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close);

			var sessionTime = GetSessionTimes(Symbol).FirstOrDefault();
			sessionStart = sessionTime.Start;
			sessionEnd = sessionTime.End;

			// SendOrderSequential(true);
			WorkWithPermanentSignal(true);

			SendOrderSequential(true, Side.Buy);
		}

		/// <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()
		{
			var barData = GetBarData();
			// Tahmin hedefi belirlenerek dataset olusturulur.
			// Asagidaki ornekte tahmin hedefi kapanis olarak belirlenmistir.
			DataSet = GetAiDataSet(barData, OHLCType.Close, indexer);

			// Ozellikle farkli bir degerle eklenmedikleri durumlarda, inputlar bu windowsize'i kullanirlar.
			DataSet.DefaultWindowSize = 5;

			// BarData dogrudan eklendiginde open, high, low ve close input olarak kullanilir.
			DataSet.AddInput(barData);

			DataSet.AddInput(most);

			DataSet.SetTrainingDateInterval(new DateTime(2019, 12, 30, 0, 0, 0), new DateTime(2021, 12, 1, 16, 56, 0));

			// Egitim yapilmak istendiginde datasetten egitim datasi istenilir.
			var trainingData = DataSet.GetTrainingData();

			// Oncelikle kullanilacak model icin parametre olusturulur.
			var parameters = new ClassificationBoostingParameters(224, 0.00514942896638459, 3, 2, 0.632234101012458, 2);

			// Parametreler kullanilarak model alinir.
			AiModel = AiModelFactory.GetClassifier(parameters);

			// Hazlirlanan data seti ile egitim yapilir.
			AiModel.Train(trainingData.input, trainingData.target);

			var prediction = GetAiPrediction();
		}



		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			var prediction = GetAiPrediction();

			// Yukarı yönlü tahminler için 1, aşağı yönlü tahminler için 0 döner.
			var direction = prediction.Prediction == 1 ? "Yukarı" : "Asağı";

			// Her sonuca ait olasılık, kendi indeksinde yer alır.
			var probability = prediction.Probability[prediction.Prediction];

			// Yukarı yönlü tahminler için 1, aşağı yönlü tahminler için 0 döner.
			if (prediction.Prediction == 1 && (decimal) prediction.Probability[prediction.Prediction] * 100>Olasilik && LastOrderSide.Obj != Side.Buy)
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
				Debug("alış emri gonderildi");
				Debug($"Yön: {direction} Olasılık: {probability*100}");
			}

			if (prediction.Prediction == 0 && (decimal) prediction.Probability[prediction.Prediction] * 100>Olasilik && LastOrderSide.Obj != Side.Sell)
			{
				SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
				Debug("Satış emri gonderildi");
				Debug($"Yön: {direction} Olasılık: {probability*100}");
			}
		}



		public ClassifierOutput GetAiPrediction()
		{
			// Seans açık ise, son bar canlı olduğu için tahmin hedefidir
			// ve girdi olarak kullanılmaz. Seans kapalı ise son bar
			// girdilere dahil edilir. Backtest esnasında bu seçeneğe
			// bakılmaksızın son bar kullanılır.
			// Günlük üzeri periyotlarda bu koşul modifiye edilmelidir.
			var currentTime = DateTime.Now.TimeOfDay;
			if (currentTime > sessionStart && currentTime < sessionEnd)
			{
				DataSet.IgnoreLastBar(true);
			}
			else
			{
				DataSet.IgnoreLastBar(false);
			}

			// Tahmin datasi da OnInitCompleted icerisinde hazirlanan dataSet kullanilarak alinir.
			var predictionData = DataSet.GetPredictionData();
			var prediction = AiModel.Predict(predictionData);

			// Yukarı yönlü tahminler için 1, aşağı yönlü tahminler için 0 döner.
			var direction = prediction.Prediction == 1 ? "Yukarı" : "Asağı";

			// Her sonuca ait olasılık, kendi indeksinde yer alır.
			var probability = prediction.Probability[prediction.Prediction];

			// Tahmin sonucunun kullanılacağı yerde
			// olasılık ve yönün elde edilmesi yukarıdaki gibi yapılır.
			return prediction;
		}
	}
}

İyi çalışmalar.

(11,069 puan) tarafından
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,509 soru
7,511 cevap
4,405 yorum
8,750 kullanıcı