Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 795

 
Alexey Viktorov:
Réglez la couleur de l'affichage sur clrNONE.

Vous ne pouvez donc sortir que le tampon, mais pas la variable séparément ?

 
psyman:

Vous ne pouvez donc sortir que le tampon, mais pas la variable séparément ?

Oui, c'est le seul moyen. Et une autre astuce qui peut s'avérer utile, si vous définissez SetIndexLabel(0, "") ; alors ces valeurs ne seront pas affichées dans la fenêtre de données. Et même la fonction iCustom() ne sera pas disponible.
 
Igor Makanu:

Merci de répondre.

Donc, ce que je comprends, c'est qu'il faut créer un tampon, puis le remplir avec

avec les valeurs RSI, puis alimente ce tampon aveciMAOnArray().

Quelqu'un a-t-il fait cela pour EA et cela s'affichera lors du test d'EA dans la sous-fenêtre?

Habituellement, les tests EA via iCustom sont lents.

 

J'ai pris le code de l'exemple dans https://www.mql5.com/ru/docs/strings/stringadd et je l'ai collé dans le script. Le résultat est le même dans MQL4 et MQL5 :


HE      0       22:42:49.015    Test Script (EURUSD,H1) time for 'c = a + b' = 235 milliseconds, i = 1000000
OH      0       22:42:50.187    Test Script (EURUSD,H1) time for 'StringAdd(a,b)' = 1156 milliseconds, i = 1000000
EP      0       22:42:50.781    Test Script (EURUSD,H1) time for 'StringConcatenate(c,a,b)' = 594 milliseconds, i = 1000000


Je pensais que StringAdd() et StringConcatenate() devaient fonctionner plus vite que "+". Pourquoi n'en est-il pas ainsi ?

 
Northwest:

iCustom ralentit généralement les tests de l'Expert Advisor.

ce n'est pas vrai, en général c'est l'inverse, car l'allocation de mémoire pour les buffers de l'indicateur est faite par le terminal, pas par le script MQL, en général ces problèmes sont le problème d'un calcul non optimal dans l'indicateur, beaucoup de débutants sur un indicateur call - tick, calculent la longueur entière des données historiques

Si vous avez compris les bases du MQL, lisez les articles, tout est écrit.

https://www.mql5.com/ru/articles/4602


Nord-Ouest:

Qui a fait cela pour un EA et cela s'affichera lors du test de l'EA dans une sous-fenêtre ?

personne ne l'a fait, lisez quelle est la différence entre un EA et un indicateur, qui a des tampons d'indicateur et qui n'en a pas, qui a des fonctions de trading et qui n'en a pas.....

ZZY : une sous-fenêtre ne peut créer qu'un indicateur. Si vous créez une sous-fenêtre, vous pouvez alors ajouter des objets graphiques à cette sous-fenêtre en utilisant le conseiller experthttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object.

ZSYZZ : la sous-fenêtre peut être obtenue en appliquant un modèle, il y avait un sujet il y a quelques mois, mais je pense que vous avez un problème avec d'autres choses jusqu'à présent

Как перенести расчетную часть любого индикатора в код эксперта
Как перенести расчетную часть любого индикатора в код эксперта
  • www.mql5.com
Когда программист создает советник, который получает сигналы от индикаторов, он всякий раз сталкивается с вопросом: использовать обращение к индикатору или перенести код индикатора в советник? Причины этому могут быть различные: желание сохранить в тайне используемые индикаторы и стратегию в целом, необходимость распространения советника единым...
 
Igor Makanu:

ce n'est pas vrai, en général c'est l'inverse, car l'allocation de mémoire pour les buffers des indicateurs est faite par le terminal, pas par le script MQL, en général ces problèmes sont le problème d'un calcul non optimal dans l'indicateur, beaucoup de débutants sur un indicateur call - tick, ils calculent toute la longueur des données historiques

Si vous avez compris les bases du MQL, lisez les articles, ils ont été écrits depuis longtemps.

https://www.mql5.com/ru/articles/4602


personne ne l'a fait, lisez quelle est la différence entre un Expert Advisor et un indicateur, qui a des tampons d'indicateur et qui n'en a pas, qui a des fonctions de trading et qui en a .....

ZZY : une sous-fenêtre ne peut créer qu'un indicateur, si vous créez une sous-fenêtre, alors vous pouvez ajouter des objets graphiques à cette sous-fenêtre en utilisant le conseiller experthttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object.

