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

 
Aleksey Mavrin:

речь про тестер или онлайн?

если онлайн - смотреть код, где то событие перемещения не проброшено нормально. Панелей кстати на сайте только библиотек пять разных, вы про какую? 

А в тестере - вроде бы никак, да и зачем.

После того, как отослали команды перемещения ВСЕМ объектам панели, делайте ChartRedraw()
 
Aleksey Mavrin:

речь про тестер или онлайн?

если онлайн - смотреть код, где то событие перемещения не проброшено нормально. Панелей кстати на сайте только библиотек пять разных, вы про какую? 

А в тестере - вроде бы никак, да и зачем.

Речь про онлайн. В тестере это и в правду мне не нужно. На счет библиотек не могу Вам ответить, я в программировании полный чайник. Я просто взял готовый код кнопки из справочника MQL5. 

Команды перемещения кнопки вставлял в функцию OnTick, чтобы можно было в тестере пользоваться. Видимо поэтому и обновление положения кнопки происходит на следующем тике. Не понимаю как заставить кнопки двигаться вместе с фоном.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Artyom Trishkin:
После того, как отослали команды перемещения ВСЕМ объектам панели делайте ChartRedraw()
Я попробовал сделать вот так, но не помогло.
   ObjectSetInteger(0, "Buy",            OBJPROP_XDISTANCE, x + 2);
   ObjectSetInteger(0, "Buy",            OBJPROP_YDISTANCE, y + 2);
   ChartRedraw();
  
   ObjectSetInteger(0, "Sell",           OBJPROP_XDISTANCE, x + 74);
   ObjectSetInteger(0, "Sell",           OBJPROP_YDISTANCE, y + 2);
   ChartRedraw();
 
Помогите пожалуйста разобраться. Есть код для торговой панели на открытие отложенного ордера Buy Stop с последующим трейлингом, если ордер не срабатывает. Ордер открывается, но модификация ордера не происходит, в журнале никаких ошибок не появляется и попыток модифицировать ордер тоже нет. Попробовал отследить через журнал на каком этапе происходит ошибка, с помощью функции: 
Print("Ордер Выбран!");

Просто вставлял ее после каждого условия if.

В итоге выяснил, что функция: 

 for(int i=OrdersTotal()-1;i>=0;i--)
          if(aorder.SelectByIndex(i))  

успешно выбирает ордер для дальнейшей работы, а если Print("Ордер Выбран!"); вставить после этого кода:

if(aorder.Symbol()==asymbol.Name() && aorder.Magic()==MagicNumber && Ask < aorder.PriceOp
en())

то происходит ошибка:

2020.06.17 01:38:24.136 2020.01.02 07:40:00   failed modify order #2 buy stop 0.1 EURUSD_i at 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.00000 [Invalid price]

2020.06.17 01:38:24.136 2020.01.02 07:40:00   CTrade::OrderSend: modify #2 at 1.00000 (sl: 1.00000 tp: 1.00000) [invalid price]

2020.06.17 01:38:24.136 2020.01.02 07:40:00   Модификация BUY STOP прошла с ошибкой! Result Retcode: 10015, description of Retcode: invalid price

Этот же код использую в другом советнике для автоматической торговли (с разницей лишь в отсутствии:

ObjectGetInteger(0, "Buy Stop", OBJPROP_STATE) == true


) и никаких проблем нет. Ордера открываются, модифицируются без вопросов.

Вот сам код:

     double Ask          = NormalizeDouble(PriceInformation_High_Buy[HighestCandle_High_Buy].high, _Digits) + indent; // максимум самой высокой свечи плюс отступ
     double sl_buy       = NormalizeDouble(PriceInformation_Low_Buy[LowestCandle_Low_Buy].low, _Digits) - indent;     // минимум самой низкой свечи минус отступ  
     double tp_buy       = Ask + ((Ask - sl_buy) * Профит_фактор);                                                    // количество стопов лоссов 
     
     if  (OrdersTotal()==0 && PositionsTotal()==0 &&                                         // проверка на наличие открытых позиций и ордеров
     ObjectGetInteger(0, "Buy Stop", OBJPROP_STATE) == true)                                 // проверка состояния кнопки
                                                                                             
     {
        atrade.BuyStop(Lots, Ask, _Symbol, sl_buy, tp_buy, ORDER_TIME_GTC, 0, "My comment"); // посылаем ордер Buy Stop
        ObjectSetInteger(0, "Buy Stop", OBJPROP_STATE, false);                               // отжимаем кнопку
     }

     else

     ObjectSetInteger(0, "Buy Stop", OBJPROP_STATE, false);                                  // отжимаем кнопку
       
