Merhabalar,
Stratejinizde eğer birden fazla indikatör kullanacak iseniz lütfen kullandığınız indikatörlerden birinin koşullarını yukarı kırınca/aşağı kırınca şeklinde oluşturuyorsanız, diğer indikatörün koşullarını </> işaretlerini kullanarak oluşturmalısınız.
Burada bahsettiğiniz ilk al koşulunuz,
Eğer ParabolicSar al koşulunda (ParabolicSar<barData) ise EMA2 OTT'yi yukarı kestiğinde alsın
ve aynı şekilde sat koşulunuz ise,
Eğer ParabolicSar sat koşulunda (ParabolicSar>barData) ise EMA2 OTT'yi aşağı kestiğinde satsındır.
Kodlama bilginizin olmadığını düşündüğünüz durumlarda Algoritma Sihirbazı sizler için çok yardımcı olacaktır. Açığa Satış ve Açığa Satış Kapatma pozisyonları da dahil olmak üzere bir çok ögeyi içinde barındırır.
(ParabolicSar < barData ve EMA2 OTT'yi yukarı kırınca) al gibi formülü algoritma sihirbazında rahatlıkla oluşturabilirsiniz.
Lütfen aşağıdaki linki inceleyiniz.
https://destek.matriksdata.com/?qa=6289/algoritma-sihirbazi-farkli-parametreler-oldu%C4%9Funda
İyi çalışmalar.
Tekrar merhaba,
Burada bahsettiğiniz ilk al koşulunuz,
Eğer ParabolicSar al koşulunda (ParabolicSar<barData) ise EMA2 OTT'yi yukarı kestiğinde alsın
ve aynı şekilde sat koşulunuz ise,
Eğer ParabolicSar sat koşulunda (ParabolicSar>barData) ise EMA2 OTT'yi aşağı kestiğinde satsındır.
Koşulları ile bir algoritma kurdum fakat backtest sonuçlarında istenilen sonuçları alamadım.Al sat ve açığa sat ve açığa satı kapat komutlarıyla 4 farklı koşul üzerinde bir strateji kurdum. Scriptimi paylaşıyorum, hatamı söyleyebilir misiniz ?
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;
using Matriks.Trader.Core.TraderModels;
namespace Matriks.Lean.Algotrader
{
public class pbarottacık : 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("BTC_USDT_FBIN")]
public string Symbol1;
[Parameter(SymbolPeriod.Min60)]
public SymbolPeriod SymbolPeriod1;
[Parameter(2)]
public int EmaPeriod1;
[Parameter(2)]
public int OttPeriod1;
[Parameter(3)]
public decimal OttOpt1;
[Parameter(MovMethod.VAR)]
public MovMethod OttMovMethod1;
[Parameter(true)]
public bool OttSupportLine1;
[Parameter(0.02)]
public decimal ParabolicsarAcc1;
[Parameter(0.2)]
public decimal ParabolicsarMaxAcc1;
[Parameter(1)]
public decimal OrderQuantity1;
[Parameter(1)]
public decimal OrderQuantity2;
[Parameter(1)]
public decimal OrderQuantity3;
[Parameter(1)]
public decimal OrderQuantity4;
EMA ema;
OTT ott;
ParabolicSAR parabolicSar;
public override void OnInit()
{
ema = EMAIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, EmaPeriod1);
ott = OTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, OttPeriod1, OttOpt1, OttMovMethod1, OttSupportLine1);
parabolicSar = ParabolicSARIndicator(Symbol1, SymbolPeriod1, ParabolicsarAcc1, ParabolicsarMaxAcc1);
SendOrderSequential(true, Side.Buy);
SendOrderSequentialForShort(true, Side.Sell);
WorkWithPermanentSignal(true);
//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");
}
/// <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()
{
}
/// <summary>
/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.
/// </summary>
public override void OnTimer()
{
}
/// <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)
{
var barData1 = GetBarData(Symbol1, SymbolPeriod1);
var ohlcData1 = GetSelectedValueFromBarData(barData1, OHLCType.Close);
if (CrossAbove(ema, ott, 0, 0) && parabolicSar.Value[0][parabolicSar.CurrentIndex] < ohlcData1)
{
SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false);
}
if (CrossBelow(ema, ott, 0, 1) && parabolicSar.Value[0][parabolicSar.CurrentIndex] > ohlcData1)
{
SendPLMOrder(Symbol1, OrderQuantity2, OrderSide.Sell);
}
if (CrossAbove(ema, ott, 0, 0) && parabolicSar.Value[0][parabolicSar.CurrentIndex] < ohlcData1)
{
SendMarketCloseShortOrder(Symbol1, OrderQuantity3);
}
if (CrossBelow(ema, ott, 0, 0) && parabolicSar.Value[0][parabolicSar.CurrentIndex] > ohlcData1)
{
SendShortSalePLMOrder(Symbol1, OrderQuantity4);
}
}
/// <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)
{
}
/// <summary>
/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
/// </summary>
public override void OnStopped()
{
}
}
}