Код: Выделить всё
function Initialize() {
StrategyName = "MyMTS6";
// Базовые параметры
AddParameter("DEMA_Period", 75, "Период DEMA", 1);
AddParameter("MA_Angle_Period", 11, "Период угла наклона MA", 1);
AddParameter("SuperTrend_Period", 50, "Период SuperTrend", 1);
AddParameter("HMA_Period", 16, "Период HMA", 1);
// Параметры для флэта
AddParameter("FlatThreshold", 25, "Порог ADX для флэта", 1);
AddParameter("BB_Period", 20, "Период Боллинджера", 1);
AddParameter("RSI_Period", 14, "Период RSI", 1);
// Управление рисками
AddParameter("ProfitTarget", 0.25, "Цель прибыли %", 0.01);
AddParameter("TrailingStop", 0.45, "Трейлинг-стоп %", 0.01);
AddParameter("Volume_Threshold", 1.2, "Порог объема", 0.1);
AddInput("Input1", Inputs.Candle, 1, true, "");
ShortLimit = 1;
}
function OnUpdate() {
// Кэширование всех индикаторов
var dema = MY.DEMA(Input1.Close, GetParameter("DEMA_Period"));
var mAngle = MY.MAngle(Input1, GetParameter("MA_Angle_Period"), GetParameter("MA_Angle_Period"), 0);
var superTrend = MY.SuperTrend(Input1, 1, GetParameter("SuperTrend_Period"), 1);
var hma = MY.HMA(Input1.Close, GetParameter("HMA_Period"));
var rsi = RSI(Input1.Close, GetParameter("RSI_Period"));
var adx = ADX(Input1, 14);
var bb = BB(Input1.Close, GetParameter("BB_Period"), 2);
var volumeAvg = SMA(Input1.Volume, 20);
// Определение рыночного режима
var isTrendMarket = adx.GetValue("ADX", 0) > GetParameter("FlatThreshold");
var isFlatMarket = !isTrendMarket;
// Общие условия для шортов
var baseCondition =
dema[0] < mAngle.GetValue("MA", 0) &&
mAngle.GetValue("MA", 0) < superTrend.GetValue("D", 0) &&
superTrend.GetValue("D", 0) < hma.GetValue("HMA", 0) &&
Input1.Volume[0] > volumeAvg[0] * GetParameter("Volume_Threshold");
// Условия для трендового рынка
var trendCondition = baseCondition &&
rsi[0] > 65 &&
mAngle.GetValue("A", 0) > 0.0003 &&
adx.GetValue("+DI", 0) < adx.GetValue("-DI", 0);
// Условия для флэта
var flatCondition = baseCondition &&
Input1.Close[0] > bb.GetValue("Upper", 0) &&
rsi[0] > 70 &&
ATR(Input1, 14)[0] < (bb.GetValue("Upper", 0) - bb.GetValue("Lower", 0)) * 0.3;
// Проверка исторических условий
var historicalValidation = false;
for (var i = 1; i <= 10; i++) {
if (dema[i] > mAngle.GetValue("MA", i) &&
mAngle.GetValue("MA", i) > superTrend.GetValue("D", i) &&
Input1.Close[i] > bb.GetValue("Upper", i) &&
rsi[i] > 70) {
historicalValidation = true;
break;
}
}
// Правила входа
if ((isTrendMarket && trendCondition) || (isFlatMarket && flatCondition)) {
if (historicalValidation) {
EnterShort(100);
// Автоподстройка тейк-профита во флэте
if (isFlatMarket) {
var targetPrice = bb.GetValue("Middle", 0);
AddTarget("Short", targetPrice, 100);
}
}
}
// Динамическое управление позицией
if (CurrentPosition() < 0) {
// Для тренда: трейлинг-стоп
if (isTrendMarket) {
BreakingStop(GetParameter("ProfitTarget"),
GetParameter("TrailingStop"),
SignalPriceType.DeltaInPercentFromAveragePrice);
}
// Для флэта: выход по RSI
if (isFlatMarket && rsi[0] < 40) {
ClosePosition();
}
}
// Фильтр волатильности
if (ATR(Input1, 14)[0] < Input1.Close[0] * 0.01) {
return;
}
}