Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 501

 
dimkh87:
Por la tarde. ¿Pueden indicar si MT4 y MT5 tienen la posibilidad de superponer los gráficos de un instrumento con diferentes plazos, y los indicadores para estos plazos? Por ejemplo, quiero mostrar en una ventana 3 gráficos del par EUR/USD con TFs: día, 4 horas y hora, y también superponer los indicadores deslizantes de estos TFs. ¿Es posible? Estaré encantado de recibir cualquier ayuda.

¿Qué hacer con la línea de tiempo? ¿O dibujar barras a partir de escalas de tiempo más pequeñas de unos pocos compases de ancho?

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

Señores, por favor aconsejen, tomé una función de Kim que devuelve el número de barra de la última posición abierta o -1.

Llamo a esta función y escribo una condición

He mirado a través de Print y veo que esta función devuelve -1, al principio pensé que no había orden pero al cabo de un rato volvió a aparecer la orden y en la misma barra se abrió una operación después del stop.

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:
error que indicaif( iOpen[0] != time_open )'iOpen' - identificador no declarado

 
Вадим Мотеюнас:
el error se escribe apuntando aif( iOpen[0] != time_open )'iOpen' - identificador no declarado

¡Kim tiene todas las funciones funcionando! No lo has aplicado correctamente.

 
Vitaly Muzichenko:

¡Kim tiene todas las funciones funcionando! No lo has aplicado correctamente.

Nadie está discutiendo, sólo quiero entender cómo lo he aplicado mal.

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

Nadie está discutiendo, me gustaría entender cómo lo estoy aplicando mal

Imprima todo: es lo correcto para identificar errores y carencias:

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

Imprima todo: es la mejor solución para identificar errores y deficiencias:

Decía que devuelve -1, es decir, la última barra en la que se abrió la orden no es encontrada por la función, me preocupa que no esté pasando los parámetros correctos

 
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();//что означает это строка?что текущее время раньше цены открытия ордера, это как?
                    }
                 }
              }
           }
        }
     }
 
Вадим Мотеюнас:

La línea significa que se recorren todas las posiciones, y se elige/recuerda la más nueva, y se trabaja con ella. Esto es en caso de que las posiciones no estén en orden, sino dispersas.

 

La función recorre y selecciona la más reciente por tiempo, es decir, la última

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

A continuación, tenemos un seleccionado, y lo sustituimos en la funcióniBarShift(sym, tf, oot ,true);

La función devuelve el número de barra por tiempo. Eso es todo.

Lamentablemente, no puedo comprobarlo, pero cuando lo usé, funcionó bien, así como todas las funciones publicadas aquí por I. Kim