Доброго времени суток! 
 
 Евгений, подскажите как в данный код добавить усреднение что бы тейк сдвигался ? Спасибо!
Шаг усреднения и количество лотов на каждом шаге должно быть разным.
Например:
Шаг: 0,1 (%)
Количество шагов: 8
Смешение на каждом шаге: 1.1 (если нет смещения то 1)
Количество докупки: 1
Смещение количества докупки: 1
Код: Выделить всё
// Инициализация параметров стратегии
Initialize() {
    StrategyName = "forts_Delta_MATrail_take";
    AddParameter("Period", 85, "Период MATrail", 1);
    AddParameter("pStop", 0, "Стоп в процентах", 0);
    AddParameter("TP", 2, "Тейк в процентах", 0);
    AddParameter("StepSize", 0.1, "Шаг усреднения (%)", 0);
    AddParameter("NumberOfSteps", 8, "Количество шагов", 1);
    AddParameter("StepMix", 1.1, "Смешение на каждом шаге", 1);
    AddParameter("PurchaseAmount", 1, "Количество докупки", 1);
    AddParameter("PurchaseMix", 1, "Смешение количества докупки", 1);
    AddInput("Input1", Inputs.Candle, 1, true, "MXU9=ФОРТС");
    AddChartIndicator("MY.str_Delta_MATra", new Dictionary<string, string>{{"Period", "Period"}}); 
}
// Основной метод обновления, вызывается при каждом обновлении данных
OnUpdate() 
{
    // Получаем параметры
    int period = GetParameter("Period");
    double stepSize = GetParameter("StepSize");
    double stepMix = GetParameter("StepMix");
    double tp = GetParameter("TP");
  
    var delta = MY.DeltaCumLine(Input1); // Вычисляем дельту
    double[] lines = MY.MATrail(delta, period);
    double line = lines[0];
    double line1 = lines[1];
    double pos = CurrentPosition(); // Получаем текущее количество открытых позиций
    double currentPrice = CurrentPrice(); // Получаем текущую цену
    double stepSizeInPrice = stepSize / 100 * currentPrice; // Вычисляем шаг в цене
    if (delta[0] > line && delta[1] <= line1) {
        if (pos == 0) { // Если позиция еще не открыта  
            EnterLong(GetParameter("PurchaseAmount")); // Открываем длинную позицию
            entryPrice = currentPrice; // Указываем цену входа
            if (GetParameter("pStop") > 0) {
                SetStopLoss(GetParameter("pStop"), StopLossType.Percent); // Устанавливаем стоп-лосс
            }
        } else {
            if (currentPrice < entryPrice * (1 - stepSize / 100 * stepMix)) {
                int additionalLots = (int)(GetParameter("PurchaseAmount") * GetParameter("PurchaseMix"));
                EnterLong(additionalLots); // Открываем дополнительные лоты
                entryPrice = (entryPrice * (1 + additionalLots) + currentPrice * additionalLots) / (1 + additionalLots);
            }
        }
    }
    if (delta[0] < line && delta[1] >= line1) {
        if (pos == 0) { // Если позиция еще не открыта  
            EnterShort(GetParameter("PurchaseAmount")); // Открываем короткую позицию
            entryPrice = currentPrice; // Указываем цену входа
            if (GetParameter("pStop") > 0) {
                SetStopLoss(GetParameter("pStop"), StopLossType.Percent); // Устанавливаем стоп-лосс
            }
        } else {
            if (currentPrice > entryPrice * (1 + stepSize / 100 * stepMix)) {
                int additionalLots = (int)(GetParameter("PurchaseAmount") * GetParameter("PurchaseMix"));
                EnterShort(additionalLots); // Открываем дополнительные лоты
                entryPrice = (entryPrice * (1 + additionalLots) + currentPrice * additionalLots) / (1 + additionalLots);
            }
        }
    }
    if (CurrentPL() >= tp) {
        ClosePosition(); // Закрываем позицию при достижении тейк-профита
    }
}