Merhaba stratejinin son halini paylaşıyorum...
Not: Çok dikkat etmeniz gerek terste kalırsanız stop noktanıza uyunuz çünkü stratejisi kar alma üzerine kuruludur iyi günler...
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
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;
/*Örnek : Most stratejisinde ASELS 16.91 Alım işlemi gerçekleşti.
Alımı bir yere yazdırması veya kendi içinde 16.91 tutması ve %1 ve üzerinde kâr görene kadar strateji beklemede kalarak 17.08 üzerinde yani %1
Üzerinde Kaldığı yerden if (CrossBelow) koşulları oluştuğunda şatış gerçekleşmesini istiyorum.
%1 dışardan değiştirme imkanı olabilmesi.
%1 kar koşulu olabilmesi için gerekirse günlerce stratejim çalışsın
Aradığım kar al zarar durdur değil.
Yani mutlak kâr gördüğünde üzerinde işleme kaldığı yerden devam edebilmesi.
Umarım açıklayıcı olabilmiştir teşekkür ederim */
/*1-Örneğin : MOST, if (CrossAbove(most.ExMOV, most)) kesişiminden normal alması gereken yerden
Alım gönderildi 16.91 Al işlemi yapıldı.
2 - Most, Alım noktasından %1 kar (17.08) veya yukarısın da iken if (CrossBelow(most.ExMOV, most))
17.08 ve üzerinde nerede DENK gelip kesişim yaparsa SAT işlemi yapılsın,
aranan şart %1 ve üzerinde normal akışına devam edecek if (CrossBelow(most.ExMOV,most)) çalışmasıdır.
3- Aksi halde kar %1 altında ise if (CrossBelow(most.ExMOV,most)) bekleme de kalsın...
4- Public %1 dışardan değiştirme imkanı olması.
5- Bütün sıralı al sat işlemlerinde de bu şart aransın...*/
namespace Matriks.Lean.Algotrader
{
public class mostStratejisi_mod2 : 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("ASELS")]
public string Symbol;
[Parameter(SymbolPeriod.Min)]
public SymbolPeriod SymbolPeriod;
[Parameter(1)]
public decimal BuyOrderQuantity;
[Parameter(1)]
public decimal SellOrderQuantity;
[Parameter(2)]
public int Period;
[Parameter(2.027)]
public decimal Percentage;
[Parameter(1)]
public decimal HedefYuzde;
MOST most;
public decimal hedefFiyat = 0;
[Parameter(false)]
public bool AlisIleBasla;
public override void OnInit()
{
most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential);
AddSymbol(Symbol, SymbolPeriod);
// 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 backtestte 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(false);
}
/// <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)
{
var BarDataModel = GetBarData();
var close = BarDataModel.Close[barDataCurrentValues.LastUpdate.BarDataIndex - 1];
if (CrossAbove(most.ExMOV, most) && AlisIleBasla == true)
{
SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
Debug("Alış Emri Verildi.");
Debug("Most.ExMov:" + Math.Round(most.ExMOV.CurrentValue, 2));
Debug("Most:" + Math.Round(most.CurrentValue, 2));
hedefFiyat = close * (1 + HedefYuzde / 100);
Debug("Hedef fiyat olusturuldu = " + hedefFiyat);
AlisIleBasla = false;
}
if (CrossBelow(most.ExMOV, most)&& AlisIleBasla == false)
{
Debug("Indikator satis kosulu olustu, hedef fiyat kontrol edilecek");
Debug("Most.ExMov:" + Math.Round(most.ExMOV.CurrentValue, 2));
Debug("Most:" + Math.Round(most.CurrentValue, 2));
if (close >= hedefFiyat && hedefFiyat != 0)
{
Debug("Satis kosulu mevcut. Fiyat = " + close + "Hedef Fiyat = " + hedefFiyat);
SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
Debug("Satış Emri Verildi");
hedefFiyat = 0;
}
else Debug("Hedef fiyata ulasilamadi, strateji beklemede kalacak.");
}
if (most.ExMOV.CurrentValue < most.CurrentValue && close >= hedefFiyat && hedefFiyat != 0)
//SendOrderSequential(true) oldugu icin ek pozisyon kontrolune gerek yoktur. Pozisyon olmadigi durumda strateji Debug'a satis basacak ama satis yapamayacaktir.
{
Debug("Satis kosulu mevcut. Fiyat = " + close + "Hedef Fiyat = " + hedefFiyat);
SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
Debug("Satış Emri Verildi");
Debug("Most.ExMov:" + Math.Round(most.ExMOV.CurrentValue, 2));
Debug("Most:" + Math.Round(most.CurrentValue, 2));
hedefFiyat = 0;
AlisIleBasla = true;
}
}
}
}