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

 
MrBrooklin #:

Всем доброго вечера!

Пытаюсь создать функцию открывающую дополнительную позицию (пока без стопа и тейка) к уже имеющейся открытой позиции. Написал код:

но он почему-то не видит открытую позиции. Пробовал найти проблему отладчиком, но он после запуска цикла сразу вылетает из функции не видя того, что прописано внутри неё. Точку останова ставил на PositionGetTicket(i). Подскажите, пжл, где опять у меня косяк в коде?

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

Чему равен pos_total?

 
Alexey Viktorov #:

Чему равен pos_total?

Привет, Алексей! Переменная pos_total=PositionsTotal(), просто она была задана на глобальном уровне. Сейчас перенёс внутрь функции и оказалось, что проблема была именно в этом. Всё заработало. А чё за фигня? Вообще не понял прикола!!!

Сейчас ради эксперимента ещё раз вынес pos_total на глобальный уровень и снова перестало работать, а когда вставил внутрь функции - работает, как надо! Просто чудеса какие-то, ну, по крайней мере для меня!!! )))

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

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

 
MrBrooklin #:

Привет, Алексей! Переменная pos_total=PositionsTotal(), просто она была задана на глобальном уровне. Сейчас перенёс внутрь функции и оказалось, что проблема была именно в этом. Всё заработало. А чё за фигня? Вообще не понял прикола!!!

Сейчас ради эксперимента ещё раз вынес pos_total на глобальный уровень и снова перестало работать, а когда вставил внутрь функции - работает, как надо! Просто чудеса какие-то, ну, по крайней мере для меня!!! )))

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

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

Иногда можно, но не каждую. В этом случае, когда ты запускаешь советник, он ещё не видит открытые позиции и переменная равна нулю…

Собственно я вчера экспериментировал с выборкой позиций и пришёл к выводу, что  PositionsTotal() нужна исключительно для определения количества позиций. А это количество нужно только для ограничения цикла.

Вот такой цикл

  int i = 0;
  while(bool(posTicket = PositionGetTicket(i)) && !IsStopped())
   {
    string posSymbol = PositionGetString(POSITION_SYMBOL);
    double posPrice = PositionGetDouble(POSITION_PRICE_OPEN),
           pos_tp = PositionGetDouble(POSITION_TP),
           pos_sl = PositionGetDouble(POSITION_SL);
    printf("%s Ticket %d цена = %g тейк-профит = %g стоп-лосс = %g", posSymbol, posTicket, posPrice, pos_tp, pos_sl);
    i++;
   }


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


А в твоём случае проще написать без цикла

      PositionGetTicket(PositionsTotal()-1); // получим тикет позиции

если тебе надо последнюю позицию…

 
Alexey Viktorov #:
В этом случае, когда ты запускаешь советник, он ещё не видит открытые позиции и переменная равна нулю…

Согласился бы с тобой, но вот в чём проблема -  при выносе на глобальный уровень переменной pos_total советник не видел открытые позиции на протяжении всего периода тестирования, хотя за это время было открыто более 50 шт. Не понятно! Получается, что такой вариант не прокатывает?

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

 
Alexey Viktorov #:

А в твоём случае проще написать без цикла

если тебе надо последнюю позицию…

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

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

 
MrBrooklin #:

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

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

Да никакой разницы сколько позиций открыто и хоть на север, хоть на йух или во все стороны сразу… Последним по любому будет  PositionsTotal()-1

 
Alexey Viktorov #:

Да никакой разницы сколько позиций открыто и хоть на север, хоть на йух или во все стороны сразу… Последним по любому будет  PositionsTotal()-1

Привет, Алексей! Чёт затупил. Ты, как всегда прав!!! )))

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

 
Alexey Viktorov #:

Собственно я вчера экспериментировал с выборкой позиций и пришёл к выводу, что  PositionsTotal() нужна исключительно для определения количества позиций. А это количество нужно только для ограничения цикла.

Вот такой цикл


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

Тут тоже есть одна тонкость.

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

 
JRandomTrader #:

Тут тоже есть одна тонкость.

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

Я-же не сказал, что функция совсем бесполезна. Но в некоторых случаях без неё можно и нужно обходиться. Ведь каждая функция это время. Так по чуток набрать можно до тормозов…

 
MrBrooklin #:

Привет, Алексей! Чёт затупил. Ты, как всегда прав!!! )))

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

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

Так как проверяете вы только последнюю, а она (последняя) может оказаться открыта на другом символе.