MatriksIQ Destek
Matriks Destek
Matriks Web Destek
Matriks Mobile Destek
0 beğenilme 0 beğenilmeme
251 kez görüntülendi

Merhaba,

Önceki konuda iq'da (aynı formül için) prime sinyallerinden farklı yerlerde emir gelmesi sorunu Orçun Bey sayesinde halldedildi.

Şimdi daha genel bir şey danışmak istiyorum.

iq'da yaklaşık bir saatten fazla emirleri takip ettim, prime ile aynı yerlerde emirlerin geldiğini görünce bir de backtest yapayım dedim.

Backtest sonucunda, canlıda yaptığı işlemlerden tamamen alakasız şeyler geldi.

Bu fark neden olur? Farkın olmaması için ne yapabilirim?

Bu konu çok önemli, çünkü stratejiler canlıya alınınca tamamen farklı işlemler yaparsa backtest yapmamızın anlamı kalmaz...

Ekran görüntüsü : Soldaki backtest, sağdaki canlı işlem. Ekran görüntüsünde 19:32 den beri olan işlemler var.

https://hizliresim.com/EdnHd5

 

Kod:

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

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

        [Parameter(10)]
        public decimal Lot;

        [Parameter(1)]
        public int Pm1;
        [Parameter(3)]
        public int Pm2;
        [Parameter(1)]
        public int Pm3;

 


        SMA m1, m2, m3, m4, m5;


        public override void OnInit()
        {

            m1 = SMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, Pm1);
            m2 = SMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, Pm2);
            m3 = SMAIndicator(Symbol, SymbolPeriod, OHLCType.High, Pm3);
            m4 = SMAIndicator(Symbol, SymbolPeriod, OHLCType.Low, Pm3);

 


            AddSymbol(Symbol, SymbolPeriod);
            WorkWithPermanentSignal(true); //Sadece kalıcı sinyallerde işlem yap
            SendOrderSequential(true);//Bir al bir sat kuralı


        }


        public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
        {

            var bardata = GetBarData();
            var close = bardata.Close[barDataCurrentValues.LastUpdate.BarDataIndex -1];

            if (Ref(m1, 0) >Ref(m2, 0) && close<Ref(m3, 0))
            {
                SendMarketOrder(Symbol, Lot, OrderSide.Buy, ChartIcon.Buy);
            }

            if (Ref(m1, 0) <Ref(m2, 0) && close>Ref(m4, 0))
            {
                SendMarketOrder(Symbol, Lot, OrderSide.Sell, ChartIcon.Sell);
            }

 

        }
    }
}

 

Ek bilgi: Stratejinin Prime kodu

(MOV(c,1,s)>MOV(c,3,s)) and (c<MOV(h,1,s))

(MOV(c,1,s)<MOV(c,3,s)) and (c>MOV(l,1,s))

Algoritmik Trading kategorisinde (206 puan) tarafından
tarafından düzenlendi | 251 kez görüntülendi

1 cevap

1 beğenilme 0 beğenilmeme
En İyi Cevap

Merhabalar,

Önceki sorunuzda biraz eksik bilgi paylaşmışım. Kapanış değerinin 1 bar öncekini alarak canlıda işinizi görebilirsiniz fakat backtestte işler biraz farklılaşıyor. Backtestte bar açılışı diye bir olay olmadığı için gelen değerler hep bar kapanaşında oluşan değerlerdir. Sizde close değerini 1 önceki bardan almak istediğinizde yanlış sonuçlar ortaya çıkıyor. Bu sorununu çözmek için close değerini biraz değiştirmek yeterli. Close değerini aşağıdaki gibi tanımlarsanız backtest ve canlıda sorun yaşamazsınız.

var close = Ref(bardata,OHLCType.Close,0);

Bir tavsiye olarak lütfen kullandığınız değerleri Debug tabinde yazdırıp grafik ile kıyaslayarak gidin en doğru sonuca bu şekilde varabilirsiniz. Debug tabina verileri yazdırmanız için OnDataUpdate fonksiyonunda aşağıdaki gibi değişiklik yaptım.

public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
{

	var bardata = GetBarData();
	var close = Ref(bardata, OHLCType.Close, 0);
	Debug("**************************");
	Debug("Close : " + close);
	Debug("m1.CurrentValue : " + Ref(m1, 0));
	Debug("m2.CurrentValue : " + Ref(m2, 0));
	Debug("m3.CurrentValue : " + Ref(m3, 0));
	Debug("m4.CurrentValue : " + Ref(m4, 0) + "\n");

    if (Ref(m1, 0) >Ref(m2, 0) && close<Ref(m3, 0))
    {
		SendMarketOrder(Symbol, Lot, OrderSide.Buy, ChartIcon.Buy);
		Debug("Alış emri gerçekleşti.");
	}

	if (Ref(m1, 0) <Ref(m2, 0) && close>Ref(m4, 0))
	{
		SendMarketOrder(Symbol, Lot, OrderSide.Sell, ChartIcon.Sell);
		Debug("Alış emri gerçekleşti.");
	}
}

İyi çalışmalar

(3,238 puan) tarafından
tarafından seçilmiş
0 0
Stratejiyi düzenlerken silmişim pardon. İlk attığınızda stratejiniz görünüyordu.

if (CrossAbove(Ref(emaLong ,0), Ref(emaShort ,0)))

Bu şekilde kullanımda nasıl bir hata aldınız. Tekrar deneyin isterseniz.
0 0
estğ . ben kendimden birden şüphe ettim çünkü hepsini kopyalamıştım çünkü :)

aşağıdaki gibi bir hata geliyor.

https://hizliresim.com/DtFjPu
1 0

Doğru gözden kaçırmışım. Cross fonksiyonları en az bir indikatör veya bardata almak zorunda. Fakat Ref() kullanımında bize decimal değer döner. Bu nedenle hata oluyor. 

Aşağıdaki kod parçasını Cross fonksiyonlarının yerine kullanabilirsiniz.

			if (Ref(emaLong, 1) <= Ref(emaShort, 1) && Ref(emaLong, 0) > Ref(emaShort, 0))
			{

				SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
				Debug("Alış emri gönderildi.");
				Debug("Close = " + barData.BarData.Close);
				Debug("Ema = " + Ref(emaShort, 0));
			}

			if (Ref(emaLong, 1) >= Ref(emaShort, 1) && Ref(emaLong, 0) < Ref(emaShort, 0))
			{
				SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
				Debug("Satış emri gönderildi.");
				Debug("Close = " + barData.BarData.Close);
				Debug("Ema = " + Ref(emaShort, 0));
			}

 

0 0
ilk ben buna benzer bir if yazmıştım ama CrossAbove fonk tam olarak nasıl çalıştığını bilmediğimden dolayı daha doğrudur diye onu kullanmıştım.

Yardımlarınız için çok teşekkürler.
0 0
Rica ederim. Aslında Cross fonksiyonlarıyla aynı işlevi görüyor benim yazdığım kod. Fakat Cross fonksiyonlarında o anda gelen indikatör değeri ne ise o işleme giriyor. Bu durumda backtest ile uyumsuzluğa neden oluyor. Yani iki kullanım da yanlış değil yerine göre kullanmak önemli.
1,935 soru
1,830 cevap
1,772 yorum
1,326 kullanıcı