Quindi si può emettere solo il buffer, ma non la variabile separatamente?
Sì, è l'unico modo. E un altro trucco che può tornare utile, se si imposta SetIndexLabel(0, ""); allora questi valori non saranno visualizzati nella finestra dei dati. E anche la funzione iCustom() non sarà disponibile.
Ho preso il codice dall'esempio in https://www.mql5.com/ru/docs/strings/stringadd e l'ho incollato nello script. Il risultato è lo stesso in MQL4 e MQL5:
HE 022:42:49.015 Test Script (EURUSD,H1) time for 'c = a + b' = 235 milliseconds, i = 1000000
OH 022:42:50.187 Test Script (EURUSD,H1) time for 'StringAdd(a,b)' = 1156 milliseconds, i = 1000000
EP 022:42:50.781 Test Script (EURUSD,H1) time for 'StringConcatenate(c,a,b)' = 594 milliseconds, i = 1000000
Ho pensato che StringAdd() e StringConcatenate() dovrebbero essere più veloci di "+". Perché non è così?
iCustom di solito rallenta i test dell'Expert Advisor.
non è vero, di solito è il contrario, perché l'allocazione della memoria per i buffer dell'indicatore è fatta dal terminale, non dallo script MQL, di solito questi problemi sono il problema del calcolo non ottimale nell'indicatore, molti neofiti su una chiamata indicatore - tick, calcolano l'intera lunghezza dei dati storici
Se avete capito le basi del MQL, leggete gli articoli, è tutto scritto.
Chi ha fatto questo per un EA e sarà visualizzato quando si testa l'EA in una sottofinestra?
nessuno l'ha fatto, leggi qual è la differenza tra un EA e un indicatore, chi ha buffer di indicatori e chi no, chi ha funzioni di trading e chi no....
ZSYZZ: la sottofinestra può essere ottenuta applicando un modello, c'era un topic un paio di mesi fa, ma penso che tu abbia un problema con altre cose finora
Когда программист создает советник, который получает сигналы от индикаторов, он всякий раз сталкивается с вопросом: использовать обращение к индикатору или перенести код индикатора в советник? Причины этому могут быть различные: желание сохранить в тайне используемые индикаторы и стратегию в целом, необходимость распространения советника единым...
non è vero, di solito è il contrario, perché l'allocazione della memoria per i buffer degli indicatori è fatta dal terminale, non dallo script MQL, di solito questi problemi sono il problema del calcolo non ottimale nell'indicatore, molti neofiti su una chiamata indicatore - tick, calcolano l'intera lunghezza dei dati storici
Se avete capito le basi del MQL, leggete gli articoli, è stato scritto da molto tempo.
nessuno l'ha fatto, leggi qual è la differenza tra un Expert Advisor e un indicatore, chi ha buffer di indicatori e chi no, chi ha funzioni di trading e chi ....
ZSYZZ: la sottofinestra può essere ottenuta applicando un modello, era un argomento di un paio di mesi fa, ma penso che tu abbia un problema con qualcos'altro finora
Mi dispiace. Forse non mi sono espresso bene, ma
Non ho intenzione di usarlo per i test, ma non ho intenzione di eseguirlo.
Per quanto riguarda la visualizzazione sul grafico dell'indicatore durante i test, se usate
Quando usate funzioni di indicatori in linea, esse vengono disegnate sul grafico durante il processo di test
Questo è esattamente quello che voglio dire.
Ma se usate un qualche tipo di codice di calcolo dell'indicatore personalizzato che è integrato nel codice dell'EA, allora questo indicatore
non sarà visualizzato durante il processo di test dell'EA.
Per quanto riguarda iCustom, quando lo usi nel processo di test l'EA sarà visualizzato sul grafico
qualsiasi indicatore e il codice dell'indicatore può essere compilato con l'EA in un ex4 ma non ne ho bisogno.
Volevo solo sapere se c'è un modo per bypassare iCustom in questa materia, ma se non c'è, non è nemmeno un problema.
Artem ha postato un modello di indicatore qui, ecco la parte diOnCalculate
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)if(rates_total<4) return0;
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.if(limit>1)
// если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории// если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,// при подгрузке истории и на первом запуске - перерасчёт всей истории
{
limit=rates_total-1;
// здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
}
Lo sto usando ma ho una domanda)
Perché usolimit=rates_total-1 per il calcolo della storia completa enonlimit=rates_total?
Perchélimit=rates_total-1 è usato per il calcolo della storia completa enonlimit=rates_total?
Provate a controllarlo, sarete immediatamente "fuori portata " - numerazione delle barre da zero a ... Totale -1 , una situazione comune nella programmazione - la numerazione inizia con 0. Come esempio ovvio, dichiarate l'array double x[5] e provate a scrivere qualcosa nell'ultimo elemento x[5] = 100;
ZS: rispondere alla domanda che non hai ancora fatto.... Anche OrderTotal() numera da zero a OrderTotal()-1;)
ZS: rispondere a una domanda che non è ancora stata fatta.... OrderTotal() numera troppo da zero a OrderTotal()-1 ;)
La questione è sorta a proposito, ora non posso vincere una media sulla matrice, anche se faccio in cinque, ma in quale tema scrivere, non so, lasciate che sia qui.
L'indicatore calcola la differenza aperto-chiuso e costruisce МА su di essa. Ho scelto MA=2 per il debug ma usando SimpleMAOnBuffer e iMAOnArray ottengo degli spostamenti di linea inspiegabili e iMAOnArray mostra un valore zero sull'ultima barra.
//+------------------------------------------------------------------+//| _null.mq4 |//| Copyright 2014, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2014, MetaQuotes Software Corp."#property link"http://www.mql5.com"#property version"1.00"#property strict#property indicator_separate_window#include <MovingAverages.mqh>
#property indicator_buffers4#property indicator_plots2//--- plot OC#property indicator_label1"OC"#property indicator_type1DRAW_COLOR_HISTOGRAM#property indicator_color1clrSteelBlue, clrRed,clrGreen#property indicator_style1STYLE_SOLID#property indicator_width11#property indicator_label2"MA1"#property indicator_type2DRAW_LINE#property indicator_color2clrBrown#property indicator_style2STYLE_SOLID#property indicator_width21//--- indicator buffersdouble OC[], OC_color[], MA1_buf[];
inputint MA1=2;
intOnInit()
{
IndicatorSetString(INDICATOR_SHORTNAME,"t1");
SetIndexBuffer(0,OC,INDICATOR_DATA);
SetIndexBuffer(1,OC_color,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2, MA1_buf,INDICATOR_DATA);
//PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,50);//--- indicator buffers mapping//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)if(rates_total<4) return0;
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.//if(limit>1) // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории// если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,// при подгрузке истории и на первом запуске - перерасчёт всей истории
{
limit=rates_total-1;
// здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
}
for(int i=limit; i>=0 && !IsStopped(); i--)
{
// необходимые действия по расчёту индикатора
OC[i]=fmax(open[i],close[i])-fmin(open[i],close[i]);
if(OC[i]>0.001)
{ OC_color[i]=1;
}
}
/* for(int k=limit; k>=0 && !IsStopped(); k--)
{
MA1_buf[k]=iMAOnArray(OC,0,MA1,k,MODE_SMA,0);
}
*/
SimpleMAOnBuffer(rates_total,prev_calculated,0,MA1,OC,MA1_buf);
//--- return value of prev_calculated for next callreturn(rates_total);
}
double iMAOnArray(double &array[],
int total,
int period,
int ma_shift,
int ma_method,
int shift)
{
double buf[],arr[];
if(total==0) total=ArraySize(array);
if(total>0 && total<=period) return(0);
if(shift>total-period-ma_shift) return(0);
switch(ma_method)
{
caseMODE_SMA :
{
total=ArrayCopy(arr,array,0,shift+ma_shift,period);
if(ArrayResize(buf,total)<0) return(0);
double sum=0;
int i,pos=total-1;
for(i=1;i<period;i++,pos--)
sum+=arr[pos];
while(pos>=0)
{
sum+=arr[pos];
buf[pos]=sum/period;
sum-=arr[pos+period-1];
pos--;
}
return(buf[0]);
}
caseMODE_EMA :
{
if(ArrayResize(buf,total)<0) return(0);
double pr=2.0/(period+1);
int pos=total-2;
while(pos>=0)
{
if(pos==total-2) buf[pos+1]=array[pos+1];
buf[pos]=array[pos]*pr+buf[pos+1]*(1-pr);
pos--;
}
return(buf[shift+ma_shift]);
}
caseMODE_SMMA :
{
if(ArrayResize(buf,total)<0) return(0);
double sum=0;
int i,k,pos;
pos=total-period;
while(pos>=0)
{
if(pos==total-period)
{
for(i=0,k=pos;i<period;i++,k++)
{
sum+=array[k];
buf[k]=0;
}
}
else sum=buf[pos+1]*(period-1)+array[pos];
buf[pos]=sum/period;
pos--;
}
return(buf[shift+ma_shift]);
}
caseMODE_LWMA :
{
if(ArrayResize(buf,total)<0) return(0);
double sum=0.0,lsum=0.0;
double price;
int i,weight=0,pos=total-1;
for(i=1;i<=period;i++,pos--)
{
price=array[pos];
sum+=price*i;
lsum+=price;
weight+=i;
}
pos++;
i=pos+period;
while(pos>=0)
{
buf[pos]=sum/weight;
if(pos==0) break;
pos--;
i--;
price=array[pos];
sum=sum-lsum+price*period;
lsum-=array[i];
lsum+=price;
}
return(buf[shift+ma_shift]);
}
default: return(0);
}
return(0);
}
Ho una domanda correlata, sto ancora lottando con la media delle matrici, anche se la sto facendo in 5, ma non so in quale soggetto scriverla, sia qui.
Ho la sensazione che in MQL5 i buffer degli indicatori e le serie temporali siano "dispiegati" in modo opposto, di default la barra più a sinistra in MT5 è la barra 0 e in MT4 la barra più a destra è la barra 0 e i buffer degli indicatori hanno la stessa numerazione
ZS: ahimè, non voglio essere coinvolto con MT5, MT4 è sufficiente per me per verificare le mie idee, guardo solo le preparazioni in MT5, se scrivo qualcosa usando MT5 non lo mostro mai a nessuno )))
Imposta il colore del display su clrNONE.
Quindi si può emettere solo il buffer, ma non la variabile separatamente?
Quindi si può emettere solo il buffer, ma non la variabile separatamente?
Grazie per aver risposto.
Quindi quello che ho capito è di creare un buffer, poi riempirlo con
con i valori RSI e poi alimentare questo buffer coniMAOnArray().
Qualcuno ha fatto questo per EA e sarà visualizzato quando si prova EA nella sottofinestra?
Di solito i test EA attraverso iCustom sono lenti.
Ho preso il codice dall'esempio in https://www.mql5.com/ru/docs/strings/stringadd e l'ho incollato nello script. Il risultato è lo stesso in MQL4 e MQL5:
Ho pensato che StringAdd() e StringConcatenate() dovrebbero essere più veloci di "+". Perché non è così?
iCustom di solito rallenta i test dell'Expert Advisor.
non è vero, di solito è il contrario, perché l'allocazione della memoria per i buffer dell'indicatore è fatta dal terminale, non dallo script MQL, di solito questi problemi sono il problema del calcolo non ottimale nell'indicatore, molti neofiti su una chiamata indicatore - tick, calcolano l'intera lunghezza dei dati storici
Se avete capito le basi del MQL, leggete gli articoli, è tutto scritto.
https://www.mql5.com/ru/articles/4602
Chi ha fatto questo per un EA e sarà visualizzato quando si testa l'EA in una sottofinestra?
nessuno l'ha fatto, leggi qual è la differenza tra un EA e un indicatore, chi ha buffer di indicatori e chi no, chi ha funzioni di trading e chi no....
ZZY: una sottofinestra può solo creare un indicatore. Se create una sottofinestra, allora potete aggiungere oggetti grafici a questa sottofinestra usando l'Expert Advisorhttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object
ZSYZZ: la sottofinestra può essere ottenuta applicando un modello, c'era un topic un paio di mesi fa, ma penso che tu abbia un problema con altre cose finora
non è vero, di solito è il contrario, perché l'allocazione della memoria per i buffer degli indicatori è fatta dal terminale, non dallo script MQL, di solito questi problemi sono il problema del calcolo non ottimale nell'indicatore, molti neofiti su una chiamata indicatore - tick, calcolano l'intera lunghezza dei dati storici
Se avete capito le basi del MQL, leggete gli articoli, è stato scritto da molto tempo.
https://www.mql5.com/ru/articles/4602
nessuno l'ha fatto, leggi qual è la differenza tra un Expert Advisor e un indicatore, chi ha buffer di indicatori e chi no, chi ha funzioni di trading e chi ....
ZZY: una sottofinestra può solo creare un indicatore, se si crea una sottofinestra, allora si possono aggiungere oggetti grafici a questa sottofinestra utilizzando l'Expert Advisorhttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object
ZSYZZ: la sottofinestra può essere ottenuta applicando un modello, era un argomento di un paio di mesi fa, ma penso che tu abbia un problema con qualcos'altro finora
Mi dispiace. Forse non mi sono espresso bene, ma
Non ho intenzione di usarlo per i test, ma non ho intenzione di eseguirlo.
Per quanto riguarda la visualizzazione sul grafico dell'indicatore durante i test, se usate
Quando usate funzioni di indicatori in linea, esse vengono disegnate sul grafico durante il processo di test
Questo è esattamente quello che voglio dire.
Ma se usate un qualche tipo di codice di calcolo dell'indicatore personalizzato che è integrato nel codice dell'EA, allora questo indicatore
non sarà visualizzato durante il processo di test dell'EA.
Per quanto riguarda iCustom, quando lo usi nel processo di test l'EA sarà visualizzato sul grafico
qualsiasi indicatore e il codice dell'indicatore può essere compilato con l'EA in un ex4 ma non ne ho bisogno.
Volevo solo sapere se c'è un modo per bypassare iCustom in questa materia, ma se non c'è, non è nemmeno un problema.
Grazie mille per la risposta esauriente.
Artem ha postato un modello di indicatore qui, ecco la parte diOnCalculate
Lo sto usando ma ho una domanda)
Perché usolimit=rates_total-1 per il calcolo della storia completa enonlimit=rates_total?
Perchélimit=rates_total-1 è usato per il calcolo della storia completa enonlimit=rates_total?
Provate a controllarlo, sarete immediatamente "fuori portata " - numerazione delle barre da zero a ... Totale -1 , una situazione comune nella programmazione - la numerazione inizia con 0. Come esempio ovvio, dichiarate l'array double x[5] e provate a scrivere qualcosa nell'ultimo elemento x[5] = 100;
ZS: rispondere alla domanda che non hai ancora fatto.... Anche OrderTotal() numera da zero a OrderTotal()-1 ;)
ZS: rispondere a una domanda che non è ancora stata fatta.... OrderTotal() numera troppo da zero a OrderTotal()-1 ;)
La questione è sorta a proposito, ora non posso vincere una media sulla matrice, anche se faccio in cinque, ma in quale tema scrivere, non so, lasciate che sia qui.
L'indicatore calcola la differenza aperto-chiuso e costruisce МА su di essa. Ho scelto MA=2 per il debug ma usando SimpleMAOnBuffer e iMAOnArray ottengo degli spostamenti di linea inspiegabili e iMAOnArray mostra un valore zero sull'ultima barra.
Ho una domanda correlata, sto ancora lottando con la media delle matrici, anche se la sto facendo in 5, ma non so in quale soggetto scriverla, sia qui.
Ho la sensazione che in MQL5 i buffer degli indicatori e le serie temporali siano "dispiegati" in modo opposto, di default la barra più a sinistra in MT5 è la barra 0 e in MT4 la barra più a destra è la barra 0 e i buffer degli indicatori hanno la stessa numerazione
ZS: ahimè, non voglio essere coinvolto con MT5, MT4 è sufficiente per me per verificare le mie idee, guardo solo le preparazioni in MT5, se scrivo qualcosa usando MT5 non lo mostro mai a nessuno )))