Merhabalar,
İstediğiniz stratejideki MOST(RSI(C,14) ve MOV(RSI(C,14)+1000,opt1,e) çizgileri için yeni bir indikatör oluşturmak gerekli. Daha sonra bu indikatörü strateji içerisinde kullanarak istediğiniz strateji oluşturulabilir.
Aşağıda hem indikatör hem de strateji kodları bulunmakta. İndikatör ve strateji kodlarını kullanırken isim alanlarının aynı olmasına dikkat ediniz. Benim isimlendirdiğim şekliyle indikatör adı "RsiMost", strateji adı ise "Most_Rsi" ister bu isimlerle isterseniz değiştirip de kullanabilirsiniz. Stratejiyi emin olana kadar gerçek hesaplarda kullanmayınız.
İyi çalışmalar
İndikatör:
using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using Matriks.Data.Identifiers;
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;
namespace Matriks.Lean.Algotrader
{
[IndicatorInformationAttribute("RsiMost", IndicatorDrawingArea.NewWindow)]
[IndicatorLineInformationAttribute(new []
{
"Rsi/Most(0,1,2,3,4,5)", "Rsi/Mov(0,1,2,3,4,5)"
})]
public class RsiMost : MatriksIndicator
{
[DefaultValue(14)]
public int RsiPeriod
{
get; set;
}
[DefaultValue(5)]
public int MovPeriod
{
get; set;
}
[DefaultValue(MovMethod.E)]
public MovMethod MovMethod
{
get; set;
}
[DefaultValue(3)]
public int MostPeriod
{
get; set;
}
[DefaultValue(2)]
public decimal Percentage
{
get; set;
}
[DefaultValue(MovMethod.E)]
public MovMethod MostMethod
{
get; set;
}
MOV mov;
MOST most;
RSI rsi;
public override void OnInit()
{
mov = new MOV(MovPeriod, MovMethod);
most = new MOST(MostPeriod, Percentage, MostMethod);
rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, 14);
}
public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime)
{
SetLine(0, currentBar, 0);
SetLine(1, currentBar, 0);
mov.Update(rsi.CurrentValue+1000,currentBar,barDateTime);
most.Update(rsi.CurrentValue+1000,currentBar,barDateTime);
if (currentBar < MovPeriod) return ;
SetLine(0, currentBar, most.CurrentValue);
SetLine(1, currentBar, mov.CurrentValue);
}
}
}
Strateji:
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;
namespace Matriks.Lean.Algotrader
{
public class Most_Rsi : MatriksAlgo
{
[SymbolParameter("GARAN")]
public string Symbol;
[Parameter(SymbolPeriod.Min5)]
public SymbolPeriod SymbolPeriod;
[Parameter(5)]
public decimal Quantity;
[Parameter(14)]
public int RsiPeriod;
[Parameter(5)]
public int MovPeriod;
[Parameter(MovMethod.E)]
public MovMethod MovMethod;
[Parameter(3)]
public int MostPeriod;
[Parameter(2)]
public decimal Percentage;
[Parameter(MovMethod.E)]
public MovMethod MostMethod;
MatriksIndicator RsiMost;
public override void OnInit()
{
RsiMost = new RsiMost();
RsiMost.SetIndicatorParameters("RsiPeriod", RsiPeriod);
RsiMost.SetIndicatorParameters("MovPeriod", MovPeriod);
RsiMost.SetIndicatorParameters("MovMethod", MovMethod);
RsiMost.SetIndicatorParameters("MostPeriod", MostPeriod);
RsiMost.SetIndicatorParameters("Percentage", Percentage);
RsiMost.SetIndicatorParameters("MostMethod", MostMethod);
RegisterUserIndicator(RsiMost, Symbol, SymbolPeriod, OHLCType.Close, 5);
AddSymbol(Symbol, SymbolPeriod);
WorkWithPermanentSignal(true);
SendOrderSequential(true);
}
public override void OnInitComplated()
{
}
public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
{
var index = barDataCurrentValues.LastUpdate.BarDataIndex;
var PrevMov = RsiMost.Value[1][index -1];
var PrevMost = RsiMost.Value[0][index -1];
var Mov = RsiMost.Value[1][index];
var Most = RsiMost.Value[0][index];
if (PrevMov < PrevMost && Mov>Most)
{
SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
Debug("Alış Emri Verildi.");
}
if (PrevMov > PrevMost && Mov<Most)
{
SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
Debug("Satış Emri Verildi.");
}
}
public override void OnOrderUpdate(IOrder order)
{
if (order.OrdStatus.Obj == OrdStatus.Filled)
{
}
}
}
}