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

 
Aleksandr Slavskii #:

Какой то злой кодер, очень сильно поизвращался над кодом вашего советника.

Боюсь поле такого, этот советник никогда не сможет торговать 

Ну а если серьёзно, то у советника нет условий для открытия позиций.

Согласитесь, что такое условие никогда не будет выполнено ask > ask   и такое тоже   bid > bid

А у вас в коде, советник ждёт выполнения именно этого.

Сорри, там всё таки есть одно условие при котором может открыться позиция селл  -  ask0 > bid0, но вот незадача продавать можно только по цене bid, а ваш советник пытается продать по цене  ask, и естественно получает при этом реквот.


Как видите в логах всё есть.

Злее меня кодеров еще поискать...

Как Вы сделали, чтобы появились логи и что значит этот реквот?

Дело в том, что проблем с открытием ордеров не наблюдалось. Прикрепляю скан истории за 03.05.2024 года. Там открыты роботом три позиции, одна из которых - buy... Вот закрыть мне их пришлось вручную и удалить Эксперта со страницы, чтобы не открывал опять. Почему-то именно условие закрытия не сработало.

Я мог бы выложить весь код сюда, но  там две сотни строчек кода. Не уверен, что будет правильно так. Поэтому, оставил ссылку.

ПС. Пробую добавить файл mq5. Там тоже можно увидеть код. Мой МетаЭдитор открывает.

Попробовал, как работает эксперт, который приложен ниже. Открыл бай. Снова не закрыл по условию. И снова нет ни лог файла, ни записей во вкладке Эксперт.



 
Aleksey Vyazmikin #:

Ошибки то не отображаются/обрабатываются - поэтому и написал про необходимость установить ошибку, которую возвращает сервер, а уже потом думать дальше. Если ошибки не возвращает, то уже вопрос к логике советника - она может не срабатывать.

Вы правы. Сделал принты, и лог файл появился. Но в нем, почему-то, не указывается открытие, закрытие позиций. Может, я напрасно переживал? Извините, что отнял время.

 
Aleksey Vyazmikin #:

Возможно, этот случай.

Принты подтвердили, что условие закрытия есть, но закрытие не происходит.
Файлы:
 
maxvoronin74 #:

Злее меня кодеров еще поискать...

Ладно, все когда то, с чего то начинали.

Очень много ошибок в советнике.

double Price            = PositionGetDouble(POSITION_PRICE_OPEN);

Вызывать PositionGetDouble нужно после PositionSelect иначе в вашем Price окажется скорее всего мусор или ноль, потом вы будете сравнивать этот ноль с асками бидами, где нибудь да сработает условие.

 for(int i = 0; i < ArraySize(mqlTick); i++)
  {
     double bid1 = NormalizeDouble(mqlTick[0].bid, _Digits); // первая цена bid за последний период
     double ask1 = NormalizeDouble(mqlTick[0].ask, _Digits); // первая цена ask за последний период

Что делает этот код?

Хренову тучу раз он делает одно и то же.

Полагаю, что индексом массива mqlTick должен быть не ноль, а i.

Ну и про не правильные биды аски в открытиях позиций, я написал в предыдущем сообщении.

Вам лучше вообще не указывать цену для открытия позиции, пусть это делает класс CTrade

m_trade.Buy(LotSize)

Так у вас будет меньше шансов ошибиться.


При наступлении условия bid0 > ask0 вы хотите открывать позицию.

По мне так при наступлении этого условия, нужно закрывать все открытые позиции, закрывать терминал и выключать компьютер)))

 
Aleksandr Slavskii #:

Вызывать PositionGetDouble нужно после PositionSelect иначе в вашем Price окажется скорее всего мусор или ноль, потом вы будете сравнивать этот ноль с асками бидами, где нибудь да сработает условие.

Что делает этот код?

Хренову тучу раз он делает одно и то же.

Полагаю, что индексом массива mqlTick должен быть не ноль, а i.

Ну и про не правильные биды аски в открытиях позиций, я написал в предыдущем сообщении.

Вам лучше вообще не указывать цену для открытия позиции, пусть это делает класс CTrade

Так у вас будет меньше шансов ошибиться.


При наступлении условия bid0 > ask0 вы хотите открывать позицию.

По мне так при наступлении этого условия, нужно закрывать все открытые позиции, закрывать терминал и выключать компьютер)))

PositionSelect - надо будет потратить кусочек времени, чтобы понять, почему не открываются позиции, когда я его использую. Так что временно пользую !PositionSelect(Symbol()), чтобы в любой момент времени работала только одна позиция на инструменте. Поэтому, я думаю, и

double Price            = PositionGetDouble(POSITION_PRICE_OPEN);

работает правильно. Проверял. Или это не всегда?

 for(int i = 0; i < ArraySize(mqlTick); i++)
  {
     double bid1 = NormalizeDouble(mqlTick[0].bid, _Digits); // первая цена bid за последний период
     double ask1 = NormalizeDouble(mqlTick[0].ask, _Digits); // первая цена ask за последний период

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

Цена открытия бай должна быть аск, на сколько я понял. А селл - бид. Видимо, я неправильно прописал открытие позиции. Там наоборот. Имя инструмента, получается, тоже из-за класса нет смысла писать при открытии? Только лотажность и все?

Касаемо условия открытия, читал, что спред бывает отрицательным. Вот и попытался это предусмотреть, но неправильно прописал логику. На самом деле не бывает спред отрицательным?

В общем, сердечно благодарю. Я бы и не обратил внимания, если бы Вы не показали.

Файлы:
 
Здравствуйте, ребята, подскажите, пожалуйста, какой язык мне стоит изучать в программировании для MetaTrader 5?
 
152488748 #:
Здравствуйте, ребята, подскажите, пожалуйста, какой язык мне стоит изучать в программировании для MetaTrader 5?

Смотрим вверху этого сайта, щёлкаем по ссылке и начинаем изучать:

Программирование на MQL5 для трейдеров - Учебник на MQL5.com
Программирование на MQL5 для трейдеров - Учебник на MQL5.com
  • www.mql5.com
Современный трейдинг немыслим без компьютера. Автоматизация рабочего процесса трейдера уже давно вышла за пределы бирж и офисов брокеров, став...
 
По какой формуле расчитывается SYMBOL_PRICE_VOLATILITY?
 
maxvoronin74 #:
По какой формуле расчитывается SYMBOL_PRICE_VOLATILITY?

Это не устроит?

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Info_Print()
  {
   double change=0.0; // объявим и инициализируем переменную change (изменение цены в % с момента открытия торговой сессии)
   MqlTick mql_tick; // объявим и инициализируем переменную mql_tick для упрощенного доступа к структуре MqlTick
   SymbolInfoTick(_Symbol,mql_tick); // получим актуальные текущие цены
   double price_bid=mql_tick.bid; // получим текущую цену bid
   double price_open_day=iOpen(_Symbol,PERIOD_D1,0); // получим цену открытия торговой сессии
   if(price_open_day>0 && price_bid>0) // если все цены получены и они больше нуля
      change=((price_bid-price_open_day)*100)/price_open_day; // вычисляем изменение цены в %
   return(change); // возвращаем значение изменения цены в %
  }
//+------------------------------------------------------------------+

С уважением, Владимир.

 
MrBrooklin #:

Это не устроит?

С уважением, Владимир.

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

SYMBOL_PRICE_VOLATILITY добавили в 2020 году. А формула не известна? Поисковик не показывает...