I forgot:
dupla Dist = 1000000.0;
Por favor, alguém pode me ajudar?
1. Esta é apenas parte do seu código, mostre-nos a função CheckFirstOP() por exemplo.
2. O para loop está incrementando. Isso não funcionará corretamente se as ordens de fechamento no loop forem fechadas, por favor, veja -> https://www.mql5.com/en/forum/119840.
3. Sua convenção de nomenclatura variável não é tão boa assim.
4. Por favor, use o botão SRC para postar seu código para que ele mantenha a formatação. É muito difícil ler seu código desta forma.
1. Isto é apenas parte do seu código, mostre-nos a função CheckFirstOP() por exemplo.
2. O para loop está incrementando. Isso não funcionará corretamente se as ordens de fechamento no loop, por favor veja -> https://www.mql5.com/en/forum/119840.
3. Sua convenção de nomeação de variáveis não é tão boa assim.
4. Por favor, use o botão SRC para postar seu código de modo que ele mantenha a formatação. É muito difícil ler seu código desta maneira.
double Dist=1000000.0; if ( CheckFirstOP(OP_BUY) > 1) { for ( l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) { OrderSelect( l_pos_44, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue; double Price = OrderOpenPrice(); if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) { Dist = MathAbs(Bid - Price); int Ticket = OrderTicket(); double Lot = OrderLots(); OrderClose( Ticket, Lot, OrderClosePrice(), 3); } } } int CheckFirstOP(int a_cmd_0) { int l_count_4 = 0; for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) { if (OrderSelect( l_pos_8, SELECT_BY_POS)) { if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) { if (OrderType() == a_cmd_0) { l_count_4++; break; } } } } return ( l_count_4); }
my fault...i'm very new to this stuf...
3. Sua convenção de nomeação de variáveis não é tão boa assim.
parece uma convenção de nomes de descompiladores ...
"ele é novo nessas coisas"
parece uma convenção de nomes de descompiladores ...
"ele é novo nessas coisas".
...provavelmente sim...eu quero modificar uma EA que comprei...eles também me enviaram o código (eles disseram por engano)...agora eu entendo a razão desta nomenclatura tão estranha...como eu disse que sou novo (acabei de ler o livro da MQL4 neste site) e não queria modificar muitas coisas pelo menos no início, então eu deixei os nomes como os encontrei.
Hi
A ordem selecionada pode ser completamente fechada por expressão: "OrderClose (), OrderLot (), OrderClosePrice (), 0 ) ;"
Com os melhores cumprimentos
não resolve meu problema...
2. O para loop está incrementando. Isso não funcionará corretamente se as ordens de fechamento no loop, por favor veja -> https://www.mql5.com/en/forum/119840.
Por que incrementar não funciona? no livro da MQL4 não é mencionado (eu acho)...de qualquer forma eu tentei:
if ( CheckFirstOP(OP_BUY) > 1) { for(int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect( i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue; double Price = OrderOpenPrice(); if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) { Dist = MathAbs(Bid - Price); int Ticket = OrderTicket(); double Lot = OrderLots(); OrderClose( Ticket, Lot, OrderClosePrice(), 3); } } }
it doesn't work, don't know why
simplesmente tenha certeza nesta linha agora
Sim, claro que tentei e nada muda...coisas estranhas com esta programação :) não seria difícil escrever uma simples ordem de fechamento (pensei)...
it doesn't work, don't know whyQuando você fecha o índice de pedidos 5, o índice de pedidos 6 se torna índice 5, 7 se torna 6, etc. Ao contabilizar você está perdendo todos os outros pedidos abertos.
Quando você fecha o índice de pedidos 5, o índice de pedidos 6 se torna índice 5, 7 se torna 6, etc. Contando que você está faltando cada outro pedido aberto.
ah ok, entendido...de qualquer forma o código é mentalizar para manter apenas uma ordem aberta e começar a trabalhar imidiáriamente quando há 2 ordens abertas e fecha uma delas depois de selecionar e analisar todas elas (ou seja, 2 ordens)...então eu não acho que seja um grande erro incrementar a seleção da ordem...de qualquer forma eu tentei o método decrescente sem nenhum resultado...talvez eu esteja tentando de uma maneira errada...não sei...alguém pode tentar meu código e ver se ele realmente fecha as negociações...ou alguém pode escrever um código simples para selecionar e fechar a ordem aberta anterior (isto é, aquela com preço aberto mais alto para comprar e com preço aberto mais baixo para vender)?
obrigado
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Saudações a todos vocês. Eu criei um código (modificando outros códigos) para fechar ordens do mercado.
int l_pos_44 = 0;
if (CheckFirstOP(OP_BUY) > 1) {
para (l_pos_44 = 0; l_pos_44 < OrderTotal(); l_pos_44++) {
OrderSelect(l_pos_44, SELECT_BY_POS, MODE_TRADES);
se (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continuar;
preço duplo = OrderOpenPrice();
if (NormalizeDouble(MathAbs(Bid - Bid - Price), Digitos) < NormalizeDouble(Dist, Digitos)) {
Dist = MathAbs(Bid - Price);
int Ticket = OrderTicket();
lote duplo = OrderLots();
OrderClose(Ticket, Lot, Bid, 3);
}
}
(o mesmo código para fechar posições de venda (obviamente com a variável OP_SELL ao invés de OP_BUY))
int CheckFirstOP(int a_cmd_0) {
int l_count_4 = 0;
for (int l_pos_8 = 0; l_pos_8 < OrderTotal(); l_pos_8++) {
se (OrderSelect(l_pos_8, SELECT_BY_POS)) {
if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {
se (OrderType() == a_cmd_0) {
l_count_4++;
intervalo;
}
}
}
}
retorno (l_count_4);
}
Eu preciso de um código para fechar posições longas ou curtas quando há mais de 1 posição aberta para o tipo...então para manter 2 posições no total (1 compra e 1 venda)...eu preciso também manter a posição aberta mais recente, ou seja, neste caso, aquela com o maior preço aberto para posição de compra e aquela com o menor preço aberto para posição de venda. O problema é que o código não fecha as posições...ele não fecha nenhuma delas.
quando: "se (CheckFirstOP(OP_BUY) == 1)", então o código fecha as primeiras posições imidiáriamente após serem abertas...ou seja, após uma ordem de compra e venda serem abertas, elas são fechadas com o próximo tick. E quando: "se (CheckFirstOP(OP_BUY) > 1)" nenhuma das posições é fechada. Eu não sei o que estou fazendo de errado.
Por favor, alguém pode me ajudar?