OrderSend() perguntas - página 2

 
Yedelkin:
Devo ter perdido um tópico como este. Onde posso ver a função de verificação de encomendas da KimV?
É para 4, mas pode verificá-lo, pode vir a ser útil. Pode verificá-lo no seu sítio web em: "bibliotecas gratuitas", encomendar biblioteca.
 
-Alexey-:
É para a 4ª versão, mas pode dar uma vista de olhos, pode ser útil. Pode consultar no seu site, na secção "bibliotecas gratuitas", a biblioteca para fazer encomendas.

de um quatro não vai funcionar. Eu uso

PositionSelect

Selecciona uma posição aberta para posterior manipulação. Retorna verdadeiro se a função for concluída com sucesso. Retorna falso se a função falhar. Para obter a informação sobre o erro, chamar a função GetLastError().

boolPositionSelect(
símbolo de corda// nome da ferramenta
);

Parâmetros

símbolo

[em] Nome do instrumento financeiro.

Valor devolvido

Valor do tipo bool.

Nota

Para cada símbolo, apenas uma posição pode ser aberta em qualquer altura, que é o resultado de um ou vários ofícios. As posições e ordens pendentes activas que também são apresentadas no separador "Comércio" do painel "Caixa de ferramentas" do terminal do cliente não devem ser misturadas.

A função PositionSelect() copia os dados sobre a posição para o ambiente do programa, e as chamadas subsequentes PositionGetDouble(), PositionGetInteger() e PositionGetString() devolvem os dados previamente copiados. Isto significa que a posição em si pode já não existir (ou pode ter mudado em volume, direcção, etc.), mas os dados desta posição ainda podem ser recuperados. A fim de garantir a aquisição de novos dados de posição, recomenda-se que se chame a função PositionSelect() imediatamente antes de se candidatar a eles.

 
sergey1294:

de um quadrigêmeo não vai funcionar. Eu uso PositionSelect para definir a posição

Ao usar a função PositionSelect(), é alarmante que "...retorne falso se a função falhar". Ou seja, falso é devolvido se a função PositionSelect()falhar , e não apenas se não houver posição. Por outras palavras, a situação não pode ser excluída se a função OrderSend() retornar verdadeiro, a função PositionSelect() retornar falso, e a posição ainda abrir.
 
papaklass:
Está a analisar estas situações nas pré-alterações de um tick ou em carraças diferentes?

OK, vou proceder a partir do seguinte:

Um tick é uma alteração no preço de um instrumento. A frequência de tais mudanças é imprevisível: de várias por segundo a várias por hora. De forma correspondente, as funções OrderSend() e PositionSelect() não devem depender da actividade das carraças. E como é assim, penso que devemos verificar para evitar a duplicação de encomendas (e analisar as situações correspondentes) sem relação com o comportamento (frequência) das carraças.

Assim, tenho dificuldade em responder à pergunta com precisão :/.

 
papaklass:

Não era isso que eu queria dizer quando fiz a minha pergunta. O manipulador de eventos OnTick() é accionado quando chega o próximo tick. Por causa disto, estou a reformular a minha pergunta:

Analisa estas situações dentro de uma chamada OnTick() ou diferentes?

Se após a chegada de um novo tick(evento do utilizador) for necessário enviar um pedido de troca ao servidor, então a verificação da execução bem sucedida deste pedido é efectuada "dentro do processamento" do tick (evento) chegado. Isto é, de acordo com a sua terminologia, "dentro de uma única chamada OnTick()". [e independentemente de quantas carraças (eventos) chegaram (devem ter chegado) durante este processamento].
 
papaklass:

Bem, ainda não consegui obter uma resposta num tick, executa OrderSend() e PositionSelect()?

Quero sugerir-lhe que faça estas consultas não dentro de um tique (accionando OnTick()), mas em dois tques:

- no primeiro tick

ou seja, se o pedido for bem sucedido, o operador coloca a bandeira de abertura de posição para comprar=verdadeiro, e interrompe a execução de OnTick() até ao próximo tick (activando o retorno do operador OnTick()).

- No segundo tick - PositionSelect().

Neste caso, não há duplicação da abertura de posições.

Não há garantia de que a posição já será aberta no próximo tick. Medir o tempo que leva a abrir uma posição quando se estabelece uma ordem manualmente,

Aconselho-o a mover o controlo de execução da ordem para OnTrade(), este evento é gerado apenas como uma resposta do servidor a uma operação comercial.

Embora não esteja muito claro para mim porque existem 4 eventos OnTrade() por encomenda ?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - Документация по MQL5
 
papaklass:

Bem, ainda não consegui obter uma resposta num tick, executa OrderSend() e PositionSelect()?

De acordo com a sua terminologia, acontece que as minhas funções OrderSend() e PositionSelect() são executadas "dentro de um tick".

papaklass:

...quero sugerir que estas consultas sejam executadas não dentro de um único tique (desencadeamento de OnTick()), mas dentro de dois tques:

- no primeiro tick

ou seja, se o pedido responder com sucesso, o utilizador coloca uma bandeira para abrir posição em buy=true, e interrompe a execução de OnTick() até ao próximo tick (desencadeamento do retorno do operador OnTick()).

- No segundo tick - PositionSelect().

Nesta variante não haverá abertura duplicada de posições.

Um pouco antes escrevi, que a execução das funções OrderSend() e PositionSelect() não tem nada a ver com a chegada/não chegada de carraças. E expliquei brevemente porquê. Portanto, a verificação "no segundo tick - PositionSelect()" não nos deve impedir de duplicar as encomendas em todos os casos possíveis.

 
Urain:

Embora não esteja muito claro para mim porque existem 4 eventos OnTrade() por encomenda ?

Houve um artigo sobre o assunto no passado sobre a OnTrade().

Urain:

Não há garantias de que a posição já será aberta no próximo tick...

É mais ou menos isso que estou a dizer.
 
papaklass:

Bem, ainda não consegui obter uma resposta num tick, executa OrderSend() e PositionSelect()?

Quero sugerir-lhe que faça estas consultas não dentro de um tique (accionando OnTick()), mas em dois tques:

- no primeiro tick

ou seja, se o pedido for bem sucedido, o operador coloca a bandeira de abertura de posição para comprar=verdadeiro, e interrompe a execução de OnTick() até ao próximo tick (activando o retorno do operador OnTick()).

- No segundo tick - PositionSelect().

Neste caso, não há duplicação da abertura de posições.

Não - não no carrapato. No 1º segundo.

Aqui está uma simplificação:

portanto - se sem uma pausa, abrirá 2 ordens seguidas. Mas eu defini-o durante 3 segundos - e não me arrependo de o ter feito )))) Ainda assim, é a abertura da encomenda.


void OnTimer()
{
  while(true)
  {
     zOrderSend (_Symbol,0.1,ORDER_TYPE_BUY);

     Sleep (1); 

   if (PositionSelect(_Symbol)==true) {break;} 
  }
}
 

A contabilidade das encomendas no MT5 é uma ciência completa:tratar de eventos comerciais no Expert Advisor utilizando a função OnTrade()

Nenhuma pausa o poupará de reabrir, uma situação pode sempre ocorrer, em que a ordem levará mais 1 segundo a ser executada.

ps: E não se esqueça da magia.

Razão: