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

 

Saluti a tutti i membri del forum.

Per favore, aiutatemi a far funzionare l'indicatore con un simbolo specifico, indipendentemente dal grafico su cui è impostato.

So che un parametro esterno è usato per cambiare il simbolo

input string   Symb   ="GBPJPY";
Non so cosa fare dopo

Sto allegando l'indicatore

File:
Fisher.mq4  3 kb
 

Potete dirmi per favore come resettare il buffer quando appare una nuova barra, ma in modo che i dati precedenti non vengano cancellati e vengano visualizzati sul grafico. Per qualche motivo non riesco ad azzerare il buffer e quando appareuna nuova barra, i nuovi dati si sovrappongono ai vecchi dati accumulati. Cosa sbaglio nel mio codice? Grazie per il chiarimento.

void OnInit()
{
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
   SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
  
   
}
 
 
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
      Buf_1[0]=0;         // и обнулить последний элемент буфера
      Buf_2[0]=0;
   }
   
      
   if(Bid > Bid1) 
   {
   V1 = iVolume(NULL, 0, 0);
   V2 = V1 + V2;
   Buf_1[0]= V2;
   }                             
   else 
   {
   V3 = iVolume(NULL, 0, 0);
   V4 = V3 + V4;
   Buf_2[0]= (V4*-1);
   }
   Bid1=Bid;
   
   
  return(rates_total);
}
 
Alekseu Fedotov:

Questo è il modo in cui è


Ho una domanda con il codice, risulta che la candela corrente non chiusa ha il tempo di chiusura e fino a quando la candela si chiude, l'indicatore disegna il prezzo di chiusura del periodo, su cui l'indicatore sta rosso nella zona dello schermo che non dovrebbe essere disegnato perché la candela dell'ora non è chiusa , questo è il tempo di compilazione e poi dopo la compilazione viene il disegno di ogni candela chiusa, naturalmente si può risolvere in un altro modo trovando le barre orarie, ma volevo un modo più semplice, ho scritto prima così
for(i=limit; i>0; i--)
{
yesterday_weekday = TimeHour(iTime(Symbol(),0,i+1))-TimeHour(iTime(Symbol(),0,i));
if(yesterday_weekday!=0)

qualsiasi altra soluzione al problema? Vorrei vederlo nella compilazione.

 
MakarFX: Per favore, aiutatemi a far funzionare l'indicatore con un certo simbolo, indipendentemente dal grafico su cui è impostato.

È necessario scrivere questo parametro nelle chiamate Higest, Lowest - sono obsoleti, meglio iHigest, iLowest e lodato notorio Fisher immediatamente concordato per un pareggio (V.Vysotsky)

 
PokrovMT5:
Ho una domanda con il codice, risulta che l'attuale candela di un'ora non chiusa ha il tempo di chiusura e finché la candela non si chiude, l'indicatore disegna la chiusura del prezzo del periodo su cui si trova l'indicatore, l'area rossa nello screenshot non deve essere disegnata perché la candela di un'ora non è chiusa , questo è il tempo di compilazione e poi dopo la compilazione viene il disegno di ogni candela chiusa, naturalmente si può risolvere in un altro modo trovando le barre orarie ma volevo un modo più semplice, ho scritto prima

C'è un'altra soluzione al problema? Grazie.

Se ho capito bene, vuoi segnare la chiusura oraria sul grafico?

// (только для TF меньше часа) для всех свечей внутри часа поставить HourCloseBuff=цена закрытия часа

// предполагается что close индексирован как тайм-серия

for(int back=i+1;back<=limit && TimeHour(time[back]==TimeHour(time[i+1]);back++) {

  HourCloseBuff[back]=close[i+1];

}

 
STARIJ:

Dovremmo scrivere questo parametro nelle chiamate Higest, Lowest - sono obsolete, meglio iHigest, iLowest e il famigerato Fischer ha subito accettato una patta (V.Vysotsky)

#property  copyright "Copyright © 2005, Yura Prokofiev"
#property  link      "Yura.prokofiev@gmail.com"

#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Lime
#property  indicator_color3  Red
 
input string   Symb     ="GBPJPY";
extern int     period   =10;

double         ExtBuffer0[];
double         ExtBuffer1[];
double         ExtBuffer2[];


int init()
  {
   
   
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2,Red);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,Lime);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);

   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);

   IndicatorShortName("Fisher");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);

   return(0);
  }


int start()
  {
   //int     period=10;
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current,old;
   double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0;
   double price;
   double MinL=0;
   double MaxH=0;  
   

   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;


   for(int i=0; i<limit; i++)
    {  MaxH = High[iHighest(Symb,0,MODE_HIGH,period,i)];
       MinL = Low[iLowest(Symb,0,MODE_LOW,period,i)];
      price = (High[i]+Low[i])/2;
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;     
      Value=MathMin(MathMax(Value,-0.999),0.999); 
      ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=ExtBuffer0[i];
      
    }


   bool up=true;
   for(i=limit-2; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
           
      if (((current<0)&&(prev>0))||(current<0))   up= false;    
      if (((current>0)&&(prev<0))||(current>0))   up= true;
      
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
        
       else
         {
          ExtBuffer1[i]=current;
          ExtBuffer2[i]=0.0;
         }
     }

   return(0);
  }
L'ho fatto, ma questo non risolve il problema per
price = (High[i]+Low[i])/2;
Alto e Basso usano il simbolo corrente.
 
Maxim Kuznetsov:

Se ho capito bene, vuoi segnare la chiusura oraria sul grafico?

// (только для TF меньше часа) для всех свечей внутри часа поставить HourCloseBuff=цена закрытия часа

// предполагается что close индексирован как тайм-серия

for(int back=i+1;back<=limit && TimeHour(time[back]==TimeHour(time[i+1]);back++) {

  HourCloseBuff[back]=close[i+1];

}

Maxim, buon giorno! Grazie per la variante, la mia è quasi la stessa, funziona anche, maAlekseu Fedotov l'ha suggerita e io l'ho scritta, qual è l'idea di correggerla?



for(i=limit; i>=0; i--)
     {
      T = iTime(NULL,0,i); 
      shift=iBarShift(NULL,60,T); 
      C=iClose(NULL,60,shift);
      CC[i]=C;
     }
 

Potete dirmi per favore come resettare il buffer quando appare una nuova barra, ma in modo che i dati precedenti non vengano cancellati e vengano visualizzati sul grafico. Per qualche motivo non riesco ad azzerare il buffer e quando appareuna nuova barra, i nuovi dati si sovrappongono ai vecchi dati accumulati. Cosa sbaglio nel mio codice? Grazie per il chiarimento.

 datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
      Buf_1[0]=0;         // и обнулить последний элемент буфера
      Buf_2[0]=0;
   }
   
      
   if(Bid > Bid1) 
   {
   V1 = iVolume(NULL, 0, 0);
   V2 = V1 + V2;
   Buf_1[0]= V2;
   }                             
   else 
   {
   V3 = iVolume(NULL, 0, 0);
   V4 = V3 + V4;
   Buf_2[0]= (V4*-1);
   }
   Bid1=Bid;
   
   
  return(rates_total);
 

Nessuno può aiutarmi?

 

Buona giornata a tutti voi! Come faccio a passare alla finestra del grafico giusto?

Ho molte finestre di diverse coppie aperte, ognuna con un EA, appare un segnale di trade, ma le valute sono alla frutta, e ho bisogno di attivare rapidamente il grafico esatto su cui è arrivato il segnale.

Conosco il comando Symbol(), ma non so come attivare la finestra con una coppia di valute specificata. Forse, chi ha affrontato questo compito?