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

 
Vitaly Muzichenko # Мы должны искать не причину, а решение.

Если причиной является асинхронность, то реального "решения" не существует.

 

Привет всем,

Я столкнулся со следующей проблемой, которая продолжает меня озадачивать.
Я ожидал, что смогу получить информацию о позиции либо с помощью собственные функции либо с помощью класса CPositionInfo.

Однако создается впечатление, что я получаю противоположные результаты. Ниже приведен пример того, что происходит на счете NETTING.
Я выбираю точно такую же позицию: Я использую один и тот же номер билета и после выбора печатаю его.

Однако родная функция PositionGetInteger правильно говорит, что позиция короткая, в то время как класс говорит, что она длинная.

В следующем примере я выбираю позицию из массива (array_pos_tickets). Объект a_position является экземпляром CPositionInfo.

       if(a_position.SelectByTicket(array_pos_ticket.At(i))) {
              Print("SELECTED POSITION n. "+IntegerToString(a_position.Ticket()) + "  from ticket n. "+IntegerToString(array_pos_ticket.At(i)));
         
               //***Классный метод ***//
               if(a_position.Type()==POSITION_TYPE_BUY)
                  Print("CLASS METHOD--->position is LONG");
               else
                  Print("CLASS METHOD--->position is SHORT");
                  
                //***Нативные функции ***// 
               PositionSelectByTicket(array_pos_ticket.At(i));
               long pos_type=PositionGetInteger(POSITION_TYPE);
               if(pos_type==POSITION_TYPE_BUY)
                 Print("PositionGetInteger----->position is LONG");
               else
                  Print("PositionGetInteger------->position is SHORT");
         }

Вот результат, который я получаю:

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

 
Miguel Angel Vico Alba #:

Если причиной является асинхронность, то реального "исправления" не существует, есть только способы адаптации.

Нужно не бороться с природой системы, а научиться жить с ней.

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

Вопрос был про тестер, слип и таймер не работают. Достучатся даже до локального времени компа проблема. Возврат true по исполнении было бы хорошо.
 

По скриншоту

Получить в переменную результат функции, и покрутить её во while? 

Не забыть про IsStopped()) 

 
Valeriy Yastremskiy #:
Вопрос был про тестер, слип и таймер не работают. Достичь даже локального времени на компе - проблема. Хорошо бы вернуть true при выполнении.
В тестере таймер работает, время симулируется (не используйте Sleep()), а ChartScreenShot() имеет смысл использовать только в визуальном режиме, синхронизировать с OnTimer() плюс ChartRedraw(), и проверять наличие и размер файла изображения в формате PNG, прежде чем считать его валидным.
 
lynxntech Strategy Tester? В документации нет никаких ограничений, но у меня получаются пустые изображения. Кто-нибудь сталкивался с этим или нашел решение?
 
Miguel Angel Vico Alba #:

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

В wine пустые файлы были, в поиске можно посмотреть
 
lynxntech #:

По скриншоту

Получить в переменную результат функции, и покрутить её во while

Не забыть про IsStopped()) 

Я это пробовал, пока крутит while - программа умирает и скриншот не создаётся.

 
Samuel Bandi Roccatello #:

Привет всем,

Не правильно

a_position.Type()

правильно

a_position.PositionType()
 
Miguel Angel Vico Alba #:

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

Покажите ваш кусок кода…