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().
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.
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).
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; } }
Sim, - Acho que sim! Obrigado, TheXpert!
Vou tentar!
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).
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!