Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 502

 
Vitaly Muzichenko:

A função passa e seleciona o mais novo por vez, ou seja, o último

Em seguida, temos um selecionado, e o substituímos na funçãoiBarShift(sym, tf, oot ,true);

A função retorna o número da barra por tempo. Isso é tudo.

Infelizmente não posso verificar, mas quando o usei, funcionou perfeitamente, assim como todas as funções aqui publicadas por mim.

e se eu tiver um bilhete atribuído quando eu abrir um pedido e a função selecionar um número seqüencial, está bem?
 
Вадим Мотеюнас:
Escreve erro indicandose( iOpen[0] != time_open )'iOpen' - identificador não declarado

Eu escrevi algo um pouco errado, um pouco na outra direção do pensamento. Alterar iOpen[0] para Open[0]. Corrigido. Mas para simplificar. Quando abro um bar, lembro-me da hora da abertura do bar e nenhuma ordem já é tomada neste bar.

 

Também está escrito na descrição da função que

A seleção das posições a serem levadas em consideração é definida por parâmetros externos:

  • sy- Nome do instrumento de mercado. Se você definir este parâmetro, a função considerará apenas as posições do instrumento especificado. O valor padrão -NULL significa o instrumento de mercado atual.
  • tf- Cronograma. O valor padrão0 significa o período de tempo atual.
  • op- Operação comercial, tipo de posição. Valores válidos:OP_BUY,OP_SELL ou-1. O valor padrão-1 significa qualquer posição.
  • mn- Identificador de posição, MagicNumber. O valor padrão-1 significa qualquer identificador.
Estes valores devem ser declarados antes da primeira função especial, ou seja, o fato de estarem incluídos na descrição da funçãoNumberOfBarOpenLastPos() em sinão é suficiente?

 
Вадим Мотеюнас:

Também está escrito na descrição da função que

A seleção das posições a serem levadas em consideração é definida por parâmetros externos:

  • sy- Nome do instrumento de mercado. Se você definir este parâmetro, a função considerará apenas as posições do instrumento especificado. O valor padrão -NULL significa o instrumento de mercado atual.
  • tf- Cronograma. O valor padrão0 significa o período de tempo atual.
  • op- Operação comercial, tipo de posição. Valores válidos:OP_BUY,OP_SELL ou-1. O valor padrão-1 significa qualquer posição.
  • mn- Identificador de posição, MagicNumber. O valor padrão-1 significa qualquer identificador.
Por parâmetros externos? É necessário declará-los antes da primeira função especial? ou seja,não basta que estejam na descrição da própria funçãoNumberOfBarOpenLastPos()?

Já chega. Nos parâmetros externos você pode inserir os valores necessários: MagicNumber, quais posições você está procurando, se você quer COMPRAR(0) e VENDER(1) - então escreva "-1".

 
Konstantin Nikitin:

Eu escrevi algo um pouco errado, um pouco na outra direção do pensamento. Alterar iOpen[0] para Open[0]. Corrigido. Mas para simplificar. Quando eu abrir um bar, ele se lembrará da hora da abertura do bar e nenhuma ordem será aberta neste bar.

muitos pedidos são abertos e parece que a condição se(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) antes da abertura de uma não-ordem é cumprida uma vez que NumberOfBarOpenLastPos retorna -1

 
Вадим Мотеюнас:

muitas ordens são abertas, e parece que a condição se(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) for atendida antes de uma ordem não aberta, porque NumberOfBarOpenLastPos retorna -1

Você está procurando por pedidos, então você precisa usar a função em sua versão completa, ou seja, com a capacidade de procurar por pedidos, não apenas por posições:

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }
 
Vitaly Muzichenko:

Isto é suficiente. Nos parâmetros externos você pode inserir os valores necessários: Majik, quais posições são procuradas, talvez só COMPRAR, se COMPRAR(0) e VENDER(1) forem necessárias - então escrevemos "-1".

quando começo no testador, não há ordens abertas, talvez seja por isso que -1 é devolvido, e é por isso que a condição se(NumberOfBarOpenLastPos(Symbol(),0,-1,-1,-1)>0) não se mantém?

 
Вадим Мотеюнас:

Ao começar no testador, não há ordens em aberto, talvez seja por isso que -1 é devolvido e portanto a condição se(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) não for atendida?

Vou verificar isso agora.

 
Vitaly Muzichenko:

Você está procurando por pedidos, então você precisa usar a função em sua versão completa, ou seja, com a capacidade de procurar por pedidos, não apenas por posições:

ainda retorna -1

 
Вадим Мотеюнас:

ainda retorna -1

Funciona perfeitamente!

De duas posições ele escolheu a última, que está no bar 11, como você pode ver na imagem da tela:


Código de verificação:

 void OnTick() 
  {
   ...
   Comment( NumberOfBarOpenLastPos("",0,-1,-1) );
   ...
  }

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }
Razão: