Инструкция по работе с терминалом TSLab версии 1.2
3.5. Создание скрипта при помощи API

В данном разделе приведен листинг скрипта, написанного с использованием TSLab API. Описание отладки скрипта.

using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Optimization;
using TSLab.Script.Helpers;
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 high = ctx.GetData(«Highest», new[] {HighPeriod.ToString()},
delegate { return Series.Highest(source.HighPrices, HighPeriod); });
IList low = ctx.GetData(«Lowest», new[] {LowPeriod.ToString()},
delegate { return Series.Lowest(source.HighPrices, LowPeriod); });
IList high2 = ctx.GetData(«Highest», new[] {High2Period.ToString()},
delegate { return Series.Highest(source.HighPrices, High2Period); });
IList 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(«High2({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(«Low2({0}) [{1}]», Low2Period, 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", i); if (le == null) { // Если нет активных длинных позиций, выдаем условный ордер на создание новой позиции. source.Positions.BuyIfGreater(i + 1, 1, high[i], "LE"); } else { le.CloseAtStop(i + 1, low[i], "LX"); } IPosition se = source.Positions.GetLastActiveForSignal("SE", i); if (se == null) { // Если нет активных коротких позиций, выдаем условный ордер на создание новой позиции. source.Positions.SellIfLess(i + 1, 1, low2[i], "SE"); } else { se.CloseAtStop(i + 1, high2[i], "SX"); } } } } }