ZSYZZ : la sous-fenêtre peut être obtenue en appliquant un modèle, c'était un sujet il y a quelques mois, mais je pense que vous avez un problème avec autre chose jusqu'à présent

Désolé. Peut-être que je ne l'ai pas bien formulé mais

Je ne veux pas l'utiliser pour des tests, mais je ne veux pas l'exécuter.

En ce qui concerne la visualisation sur le graphique de l'indicateur pendant les tests, si vous utilisez la fonction

Lorsque vous utilisez des fonctions d'indicateur en ligne, elles sont dessinées sur le graphique pendant le processus de test.

C'est exactement ce que je veux dire.

Mais si vous utilisez une sorte de code personnalisé de calcul de l'indicateur qui est intégré dans le code de l'EA, alors cet indicateur

ne seront pas affichés pendant le processus de test de l'EE.

Quant à iCustom, lorsque vous l'utilisez dans le processus de test, l'EA sera affiché sur le graphique.

tout indicateur et le code de l'indicateur peuvent être compilés avec l'EA dans un ex4 mais je n'en ai pas besoin.

Je voulais juste savoir s'il existe un moyen de contourner iCustom dans ce domaine, mais si ce n'est pas le cas, ce n'est pas un problème non plus.

Merci beaucoup pour cette réponse complète.

 

Artem a posté un modèle d'indicateur ici, voici la partie deOnCalculate

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if(limit>1) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total-1;
      // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }

Je l'utilise mais j'ai une question)

Pourquoi dois-je utiliserlimit=rates_total-1 pour le calcul de l'historique complet etnonlimit=rates_total ?

 
psyman:

Pourquoilimit=rates_total-1 est-il utilisé pour le calcul de l'historique complet etnonlimit=rates_total ?

Essayez de le vérifier, vous serez immédiatement "hors limites " - numérotation des barres de zéro à ... Total -1 , une situation courante en programmation - la numérotation commence par 0. Comme exemple évident, déclarez le tableau double x[5] et essayez d'écrire quelque chose dans le dernier élément x[5] = 100 ;

ZS : répondre à la question que vous n'avez pas encore posée.... OrderTotal() numérote également de zéro à OrderTotal()-1 ;)

 
Igor Makanu:

ZS : répondre à une question qui n'a pas encore été posée.... OrderTotal() trop numéroté de zéro à OrderTotal()-1 ;)

La question s'est posée d'ailleurs, maintenant je ne peux pas gagner une moyenne sur le tableau, bien que je le fasse en cinq, mais dans quel thème écrire, je ne sais pas, que ce soit ici.

L'indicateur calcule la différence ouverture-fermeture et construit МА sur cette différence. J'ai choisi MA=2 pour le débogage mais en utilisant SimpleMAOnBuffer et iMAOnArray, j'obtiens des décalages de ligne inexplicables et iMAOnArray affiche une valeur nulle sur la dernière barre.


//+------------------------------------------------------------------+
//|                                                        _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_buffers 4
#property indicator_plots   2
//--- plot OC
#property indicator_label1  "OC"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrSteelBlue, clrRed,clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "MA1"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBrown
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1


//--- indicator buffers
double   OC[], OC_color[], MA1_buf[];
input int MA1=2;

int OnInit()
  {
  
   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                              |
//+------------------------------------------------------------------+
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[])
{

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   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 call
   return(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)
     {
      case MODE_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]);
        }
      case MODE_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]);
        }
      case MODE_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]);
        }
      case MODE_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);
  }
 
psyman:

J'ai une question connexe, j'ai toujours du mal avec la moyenne des tableaux, bien que je le fasse en 5, mais je ne sais pas dans quel sujet l'écrire, que ce soit ici.

J'ai l'impression que dans MQL5 les tampons d'indicateurs et les séries temporelles sont "dépliés" de manière opposée, par défaut la barre la plus à gauche dans MT5 est la barre 0 et dans MT4 la barre la plus à droite est la barre 0 et les tampons d'indicateurs ont la même numérotation.

ZS : hélas, je ne veux pas m'impliquer dans MT5, MT4 me suffit pour vérifier mes idées, je ne regarde les préparations que dans MT5, si j'écris quelque chose en utilisant MT5 je ne le montre jamais à personne ;)))