merhaba, ekteki kodu inceleyin. ben kapanış fiyatına göre, açığa satış olmayacak şekilde yaptım. isterseniz derinlik kullanarak da yapabilirsiniz. Fakat derinlik verilerini kullandığınızda backtest yapamazsınız. Kod döngüye girerse istenmeyen sonuçlar ortaya çıkabilir derinlik verisinde. Ola ki derinlik verileriyle yapmak isterseniz döngülere karşı korunmak için Sayaç tanımladım. If bloğu içerisinde 5 değerini şart olarak koydum. Yani 5 alış emri gönderir ve durur. İhtiyaç olursa kullanırsınız. bu haliyle sayaç değerine gerek yok İf bloğu içerisinde silin veya yüksek bir int değer girin şarta.
Gelelim eksik yönlere. kapanış fiyatına göre işlem yaptığı için seans açıkken son değer kapanış olarak geçecek. Yani 4.00 alış. Kar al %1, 4,04 satış olması lazım ama alış 4.03 satış 4.04 iken 4,04 tetiklendiğinde kapanış 4,04 olacağı için kar al tetiklenip 4,03 e satar. diğer eksik husus 4,00 aldınız ama işlemler çok hızlı geçti sizin kod alış maliyetini yazacağı anda 4,01 işlem geçerse maliyet 4,01 olarak kaydedilecek sistemde. Kar al noktası değişecek.
Stratejide bana göre eksik yön, %1 kar al yaptınız. Trend oluştu ve fiyatlar yukarı gidiyor. Sizin tekrar pozisyona girebilmeniz için önce Pmax K, St line aşağı kesecek. sonra dönüp yukarı kesecek ki işleme girsin. Peki Trend devam ederse??? tekrar işleme girmek için gerekli şart sağlanmayacak. Yani trend devam ederse dışarıda kalıp izlemiş olursunuz. Bu sebeple tekrar pozisyona giriş için ayrıca şart belirleyin. Garan 60dk periyod da bakın, son işlemde Kar Al dan sonra tekrar pozisyona giriş şartı olmadığı için güzel bir trendi kaçırıyor.
Bu haliyle size fikir versin diye attım, iyi sonuç vermez bence bu hali bu sebeple gerçek ortamda denemeyin. Strateji adını dstk4 olarak kaydedin. Hata, eksik varsa affola Saygılarımla.
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 dstk4 : 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.Min60)]
public SymbolPeriod SymbolPeriod;
[Parameter(1)]
public decimal BuyOrderQuantity;
[Parameter(1)]
public decimal SellOrderQuantity;
[Parameter(10)]
public int ATRPeriod;
[Parameter(10)]
public int MovPeriod;
[Parameter(3)]
public decimal Coefficient;
[Parameter(MovMethod.E)]
public MovMethod MovMethod;
[Parameter(0)]
public int Sayac;
public decimal Maliyet;
int FirstRun = 0;
int realposition = 0;
PMaxIndicator pmax;
/// <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(Symbol, SymbolPeriod);
pmax = PMaxIndicators(Symbol, SymbolPeriod, ATRPeriod, MovPeriod, (decimal) Coefficient, MovMethod);
// 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);
}
public override void OnDataUpdate(BarDataEventArgs barData)
{
var pmaxKline = Math.Round(pmax.KLine.CurrentValue, 2);
var pmaxSTline = Math.Round(pmax.StLine.CurrentValue, 2);
/* Debug("***********************************************");
Debug("pmaxSTline = " + pmaxSTline);
Debug("pmaxKline = " + pmaxKline);*/
if (CrossAbove(pmax.KLine, pmax.StLine) && FirstRun == 0 && Sayac<5)
{
SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
Maliyet = barData.BarData.Close;
Sayac += 1;
Debug("Alış emri gonderildi." + "Alış Maliyeti:" + Maliyet + "Gönderilen Alış Emri Adedi:" + Sayac);
FirstRun = 1;
}
if ((CrossBelow(pmax.KLine, pmax) && FirstRun == 1) || (FirstRun == 1 && Maliyet * 1.01m <= barData.BarData.Close))
{
if (Maliyet * 1.01m <= barData.BarData.Close)
{
SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
Debug("Kar Al Tetiklendi.");
FirstRun = 0;
}
else
{
SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
Debug("Satış emri gonderildi.");
FirstRun = 0;
}
}
}
public override void OnOrderUpdate(IOrder order)
{
//Gercek zamanli pozisyon takibi
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
{
var positionChange = order.OrderQty;
realposition += (int) positionChange;
Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
}
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
{
var positionChange = order.OrderQty;
realposition -= (int) positionChange;
Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
}
}
}
}