//---Трейлинг Buy Stop---------------------------------------------------------------------------------------------------------------------------//     
      
        for(int i=OrdersTotal()-1;i>=0;i--)
          if(aorder.SelectByIndex(i))                                                                      // выбираем ордер 
       
            if(aorder.Symbol()==asymbol.Name() && aorder.Magic()==MagicNumber && Ask < aorder.PriceOpen()) // проверяем символ, мэджик номер, цену
               
              {
                 if(aorder.OrderType()==ORDER_TYPE_BUY_STOP)
                 Print("Ордер Выбран!"); 
                 if(aorder.PriceCurrent()<aorder.PriceOpen())
                 
                    {
                     if(atrade.OrderModify(aorder.Ticket(),
                        asymbol.NormalizePrice(Ask),
                        asymbol.NormalizePrice(sl_buy),
                        asymbol.NormalizePrice(tp_buy),
                        aorder.TypeTime(),
                        aorder.TimeExpiration()))
                        Print("Модификация BUY STOP прошла успешно! Тикет ордера = ",atrade.ResultOrder());
                     else
                        Print("Модификация BUY STOP прошла с ошибкой! Result Retcode: ",atrade.ResultRetcode(),
                              ", description of Retcode: ",atrade.ResultRetcodeDescription());
                    }
              }

Подскажите пожалуйста, в чем моя ошибка?

 
Mikhail:

Речь про онлайн. В тестере это и в правду мне не нужно. На счет библиотек не могу Вам ответить, я в программировании полный чайник. Я просто взял готовый код кнопки из справочника MQL5. 

Команды перемещения кнопки вставлял в функцию OnTick, чтобы можно было в тестере пользоваться. Видимо поэтому и обновление положения кнопки происходит на следующем тике. Не понимаю как заставить кнопки двигаться вместе с фоном.

А как интересно вы определили что именно на следующем, а не на том?)

 
Mikhail:
Помогите пожалуйста разобраться. Есть код для торговой панели на открытие отложенного ордера Buy Stop с последующим трейлингом, если ордер не срабатывает. Ордер открывается, но модификация ордера не происходит, в журнале никаких ошибок не появляется и попыток модифицировать ордер тоже нет. Попробовал отследить через журнал на каком этапе происходит ошибка, с помощью функции: 

Просто вставлял ее после каждого условия if.

В итоге выяснил, что функция: 

успешно выбирает ордер для дальнейшей работы, а если Print("Ордер Выбран!"); вставить после этого кода:

то происходит ошибка:

2020.06.17 01:38:24.136 2020.01.02 07:40:00   failed modify order #2 buy stop 0.1 EURUSD_i at 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.00000 [Invalid price]

2020.06.17 01:38:24.136 2020.01.02 07:40:00   CTrade::OrderSend: modify #2 at 1.00000 (sl: 1.00000 tp: 1.00000) [invalid price]

2020.06.17 01:38:24.136 2020.01.02 07:40:00   Модификация BUY STOP прошла с ошибкой! Result Retcode: 10015, description of Retcode: invalid price

Этот же код использую в другом советнике для автоматической торговли (с разницей лишь в отсутствии:


) и никаких проблем нет. Ордера открываются, модифицируются без вопросов.

Вот сам код:

Подскажите пожалуйста, в чем моя ошибка?

Очевидно не работает Нормалайз нормально. округляет до единицы. Распринтуйте  asymbol.Digits()  asymbol.TickSize(),.. Point()  проверьте . 

 

Всем доброго времени суток. Столкнулся с вот такой проблемой при обращении советника к DLL:

Cannot load 'C:\....\shablon.dll' [487] 

