Вот что я изначально имел ввиду, показано в коде велса, в таком же примере, все делается одной строчкой. А вобще удобно очень сделано у них QuickRef, вот бы в Тслаб так)) и если в QuickRef открыть папку Cosmetic Chart, то увидим много инструментов для визуализации. Поскорей бы версия 2

using System;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
namespace WLD.Strategies
{
class Drawing : WealthScript
{
#region Объявление параметров торговой системы
readonly StrategyParameter _period; // Период ATR
#endregion
#region Инициализация параметров торговой системы
public Drawing()
{
_period = CreateParameter("ATR Period", 160, 20, 200, 20);
}
#endregion
protected override void Execute()
{
var firstValidValue = 0; // Первый бар ТС, на котором все паттерны и индикаторы существуют и стабилизированы
PlotStops(); // Отображать уровни, на которых были попытки выхода по S/L
ClearDebug(); // Очистить окно отладки
HideVolume(); // Скрыть объемы
#region Индикаторы
var period = _period.ValueInt;
DataSeries stopSma = SMA.Series(Close, period);
PlotSeries(PricePane, stopSma, Color.Red, LineStyle.Solid, 1);
firstValidValue = Math.Max(firstValidValue, stopSma.FirstValidValue * 3); // Первое значение индикатора с условием стабилизации
#endregion
double stopLevel = 0;
for (var bar = firstValidValue; bar < Bars.Count; bar++) // Пробегаемся по всем свечкам
{
var isSignalBuy = Close[bar] > High[bar - 1]; // Сигналы на вход в длинную и короткую позиции
isSignalBuy &= Low[bar] > stopSma[bar];
var isSignalShort = Close[bar] < Low[bar - 1]; // Сигналы на вход в длинную и короткую позиции
isSignalShort &= High[bar] < stopSma[bar];
if (!IsLastPositionActive) // Если позиции нет
{
if (isSignalBuy) // Если пришел сигнал на покупку
{
BuyAtMarket(bar + 1, "Buy"); // Пробуем войти в длинную позицию
stopLevel = SMA.Value(bar - 1, Close, period);
}
else if (isSignalShort) // Если пришел сигнал на короткую продажу
{
ShortAtMarket(bar + 1, "Short");
stopLevel = SMA.Value(bar - 1, Close, period);
}
}
else // Если позиция есть
{
var pos = LastActivePosition; // Позиция, с которой будем работать
var barsHeld = bar - pos.EntryBar + 1;
var smaPeriod = period - barsHeld;
smaPeriod = smaPeriod < 5 ? 5 : smaPeriod;
var adoptSma = SMA.Value(bar - 1, Close, smaPeriod);
if (pos.PositionType == PositionType.Long) // Для длинной позиции
{
stopLevel = Math.Max(stopLevel, adoptSma);
if (Close[bar] < stopLevel)
ExitAtLimit(bar + 1, pos, Close[bar]);
}
else // Для короткой позиции
{
stopLevel = Math.Min(stopLevel, adoptSma);
if (Close[bar] > stopLevel)
ExitAtLimit(bar + 1, pos, Close[bar]);
}
DrawCircle(PricePane, 4, bar, stopLevel, Color.Green, Color.DarkGreen, LineStyle.Solid, 1, true); // Вот также хотелось бы в Тслабе
}
}
}
}
}