pergunta simples

 

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?

 

I forgot:


dupla Dist = 1000000.0;

 
Aljohin:

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.

 
gordon:

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...
 
gordon:

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"

 
meikel:

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.

 
Ais:

Hi

A ordem selecionada pode ser completamente fechada por expressão: "OrderClose (), OrderLot (), OrderClosePrice (), 0 ) ;"

Com os melhores cumprimentos

não resolve meu problema...

 
gordon:

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
 
Ais:

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 why
Quando 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.
 
WHRoeder:
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

Razão: