0 beğenilme 0 beğenilmeme
383 kez görüntülendi
Merhaba, çok basit şekilde rsi belli bir seviyenin altındayken al ve alış pozisyonundan yüzde 1 kar elde ettiğinde sat emri giren bir algo oluşturmaya çalışıyorum. Bir çok farklı hisse senedi için rsi (al) sinyalleri düzgün çalışırken maalesef satış noktasında takeprofit işe yaramamakta. Çoğu zaman hisseyi aldığı fiyattan aşağıda satış emri veriyor. Kodu aşağıya ekliyorum. Yardımcı olaiblirseniz sevinirim. Benim istediği yalnızca aldığı fiyatın yüzde 1 yükseğinden satış emri girmesi

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using Matriks.Data.Symbol;

using Matriks.Engines;

using System.Windows.Media;

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 deneme31 : 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("TUKAS")]

public string Symbol0;

 

[Parameter(SymbolPeriod.Min5)]

public SymbolPeriod SymbolPeriod;

 

[Parameter(20)]

public decimal OrderQuantity;

 

[Parameter(14)]

public int Period;

 

[Parameter(50)]

public int UpLevel;

 

[Parameter(35)]

public int DownLevel;

 

[Parameter(1.5)]

public decimal Kar_al;

[Parameter(5)]

public decimal Zarar_sat;

 

 

 

 

// indikator tanımları.

RSI rsi0;

 

 

/// <summary>

/// Strateji ilk çalıştırıldığında bu fonksiyon tetiklenir. Tüm sembole kayit işlemleri,

/// indikator ekleme, haberlere kayıt olma işlemleri burada yapılır.

/// </summary>

public override void OnInit()

{

AddSymbol(Symbol0, SymbolPeriod);

 

 

 

rsi0 = RSIIndicator(Symbol0, SymbolPeriod, OHLCType.Close, Period);

 

 

 

 

// Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur.

// true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız veya false geçerseniz her işlem olduğunda algoritma tetiklenir.

WorkWithPermanentSignal(true);

 

//Eger emri bir al bir sat seklinde gonderilmesi isteniyor bu true set edilir.

//Alttaki satırı silerek veya false geçerek emirlerin sirayla gönderilmesini engelleyebilirsiniz.

SendOrderSequential(true);

 

//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.

//SetTimerInterval(3);

 

//Alttaki fonksiyon ile tanımlanan sembol ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.

//AddNewsSymbol(Symbol);

 

//Alttaki fonksiyon ile tanımlanan anahtar kelime ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.

//AddNewsKeyword("KAP");

}

 

/// <summary>

/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir

/// </summary>

public override void OnInitCompleted()

{

 

}

 

/// <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(BarDataCurrentValues barDataCurrentValues)

{

if (CrossAbove(rsi1, DownLevel))

 {

 SendMarketOrder(Symbol1, OrderQuantity, (OrderSide.Buy));

 Debug("Alış Emri Gönderildi");

 TakeProfit(Symbol0, SyntheticOrderPriceType.Percent, Kar_al);

StopLoss(Symbol0, SyntheticOrderPriceType.Percent, Zarar_sat);

 }

else

{

 TakeProfit(Symbol0, SyntheticOrderPriceType.Percent, Kar_al);

StopLoss(Symbol0, SyntheticOrderPriceType.Percent, Zarar_sat);

 }
Algoritmik Trading kategorisinde (12 puan) tarafından | 383 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar, 

Öncelikle formülünüzde else yapısını kullanmanıza gerek yoktur. Yalnızca Takeprofit ve stoploss yeterlidir. 

Ayrıca emrinizin hatalı çalıştığı yerler için de lütfen aşağıdaki linki inceleyiniz. 

Yardımcı olacaktır.

https://destek.matriksdata.com/?qa=12386/matriks-iq-kar-al-y%C3%BCzde-stop-%C3%A7al%C4%B1%C5%9Fmamas%C4%B1&show=12386#q12386

İyi çalışmalar.

(11,059 puan) tarafından
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.



8,636 soru
8,590 cevap
4,821 yorum
19,785 kullanıcı