Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2568

 
DanilaMactep #:

Всем добрый день. Пишу очередной Грааль JJJ пытаюсь написать функцию динамического расчёта трала по атр. Код трала ниже


В таком виде трал даже работает, но периодически появляются ошибка 1 и 130. Помогите пожалуйста исправить это дело, чтобы ошибки ушли.

В параметрах OrderSend, OrderModify все цены должны быть нормированы. У вас нет.. То есть надо NormalizeDouble(new_stop_loss,digits); (не забыть получить правильный digits, если символ отличается от текущего)


PS/ чтобы два раза не вставать: проверка значения индикатора на корректность : MathIsValidNumber(value) && value>=0 && value!=EMPTY_VALUE

 
Tretyakov Rostyslav #:
Принтуйте инициализацию и найдете причину.

Спасибо, нашел причину. В программе использую данние с Cluster Delta,  для  тестерного сигнала  использую данние с файла вместо функций Cluster Delta, но видимо при тесте не візуальном  каким-то боком цепляются и до инициализации вообще не доходит. Сделал отдельную версию дле тестов и заработало.

 
Maxim Kuznetsov #:

В параметрах OrderSend, OrderModify все цены должны быть нормированы. У вас нет.. То есть надо NormalizeDouble(new_stop_loss,digits); (не забыть получить правильный digits, если символ отличается от текущего)


PS/ чтобы два раза не вставать: проверка значения индикатора на корректность : MathIsValidNumber(value) && value>=0 && value!=EMPTY_VALUE

Большое спасибо за подсказку- попробовал сделать то, что рекомендуеет- получилось вот так.

//-ФУНКЦИЯ ДИНАМИЧЕСКОГО РАСЧЁТА ТРЕЙЛИНГ СТОПА С ПОМОЩЬЮ АТР НАЧАЛО----------------------+
void f___dynamic_calculation_of_trailing_stop_by_atr()
{
   double lokal_atr = iATR(Symbol(), Period_for_work_atr_tral, Period_atr, 1);
   double avg_atr = iMA(Symbol(), Period_for_work_atr_tral, Period_atr, 1, MODE_SMA, PRICE_CLOSE, 0);

   // РЕКОМЕНДАЦИЯ С ФОРУМА: Получаем количество знаков после запятой
   int digits = (int)MarketInfo(Symbol(), MODE_DIGITS);

   // РЕКОМЕНДАЦИЯ С ФОРУМА: Проверка корректности значений ATR
   if (!MathIsValidNumber(lokal_atr) || lokal_atr <= 0 || lokal_atr == EMPTY_VALUE ||
       !MathIsValidNumber(avg_atr) || avg_atr <= 0 || avg_atr == EMPTY_VALUE)
   {
      Print("Ошибка получения ATR или SMA, значения некорректны!");
      return;
   }

   // Динамический множитель ATR (адаптивный)
   double atr_ratio = lokal_atr / avg_atr;
   double atr_multiplier = 1.5 + (atr_ratio - 1.0);
   atr_multiplier = MathMax(1.0, MathMin(3.0, atr_multiplier)); // Ограничиваем от 1.0 до 3.0

   // Получаем stopLevel брокера
   double stopLevel = stoplevel * Point;

   // Перебираем все открытые ордера
   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol())
         {
            int orderType = OrderType();
            double new_stop_loss = 0;
            double old_stop_loss = OrderStopLoss();

            if (orderType == OP_SELL)
            {
               double min_stop_loss = Ask + stopLevel;
               new_stop_loss = MathMin(OrderOpenPrice() - (lokal_atr * 0.5), Ask + (lokal_atr * atr_multiplier));

               // РЕКОМЕНДАЦИЯ С ФОРУМА: Нормализуем stop loss
               new_stop_loss = NormalizeDouble(new_stop_loss, digits);

               // Проверяем stopLevel и чтобы стоп был в прибыли
               if (new_stop_loss < OrderOpenPrice() && new_stop_loss > min_stop_loss)
               {
                  // Проверяем, изменился ли стоп
                  if (new_stop_loss != old_stop_loss)
                  {
                     bool result = OrderModify(OrderTicket(), OrderOpenPrice(), new_stop_loss, OrderTakeProfit(), 0, clrNONE);
                     if (result)
                        Print("Трейлинг-стоп ATR обновлён для SELL: ", OrderTicket(), " | Новый SL: ", new_stop_loss, " | ATR множитель: ", atr_multiplier);
                     else
                        Print("Ошибка обновления трейлинг-стопа SELL: ", GetLastError());
                  }
               }
            }

            if (orderType == OP_BUY)
            {
               double max_stop_loss = Bid - stopLevel;
               new_stop_loss = MathMax(OrderOpenPrice() + (lokal_atr * 0.5), Bid - (lokal_atr * atr_multiplier));

               // РЕКОМЕНДАЦИЯ С ФОРУМА: Нормализуем stop loss
               new_stop_loss = NormalizeDouble(new_stop_loss, digits);

               // Проверяем stopLevel и чтобы стоп был в прибыли
               if (new_stop_loss > OrderOpenPrice() && new_stop_loss < max_stop_loss)
               {
                  // Проверяем, изменился ли стоп
                  if (new_stop_loss != old_stop_loss)
                  {
                     bool result = OrderModify(OrderTicket(), OrderOpenPrice(), new_stop_loss, OrderTakeProfit(), 0, clrNONE);
                     if (result)
                        Print("Трейлинг-стоп ATR обновлён для BUY: ", OrderTicket(), " | ATR множитель: ", atr_multiplier);
                     else
                        Print("Ошибка обновления трейлинг-стопа BUY: ", GetLastError());
                  }
               }
            }
         }
      }
   }
}
//-ФУНКЦИЯ ДИНАМИЧЕСКОГО РАСЧЁТА ТРЕЙЛИНГ СТОПА С ПОМОЩЬЮ АТР КОНЕЦ----------------------+

