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

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?

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

1 cevap

0 beğenilme 0 beğenilmeme

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

(3,238 puan) tarafından
0 0

Örnek kodda zaten

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

şeklinde kullandım.

Soruyu özetledim. yeniden bakabilir misiniz?

0 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.

0 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 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.

1 0

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

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

 

2,171 soru
2,028 cevap
1,841 yorum
1,501 kullanıcı