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;
// posizyon takibi - başlangıç
using System.Text;
using System.IO;
// posizyon takibi - biriş
namespace Matriks.Lean.Algotrader
{
public class DI15 : 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(19)]
public int DiPeriod;
[Parameter(5)]
public decimal Quantity;
DemandIndex demandIndex, demandIndexGun;
// posizyon takibi - başlangıç
[Parameter(0)]
public int Position;
[Parameter(true)]
public bool DosyadanOku;
[Parameter("C:\\IQData")]
public string FolderPath;
[Parameter("DI15")]
public string DosyaAdi;
StochasticSlow stochasticSlow;
// posizyon takibi - bitiş
/// <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()
{
stochasticSlow = StochasticSlowIndicator(Symbol, SymbolPeriod, OHLCType.Close, 5, 3, 5, MovMethod.Exponential);
demandIndex = DemandIndexIndicator(Symbol, SymbolPeriod, DiPeriod);
demandIndexGun = DemandIndexIndicator(Symbol, SymbolPeriod.Day, DiPeriod);
AddSymbol(Symbol, SymbolPeriod);
// posizyon takibi - başlangıç
///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);
if (DosyadanOku == true)
{
DegiskenleriDosyadanOku();
}
// posizyon takibi - bitiş
WorkWithPermanentSignal(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)
{
//StochasticSlow %K (5,5) > StochasticSlow %D (3)
var slowK = Math.Round(stochasticSlow.StochasticSlowK.CurrentValue,2);
var slowD = Math.Round(stochasticSlow.StochasticSlowD.CurrentValue,2);
Debug("Stochastic SlowK @" + slowK + " ? " + "Stochastic SlowD @" + slowD);
if (slowK > slowD && CrossAbove(demandIndex, 15) && demandIndex.CurrentValue>15 && demandIndex.CurrentValue<30 && demandIndexGun.CurrentValue>20 && demandIndexGun.CurrentValue<30 && Position != 2)
{
SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
Debug("Alış emri gönderildi.");
Position = 2;
DegiskenleriDosyayaYaz();
}
if (slowK < slowD && CrossBelow(demandIndex, 0) && Position != 1)
{
SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
Debug("Satış emri gönderildi.");
Position = 1;
DegiskenleriDosyayaYaz();
}
// %8 kar al
TakeProfit(Symbol, SyntheticOrderPriceType.Percent, 8);
}
// Veri yaz
public void DegiskenleriDosyayaYaz()
{
if (!System.IO.Directory.Exists(FolderPath))
Directory.CreateDirectory(FolderPath);
string fileName = Path.Combine(FolderPath, DosyaAdi + ".txt");
if (!File.Exists(fileName))
{
File.AppendAllText(fileName, "0");
}
File.WriteAllText(fileName, Position.ToString());
}
// Veri Oku
public void DegiskenleriDosyadanOku()
{
if (!System.IO.Directory.Exists(FolderPath))
Directory.CreateDirectory(FolderPath);
string fileName = Path.Combine(FolderPath, DosyaAdi + ".txt");
if (!File.Exists(fileName))
{
File.AppendAllText(fileName, "0");
}
// Open the file to read from.
string readText = File.ReadAllText(fileName);
Position = Convert.ToInt32(readText);
}
}
}