[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 632

 
alsu:

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à!
 
skyjet:


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:
// для терминала с 5 знаками
if (Digits == 3 || Digits == 5) {
   decimal = 10; // Определяет кол-во пунктов в четвертом(втором) знаке
   STOPLOSS *= decimal;
   TAKEPROFIT *= decimal;
   slippage *= decimal; // прочие целочисленные переменные в пунктах
} else decimal = 1;
Le variabili saranno regolate automaticamente, e per altre necessità usate il moltiplicatore "decimale"
 
skyjet:


Спасибо за разъяснения!

И просто чтобы уточнить, если я механическим путем добавлю 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!!!
 

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.

 
Mostra tutto il codice
 

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];                                                    //объявляем массив для значений таймфреймов
extern int Период_RSI=14;                                               //внешняя переменная: период RSI+
extern int Применить_к=PRICE_CLOSE;                                     //внешняя переменная: цена, для к-й рассчитывается RSI+
extern int Сдвиг=0;                                                     //внешняя переменная: сдвиг относительно текущего графика RSI+
extern double Сигма=2.0;                                                //внешняя переменная: количество стандартных отклонений для расчета лент Боллинджера по RSI+
extern int МА=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+
       }                                                                //конец for
   for(i=0;i<=Bars;i++)                                                 //цикл по подсчету количества данных внутри ЛБ
      {                                                                 //начало for
       int sum;                                                         //техническая переменные: сумма данных, к-е находятся внутри ЛБ 
       if(Buf_rsi[i]>Buf_down_line[i]&&Buf_rsi[i]<Buf_up_line[i])sum++; //если значение RSI+ > НЛБ и значение RSI+ < НЛБ, то переменная sum увеличиваестся на 1 (т.о.)
      }                                                                 //конец for
//+------------------------------------------------------------------------------------- 11 --
 
FAQ:
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)?

Motivazione: