using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TSLab.DataSource;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Helpers;
using TSLab.Script.Optimization;
namespace TradeScript
{
public class SBRF_VTB_STATIC_SETKA : IExternalScript2
{
#region Параметры оптимизации
public OptimProperty SlippageSBRF = new OptimProperty(0, 0, 0, 0);
public OptimProperty SlippageVTB = new OptimProperty(0, 0, 0, 0);
public OptimProperty SMASub = new OptimProperty(464, 500, 1500, 10);
public OptimProperty SizeLevel = new OptimProperty(100, 50, 1000, 10);
public OptimProperty SumLevel = new OptimProperty(5, 1, 5, 10);
#endregion
public void Execute(IContext ctx, ISecurity secSBRF, ISecurity secVTBR)
{
#region Расчет Индикаторов
var sub = Series.Sub(secSBRF.ClosePrices, secVTBR.ClosePrices); //Вычитание значений закрытия инструментов
var smaSub = ctx.GetData("SMASub", new string[] { SMASub.Value.ToString() }, () => Series.SMA(sub, SMASub));//Скользящая построенная по разнице
var extendable = Series.Sub(smaSub, sub); //Разница от скользящей и разницей цен
#endregion
for (int i = 0; i < ctx.BarsCount; i++)
{
////Прямые позиции
////Прямые позиции
var leVtbr = secVTBR.Positions.GetLastActiveForSignal("VTBR_LE", i);// Получаем позицию или null
var seSbrf = secSBRF.Positions.GetLastActiveForSignal("SBRF_SE", i);// Получаем позицию или null
if (leVtbr == null && seSbrf == null)
{
if (extendable[i] < 100)
{
secSBRF.Positions.SellAtMarket(i + 1, 1, "SBRF_SE", "Продажа SBRF");// Входим в шорт
secVTBR.Positions.BuyAtMarket(i + 1, 2, "VTBR_LE", "Продажа VTB"); // Входим в лонг
}
}
else
{
for (int j = 0; j < SumLevel; j++)
{
if (extendable[i] < SizeLevel && seSbrf.Shares <= j + 1)
{
leVtbr.ChangeAtMarket(i + 1, leVtbr.Shares + 2, "VTBR_LE2");// <<<<<<<<=======Ссылка не указывает на экземпляр объекта
seSbrf.ChangeAtMarket(i + 1, seSbrf.Shares - 1, "SBRF_SE2");// <<<<<<<<=======Ссылка не указывает на экземпляр объекта
}
if (extendable[i] > SizeLevel && seSbrf.Shares >= j + 1)
{
leVtbr.ChangeAtMarket(i + 1, leVtbr.Shares - 2, "VTBR_LX2");// <<<<<<<<=======Ссылка не указывает на экземпляр объекта
seSbrf.ChangeAtMarket(i + 1, seSbrf.Shares + 1, "SBRF_SX2");// <<<<<<<<=======Ссылка не указывает на экземпляр объекта
}
}
if (extendable[i] >= 0)
{
seSbrf.CloseAtMarket(i + 1, "SBRF_SX");
}
}
}
#region Визуализация
...
#endregion
}
}
}