ФОРТС. Вопросы по исполнению - страница 59

 
Aleksey Lebedev:
В PositionGet без предварительно PositionSelect.
Вы не правы. PositionSelect вызывается на каждом тике и перед последним выводом инфо в блоке 3, он тоже отработает. Так, что причина явно не в этом.
 
ALIV:

   Михаил, давай что-ли очередную "простыню" с задержками, а то что-то скучно стало. :))))

  Когда в Открытие поедешь? :))))))) 

Там ничего нового :)

 
Yury Kirillov:
Вы не правы. PositionSelect вызывается на каждом тике и перед последним выводом инфо в блоке 3, он тоже отработает. Так, что причина явно не в этом.

Иногда таки ошибаюсь, но это не тот случай, явно в этом)

Принтятся значения данных позиции на момент вызова PositionSelect.

После OrderSend значения не обновляются.

Если PositionSelect(...)==false, смысла в PositionGet нет.


зы: После OrderSend данные о позиции могут быть получены не сразу.. асинхронность таки - зло.

 
Aleksey Lebedev:

Иногда таки ошибаюсь, но это не тот случай, явно в этом)

Принтятся значения данных позиции на момент вызова PositionSelect.

После OrderSend значения не обновляются.

Если PositionSelect(...)==false, смысла в PositionGet нет.


зы: После OrderSend данные о позиции могут быть получены не сразу.. асинхронность таки - зло.

Я бы с радостью согласился - признавать ошибки не стесняюсь. Но посмотрите: перед тем, как мы попадаем внутрь блока 3, в самом начале обработчика OnTick() вызывается упомянутая Вами PositionSelect(), при этом никакие OrderSend() не выполняются. В коде специально добавлен счетчик задержек в 1000 тиков между выполнением блоков 1, 2 и 3 - это на предмет асинхронности, я думаю в тестере этого более чем достаточно, чтобы позиция зафиксировалась. Кроме того я поменял условие в Блоке 3:

   {if((gTicks>3000)&&(Step==2)&&(PositionSelect()))
   {
      Print("INFO>> *** VOLUME=",PositionGetDouble(POSITION_VOLUME),
                        " *** ID=",PositionGetInteger(POSITION_IDENTIFIER),
                        " *** TYPE=",EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),
                        " *** OrdersTotal()=",OrdersTotal());
      Step=3;
      return;
   }}//if((gTicks>3000)&&(Step==2))

 Результат не изменился: ордер на закрытие позиции исполняется, а размер позиции остается равным 1.

2015.10.27 18:55:14.986 2015.10.26 10:00:02   INFO>> *** VOLUME=1.0 *** ID=2 *** TYPE=POSITION_TYPE_SELL *** OrdersTotal()=0

 :-(

 
   {if((gTicks>3000)&&(Step==2)&&(PositionSelect()))

не должно компилироваться.. PositionSelect(_Symbol)

 
Aleksey Lebedev:

не должно компилироваться.. PositionSelect(_Symbol)

Да не компилировалось - запускался старый экземпляр программы...
 
Aleksey Lebedev:

не должно компилироваться.. PositionSelect(_Symbol

Поправил _Symbol 

И в итоге: Вы были правы! Теперь блок 3 не отрабатывает, а значит позиция не выбирается. Спасибо за диалог! :-)

Ложечки нашлись, но осадочек остался:  если позиции больше нет, то как объём позиции может быть равен 1?

Что не вяжется с документацией:

Функция PositionSelect() копирует данные о позиции в программное окружение, и последующие вызовы PositionGetDouble(), PositionGetInteger() и PositionGetString() 
возвращают ранее скопированные данные. Это означает, что самой позиции может уже и не быть (или же она изменилась по объему, направлению и т.д.), 
а данные этой позиции можно еще получать. Для гарантированного получения свежих данных о позиции рекомендуется вызывать функцию PositionSelect() 
непосредственно перед обращением за ними.

 То есть вызов PositionSelect() с результатом false не обновляет сведения о позиции? Печалька!

 
Yury Kirillov:

 То есть вызов PositionSelect() с результатом false не обновляет сведения о позиции? Печалька!

Да. Но в принципе логично (PositionSelect() == false) - нет позиции и незачем её допрашивать всякими PositionGet)
 
Мне кажется было бы логичнее всё-же чистить мусор в буфере при обнаружении отсутствия позиции. Так, на всякий...
 
Михаил:
Уже 10 месяцев прошло.....
 Мало....можно ещё столько же подождать...
Причина обращения: