Стратегии и роботы > Усреднение!

Обсуждение, описание стратегий и роботов, идеи для стратегий
Konstantin
Сообщения: 20
Зарегистрирован: 11 окт 2017, 15:25
Благодарил (а): 6 раз

Re: Усреднение!

Непрочитанное сообщение Konstantin » 19 сен 2021, 20:29

evge писал(а):Если по описанным условиям, то так (но результат работы не проверял):



Вроде бы всё работает, только надо сделать защиту параметра DP от отрицательных значений в том случае, если DPAdd будет больше DP
Добавил строку:

Код: Выделить всё

if (DP < 0) DP = DeltaPercent;
Последний раз редактировалось Konstantin 23 сен 2021, 08:23, всего редактировалось 1 раз.

Konstantin
Сообщения: 20
Зарегистрирован: 11 окт 2017, 15:25
Благодарил (а): 6 раз

Re: Усреднение!

Непрочитанное сообщение Konstantin » 22 сен 2021, 21:10

evge писал(а):Если по описанным условиям, то так (но результат работы не проверял):


Мне показались более интересными результаты, если заменить в условии "противоречат" на "совпадают":
"Если сигналы по SMA1 и SMA2 совпадают друг с другом"
Заменить этот код:

Код: Выделить всё

if ((sMA2[0] > sMA2[1] && sMA[0] < sMA[1]) || (sMA2[0] < sMA2[1] && sMA[0] > sMA[1]))

на этот:

Код: Выделить всё

if ((sMA2[0] > sMA2[1] && sMA[0] > sMA[1]) || (sMA2[0] < sMA2[1] && sMA[0] < sMA[1]))

Аватара пользователя
ip851874
Сообщения: 50
Зарегистрирован: 21 ноя 2020, 22:56
Откуда: Москва
Благодарил (а): 21 раз
Контактная информация:

Re: Усреднение!

Непрочитанное сообщение ip851874 » 17 окт 2025, 19:16

Доброго времени суток! :)
Евгений, подскажите как в данный код добавить усреднение что бы тейк сдвигался ? Спасибо!
Шаг усреднения и количество лотов на каждом шаге должно быть разным.
Например:
Шаг: 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(); // Закрываем позицию при достижении тейк-профита
    }
}



Вернуться в «Стратегии и роботы»

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и 18 гостей