[ARCHIVE] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 3. - page 632

 
alsu:

Par exemple, vous devez calculer une moyenne mobile simple avec PeriodSMA. Pour calculer la SMA, additionnez les valeurs des dernières barres de la PeriodSMA et divisez par la PeriodSMA. Il est évident que pour les barres avec les numéros Bars-1, Bars-2, ..., Bars-PeriodSMA+1, cela ne fonctionnera pas, car nous n'avons tout simplement pas le nombre de barres nécessaires pour le calcul (la barre la plus à gauche a l'indice Bars-1). Par conséquent, nous devons commencer le calcul de l'indicateur non pas avec la dernière barre du graphique, mais avec la barre avec l'indice Bars-PeriodSMA.

Pourquoi écrivent-ils cette valeur, et non une valeur arbitraire ? C'est parce que ce décalage du début du calcul nous permet de calculer la quantité maximale de barres sans préjudice de l'exactitude du calcul.

Mais n'oubliez pas qu'il s'agit du cas le plus simple. Parfois, le code ne permet pas de savoir immédiatement de combien de barres précédentes le programme a besoin pour le calcul et d'où provient exactement ce décalage. Eh bien, vous devriez probablement demander au développeur qui a écrit le code. Mais en général, il y a un moyen universel - il suffit de regarder le code, ce qu'en principe l'indice maximal de la barre peut être obtenu en utilisant les données de prix et les données des tampons d'index pendant le fonctionnement du programme, généralement déjà à ce stade il devient clair ....

Maintenant, tout se met en place. Merci Alexei pour votre réactivité !
 
skyjet:


Merci pour cette précision !

Et juste pour clarifier, si j'ajoute mécaniquement 0, est-ce que TP et SL fonctionneront dans ce type de terminal ?


Ils le feront, bien sûr qu'ils le feront.
C'est à ça qu'ils servent, des variables externes, pour fixer n'importe quelle valeur.

Mais il est plus facile de placer dans le module d'initialisation ce qui vous a été conseillé.
Ou sous cette forme :
// для терминала с 5 знаками
if (Digits == 3 || Digits == 5) {
   decimal = 10; // Определяет кол-во пунктов в четвертом(втором) знаке
   STOPLOSS *= decimal;
   TAKEPROFIT *= decimal;
   slippage *= decimal; // прочие целочисленные переменные в пунктах
} else decimal = 1;
Les variables seront ajustées automatiquement, et pour d'autres besoins, utilisez le multiplicateur "décimal".
 
skyjet:


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

И просто чтобы уточнить, если я механическим путем добавлю 0, то TP и SL будут работать в данном типе терминалов?

prorab:

Ils le feront, bien sûr.
C'est à ça qu'ils servent, des variables externes, pour fixer n'importe quelle valeur.

Mais il est encore plus facile de mettre ce que l'on vous a conseillé de faire dans le module d'initialisation.
Ou sous cette forme :
Les variables seront automatiquement ajustées, et pour d'autres besoins, utilisez le multiplicateur "décimal".

Cette tâche doit être clarifiée :

  • Vos paramètres d'entrée (STPOLOSS, TAKEPROFIT, etc.) doivent être saisis en tenant compte de 4\2 chiffres! !!
 

Bon après-midi...

SOS! !! BONNES GENS, À L'AIDE !!! Je suis un débutant en programmation en général (je suis autodidacte), et en MQL en particulier. J'ai écrit un indicateur simple : RSI + Bandes de Bollinger en une seule personne. Mais voici le problème : si je ne spécifie pas expressément la quantité d'éléments dans le tableau Buf_std_dev (c'est-à-dire que la ligne de déclaration du tableau ressemble à ceci : double Buf_std_dev[]), lorsque j'affiche cet indicateur dans la fenêtre du terminal client(CT), j'obtiens l'image suivante :

Explication de la photo :

a) en haut se trouve le RSI, qui est disponible dans le jeu d'indicateurs fourni avec CT, et les bandes de Bollinger ont été glissées dans la fenêtre de ce RSI par glisser et drop) ;

b) en bas se trouve le RSI, qui est programmé par moi ;

Le compilateur ne détecte aucune erreur ou avertissement.

 

Si, par contre, lors de la déclaration du tableau Buf_std_dev, je spécifie explicitement le nombre d'éléments qu'il contient (c'est-à-dire que la ligne de déclaration du tableau ressemble à ceci : double Buf_std_dev[5502], où 5502 est le nombre de barres, qui est obtenu à l'aide de la variable Bars), alors tout rentre dans l'ordre (comme on peut le voir en comparant les deux indicateurs : toutes les valeurs sont les mêmes) :

Pouvez-vous me dire ce qu'il faut faire pour sauvegarder l'image, comme sur la deuxième image, mais en évitant explicitement de définir le nombre d'éléments dans le tableau Buf_std_dev.

P.S. Merci d'avance pour la réponse.

 
Afficher tout le code
 

Code joint (sans certaines parties - ne peut pas tenir dans 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:
Afficher tous les codes

Veuillez me dire s'il existe des moyens de transférer le code de plus de 4Mb ici (ou de le transférer ici en plusieurs parties ?) ?
 

Si votre Buf_std_dev n'est pas un tampon indicateur (un des huit), vous devez spécifier sa taille, ou n'importe quelle taille (si vous avez l'intention de la changer (taille) dans le futur) lors de sa déclaration.

 

C'est vrai, ce n'est pas... Si je peux me permettre, deux autres questions d'un coup :

1. Si je lui attribue un tampon (le tableau Buf_std_dev) , cela signifie qu'il sera également affiché dans la fenêtre de l'indicateur ?

Si je ne lui attribue pas de tampon, alors (si je comprends bien) la situation suivante se produira : supposons que j'ai spécifié une taille de 100 barres. Ensuite, lorsque de nouvelles barres apparaissent (c'est-à-dire si par exemple Bars=101), nous effectuerons les calculs uniquement pour les 100 dernières barres que nous avons spécifiées (c'est-à-dire que la barre la plus ancienne - 101 - sera écartée). Ainsi, lors du chargement de l'historique, la taille du tableau sera toujours égale à 100 barres seulement (ou une autre valeur, que je préciserai lors de la déclaration) ?

Raison: