[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 632
Per esempio, dovete calcolare una media mobile semplice con PeriodSMA. Per calcolare la SMA, aggiungi i valori delle ultime barre PeriodSMA e dividi per il PeriodSMA. È ovvio che per le barre con numeri Bars-1, Bars-2, ..., Bars-PeriodSMA+1 non funzionerà, perché semplicemente non abbiamo la quantità necessaria di barre per il calcolo (la barra più a sinistra ha indice Bars-1). Pertanto, dobbiamo iniziare il calcolo dell'indicatore non con l'ultima barra del grafico, ma con la barra con l'indice Bars-PeriodSMA.
Perché scrivono questo valore e non uno arbitrario? È perché questo spostamento dell'inizio del calcolo ci permette di calcolare la quantità massima di barre senza pregiudicare la correttezza del calcolo.
Ma tenete presente che questo è il caso più semplice. A volte può non essere immediatamente chiaro dal codice di quante barre precedenti il programma ha bisogno per il calcolo e da dove viene esattamente questo spostamento. Beh, probabilmente dovreste chiedere allo sviluppatore che ha scritto il codice. Ma in generale, c'è un modo universale - basta guardare il codice, ciò che in linea di principio l'indice massimo della barra può essere ottenuto utilizzando i dati di prezzo e i dati dei buffer di indice durante il funzionamento del programma, di solito già in questa fase diventa chiaro...
Ora tutto sta andando a posto. Grazie Alexei per la tua reattività!
И просто чтобы уточнить, если я механическим путем добавлю 0, то TP и SL будут работать в данном типе терминалов?
prorab:
Lo faranno, naturalmente. È a questo che servono, le variabili esterne, per impostare qualsiasi valore.
Ma è ancora più facile mettere quello che vi è stato consigliato nel modulo di inizializzazione. O in questa forma: Le variabili saranno regolate automaticamente, e per altre necessità usate il moltiplicatore "decimale"
Questo compito deve essere chiarito:
I vostri parametri d'ingresso (STPOLOSS, TAKEPROFIT, ecc.) devono essere inseriti tenendo conto di 4\2 cifre!!!
SOS!!! BRAVA GENTE, AIUTO!!! Sono un principiante nella programmazione in generale (sono autodidatta), e in MQL in particolare. Ho scritto un semplice indicatore: RSI + Bande di Bollinger in una sola persona. Ma ecco il problema: se nonspecifico espressamente la quantità di elementi nell'array Buf_std_dev (cioè la linea di dichiarazione dell'array assomiglia a questa: double Buf_std_dev[]), allora quando visualizzo questo indicatore nella finestra del terminale client(CT) ottengo la seguente immagine:
Spiegazione dell'immagine:
a) in alto c'è l'RSI, che è disponibile nel set di indicatori forniti con CT, e le Bande di Bollinger sono state trascinate nella finestra di questo RSI con il dragedrop);
b ) in basso c'è l'RSI, che è programmato da me;
Il compilatore non rileva alcun errore o avvertimento.
Se, d'altra parte, quando dichiaro l'array Buf_std_dev, specifico esplicitamente il numero di elementi in esso (cioè, la linea di dichiarazione dell'array si presenta così: double Buf_std_dev[5502], dove 5502 è il numero di barre, che si ottiene utilizzando la variabile Bars), allora tutto torna normale (per come si vede dal confronto dei due indicatori: tutti i valori sono uguali):
Potete dirmi cosa fare per salvare l'immagine, come nella seconda immagine, ma esplicitamente NON per impostare il numero di elementi nell'array Buf_std_dev.
Codice allegato (senza alcune parti - non può entrare in 4 MB!!!):
....
double Buf_rsi[]; //открываем индикаторный массив для значений RSI+double Buf_ma[]; //открываем индикаторный массив для значений скользящей средней по RSI+double Buf_up_line[]; //открываем индикаторный массив для значений ВЛБ по RSI+double Buf_down_line[]; //открываем индикаторный массив для значений НЛБ по RSI+double Buf_std_dev[5498]; //открываем массив для хранения данных по стандартному отклонению string timeframe[9]; //объявляем массив для значений таймфреймовexternint Период_RSI=14; //внешняя переменная: период RSI+externint Применить_к=PRICE_CLOSE; //внешняя переменная: цена, для к-й рассчитывается RSI+externint Сдвиг=0; //внешняя переменная: сдвиг относительно текущего графика RSI+externdouble Сигма=2.0; //внешняя переменная: количество стандартных отклонений для расчета лент Боллинджера по RSI+externint МА=21; //внешняя переменная: период скользящей средней для расчета лент Боллинджера по RSI+
....
if(Bars<=Период_RSI) return(0); //если баров на графике меньше, чем период RSI+, то выходим//+-------------------------------------------------------------------------------------- 9 --int counted_bars=IndicatorCounted(); //количество посчитанных баровint i; //техническая переменные: счетчикиint limit=Bars-counted_bars; //индекс первого непосчитанного по массиву Buf_ma (т.к. этот массив НЕ является массивом таймсерией)if(counted_bars<0)limit--; //если значение переменной counted_bars больше 0, то увеличиваем на 1 значение переменной limit//+-------------------------------- Рассчет линий индикатора ---------------------------- 10 --for(i=0;i<=limit;i++)Buf_rsi[i]=iRSI(NULL,0,Период_RSI,Применить_к,i);//рассчет значения RSI+ на i-ом баре for(i=0;i<=limit;i++) //цикл по рассчету линий на основе RSI+
{ //начало for
Buf_std_dev[i]=iStdDevOnArray(Buf_rsi,Bars,МА,Сдвиг,MODE_SMA,i);//рассчитываем стандатное отклонение по массиву RSI+
Buf_ma[i]=iMAOnArray(Buf_rsi,Bars,МА,Сдвиг,MODE_SMA,i); //рассчет значения MA по RSI+ на i-ом баре
Buf_up_line[i]=Buf_ma[i]+Сигма*Buf_std_dev[i]; //рассчет значения ВЛБ по RSI+
Buf_down_line[i]=Buf_ma[i]-Сигма*Buf_std_dev[i]; //рассчет значения НЛБ по RSI+
} //конец forfor(i=0;i<=Bars;i++) //цикл по подсчету количества данных внутри ЛБ
{ //начало forint sum; //техническая переменные: сумма данных, к-е находятся внутри ЛБ if(Buf_rsi[i]>Buf_down_line[i]&&Buf_rsi[i]<Buf_up_line[i])sum++; //если значение RSI+ > НЛБ и значение RSI+ < НЛБ, то переменная sum увеличиваестся на 1 (т.о.)
} //конец for//+------------------------------------------------------------------------------------- 11 --
Se il vostro Buf_std_dev non è un buffer indicatore (uno degli otto), dovete specificare la sua dimensione, o qualsiasi dimensione (se intendete cambiarla (dimensione) in futuro) quando lo dichiarate.
Giusto, non è... Se posso, altre due domande in una volta sola:
1. Se gli assegno un buffer (l'array Buf_std_dev) , significa che sarà visualizzato anche nella finestra dell'indicatore?
Se non gli assegno un buffer, allora (se ho capito bene) si verifica la seguente situazione: supponiamo che io abbia specificato la dimensione di 100 barre. Poi quando appaiono nuove barre (cioè se per esempio Bars=101), eseguiremo i calcoli solo per le ultime 100 barre che abbiamo specificato (cioè la barra più vecchia - 101 - sarà scartata). Quindi, quando si carica la storia, la dimensione dell'array sarà sempre uguale a 100 barre soltanto (o qualche altro valore, che specificherò al momento della dichiarazione)?
Per esempio, dovete calcolare una media mobile semplice con PeriodSMA. Per calcolare la SMA, aggiungi i valori delle ultime barre PeriodSMA e dividi per il PeriodSMA. È ovvio che per le barre con numeri Bars-1, Bars-2, ..., Bars-PeriodSMA+1 non funzionerà, perché semplicemente non abbiamo la quantità necessaria di barre per il calcolo (la barra più a sinistra ha indice Bars-1). Pertanto, dobbiamo iniziare il calcolo dell'indicatore non con l'ultima barra del grafico, ma con la barra con l'indice Bars-PeriodSMA.
Perché scrivono questo valore e non uno arbitrario? È perché questo spostamento dell'inizio del calcolo ci permette di calcolare la quantità massima di barre senza pregiudicare la correttezza del calcolo.
Ma tenete presente che questo è il caso più semplice. A volte può non essere immediatamente chiaro dal codice di quante barre precedenti il programma ha bisogno per il calcolo e da dove viene esattamente questo spostamento. Beh, probabilmente dovreste chiedere allo sviluppatore che ha scritto il codice. Ma in generale, c'è un modo universale - basta guardare il codice, ciò che in linea di principio l'indice massimo della barra può essere ottenuto utilizzando i dati di prezzo e i dati dei buffer di indice durante il funzionamento del programma, di solito già in questa fase diventa chiaro...
Grazie per il chiarimento!
E solo per chiarire, se aggiungo meccanicamente 0, TP e SL funzioneranno in questo tipo di terminale?
Lo faranno, certo che lo faranno.
È a questo che servono, le variabili esterne, per impostare qualsiasi valore.
Ma è più facile mettere nel modulo di inizializzazione ciò che vi è stato consigliato.
O in questa forma:
Le variabili saranno regolate automaticamente, e per altre necessità usate il moltiplicatore "decimale"
Спасибо за разъяснения!
И просто чтобы уточнить, если я механическим путем добавлю 0, то TP и SL будут работать в данном типе терминалов?
prorab:
Lo faranno, naturalmente.È a questo che servono, le variabili esterne, per impostare qualsiasi valore.
Ma è ancora più facile mettere quello che vi è stato consigliato nel modulo di inizializzazione.
O in questa forma:
Le variabili saranno regolate automaticamente, e per altre necessità usate il moltiplicatore "decimale"
Questo compito deve essere chiarito:
Buon pomeriggio...
SOS!!! BRAVA GENTE, AIUTO!!! Sono un principiante nella programmazione in generale (sono autodidatta), e in MQL in particolare. Ho scritto un semplice indicatore: RSI + Bande di Bollinger in una sola persona. Ma ecco il problema: se non specifico espressamente la quantità di elementi nell'array Buf_std_dev (cioè la linea di dichiarazione dell'array assomiglia a questa: double Buf_std_dev[]), allora quando visualizzo questo indicatore nella finestra del terminale client(CT) ottengo la seguente immagine:
Spiegazione dell'immagine:
a) in alto c'è l'RSI, che è disponibile nel set di indicatori forniti con CT, e le Bande di Bollinger sono state trascinate nella finestra di questo RSI con il drag e drop);
b ) in basso c'è l'RSI, che è programmato da me;
Il compilatore non rileva alcun errore o avvertimento.
Se, d'altra parte, quando dichiaro l'array Buf_std_dev, specifico esplicitamente il numero di elementi in esso (cioè, la linea di dichiarazione dell'array si presenta così: double Buf_std_dev[5502], dove 5502 è il numero di barre, che si ottiene utilizzando la variabile Bars), allora tutto torna normale (per come si vede dal confronto dei due indicatori: tutti i valori sono uguali):
Potete dirmi cosa fare per salvare l'immagine, come nella seconda immagine, ma esplicitamente NON per impostare il numero di elementi nell'array Buf_std_dev.
P.S. Grazie in anticipo per la risposta.
Codice allegato (senza alcune parti - non può entrare in 4 MB!!!):
Mostra tutto il codice
Per favore consigliate se ci sono modi per scaricare qui il codice oltre i 4Mb (o scaricarlo qui in parti?)?
Se il vostro Buf_std_dev non è un buffer indicatore (uno degli otto), dovete specificare la sua dimensione, o qualsiasi dimensione (se intendete cambiarla (dimensione) in futuro) quando lo dichiarate.
Giusto, non è... Se posso, altre due domande in una volta sola:
1. Se gli assegno un buffer (l'array Buf_std_dev) , significa che sarà visualizzato anche nella finestra dell'indicatore?
Se non gli assegno un buffer, allora (se ho capito bene) si verifica la seguente situazione: supponiamo che io abbia specificato la dimensione di 100 barre. Poi quando appaiono nuove barre (cioè se per esempio Bars=101), eseguiremo i calcoli solo per le ultime 100 barre che abbiamo specificato (cioè la barra più vecchia - 101 - sarà scartata). Quindi, quando si carica la storia, la dimensione dell'array sarà sempre uguale a 100 barre soltanto (o qualche altro valore, che specificherò al momento della dichiarazione)?