Merhabalar,
WilliamsFractal için aşağıdaki strateji yapısını inceleyebilirsiniz.
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;
/*
Yeşil fractialda enyüksek değeri tutuyor bu seviyenin üzerine çıktığında alış emri gönderiyor.
Aynı mnatıkla kırmızı fractialda düşük değer değişkende tutuluyor seviyenin altına düştüğünde satıyor.
*/
namespace Matriks.Lean.Algotrader
{
public class WilliamFractal1 : MatriksAlgo
{
[SymbolParameter("GARAN")]
public string Symbol;
[Parameter(SymbolPeriod.Min5)]
public SymbolPeriod SymbolPeriod;
[Parameter(2)]
public int Period;
[Parameter(1)]
public decimal BuyOrderQuantity;
[Parameter(1)]
public decimal SellOrderQuantity;
WilliamsFractal williamFractial;
public override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod);
williamFractial = WilliamsFractalIndicator(Symbol, SymbolPeriod, Period);
SendOrderSequential(true, Side.Buy);
WorkWithPermanentSignal(true);
}
decimal highSeviye = decimal.MaxValue, lowSeviye = decimal.MinValue;
public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
{
var barDataModel = GetBarData();
var fr = williamFractial.Value[0][williamFractial.CurrentIndex - Period];
var high = barDataCurrentValues.LastUpdate.High;
var low = barDataCurrentValues.LastUpdate.Low;
if (fr != 0)
{
var prevHigh2 = Ref(barDataModel, OHLCType.High, Period);
var prevLow2 = Ref(barDataModel, OHLCType.Low, Period);
if (fr == prevHigh2)
{
highSeviye = prevHigh2;
}
if (fr == prevLow2)
{
lowSeviye = prevLow2;
}
}
if (high>highSeviye && LastOrderSide.Obj != Side.Buy)
{
SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
Debug("Alış emri gönderildi.");
Debug("High: " + high + " highSeviyessi: " + highSeviye);
highSeviye = decimal.MaxValue;
lowSeviye = decimal.MinValue;
}
if (lowSeviye>low && LastOrderSide.Obj != Side.Sell)
{
SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
Debug("Satış emri gönderildi.");
Debug("Low: " + low + " lowSeviyessi: " + lowSeviye);
highSeviye = decimal.MaxValue;
lowSeviye = decimal.MinValue;
}
}
}
}
İyi çalışmalar.