Вроде как ошибка 487 означает: ERROR_INVALID_ADDRESS, но путь к библиотеке верный. Собственно, я эту dll уже во все папки положил, не помогает.

В чем может быть дело? Буду благодарен за помощь. 


P.S. изначально эта dll предназначалась для 32 битной винды и в mt4*86 работала. Я ее перекомпилировал на 64 бит, ставлю теперь на mt5*64, и вот такие проблемы.  



 
Aleksey Mavrin:

А как интересно вы определили что именно на следующем, а не на том?)

Пока новый тик не пришел, перемещение кнопок не происходит. Это я глазами вижу. Как только цена изменилась, кнопки переместились.

Хотя сегодня даже на новом тике кнопки перестали перерисовываться, хотя я ничего не менял. Двигается только фон.
 
Aleksey Mavrin:

Очевидно не работает Нормалайз нормально. округляет до единицы. Распринтуйте  asymbol.Digits()  asymbol.TickSize(),.. Point()  проверьте . 

Когда делаю вот такой запрос:

Print("Symbol ", _Symbol, " Digits ", _Digits, " Point ", Point());

получаю вот такой результат:

2020.06.17 13:49:53.270 2020.01.02 06:50:00   Symbol EURUSD_i Digits 5 Point 1e-05

Когда делаю вот такой запрос:

Print("Symbol ",aorder.Symbol(), " Digits ", asymbol.Digits(), " Point ", asymbol.TickSize());

получаю вот такой результат:

2020.06.17 13:51:58.787 2020.01.02 06:45:00   Symbol EURUSD_i Digits 0 Point 0.0

При этом хочу заметить, что если я не вставляю функцию Print, то вообще никаких ошибок не происходит, ордер даже не пытается модифицироваться. Как будто бы CTrade не видит мой ордер.

Проверка на символ и мэджик номер не проходит:

Print("Symbol ", asymbol.Name(), " Magic ", aorder.Magic(), " Ticket ", aorder.Ticket()); 

Результат:

2020.06.17 14:37:38.147 2020.01.02 06:50:00   Symbol  Magic 0 Ticket 2

Мэджик должен быть 12345, символ евро доллар. 

Почему не удается получить символ и меджик?

Если строку:

aorder.Symbol()==asymbol.Name()

поменять на 

aorder.Symbol()==_Symbol

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

2020.06.17 01:38:24.136 2020.01.02 07:40:00   failed modify order #2 buy stop 0.1 EURUSD_i at 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.00000 [Invalid price]

2020.06.17 01:38:24.136 2020.01.02 07:40:00   CTrade::OrderSend: modify #2 at 1.00000 (sl: 1.00000 tp: 1.00000) [invalid price]

2020.06.17 01:38:24.136 2020.01.02 07:40:00   Модификация BUY STOP прошла с ошибкой! Result Retcode: 10015, description of Retcode: invalid price

Голову уже себе сломал. при том что этот же код в другом советнике работает на ура.

Что я делаю не так?

Документация по MQL5: Общие функции / Print
Документация по MQL5: Общие функции / Print
  • www.mql5.com
Данные типа double выводятся с точностью до 16 десятичных цифр после точки, при этом данные могут выводиться либо в традиционном либо в научном формате – в зависимости от того, как запись будет наиболее компактна. Данные типа float выводятся с 5 десятичными цифрами после точки. Для вывода вещественных чисел с другой точностью либо в явно...
 
dozolov:

Всем доброго времени суток. Столкнулся с вот такой проблемой при обращении советника к DLL:

Cannot load 'C:\....\shablon.dll' [487] 

Вроде как ошибка 487 означает: ERROR_INVALID_ADDRESS, но путь к библиотеке верный. Собственно, я эту dll уже во все папки положил, не помогает.

В чем может быть дело? Буду благодарен за помощь. 


P.S. изначально эта dll предназначалась для 32 битной винды и в mt4*86 работала. Я ее перекомпилировал на 64 бит, ставлю теперь на mt5*64, и вот такие проблемы.  



ERROR_INVALID_ADDRESS это не про путь. Вы передаёте неправильные аргументы.