#region Using block
using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Optimization;
using TSLab.Script.Helpers;
using TSLab.DataSource;
#endregion
#region Пространство имен системы
namespace TSLab.Sistema
{
public class System_Sistemar : IExternalScript
{
#endregion
//Переменные для обслуживания
#region Переменные для обслуживания позиций
public bool signalBuy; //Сигнал на покупку
public bool signalShort; //Сигнал на продажу
public IPosition LongPos, ShortPos; // Сигналы на вход в длинную и короткую позиции
#endregion
// Инициализация параметров оптимизации
#region Оптимизационные параметры Индикаторов
public OptimProperty _periodatr = new OptimProperty(10,5,20,1);
public OptimProperty _periodADX = new OptimProperty(10,5,20,1); // Период ADX
public OptimProperty _adxLevel = new OptimProperty(10,5,20,1); // Уровень ADX
public ConstGen ADX_Line = new ConstGen(); // Уровень индикатора в виде константы
public OptimProperty _Dm_period = new OptimProperty(10,5,20,1); // Период для DM
public OptimProperty _EMA = new OptimProperty(10,5,20,1); // Период EMA
public Time _Time_Session = new Time(); // Инициализация времени
#endregion
#region Оптимизационные параметры Take and Stop
public OptimProperty _winLoss = new OptimProperty(10,5,20,1); // Отношение риска к прибыли для Лонга
public OptimProperty _atrStop = new OptimProperty(10,5,20,1); //Процент отдаления стоп-лосса от цены входа в позицию для Лонга
#endregion
// Основной диапазон Системы
#region Диапазон Инструмента и первой свечи
public void Execute(IContext ctx, ISecurity source)
{
int StartBar = 130;
#endregion
// Получение параметров для системы
#region Параметры для Take and Stop
double orderStop=0; // Объявление переменной для Стоп
double orderTake=0; // Объявление переменной для Таке Профита
int atrStop = _atrStop; // Забираем значение % Стоп лоса для Лонга
int winLoss = _winLoss; // Забираем Отношение риска к прибыли для Лонга
#endregion
#region Параметры для Индикаторов
int periodADX = _periodADX; // Забираем значение периода ADX
this.ADX_Line.Value = _adxLevel;// Забираем значение константы для уровня из оптимизированного параметра.
int adxLevel = _adxLevel; // Забираем значение уровня ADX
int periodatr = _periodatr; // Забираем значение периода ATR для Лонга
int Dm_period = _Dm_period; // Забираем значение периода DM
int EMA = _EMA; // Забираем значение Ema
#endregion
// Расчеты индикаторов и take profit
#region Индикаторы
// Вычесляю ADX, DM
var nAdx = ctx.GetData("ADX", new[] { periodADX.ToString() },
() => new ADXFull() { Context = ctx, Period = periodADX }.Execute(source));
var nDm = ctx.GetData("+DI", new[] { Dm_period.ToString() },
() => new DIP() { Context = ctx, Period = Dm_period }.Execute(source));
IList<double> ADX_Line = ctx.GetData("ADX_line", new[] {this.ADX_Line.Value.ToString() },
delegate {return this.ADX_Line.Execute(ctx);}); // Строим нужную линию
//Вычисляю ATR и Время
IList<double> ATR = ctx.GetData("ATR", new[] {periodatr.ToString() },
delegate { return Series.AverageTrueRange(source.Bars, periodatr); });
IList<double> Time_Session = ctx.GetData("Время1", new[] {_Time_Session.ToString()},
delegate {return this._Time_Session.Execute(source);});
//Вычесляю Ema
IList<double> Ema = ctx.GetData("Ema", new[] {EMA .ToString() },
delegate { return Series.EMA(source.ClosePrices,EMA); });
#endregion
#region Takeprofit and StopLoss
#endregion
// Графики и значения
#region Отрисовка панелей
// Отрисовка основного окна
IPane mainPane = ctx.CreatePane("График", 100D, false); // Берем основную панель
mainPane.Visible = true;
IGraphList mainPane_source_chart = mainPane.AddList("График",source,CandleStyles.BAR_CANDLE,true, true, true, true, 65024,PaneSides.RIGHT); // Отрисовка Цены
source.ConnectSecurityList(mainPane_source_chart);
mainPane.AddList("EMA", Ema, ListStyles.LINE,new Color(0, 0, 255), LineStyles.SOLID, PaneSides.RIGHT); // Отрисовка ЕМА
// Отрисовка ADX, DM
IPane ADXPane = ctx.CreatePane("ADX_Long", 25, false, false); // Добавление панели для ADX_Long
ADXPane.AddList("ADX_line", ADX_Line, ListStyles.LINE,new Color(0, 0, 0), LineStyles.SOLID, PaneSides.RIGHT); // Отрисовка уровня ADX
ADXPane.AddList("ADX", nAdx, ListStyles.LINE,new Color(0, 0, 255), LineStyles.SOLID, PaneSides.RIGHT); // Отрисовка графика ADX
ADXPane.AddList("Dm", nDm, ListStyles.LINE,new Color(0, 255, 0), LineStyles.SOLID, PaneSides.RIGHT); // Отрисовка графика DM+
ADXPane.UpdatePrecision(PaneSides.RIGHT, 4); // Количество знаков после запятой
#endregion
#region Значения для первой свечи
int barsCount = source.Bars.Count;
for (int bar = StartBar; bar < barsCount; bar++)
{
#endregion
// Параметры и Сигналы
#region Сброс параметров
signalBuy = false;
signalShort = false;
nDm [bar] = nDm [bar]*100;
#endregion
#region Сигналы на вход в позицию
#endregion
// Исполнение сигналов
#region Выполнение сигналов для длинной позиции
LongPos = source.Positions.GetLastActiveForSignal("OpenLong",bar);
if (LongPos == null) // Если нет активной длинной позиции
{
if (signalBuy) // Если есть сигнал Buy,
{
source.Positions.BuyIfGreater(bar+1,1,source.HighPrices[bar]+2, "OpenLong"); // Выдаем ордер на открыте новой длинной позиции
orderStop = source.LowPrices[bar] - ((ATR [bar] / 100) * atrStop); // Устанавливаем стоп-лосс
orderTake = source.HighPrices [bar] + ((ATR [bar] / 100) * atrStop * winLoss); // Устанавливаем Таке Профит
}
}
else if (Time_Session[bar]>213000)// Если есть активная длинная позиция и время больше 23:30
{
LongPos.CloseAtMarket(bar+1, "Time Stop Long"); // Позиция закрывается по рынку
}
else// Если есть активная длинная позиция
{
LongPos.CloseAtStop(bar+1, orderStop, "Long_Stop"); // Пробуем выйти по Стопу
LongPos.CloseAtProfit(bar+1,orderTake,"Long take_profit"); // Пробуем выйти по Таке Профиту
}
#endregion
#region Выполнение сигналов для короткой позиции
ShortPos = source.Positions.GetLastActiveForSignal("OpenShort",bar);
if (ShortPos == null) // Если нет активной короткой позиции
{
if (signalShort) // Если есть сигнал Short
{
source.Positions.SellIfLess(bar+1,1,source.LowPrices[bar]-2, "OpenShort"); // Выдаем ордер на открыте новой короткой позиции.
orderStop = source.HighPrices[bar] + ((ATR [bar] / 100) * atrStop); //устанавливаем стоп-лосс
orderTake = source.LowPrices[bar] - ((ATR [bar] / 100) * atrStop * winLoss); // Устанавливаем Таке Профит
}
}
else if (Time_Session[bar]>213000)// Если есть активная короткая позиция и время больше 23:30
{
ShortPos.CloseAtMarket(bar+1, "Time Stop Short"); // Позиция закрывается по рынку
}
else // Если есть активная короткая позиция,
{
ShortPos.CloseAtStop(bar+1, orderStop, "Short_Stop"); // Пробуем выйти по Стопу
ShortPos.CloseAtProfit(bar+1,orderTake,"Short take_profit"); // Пробуем выйти по Таке Профиту
}
#endregion
}
}
}
}