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

 
dimkh87:
Boa tarde. Você pode informar se o MT4 e o MT5 têm a possibilidade de sobrepor os gráficos de um instrumento com prazos diferentes, e os indicadores para esses prazos? Por exemplo, quero exibir em uma janela 3 gráficos de par EUR/USD com TFs: dia, 4 horas e hora, e também sobrepor os indicadores deslizantes destes TFs. Isso é possível? Estou ansioso por qualquer ajuda.

O que fazer com a linha do tempo? Ou desenhar barras a partir de prazos menores com algumas barras de largura?

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

Senhores, por favor, avisem, eu assumi uma função de Kim que retorna o número da barra da última posição aberta ou -1.

Eu chamo esta função e escrevo uma condição

Eu olhei através de Print e vi que esta função retorna -1, no início eu pensei que não havia ordem, mas depois de um tempo a ordem reapareceu e no mesmo bar um acordo foi aberto após a parada.

static datetime time_open = 0;
if(Open[2]>Close[2] && Open[1]>Close[1] && Close[1]<Low[2])
     {
      Comment("цена входа = ",DoubleToStr(Low[2],Digits));
      if( Open[0] != time_open )
         if(NumberOfBarOpenLastPos("",0,-1,-1)!=0)//вызвал здесь
            ticket=OrderSend(Symbol(),OP_SELLLIMIT,0.1,Low[2],2,0,0,magic,0);

      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
        {
         time_open = Open[0];
         TP=NormalizeDouble(OrderOpenPrice()-tp*Point,Digits);
         SL=NormalizeDouble(OrderOpenPrice()+sl*Point,Digits);
         modify=OrderModify(ticket,OrderOpenPrice(),SL,TP,0);
       }
      }
 
Konstantin Nikitin:
erro indicandose( iOpen[0] != time_open )'iOpen' - identificador não declarado

 
Вадим Мотеюнас:
erro é escrito apontando paraif( iOpen[0] != time_open )'iOpen' - identificador não declarado

Kim tem todas as funções funcionando! Você não aplicou corretamente.

 
Vitaly Muzichenko:

Kim tem todas as funções funcionando! Você não aplicou corretamente.

Ninguém está discutindo, eu só quero entender como eu a apliquei mal.

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

Ninguém está discutindo, eu gostaria de entender como eu estou aplicando mal

Imprimir tudo - é a coisa certa a fazer para identificar erros e deficiências:

Print( NumberOfBarOpenLastPos("",0,-1,-1) );
 
Vitaly Muzichenko:

Imprimir tudo - esta é a melhor solução para identificar erros e deficiências:

Eu estava dizendo que ele retorna -1, ou seja, a última barra em que a ordem foi aberta não é encontrada pela função, estou preocupado que eu não estou passando os parâmetros certos

 
int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot;
   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()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime();//что означает это строка?что текущее время раньше цены открытия ордера, это как?
                    }
                 }
              }
           }
        }
     }
 
Вадим Мотеюнас:

A linha significa que você passa por todas as posições, escolhe/lembra a mais nova, e trabalha com ela. Isto caso as posições não estejam em ordem, mas dispersas.

 

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

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()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнюю позицию
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, True));
  }

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 verificá-lo, mas quando o usei, funcionou bem, assim como todas as funções aqui publicadas por mim.

Razão: