FORTES. Questões de aplicação da lei - página 59

 
Aleksey Lebedev:
Em PositionGet sem a PositionSelect de antemão.
PositionSelect é chamado a cada tick e antes da última saída de informações no bloco 3, ele também funcionará. Portanto, esta não é, obviamente, a razão.
 
ALIV:

Michael, vamos ter outra "folha" com atrasos, está ficando entediante. :))))

Quando você vai para a abertura? :)))))))

Nada de novo aí :)

 
Yury Kirillov:
Você está errado. PositionSelect é chamado em cada tick e antes da última saída de informações no bloco 3, ele também funcionará. Portanto, a razão obviamente não está neste caso.

Às vezes entendo errado, mas não é este o caso, claramente nisto)

Os valores dos dados da posição no momento em que a PositionSelect é chamada.

Os valores não são atualizados após o OrderSend.

Se PositionSelect(...)==falso, não há sentido em PositionGet.


Portanto: após o OrderSend a posição pode ser buscada não imediatamente... a assíncronia é um mal.

 
Aleksey Lebedev:

Às vezes entendo errado, mas não é este o caso, claramente nisto)

Os valores dos dados da posição no momento em que a PositionSelect é chamada.

Os valores não são atualizados após o OrderSend.

Se PositionSelect(...)==falso, não há sentido em PositionGet.


Portanto: após o OrderSend a informação da posição pode ser recuperada não imediatamente... a assíncronia é um mal.

Concordo de bom grado - não tenho vergonha de admitir erros. Mas veja: antes de entrarmos no bloco 3, logo no início do manipulador OnTick() a PositionSelect() mencionada por você é chamada, e nenhuma OrderSend() é executada. No código, acrescentei intencionalmente um contador de atraso de 1000 ticks entre a execução dos blocos 1, 2 e 3 - é sobre assincronia, acho que no testador isto é mais do que suficiente para corrigir a posição. Além disso, mudei a condição no Bloco 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))

O resultado não mudou: a ordem para fechar a posição é executada, mas o tamanho da posição permanece igual a 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()))

não deve compilar... PositionSelect(_Símbolo)

 
Aleksey Lebedev:

não deve compilar... PositionSelect(_Símbolo)

Ele não compilava - ele dirigia uma velha instância do programa...
 
Aleksey Lebedev:

não deve compilar... PositionSelect(_Símbolo

Corrigido _Símbolo.

Conclusão: Você estava certo! Agora o bloco 3 não funciona, o que significa que a posição não é selecionada. Obrigado pelo diálogo! :-)

As colheres foram encontradas, mas o resíduo permanece: se não há mais posição, como o volume da posição pode ser 1?

O que não se encaixa com a documentação:

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

Então chamarPositionSelect() com um resultado falso não atualiza as informações de posição? Que pena!

 
Yury Kirillov:

Então chamarPositionSelect() com um resultado falso não atualiza as informações de posição? Que pena!

Sim. Mas é lógico em princípio(PositionSelect() == falso) - não há posição e não há necessidade de interrogá-lo pelo PositionGet)
 
Parece-me que seria mais lógico ainda limpar o lixo no buffer quando uma posição ausente é detectada. Só para o caso de...
 
Михаил:
Já se passaram 10 meses.....
Little.... pode esperar tanto tempo quanto isso...
Razão: