[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 276

 
rid >> :

Ao utilizar (chamar) funções destes arquivos (já implementadas no mt4), em caso de trabalho incorreto da EA, podemos ver no registro o número do erro cometido por nós no código.

Por exemplo, chamamos a função 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 na página -https://book.mql4.com/ru/appendix/errors

E não teremos que procurar em todos os códigos, porque já sabemos por este número - onde exatamente o erro é cometido!

Deixe-me corrigir um pouco: a função GetLastError pode ser chamada sem o arquivo de cabeçalho, mas para obter a descrição do erro sem navegar pelos sites você deve ligar a biblioteca:

#include <stderr.mqh>
#include <stdlib.mqh>

...
Print("Ошибка открытия ордера BUY #", ErrorDescription(GetLastError()));
...
 
rid писал(а) >>

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

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

Deveria ser assim:


Sinta a diferença (você perdeu o "-1") ! e MODIFICA 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).

Quanto à sua segunda condição, eu ("sem pensar inteligentemente") 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

livrar,

Eu também entendo porque a segunda condição não funciona, talvez eu tenha explicado o problema incorretamente:

Quero que minha EA possa verificar se as ordens foram abertas por ela ou não, mesmo que elas tenham sido fechadas há muito tempo. NumberOfPositions funciona, mas conta apenas o número de posições em aberto. (é por isso que não funciona)

No código da minha EA, há um roteiro que abre cada posição seguinte levando em conta os dados da posição anterior e, se não houvesse posição anterior, a primeira ordem deveria ser aberta sem esta condição (caso contrário, a EA não iniciará). Portanto, deve haver uma função que entenda se pelo menos uma ordem desta EA foi aberta ou não (mesmo se a ordem foi então fechada). Se ainda não houver nenhuma ordem (o início do trabalho), então a primeira ordem é aberta sem considerar a segunda condição, e todas as ordens subseqüentes são abertas considerando a segunda condição, ou seja, usando os dados de ordens anteriores.

É possível modificar a função desta forma?

 

Por favor, diga-me o que a função iTime mostra.

O que é essa algaraviada de 10 dígitos? Segundos?

Como isso se traduziria em ano-mês-dia-hora-minuto?

 

Estou vendo. Você pode determinar se as posições estiveram na história desta forma:

  for (int i=0; i< OrdersTotal(); i++)                          {
    if (!(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ))) continue;
//выбираем из истории счета
    if (OrderSymbol() != Symbol()) continue;    
     if ( OrderMagicNumber()== Magic)                            {
              позиции = true;
                                                             }}
                  



Mas então seu código só funcionará no testador. Porque senão você terá que mudar o magik toda vez que ligar o EA online.

Aparentemente, você precisa definir o tempo para o qual o histórico da conta é levado em conta.

Isto é, quando foi o último comércio com o magik aberto/fechado? Foi há seis meses ou 24 horas atrás?

Há funções que devolvem o número da barra (contando da barra atual para o verso da história) do último comércio aberto ou fechado.


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

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

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

  if ( sy=="" || sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) t=OrderCloseTime();
            } } }} }  }  return(iBarShift( sy, tf, t, True));}

Para lhe dar um exemplo. Usei estas funções em meu código desta forma:
//======================================================================
// запретить торговлю - в день , если с начала текущих суток
//уже были открыты или закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 1440,-1, Magic)==0 
     ||  NumberOfBarCloseLastPos(NULL, 1440,-1, Magic)==0 )
    Trade=false;       else Trade=true;
//================================================================

Ou assim:
//======================================================================
// запрет торговли  , если за последние 85 баров графика Н1
//т.е. за посл.85 часов)уже были открыты   позиции  или
// закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 60,-1, Magic)<=85 
     ||  NumberOfBarCloseLastPos(NULL,60,-1, Magic)<=85 )
    Trade=false;       else Trade=true;
 
Cavalheiros! Socorro! Como escrever corretamente o código para exibir uma mensagem de que a última vela fechada é branca (para cima) ou preta (para baixo). Sei que não faz sentido, mas ainda assim .....

 

Hmm.lutando com o mesmo problema simples...abre um mar de posições mas precisa de apenas 1 no máximo e quando a compra fecha e vem um sinal para abrir a venda... Grande solicitação insinue e corrija o que está errado.no código abaixo... Onde eu preciso prescrever um magik? Se você não se importa, faça um exemplo idiota, quando comprar cross para cima (não mais de 1 pedido) e vender para baixo também não mais de 1. Penso que isto resolverá imediatamente as questões de muitos novatos. Agradecemos antecipadamente.

//---- input parameters
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   
   int ticket;
  if ( NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
   if ( NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
   return(0);
  }

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);
}
 

Outra pergunta estúpida:

- Como declarar uma matriz cujo número de elementos é dado por uma variável externa.

 
chaynik_1 >> :
Cavalheiros! Socorro! Como escrever corretamente o código para exibir uma mensagem de que a última vela fechada é branca (para cima) ou preta (para baixo). Sei que não faz sentido, mas ainda assim .....

É assim.

if ((Open[1]-Close[1])<0  ) Comment ("1 свеча =  бычья");
 
alderru >> :

Outra pergunta estúpida:

- Como declarar uma matriz cujo número de elementos é dado por uma variável externa.

https://docs.mql4.com/ru/array/ArrayResize

 
morok >> :

Hmm.lutando com o mesmo problema simples...abre um mar de posições mas precisa de apenas 1 no máximo e quando a compra fecha e vem um sinal para abrir a venda... Grande solicitação insinue e corrija o que está errado.no código abaixo... Onde eu preciso prescrever um magik? Se você não se importa, faça um exemplo idiota, quando comprar cross para cima (não mais de 1 pedido) e vender para baixo também não mais de 1. Penso que isto resolverá imediatamente as questões de muitos novatos. Obrigado de antemão.

Experimente assim:

(você tem que estar mais atento com NumberOfPositions(), está escrito no cabeçalho por uma razão:

/| Descrição : | Descrição : Retorna o número de posições.
//| Parâmetros : |
//| sy - nome do instrumento ("" ou NULL - símbolo corrente) |
op - operação ( -1 - qualquer posição) ||
//| mn - MagicNumber ( -1 - qualquer número mágico) |
//+----------------------------------------------------------------------------+

extern int       Magic=5675;
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);   
   int ticket;
//------------------------------------------------
 if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   if ( NumberOfPositions(NULL,OP_SELL, Magic)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

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);
}
Razão: