using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Optimization;

namespace TSLab.Samples
{
public class HiLoSample : IExternalScript
{
// Параметры оптимизации для длинных позиций задаются при помощи типа OptimProperty.
public OptimProperty HighPeriod = new OptimProperty(20, 10, 100, 5);
public OptimProperty LowPeriod = new OptimProperty(10, 10, 100, 5);

// Параметры оптимизации для коротких позиций так же задаются при помощи типа OptimProperty.
public OptimProperty Low2Period = new OptimProperty(20, 10, 100, 5);
public OptimProperty High2Period = new OptimProperty(10, 10, 100, 5);

public virtual void Execute(IContext ctx, ISecurity source)
{
// Вычисляем максимумы и минимумы.
// Используем GetData для кеширования данных и ускорения оптимизация.
// При неиспользовании кэша увеличивается объем обрабатываемых данных, что ведет к сильному замедлению оптимизации.
// Следует учесть, что необходимо перечислить абсолютно все изменяемые переменные используемые в вычислениях.
// Не соблюдение этого правила приведет к некорректной работе и результатам оптимизации.
IList<double> high = ctx.GetData("Highest", new[] {HighPeriod.ToString()},
delegate { return Series.Highest(source.HighPrices, HighPeriod); });
IList<double> low = ctx.GetData("Lowest", new[] {LowPeriod.ToString()},
delegate { return Series.Lowest(source.HighPrices, LowPeriod); });
IList<double> high2 = ctx.GetData("Highest", new[] {High2Period.ToString()},
delegate { return Series.Highest(source.HighPrices, High2Period); });
IList<double> low2 = ctx.GetData("Lowest", new[] {Low2Period.ToString()},
delegate { return Series.Lowest(source.HighPrices, Low2Period); });

// Берем основной панель (Pane).
IPane mainPane = ctx.First;

// Отрисовка графиков.
mainPane.AddList(string.Format("High({0}) [{1}]", HighPeriod, source.Symbol), high, ListStyles.LINE,
0x00ff00, LineStyles.SOLID, PaneSides.RIGHT);
mainPane.AddList(string.Format("High({0}) [{1}]", High2Period, source.Symbol), high2, ListStyles.LINE,
0x00ff00, LineStyles.DASH, PaneSides.RIGHT);
mainPane.AddList(string.Format("Low({0}) [{1}]", LowPeriod, source.Symbol), low, ListStyles.LINE,
0xff0000, LineStyles.SOLID, PaneSides.RIGHT);
mainPane.AddList(string.Format("Low({0}) [{1}]", LowPeriod, source.Symbol), low2, ListStyles.LINE,
0xff0000, LineStyles.DASH, PaneSides.RIGHT);

// =================================================
// Торговля.
int barsCount = source.Bars.Count;
for (int i = 0; (i < barsCount); i++)
{
IPosition le = source.Positions.GetLastActiveForSignal("LE");
if (le == null)
{
// Если нет активных длинных позиций, выдаем условный ордер на создание новой позиции.
source.Positions.BuyAtLimit(i + 1, 1, high[i], "LE");
}
else
{
le.CloseAtStop(i + 1, low[i], "LX");
}
IPosition se = source.Positions.GetLastActiveForSignal("SE");
if (se == null)
{
// Если нет активных коротких позиций, выдаем условный ордер на создание новой позиции.
source.Positions.ShortAtLimit(i + 1, 1, low2[i], "SE");
}
else
{
se.CloseAtStop(i + 1, high2[i], "SX");
}
}
}
}
}