Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 843

 
artmedia70:
Para fechar uma posição com um bilhete, é necessário saber primeiro o número exato do bilhete da posição a ser fechada. Em seguida, você deve selecionar o pedido usando a função OrderSelect(ticket,SELECT_BY_TICKET), com verificação da seleção bem sucedida. Então precisamos verificar o horário de fechamento da ordem selecionada com sucesso. Por quê? Porque quando selecionamos por bilhete, o parâmetro de pool da função OrderSelect(..., ..., pool) é ignorado (é usado somente quando selecionamos por índice). E isso significa que mesmo que tenhamos selecionado com sucesso uma ordem, ainda precisamos saber em qual lista a escolhemos - a lista de posições fechadas ou abertas. É a verificação do tempo de fechamento que nos permite saber "se a ordem ainda está no mercado". Se o tempo de fechamento for igual a zero, a ordem ainda está no mercado. Se o tempo for diferente de zero, o pedido já foi fechado mais cedo. E depois de todo esse procedimento, podemos enviar uma ordem para fechar essa ordem.

Tenho um gráfico à minha frente. Vejo que uma ordem está aberta nele. Decidi fechá-lo. É isso aí. nada mais é necessário.

(Pergunto porque. Eu posso fechar com uma cruz de "um clique", mas estou muito confortável com as teclas de atalho)

 
evillive:

int OrdensTotal(); - número de retorno, não verdadeiro-falso, isso é o que está errado. Não há ordens, significa 0, e se há ordens, não é apenas 1.

E não há ordens fechadas somente em uma conta recém-aberta que ainda não tenha sido negociada. Mais uma vez, este é um uso incorreto da função.

E por que RefreshRates(); APÓS o pedido ter sido enviado para o servidor? É como pagar por algo primeiro e depois perguntar "quanto é?

Obrigado, entendi.
 
evillive:

int OrdensTotal(); - número de retorno, não verdadeiro-falso, isso é o que está errado. Não há ordens, significa 0, e se há ordens, não é apenas 1.

E não há ordens fechadas somente em uma conta recém-aberta que ainda não tenha sido negociada. Mais uma vez, esta é uma má aplicação da função.

Mas por que atualizar(); APÓS o pedido ter sido enviado para o servidor? É como pagar por algo e depois perguntar "quanto é?

Depois de ouvir a expressão "O nome da capital russa comete dois erros", fiquei chocado. Onde eles poderiam ser encontrados lá? Então eu percebi que você pode cometer dois erros.

O que quero dizer é que também há mais de um erro na linha de código que estamos discutindo.

if (!OrdersTotal()==true)

se(negação -> expressão == verdadeiro) Claro que podemos entender, como explica Artem, se 0 então tudo o resto é falso Então acontece que se negarmos que há ordens abertas então... oops... é mais fácil escrever Moscou com dois erros.

 
Escapee:

Tenho um gráfico na minha frente. Vejo que uma ordem está aberta. Decidi fechá-lo. É isso. nada mais é necessário.

(Pergunto porque. Posso fechá-lo com uma cruz de "um clique", mas acho muito conveniente o uso de teclas de atalho)

Aqui estou lhes dizendo como fazer isso de forma programática correta.

1. Você tem uma tabela na sua frente com um pedido. Você pode ver o número do bilhete, e o programa? O programa precisa saber este número.

2. Você quer fechá-lo. Assim, você pode ver que o pedido com tal bilhete é aberto. E o programa? O programa não o conhece. Portanto, o programa precisa saber se o pedido com tal bilhete é aberto ou não.

3. Você pode clicar na cruz, e pronto. E o programa precisa dar um comando.

Portanto, a conclusão é a seguinte:

1. Descobrimos se há uma posição em aberto

2. Se assim for, procuramos o bilhete do pedido solicitado

3. Selecionamos o pedido com base no bilhete encontrado. Se o tivermos selecionado com sucesso, então...

4. Verifique o horário de fechamento do pedido selecionado pelo bilhete. Se o tempo de fechamento for igual a zero, então...

5. Nós a encerramos.

 

Eu corrigiria sua resposta desta forma.

artmedia70:


1. Na sua frente está uma tabela com uma ordem. Você pode ver seu número de bilhete

2. Você quer fechá-lo.

3. Você pode clicar na cruz e no ponto...

5. Feche isso.

 
AlexeyVik:

Eu corrigiria sua resposta desta forma.

Você ainda está brincando?
 
artmedia70:
Ainda está brincando?

Sim. É o dia de folga.


 
artmedia70:


ou seja, não é possível fazer um roteiro de encerramento semelhante ao roteiro de abertura? Porque é tão simples... Euestava pensando...
 
Escapee:
Então, não podemos fazer um roteiro fechado semelhante ao roteiro de ordem aberta? Por ser tão simples...eu estava pensando...

A abertura de uma ordem também não é tão simples - não com um único comando de envio de ordem comercial. Todos esses comandos precisam ser "embrulhados" em uma função completa com a verificação dos códigos de retorno do servidor comercial e a reação a essas respostas. Verificação de níveis válidos, recalculando-os se um nível calculado incorreto for dado na ordem, etc., etc.

E fechamento - a mesma coisa: uma função separada de busca da ordem correta, que chama uma função completa de fechamento, em vez de apenas uma linha de código com o envio de uma ordem ao servidor.

 
artmedia70:

A abertura de uma ordem também não é tão simples - não com um único comando de envio de ordem comercial. Todos esses comandos precisam ser "embrulhados" em uma função completa com a verificação dos códigos de retorno do servidor comercial e a reação a essas respostas. Verificação de níveis válidos, recalculando-os se um nível calculado incorreto for dado na ordem, etc., etc.

Espere... finalmente entender o que eu preciso...

Aqui está a abertura do pedido que eu precisava - OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0); . E este roteiro funciona.

Agora eu preciso fechar......

Razão: