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

 
DanilaMactep #:

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

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

ещё есть STOP_LEVEL - ближе него к текущей цене стоп поставить нельзя. Что вполне возможно и происходит в самом начале

PS/ если делаете тралы, то как-то регулируйте шаг(в пунктах) и частоту(в секундах) тралов. Тралить каждый пункт или каждую секунду глупо и чревато последствиями (и советник начнёт тормозит и от сервера можно получить бан).
И заодно уж - если тралите стопы, обязательно проверяйте их сработку. Stop (и даже Limit или Take)может и неисполнится. 

PPS/ а вообще, в "боевых" советниках тралы (стопы/тейки/промежуточные цели etc) делаются виртуальными, отрабатываются на терминале и только время от времени синхронизируются на сервер (превращаются в StopLoss TakeProfit позиции или соотв.лимитки). 

 

Вопрос. Почему компилятор пишет что не объявлен параметр "'FALSE' - undeclared identifier"

когда у меня всё объявлено

input bool Verbose = FALSE;
 
Igor Nagorniuk #:

Вопрос. Почему пишет компилятор пишет мне, что не объявлен параметр "'FALSE' - undeclared identifier"

когда у меня всё объявлено

false
 
Igor Nagorniuk #:

Вопрос. Почему компилятор пишет что не объявлен параметр "'FALSE' - undeclared identifier"

когда у меня всё объявлено

набираете на английской раскладке клавишу "f" редактор подсказывает false другими буквами нельзя и так давно 5 и 4

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

Т.е. вы сначала входите с 0 левыми значениями. А потом уже после открытия  модифицируете на нужные уровни выставляете сл и тр через модификацию позиции. Естественно проверяете чтобы были не ближе предельно допустимых значений.
 

Всем ещё раз добрый день. В своём Граале, я устранил ошибку 130 при открытии ордеров- протестировал просто открытие ордеров, без трейлинг стопа. Ордера открываются без ошибок. Включаю трал, и тестирую с теми же параметрами открытия ордеров- открываются ордера без ошибок, а вот трал вызывает ошибку ордер модефай 130. Причём в результатах, есть модификация ордеров- то есть трал не совсем всегда не работает.

//-ФУНКЦИЯ ДИНАМИЧЕСКОГО РАСЧЁТА ТРЕЙЛИНГ СТОПА С ПОМОЩЬЮ АТР НАЧАЛО----------------------+
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);

   // Проверка значений ATR
   if (!MathIsValidNumber(lokal_atr) || !MathIsValidNumber(avg_atr) || lokal_atr <= 0 || avg_atr <= 0)
   {
      Print("Ошибка получения ATR или SMA, значения некорректны!");
      return;
   }

   // РЕКОМЕНДАЦИЯ С ФОРУМА: Адаптивный коэффициент с логарифмическим сглаживанием
   double volatility = lokal_atr / avg_atr;
   double atr_multiplier = 1.5 + MathLog(volatility + 1.0);
   atr_multiplier = MathMax(0.5, MathMin(5.0, atr_multiplier)); // Ограничиваем от 0.5 до 5.0

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

   // Перебираем все открытые ордера
   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));

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

               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));

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

               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(), " | Новый SL: ", new_stop_loss, " | ATR множитель: ", atr_multiplier);
                     else
                        Print("Ошибка обновления трейлинг-стопа BUY: ", GetLastError());
                  }
               }
            }
         }
      }
   }
}
//-ФУНКЦИЯ ДИНАМИЧЕСКОГО РАСЧЁТА ТРЕЙЛИНГ СТОПА С ПОМОЩЬЮ АТР  КОНЕЦ----------------------+

Прошлые рекомендации в код я вроде прикрутил, может что-то не правильно пришпандорил? Про тип открытия ордеров я без понятия, но сейчас открытие 100% без ошибок. Подскажите пожалуйста, как эту Грааль машину завести?  :-) :-) ;-)

 
DanilaMactep #:

