En son oluşan yeşil ikonun oluştuğu bardaki Williams Fractial değeri tutulur ve sonraki barlarda bu seviye geçilirse al sinyali oluşur.
Ters mantıkla da en son oluşan kırmızı ikonun oluştuğu bardaki Williams Fractial değeri tutulur ve sonraki barlarda bu seviyenin altına düşülürse sat sinyali oluşur.
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 FractialStratejisi : 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;
bool ? alisMI = null;
decimal highSeviye = decimal.MaxValue, lowSeviye = decimal.MinValue;
public override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod);
williamFractial = WilliamsFractalIndicator(Symbol, SymbolPeriod, Period);
SendOrderSequential(true, Side.Buy);
WorkWithPermanentSignal(true);
}
decimal fr;
public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
{
var barDataModel = GetBarData();
fr = williamFractial.Value[0][williamFractial.CurrentIndex -Period];
if (fr != 0)
{
var high = Ref(barDataModel, OHLCType.High, Period);
var low = Ref(barDataModel, OHLCType.Low, Period);
if (fr == high && LastOrderSide.Obj != Side.Buy)
{
highSeviye = high;
Debug("high: " + high);
}
if (fr == low && LastOrderSide.Obj != Side.Sell)
{
lowSeviye = low;
Debug("low: " + low);
}
}
if (barDataCurrentValues.LastUpdate.High>highSeviye && LastOrderSide.Obj != Side.Buy)
{
SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
Debug("Alış emri gönderildi.");
Debug("High: " + barDataCurrentValues.LastUpdate.High + " highSeviyessi: " + highSeviye);
highSeviye = decimal.MaxValue;
lowSeviye = decimal.MinValue;
}
if (lowSeviye>barDataCurrentValues.LastUpdate.Low && LastOrderSide.Obj != Side.Sell)
{
SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
Debug("Satış emri gönderildi.");
Debug("Low: " + barDataCurrentValues.LastUpdate.Low + " lowSeviyessi: " + lowSeviye);
highSeviye = decimal.MaxValue;
lowSeviye = decimal.MinValue;
}
}
public override void OnOrderUpdate(IOrder order)
{
}
}
}