[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 275

 

A questão é.

Como obter um número sem menos, se se verificar que Aberto[1] <Fechado[1] e quando você subtrai Aberto[1]-Fechado[1] eu recebo o valor com um menos, como fazer com que seja sempre um valor positivo, eu preciso calcular a distância entre Aberto e Fechado talvez haja outra maneira?

Obrigado.

 
Martingeil >> :

A questão é.

Como obter um número sem menos, se se verificar que Aberto[1] <Fechado[1] e quando você subtrai Aberto[1]-Fechado[1] eu recebo o valor com um menos, como fazer com que seja sempre um valor positivo, eu preciso calcular a distância entre Aberto e Fechado talvez haja outra maneira?

>> Obrigado.

https://docs.mql4.com/ru/math/MathAbs

 

;) >> Obrigado!

 

Bom dia!

Ao escrever uma EA para MT4, havia a necessidade de determinar programmaticamente (isto é, no próprio código da EA) se pelo menos uma ordem desta EA foi aberta ou não. Você pode informar se existe tal função? Talvez, se houvesse, parecesse algo assim

Bool (tem um pedido de EA com este número mágico aberto)

{resposta= Verdadeiro/Falso}

?

Especialistas - ajude-nos, por favor - já estamos embrulhando nossos cérebros

P.S.- tentou a opção com números de pedido - não funcionou

 
waitra >> :

Bom dia!

Ao escrever uma EA para MT4, havia a necessidade de determinar programmaticamente (isto é, no próprio código da EA) se pelo menos uma ordem desta EA foi aberta ou não. Você sabe se existe tal função?

Esta função vai funcionar?

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                  |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}
  return( kp);
}

Exemplo de uso: Colocamos esta função no final de nosso código e a verificamos quando abrimos uma posição:



if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1) {
// если нет окрытых OP_BUY позиций с заданным магиком, покупаем
ticket=OrderSend(Symbol(),0, Lots,Ask, Slippage,Bid- SL*Point,
                      Ask+ TP*Point, NULL, Magic ,0,Blue);
                                              }

Se não procurarmos posições, mas sim ordens pendentes, podemos usar esta função

Função NumberOfOrders().
Esta função retorna o número de pedidos . Você pode limitar a lista de ordens a serem verificadas usando os parâmetros da função:
sy - Nome do instrumento. Se definirmos este parâmetro, a função só verificará as ordens do instrumento especificado. NULL significa instrumento atual, e "" (padrão) significa qualquer instrumento.
op - Tipo de ordem pendente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. O valor padrão de -1 significa qualquer ordem.
mn - Identificador do pedido (MagicNumber). O valor padrão de -1 significa qualquer MagicNumber.

https://www.mql5.com/ru/forum/107476/page12

 

Por favor, explique o que os arquivos fornecem:

#include <stdlib.mqh>
#include <stderror.mqh>

Se possível, de alguma forma simples.

Obrigado.

 
Serbov писал(а) >>

Por favor, explique o que os arquivos fornecem:

Se possível, de alguma forma simples.

Obrigado.

estes são os chamados "arquivos da biblioteca". estes arquivos armazenam funções freqüentemente usadas. eles são usados para evitar carregar a fonte. se o arquivo da biblioteca for "declarado", as funções do arquivo declarado podem ser usadas como se estivessem incluídas na fonte.

 
Serbov >> :

Por favor, explique o que os arquivos nos dão:

Se possível, por favor, mantenha-o simples.

Obrigado.

Ao utilizar (chamar) uma função desses arquivos (já inicialmente embutida no mt4) nós, em caso de operação incorreta da EA, podemos ver no log o número do erro que cometemos no código .

Por exemplo, chamamos a função GetLastError() :

ticket= OrderSend(Symbol(),OP_BUY, lots,Ask,3, SL, TP,"Name_Expert", Magic,0, clOpenBuy );
   if( ticket < 0)
 {Print("Ошибка открытия ордера BUY #", GetLastError());  } 

Neste caso, se cometemos um erro no código ou estabelecemos parâmetros externos incorretos, veremos o número deste erro no registro.

Por exemplo, 130.

E a decodificação do número pode ser encontrada em -https://book.mql4.com/ru/appendix/errors

E não precisamos passar por todo o código, pois já sabemos onde o erro foi cometido!

 
rid писал(а) >>

Esta função vai funcionar?


Exemplo de uso: colocamos a própria função no final do código (fora da função START) e depois a verificamos ao abrir uma posição:



Se não procurarmos por posições, mas por ordens pendentes, podemos usar

Função NumberOfOrders().
Esta função retorna o número de pedidos . Você pode limitar a lista de ordens a serem verificadas usando os parâmetros da função:
sy - Nome do instrumento. Se você especificar este parâmetro, a função só verificará as ordens do instrumento especificado. NULL significa instrumento atual, e "" (por padrão) significa qualquer instrumento.
op - Tipo de ordem pendente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. O valor padrão de -1 indica qualquer ordem.
mn - Identificador do pedido (MagicNumber). O valor padrão -1 significa qualquer MagicNumber.

https://www.mql5.com/ru/forum/107476/page12

Muito obrigado pela dica, nós a tentamos mas não funcionou, por favor verifique se há um erro em algum lugar no código:

bool Open_Buy()

{

   bool res=false;    


if( условие_1)        { 

       if ( NumberOfPositions(NULL, Magic)< 1) // если нет открытых позиций с заданным магиком

          { res=true; }}

else  

   {

    if( условие_1) 

       { 

       if ( NumberOfPositions(NULL, Magic)> 1) // если советник уже открывал позиции

       {

          if ( условие_2)              { 

             res=true; }

           } 

}}

return( res);

}

Se quisermos verificar se existe uma condição de Venda ou Compra e não abrimos ou fechamos um pedido, neste caso, somente a primeira condição funcionará. E se a EA já abriu ordens no passado, então, quando uma ordem é aberta, as primeiras + segundas condições devem ser acionadas.

Procurei através do link fornecido por você, talvez o ExistOrders(); é mais adequado?

(mas honestamente não consegui colocá-lo, uma vez que, por enquanto, parece que me falta a habilidade).

 

Você não chamou a função corretamente.

Sua função é chamada assim: se (NumberOfPositions(NULL,Magic)> 1)

Deveria ser assim:

if( условие_1)        { 

       if ( NumberOfPositions(NULL,-1, Magic)< 1) 
// если нет открытых позиций с заданным магиком

          { res=true; }}

Sinta a diferença (você deixou de fora "-1") ! e RETIFIQUE SEU CÓDIGO.

Para controlá-lo, você pode imprimir um comentário no gráfico. Por exemplo, assim (no início da função START).

Comment ("Количество текущих открытых советником позций = ",
                                  NumberOfPositions(NULL,-1,Magic)  );
Magic_2=Magic*3;
Quanto à sua segunda condição, eu ("sem pensar muito") colocaria um mágico diferente e função separada Open_Buy_2() para abrir posições pela segunda condição !

O código da segunda condição ficaria assim

 if ( условие_2)                          { 
  if ( NumberOfPositions(NULL,-1, Magic)== 1)   {
    if ( NumberOfPositions(NULL,-1, Magic_2)< 1) { 
..... .....