Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 501

 
dimkh87:
Pomeriggio. Potete per favore consigliarmi se MT4 e MT5 hanno la possibilità di sovrapporre i grafici di uno strumento con diversi timeframes, e gli indicatori per questi timeframes? Per esempio, voglio visualizzare in una finestra 3 grafici della coppia EUR/USD con TF: giorno, 4 ore e ora, e anche sovrapporre gli indicatori scorrevoli di questi TF. È possibile? Non vedo l'ora di ricevere qualsiasi aiuto.

Cosa fare con la linea temporale? O disegnare barre da scale temporali più piccole di qualche barra?

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

Signori, per favore consigliatemi, ho preso una funzione da Kim che restituisce il numero di barra dell'ultima posizione aperta o -1.

Chiamo questa funzione e scrivo una condizione

Ho dato un'occhiata a Print e vedo che questa funzione restituisce -1, all'inizio pensavo che non ci fosse nessun ordine ma dopo un po' l'ordine è riapparso e sulla stessa barra è stata aperta un'operazione dopo lo 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:
errore che indicaif( iOpen[0] != time_open )'iOpen' - identificatore non dichiarato

 
Вадим Мотеюнас:
l'errore è scritto puntando aif( iOpen[0] != time_open )'iOpen' - identificatore non dichiarato

Kim ha tutte le funzioni funzionanti! Non l'hai applicato correttamente.

 
Vitaly Muzichenko:

Kim ha tutte le funzioni funzionanti! Non l'hai applicato correttamente.

Nessuno sta discutendo, voglio solo capire come l'ho applicata male.

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

Nessuno sta discutendo, vorrei capire come lo sto applicando male

Stampate tutto - è la cosa giusta da fare per identificare errori e mancanze:

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

Stampare tutto - questa è la soluzione migliore per identificare errori e carenze:

Dicevo che restituisce -1, cioè l'ultima barra in cui l'ordine è stato aperto non viene trovata dalla funzione, sono preoccupato che non sto passando i parametri giusti

 
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 linea significa che si passa attraverso tutte le posizioni, e si sceglie/ricorda la più recente, e si lavora con quella. Questo nel caso in cui le posizioni non siano in ordine, ma sparse.

 

La funzione passa attraverso e seleziona il più recente per tempo, cioè l'ultimo

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

Poi, abbiamo un selezionato, e lo sostituiamo nella funzioneiBarShift(sym, tf, oot ,true);

La funzione restituisce il numero di barra per tempo. Questo è tutto.

Purtroppo non posso controllarlo, ma quando l'ho usato, ha funzionato bene, così come tutte le funzioni pubblicate qui da I. Kim