Попробовал провести тест- ошибка 130 всё равно присутствует.Причём в начале етста идёт прямо батарея ошибки 130, а потом по одной  и стоп начинает тралиьтся как-то через раз. Что ещё надо поправить, чтобы ошибки исчезли? Или я сейчас что не так прикрутил и сделал?

 
DanilaMactep #:
ошибка 130 всё равно присутствует
Ошибка может быть при установке ордера
 
Tretyakov Rostyslav #:
Ошибка может быть при установке ордера
Проверил эту идею- отключив использование трала и реально ордер сенд выдаёт ошибку 130- что за магия вообще? 😋🤓😎😁😁😁😉
 
DanilaMactep #:
ордер сенд выдаёт ошибку 130
Там ищите причину
 
Tretyakov Rostyslav #:
Там ищите причину
130 при ордер сенде получается, когда стоп ставлю по максимуму минимуму икс свечей. Но попробовал пеерключить стоп и профит чтобы ставился в пунктах- поставил 3000 пунктов стопу и профиту, включил трал и ошибка ордер модифай 130 всё равно есть((((
 
DanilaMactep #:
130 при ордер сенде получается, когда стоп ставлю по максимуму минимуму икс свечей. Но попробовал пеерключить стоп и профит чтобы ставился в пунктах- поставил 3000 пунктов стопу и профиту, включил трал и ошибка ордер модифай 130 всё равно есть((((

Без кода - это игра "угадайка".

Сначала избавляетесь от ошибки в ордерсенд.

 
DanilaMactep #:
130 при ордер сенде получается, когда стоп ставлю по максимуму минимуму икс свечей. Но попробовал пеерключить стоп и профит чтобы ставился в пунктах- поставил 3000 пунктов стопу и профиту, включил трал и ошибка ордер модифай 130 всё равно есть((((
Дистанция установки ордера тоже должна быть не меньше разрешëнной
 
DanilaMactep #:

Всем добрый день. Пишу очередной Грааль JJJ пытаюсь написать функцию динамического расчёта трала по атр. Код трала ниже


В таком виде трал даже работает, но периодически появляются ошибка 1 и 130. Помогите пожалуйста исправить это дело, чтобы ошибки ушли.

Не полинитесь почитать, я понимаю что вам не до маркета, но тут выложены все критические ошибки

https://www.mql5.com/ru/articles/2555

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку для обеспечения единого стандарта качества. В этой статье мы расскажем о наиболее частых ошибках, которые допускают разработчики в своих технических индикаторах и торговых роботах. А также покажем как самостоятельно проверить свой продукт перед отправкой в Маркет.