Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1527

 
Oleg Kubenko #:
и еще вопрос куда делись книги из продажи в маркете?

Сомнительно, что тут ответят в этой ветке. Вероятно, не очень прибыльно оказалось их продавать...

 
Aleksey Vyazmikin #:

Тогда я не понял, при чём тут волатильность. На свече же знаете где будет максимальный минус сразу в момент открытия её...

разница в том что если свеча откроется слишком высоко скажем при ордере селл то стоп лос приблизится только по факту открытия 

 
Aleksey Vyazmikin #:

Сомнительно, что тут ответят в этой ветке. Вероятно, не очень прибыльно оказалось их продавать...

а где они теперь?

 
Oleg Kubenko #:

разница в том что если свеча откроется слишком высоко скажем при ордере селл то стоп лос приблизится только по факту открытия 

Напишите детально алгоритм, что там считаете, а то я не понимаю, почему нельзя сразу определить стоп...

 
Oleg Kubenko #:

а где они теперь?

Похоже, что нет смысла их продавать - вот и убрали.

 
Aleksey Vyazmikin #:

Напишите детально алгоритм, что там считаете, а то я не понимаю, почему нельзя сразу определить стоп...

ладно вроде бы переделал как вы говорите, вы это имели ввиду? (то что касается уменьшения убытков в коде) эта функция вызывается на каждом тике

datetime lastCandleTime = 0;
void UpdateTrailingStops() {
    if (!ActivateTrailStop || !EnableStopLoss) return; // Проверка, включены ли трейлинг-стоп и стоп-лосс

    datetime currentCandleTime = iTime(_Symbol, PERIOD_M1, 0); // Время текущей свечи

    // Проверка, началась ли новая свеча
    if (currentCandleTime != lastCandleTime) {
        lastCandleTime = currentCandleTime; // Обновляем время последней обработанной свечи

        // Перебор всех открытых позиций
        for (int i = PositionsTotal() - 1; i >= 0; --i) {
            ulong ticket = PositionGetTicket(i);
            if (PositionSelectByTicket(ticket)) { // Выбор позиции по билету
                if (PositionGetInteger(POSITION_MAGIC) == MagicNumber) { // Проверка магического числа
                    double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
                    double currentPrice = PositionGetDouble(POSITION_PRICE_CURRENT);
                    double profit = PositionGetDouble(POSITION_PROFIT);
                    double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
                    double stopLoss = PositionGetDouble(POSITION_SL);
                    double trailStopLevel = stopLoss; // Начальное значение стоп-лосса
                    double lastHigh = iHigh(_Symbol, PERIOD_M1, 1); // Получение хая предыдущей свечи
                    double lastLow = iLow(_Symbol, PERIOD_M1, 1); // Получение лоу предыдущей свечи

                    if (profit > 0 && profit / point >= ActivationProfit) {
                        // Логика для прибыльных позиций
                        if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) {
                            trailStopLevel = currentPrice - TrailingStop * point;
                            if (trailStopLevel > openPrice && trailStopLevel > stopLoss) {
                                if (trailStopLevel != stopLoss) {
                                    trade.PositionModify(ticket, trailStopLevel, PositionGetDouble(POSITION_TP));
                                }
                            }
                        } else {
                            trailStopLevel = currentPrice + TrailingStop * point;
                            if (trailStopLevel < openPrice && trailStopLevel < stopLoss) {
                                if (trailStopLevel != stopLoss) {
                                    trade.PositionModify(ticket, trailStopLevel, PositionGetDouble(POSITION_TP));
                                }
                            }
                        }
                    } else if (profit < 0) { // Логика уменьшения убытков при неприбыльных позициях
                        if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) {
                            trailStopLevel = MathMax(stopLoss, currentPrice - (lastLow - stopLoss));
                        } else {
                            trailStopLevel = MathMin(stopLoss, currentPrice + (stopLoss - lastHigh));
                        }
                        if (trailStopLevel != stopLoss) {
                            trade.PositionModify(ticket, trailStopLevel, PositionGetDouble(POSITION_TP));
                        }
                    }
                }
            }
        }
    }
}
 
Oleg Kubenko #:

ладно вроде бы переделал как вы говорите, вы это имели ввиду? (то что касается уменьшения убытков в коде) эта функция вызывается на каждом тике

Ну, результат устраивает?

Я вообще чего то код смотрю и не пойму - что тут насчитали...

сurrentPrice - (lastLow - stopLoss)

Ну, думаю я просто устал, а Вы всё уже детально проверили в визуализаторе...

 
Aleksey Vyazmikin #:

Ну, результат устраивает?

Я вообще чего то код смотрю и не пойму - что тут насчитали...

Ну, думаю я просто устал, а Вы всё уже детально проверили в визуализаторе...

это я расчитал приближение стоп лоса к цене хай или лоу предыдущего бара, пока что нет не проверил, тестирую предыдущие результаты

покачто на графике цена идет в мою пользу и передвигается только трейл стоп по прибыли
 

Мне дали информацию, что существует в MQL5 функция iVolatility с примером:

double volatility = iVolatility(_Symbol, PERIOD_CURRENT, 14, PRICE_CLOSE, 0, 0);
Но не могу нигде про это прочитать. Имеет место такая функция? Если нет, как тогда получить текущую волатильность в MQL5?


 
maxvoronin74 #:

Мне дали информацию, что в MQL5 есть функция iVolatility с примером:

Но я нигде не могу прочитать об этом. Существует ли такая функция? Если нет, то как можно получить текущую волатильность в MQL5?


не существует, простая проверка в документации подскажет вам, что существует.