Pergunta para os conhecedores - página 13

 

Sim, - Acho que sim! Obrigado, TheXpert!

Vou tentar!

 
Caros especialistas, por favor, ajudem-me a entender a função OrderCloseBy(). Estou totalmente confuso. Tenho um consultor especializado, que abre e fecha posições por condições invertidas. Ou seja, as condições OPEN BUY e CLOSE SELL são as mesmas, assim como OPEN SELL e CLOSE BUY, o que significa que logo após sair de uma posição pelo mesmo preço, uma posição se abre na direção oposta com o mesmo tamanho. Portanto, decidi tentar substituir OrderClose() abrindo uma posição na direção oposta com volume duplo e depois fechando ordens opostas com OrderCloseBy(). Ou seja, o mesmo algoritmo deveria ter sido aplicado, mas teria poupado um spread por comércio, mas o testador mostrou um resultado bastante diferente. Não posso decidir se escrevi o código incorretamente ou se entendi mal a idéia... Ficar-lhe-ia muito grato pelo esclarecimento...
 
Antes de mais nada, verifique com o suporte técnico de sua corretora se esta função é suportada pelo terminal. Nem todas as corretoras permitem a função OrderCloseBy().
 
Na demonstração, OrderCloseBy() é suportado.
 

Eu não sou um especialista. Tenho esta nota sobre esta função em minha pasta "ajuda", além de tudo "normal" (copiei-a aqui também - não me lembro qual ramo) -

E a função OrderCloseBy é usada SOMENTE para fechar 2 pedidos simultaneamente, nesse spread é salvo.
Devemos caminhar pelo terminal de forma programática, memorizar todos os números de pedidos abertos e suas características, selecionar o número do pedido principal, combiná-lo com o pedido desejado (a partir do disponível) e colar esse número.


// Isto é, como eu entendo, com esta função você só pode fechar duas posições contrárias, pré-selecionadas.

Isso é tudo o que há.

 

Sim, bem...

É por isso que é chamado assim.

 

Deixe-me reformular a questão se existe alguma diferença econômica nas duas possibilidades de inversão de posição que se seguem:

1) Fechar VENDA com 1 lote de volume usando a função OrderClose e depois abrir COMPRAR com 1 lote de volume

2) Enquanto a VENDA está aberta em 1 lote, primeiro abra COMPRAR em 2 lotes e depois feche a VENDA com a função OrderCloseBy, que também deixará uma posição de COMPRA aberta em 1 lote.

De acordo com o exemplo no livro de exercícios, um spread permanecerá na variante 2).

 
Em resumo, o spread 1+1 será compensado e o 1 restante será o spread comercial normal.
 
https://book.mql4.com/ru/trading/orderclose - aqui está uma descrição da função OrderCloseBy(). Tentou fazer o mesmo na demonstração - isso realmente reduz muito a propagação. Mas ainda não funciona no Expert Advisor... Estou tão confuso...
 
Dmirtiy писал(а) >>
https://book.mql4.com/ru/trading/orderclose - aqui você pode ver como funciona a função OrderCloseBy(). Tentei fazer o mesmo na demonstração - tem realmente uma propagação menor. Mas ainda não funciona no Expert Advisor... Estou realmente confuso...

Você já esteve em dois fios com esta pergunta. Você é inquisitivo.

Não há soluções simples. Com o lançamento da MQL5, este problema desaparecerá completamente.

Posso sugerir alguns procedimentos que eu utilizo em meus EAs.

//Detectar o estado atual das ordens abertas:

encomendas sem validade()
{
int i;
BuyOrder = falso;
SellOrder = falso;
BuyLots = 0,0;
SellLots = 0,0;

para ( i=0; i < OrdensTotal(); i++)
{
OrderSelect(i, SELECT_BY_POS);
se ( OrderSymbol() == Symbol())
{
se ( OrderType() == OP_BUY )
{
BuyOrder = verdadeiro;
LastBuyLots = OrderLots();
BuyLots += LastBuyLots; // soma das posições em aberto BuyLots
BuyTicket = OrderTicket();
}
se ( OrderType() == OP_SELL)
{
SellOrder = verdadeiro;
LastSellLots = OrderLots();
SellLots += LastSellLots; // soma das posições de venda em aberto
SellTicket = OrderTicket();
}
}
}
}

//Obrir (fechar) ordens:

Variante de comércio vazio( variante int )
{
switch( variante )
{
// se (Padrão < 0 && !BuyOrder && !SellOrder && !FridayLastHour) variante = 1;
// sinal para vender, nenhuma ordem está aberta e não é a última hora na sexta-feira
// abrir uma ordem de venda
caso 1:
OpenSellOrder(Lots);
pausa;

// if (Padrão < 0 && BuyOrder && !SellOrder && !FridayLastHour) variante = 2;
// sinal para vender, há uma ordem de compra aberta, sem ordem de venda
// não é a última hora da sexta-feira - estamos voltando
caso 2:
OpenSellOrder(Lots + BuyLots);
pausa;

// se (Padrão < 0 && BuyOrder && !SellOrder && FridayLastHour) variante = 3;
// sinal para vender, há uma ordem de compra aberta, sem ordem de venda
// é a última hora da sexta-feira - feche o pedido de compra
caso 3:
CloseBuyOrders();
pausa;

// if (Padrão > 0 && !SellOrder && !BuyOrder && !FridayLastHour) variante = 4;
// sinal para comprar, nenhum pedido está aberto e não é a última hora da sexta-feira
// ordem de compra em aberto
caso 4:
OpenBuyOrder(Lots);
pausa;

// if (Padrão > 0 && SellOrder && !BuyOrder && !FridayLastHour) variante = 5;
// sinal para comprar, há uma ordem de Venda em aberto, sem ordem de Compra
// não é a última hora da sexta-feira - estamos voltando
caso 5:
OpenBuyOrder(Lots + SellLots);
pausa;

// if (Padrão > 0 && SellOrder && !BuyOrder && FridayLastHour) variante = 6;
// sinal para comprar, há uma ordem de Venda em aberto, sem ordem de Compra
// é a última hora da sexta-feira - fechar a ordem de venda
caso 6:
FecharVendaOrdens();
pausa;

caso 7:
// if (SellOrder && BuyOrder) variant = 7;
// tem um pedido cruzado aberto
if (WaitBeforeTransaction(WaitSeconds) == 1) // pausa entre pedidos
{
if (LastBuyLots <= LastSellLots)
OrderCloseBy( BuyTicket, SellTicket);
else
OrderCloseBy( SellTicket, BuyTicket);
}
break

// em outras variantes não fazem nada
padrão:
pausa;
}
}

Espero que você consiga com as variáveis.

>> Boa sorte!