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

 

Qualcuno può gentilmente dirmi come scrivere la seguente cosa.

Ho fatto un indicatore di allenamento, che conta iVolume per ogni tick: iVolume è positivo per quelli che si sono mossi verso l'alto, e iVolume è negativo per quelli che si sono mossi verso il basso. Per fare una curva, tutti gli iVolume (positivi e negativi) aggiungo un totale crescente da barra a barra. Si ottiene una curva. Tuttavia, ho incontrato due problemi:

1) la linea risulta molto rotta;

2) è impossibile testare l'Expert Advisor, perché il grafico iVolume ottenuto ha solo una vita reale.

Domanda:

1) come descrivere il codice che permette di costruire un grafico basato su dati mediati che scrivo nel buffer?

2) È possibile scrivere i dati di questo indicatore (che si riceve in modalità reale) in un certo file, in modo che in seguito, facendo riferimento a questo file, si possa costruire l'indicatore sui dati storici, applicando ad essi i volumi di tick già raccolti? Se possibile, come descriverlo programmaticamente? O c'è un'altra soluzione che non richiede la scrittura delle informazioni correnti di iVolume in un file?

#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_label1  "Вверх"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Salmon
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "Вниз"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkTurquoise
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

datetime Время=0;   // Время прошлого бара
double Bid1;
double   Buf_1[];
long V1; // объем для текущего тика вверх
long V2; // накопленный объем для всех тиков вверх текущего бара
long V3; // объем текущего тика вниз
long V4; // накопленный объем для всех тиков вниз для текущего бара
long V5;  // отрицательные и положительные iVolume нарастающим итогом

void OnInit()
{
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
   //SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
   V5 = 0;
  
   
}
 
 
//+------------------------------------------------------------------+
//| 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;         // и обнулить последний элемент буфера
   }
   
      
   if(Bid >= Bid1) 
{
   if(Bid > Bid1) 
{   
   V1 = iVolume(NULL, 0, 0); // если повышающий цену тик
   V2 = V1 + V2;
}
  else
{
   V1 = 0;                // если Bid1 = Bid2, т.е. изменение цены = 0, то iVolume этого тика присваиваем 0;
   V2 = V1 + V2;      
}               
}              
   else 
{
   V3 = iVolume(NULL, 0, 0); // если понижающий цену тик 
   V4 = V3 + V4;
}
  
   V5 = V2-V4;
   Bid1=Bid;
   Buf_1[0]= V5; // в буфер сгружаем 
  
   
  return(rates_total);
}
 

Forse aggiungere alla fine del codice:

double macurrent=iMAOnArray(Buf_1[0],0,5,0,0,MODE_LWMA,0);

Eh, no! Il compilatore genera l'errore dicendo che non c'è una matrice.


 
Ciao, puoi dirmi cosa significano i punti esclamativi nel tostapane della strategia?
 

Anyone....., puoi aiutarmi? Il mio punto morto per me è esposto qui:https://www.mql5.com/ru/forum/160683/page378#comment_6053255

 
YarTrade: è possibile scrivere i dati di questo indicatore (che si ottiene in modalità reale) in un file, in modo che più tardi, facendo riferimento a questo file, sarebbe possibile costruire un indicatore su dati storici, applicando ad esso i volumi di tick già raccolti? Se possibile, come descriverlo programmaticamente? O c'è un'altra soluzione che non richiede la scrittura delle informazioni correnti di iVolume nel file?

Indicatore basato sui dati del file - ha inserito questa linea nella ricerca e ha trovato

 

Una specie di incubo, non capisco perché dà fuori così:
Codice sezione :


line[0]=MathFloor(Low[1]*MathPow(10,D-1));
Print("Var ",DoubleToStr(line[0],D));
Print("Code ",DoubleToStr(MathFloor(Low[1]*MathPow(10,D-1)),D));

Output :

EURUSD,M15: Var 0.00000
EURUSD,M15: Codice 11754.00000


Cosa succede al valore dopo l'assegnazione?

 
LuckySith:   Sezione del codice :

line[0]=MathFloor(Low[1]*MathPow(10,D-1));
Print("Var ",DoubleToStr(line[0],D));
Print("Code ",DoubleToStr(MathFloor(Low[1]*MathPow(10,D-1)),D));

Print :

EURUSD,M15: Var 0.00000
EURUSD,M15: Codice 11754.00000

Cosa succede al valore dopo l'assegnazione?

Stampa il valore delle variabili dopo l'assegnazione e il valore della variabile D. Usa la tua calcolatrice per fare i conti.

 

Ciao a tutti. Gente, potreste darci un piccolo aiuto? Qualcuno potrebbe per favore impostare una linea nell'indicatore dove è possibile specificare il nome del file audio, in modo che la linea venga visualizzata nelle impostazioni dell'indicatore.

File:
Awesome-33.ex4  16 kb
 
STARIJ:

Stampa i valori delle variabili dopo l'assegnazione e il valore della variabile D. Calcoliamolo con una calcolatrice...


Quindi stampo il valore della variabile dopo l'assegnazione. Quindi il codice è fondamentalmente il seguente:


a=b;

Stampa (a);

Stampa (b);

Ma a è uguale a zero e b è stampato correttamente

 
LuckySith:

Questo è il modo in cui ho emesso il valore che è stato assegnato. Quindi il codice è essenzialmente il seguente:


a=b;

Stampa (a);

Stampa (b);

Ma a è uguale a zero mentre b è stampato correttamente


Non vedo lo zero, avete fatto un errore da qualche parte

   int D=5;
   double a=MathFloor(Low[1]*MathPow(10,D-1)); 
   Print("Var ",DoubleToStr(a,D)); 
   Print("Code ",DoubleToStr(MathFloor(Low[1]*MathPow(10,D-1)),D));