Всем ещё раз добрый день. В своём Граале, я устранил ошибку 130 при открытии ордеров- протестировал просто открытие ордеров, без трейлинг стопа. Ордера открываются без ошибок. Включаю трал, и тестирую с теми же параметрами открытия ордеров- открываются ордера без ошибок, а вот трал вызывает ошибку ордер модефай 130. Причём в результатах, есть модификация ордеров- то есть трал не совсем всегда не работает.

Прошлые рекомендации в код я вроде прикрутил, может что-то не правильно пришпандорил? Про тип открытия ордеров я без понятия, но сейчас открытие 100% без ошибок. Подскажите пожалуйста, как эту Грааль машину завести?  :-) :-) ;-)

//-ФУНКЦИЯ ДИНАМИЧЕСКОГО РАСЧЁТА ТРЕЙЛИНГ СТОПА С ПОМОЩЬЮ АТР НАЧАЛО----------------------+
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);

   // Проверка значений ATR
   if (!MathIsValidNumber(lokal_atr) || !MathIsValidNumber(avg_atr) || lokal_atr <= 0 || avg_atr <= 0)
   {
      Print("Ошибка получения ATR или SMA, значения некорректны!");
      return;
   }

   bool result=false;
   double new_stop_loss,old_stop_loss,min_stop_loss,max_stop_loss;
   // Получаем stopLevel брокера
   double stopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL) *_Point;
   int digits = (int)MarketInfo(Symbol(), MODE_DIGITS); // РЕКОМЕНДАЦИЯ С ФОРУМА: Исправление типа

   // РЕКОМЕНДАЦИЯ С ФОРУМА: Адаптивный коэффициент с логарифмическим сглаживанием
   double volatility = lokal_atr / avg_atr;
   double atr_multiplier = 1.5 + MathLog(volatility + 1.0);
   atr_multiplier = MathMax(0.5, MathMin(5.0, atr_multiplier)); // Ограничиваем от 0.5 до 5.0

   // Перебираем все открытые ордера
   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol())
         {
            if (OrderType() == OP_SELL)
            {
               min_stop_loss = Ask + stopLevel;
               old_stop_loss = OrderStopLoss();
               new_stop_loss = MathMin(OrderOpenPrice() - (lokal_atr * 0.5), Ask + (lokal_atr * atr_multiplier));
               new_stop_loss = NormalizeDouble(new_stop_loss, digits); // РЕКОМЕНДАЦИЯ С ФОРУМА: Нормализация

               if (new_stop_loss < OrderOpenPrice() && new_stop_loss > min_stop_loss)
               {
                  if (new_stop_loss < old_stop_loss || old_stop_loss == 0)
                  {
                     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)
            {
               max_stop_loss = Bid - stopLevel;
               old_stop_loss = OrderStopLoss();
               new_stop_loss = MathMax(OrderOpenPrice() + (lokal_atr * 0.5), Bid - (lokal_atr * atr_multiplier));
               new_stop_loss = NormalizeDouble(new_stop_loss, digits); // РЕКОМЕНДАЦИЯ С ФОРУМА: Нормализация

               if (new_stop_loss > OrderOpenPrice() && new_stop_loss < max_stop_loss)
               {
                  if (new_stop_loss > old_stop_loss || old_stop_loss == 0)
                  {
                     result = OrderModify(OrderTicket(), OrderOpenPrice(), new_stop_loss, OrderTakeProfit(), 0, clrNONE);
                     if (result)
                        Print("Трейлинг-стоп ATR обновлён для BUY: ", OrderTicket(), " | Новый SL: ", new_stop_loss, " | ATR множитель: ", atr_multiplier);
                     else
                        Print("Ошибка обновления трейлинг-стопа BUY: ", GetLastError());
                  }
               }
            }
         }
      }
   }
}
 
Tretyakov Rostyslav #:
Ростислав, большое спасибо за помощь- так всё работает без ошибок и как тюнингованый танк :):):)
 

Помогите разобраться с буферными индикаторами если можно

Вот оригинал в мт4

краденый код удален

А вот что получилось

краденый код удален
Там где жёлтым цветом, у меня есть сомнение в правильности кода.
 
Igor Nagorniuk #:

Помогите разобраться с буферными индикаторами если можно


Здесь не помогают с декомпилами.