MatriksIQ Destek
Matriks Destek
Matriks Web Destek
Matriks Mobile Destek
0 beğenilme 0 beğenilmeme
691 kez görüntülendi
Merhaba, bu ilk sorum ama son sorum değil :)

Hem long hem de short pozisyon açabilen bir algo yazdım. Örnepin mevcut stokta X kadar long varsa bunu parametre ile giriyorum başta, dolayısıyla sonra sat sinyali geldiğinde 2X kadar short pozisyon açıyor. Dolayısıyla eksi X pozisyona geçmiş oluyor.

Sonraki işlemde Takeprofit ve Stop Loss çalıştıırsa ben X kadar long işlem yapmasını isteyerek pozisyonun sıfırlanmasını isterim. Ama mevcut TP ve SL fonksiyonu 2X kadar pozisyon açmaktadır.

Örnek kodlarınızda pozisyon takipleri var. Ama TP ve SL'de ne kadar satış yapılacağı bilgisi parametrik girilemiyor.
Algoritmik Trading kategorisinde (16 puan) tarafından | 691 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhaba,

Miktarları x e düşürüp, peş peşe 2 sefer al ve peş peşe 2 sefer sat yaparak kurgulamalısınız.

Aşağıda bir örnek de var.

iyi çalışmalar

 

 

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;

namespace Matriks.Lean.Algotrader
{
            public class crossmov1 : 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("GARAN")]
                        public string Symbol;

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

                        [Parameter(5)]
                        public decimal BuyOrderQuantity;

                        [Parameter(5)]
                        public decimal SellOrderQuantity;

                        [Parameter(5)]
                        public int MovPeriod;

                        [Parameter(22)]
                        public int MovPeriod2;

                        [Parameter(10)]
                        public decimal Kar_al_yuzdesi;

                        // indikator tanımları.
                        MOV mov;
                        MOV mov2;

                        int FirstRun = 0;
                        decimal realposition = 0;

                        public override void OnInit()
                        {
                                   //Symbol = "GARAN";
                                   //SymbolPeriod = SymbolPeriod.Min5;
                                   //BuyOrderQuantity = 1;
                                   //SellOrderQuantity = 1;
                                   //MovPeriod = 5;
                                   //MovPeriod2 = 22;
                                   AddSymbol(Symbol, SymbolPeriod);
                                   mov = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod, MovMethod.Exponential);
                                   mov2 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod2, MovMethod.Exponential);

                                   SendOrderSequential(true, true);
                                   WorkWithPermanentSignal(true);
                        }

                        /// <summary>
                        /// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir
                        /// </summary>
                        public override void OnInitComplated()
                        {

                        }

                        /// <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)
                        {
                                   if (CrossAbove(mov, mov2))
                                   {
                                               if (FirstRun == 0)
                                               {
                                                           SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
                                                           Debug("Alış Emri Gönderildi");
                                                           FirstRun = 1;
                                                           TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_al_yuzdesi);
                                               }
                                               else
                                               {
                                                           SendMarketOrder(Symbol, BuyOrderQuantity * 2, OrderSide.Buy);
                                                           Debug("Alış Emri Gönderildi");
                                                           TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_al_yuzdesi);
                                               }
                                   }

                                   if (CrossBelow(mov, mov2))
                                   {
                                               if (FirstRun == 0)
                                               {
                                                           SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
                                                           Debug("Satış Emri Gönderildi");
                                                           FirstRun = 1;
                                                           TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_al_yuzdesi);
                                               }
                                               else
                                               {
                                                           SendMarketOrder(Symbol, SellOrderQuantity * 2, OrderSide.Sell);
                                                           Debug("Satış Emri Gönderildi");
                                                           TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_al_yuzdesi);
                                               }

                                   }
                        }

                        /// <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)
                        {
                                   var position = GetRealPositions();

                                   //QtyAvailable Belirtilen sembole ait kullanılabilir adedi portföyden döndürür.
                                   var quantity = position[Symbol].QtyAvailable;

                                   if (quantity == 0) FirstRun = 0;
                        }
            }
}

 

(5,090 puan) tarafından
0 0
Teşekkürler cevap için ama sorunum bu değil. Aslında benim sorunum algo çalışmadan, stoktaki hisse miktarının algo tarafından okunamamasından dolayı.

Dolayısıyla takeprofit yaparken algo içinde pozisyon takibine göre işlem yapmakta.

Getportfolio işlevi algo çalışmadan önceki stok rakamı okumadığından diye düşünüyorum.
0 0
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.



4,842 soru
4,850 cevap
3,196 yorum
3,629 kullanıcı