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.