0 beğenilme 0 beğenilmeme
798 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 (228 puan) tarafından
tarafından düzenlendi | 798 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

(4,555 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.

 

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ı