Matriks Destek ve Yardım Platformu

Matriks Ürünleri ile ilgili tüm sorularınız için bizlere buradan ulaşabilirsiniz. Daha önce sorulan soruları ve verilen cevapları ilgili sekmelerden ve arama üzerinden inceleyebilirsiniz. Sağ taraftaki kategoriler üzerinden İlgilendiğiniz özelliklerle ilgili soruları filtreleyebilirsiniz. Soru ve cevapları sosyal medyada paylaşabilirsiniz. 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.

0

Backtest ve Canlı işlem tutarsızlığı.

Soruldu
Görüntülenme
1.544 görüntülenme
Durum
Cevaplandı

Edit: Sorunu özetledim.

 

(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))

 şeklindeki matriks formülümü iq'da;

 

 

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_test2 : MatriksAlgo
    {
        [SymbolParameter("XBT_USD_BMEX")]
        public string Symbol;

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

        [Parameter(100)]
        public decimal Lot;

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

 

        SMA m1, m2, m3, m4;


        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 (m1.CurrentValue>m2.CurrentValue && close<m3.CurrentValue)
            {
                SendMarketOrder(Symbol, Lot, OrderSide.Buy, ChartIcon.Buy);
            }

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


        }
    }
}

 

şeklinde yazdım. Ancak canlı işlemde emir yerleri farklı geliyor. Kodda nasıl bir değişiklik yapmam lazım yardımcı olabilir misiniz?

Paylaş
CevaplaBayrakladüzenlendi · merpermerper261

1 Cevap

0

Merhabalar,

Örnek kod paylaştığınız için teşekkürler bu sefer ihtiyacımız yok gibi :).

Canlı veri akışında kalıcı sinyalde çalışırken OnDataUpdate sadece yeni bar açılışında tetikleniyor. Backtestte ise bar kapanışıyla tetikleniyor.

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

Bu şekilde kullanırsanız canlıda sorun olacağını düşünmüyorum. Backtestte ise matriks ile karşılaştırırken 1 önceki bar değerini karşılaştırın. Eğer uyumsuzluk varsa tekrar bildirin.

İyi çalışmalar

BağlantıBayraklaOrçunMatriks Destek4.555

Yorumlar (5)

  • ▲0

    Örnek kodda zaten

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

    şeklinde kullandım.

    Soruyu özetledim. yeniden bakabilir misiniz?

  • ▲0

    Tekrar Merhaba,

    Aynı işlemi indikatör için yapmanız gerekmekte. OnDataUpdate bar açılışında tetiklendiği için indikatörlerde bar açılışındaki değerlerini almakta. İndikatör değerlerini alttaki gibi yazdırıp karşılaştırır mısınız?

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

    Koşullarınızı da bu şekilde değiştirip test ediniz.

    OrçunMatriks DestekBayrakla
  • ▲0
    Debug sonucu://viop yakınvade sembolü - 5 dk bar.

    30.10.2020 16:10:00.854  :m1.CurrentValue : 1216,75
    30.10.2020 16:10:00.867  :m2.CurrentValue : 1217,3333333333333333333333333
    30.10.2020 16:10:00.870  :m3.CurrentValue : 1218,75
    30.10.2020 16:10:00.873  :m4.CurrentValue : 1215

    Bu değerler kapanan barı gösteriyor. mov(c,3,s) dahil. İşlem gören son barın değerleri farklı.

    Benim prime formülündeki sonuçları almam için;

    if (Ref(m1.CurrentValue,0)>Ref(m2.CurrentValue,0) && Ref(close,0)<Ref(m3.CurrentValue,0)) şeklinde mi kullanmam lazım?
  • ▲0

    Merhaba,

    Kapanan bar ile çalışmanız lazım. Çünkü sizin kullandığınız indikatör parametrelerinde Low ve High değerleri var. Canlıda kalıcı sinyalde çalışırken kapanan barı almazsanız bar açılışında open/high/low/close değerleri eşit geldiği için indikatör değerleri de aynı gelecektir.

    Bu şekilde kullanmanız gerekli.

    if (Ref(m1,0)>Ref(m2,0) && close<Ref(m3,0))

    Close ref eklemeye gerek yok onu zaten geçmiş bar olarak alıyorsunuz.

    OrçunMatriks DestekBayrakla
  • ▲1

    Şimdi emirler prime ile aynı gelmeye başladı.

    Yardımınız için Çok teşekkür ederim.

     

Cevabınız

Cevap yazmak için giriş yapın.Giriş yapKayıt ol