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

 
Vitaly Muzichenko:

Voici celle qui a été modifiée, l'originale est tout simplement sombre.

P.S. Dot.mq4 - original complet

Désolé pour le long moment, j'étais occupé par le travail.

Voilà :

//+------------------------------------------------------------------+
//|                                                      VMTest1.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 7
#property indicator_plots   3
//--- plot ARR
#property indicator_label1  "MaOSC"
#property indicator_type1   DRAW_COLOR_ARROW
#property indicator_color1  clrLimeGreen,clrOrangeRed,clrSilver
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot ArrUP
#property indicator_label2  "Up"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot ArrDN
#property indicator_label3  "Down"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrCrimson
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//---
#include <MovingAverages.mqh>

//--- input parameters
input uint     InpA=40;
//--- indicator buffers
double         BufferMAOSC[];
double         BufferColorsARR[];
double         BufferArrUP[];
double         BufferArrDN[];
double         BufferMAV[];
double         BufferMAA[];
double         BufferTMP[];
//--- gv
int a=0;
int per=0;
int val=0;
int handle_mav=INVALID_HANDLE;
int handle_maa=INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAOSC,INDICATOR_DATA);
   SetIndexBuffer(1,BufferColorsARR,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,BufferArrUP,INDICATOR_DATA);
   SetIndexBuffer(3,BufferArrDN,INDICATOR_DATA);
   SetIndexBuffer(4,BufferMAV,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,BufferMAA,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,BufferTMP,INDICATOR_CALCULATIONS);
   
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,159);
   PlotIndexSetInteger(1,PLOT_ARROW,225);
   PlotIndexSetInteger(2,PLOT_ARROW,226);
//---
   ArraySetAsSeries(BufferMAOSC,true);
   ArraySetAsSeries(BufferColorsARR,true);
   ArraySetAsSeries(BufferArrUP,true);
   ArraySetAsSeries(BufferArrDN,true);
   ArraySetAsSeries(BufferMAV,true);
   ArraySetAsSeries(BufferMAA,true);
   ArraySetAsSeries(BufferTMP,true);
//---
   a=(InpA<4 ? 4 : InpA);
   per=(int)floor(sqrt(a));
   val=(int)floor(a/1.9);
//---
   handle_mav=iMA(NULL,PERIOD_CURRENT,val,0,MODE_SMA,PRICE_LOW);
   if(handle_mav==INVALID_HANDLE)
     {
      Print("Не удалось создать хэндл индикатора MA(",val,"), ошибка ",GetLastError());
      return INIT_FAILED;
     }
   handle_maa=iMA(NULL,PERIOD_CURRENT,a,0,MODE_SMA,PRICE_LOW);
   if(handle_maa==INVALID_HANDLE)
     {
      Print("Не удалось создать хэндл индикатора MA(",a,"), ошибка ",GetLastError());
      return INIT_FAILED;
     }
//---
   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[])
  {
//---
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-2;
      ArrayInitialize(BufferMAOSC,EMPTY_VALUE);
      ArrayInitialize(BufferColorsARR,2);
      ArrayInitialize(BufferArrUP,EMPTY_VALUE);
      ArrayInitialize(BufferArrDN,EMPTY_VALUE);
      ArrayInitialize(BufferMAV,0);
      ArrayInitialize(BufferMAA,0);
      ArrayInitialize(BufferTMP,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 1),copied=0;
   copied=CopyBuffer(handle_mav,0,0,count,BufferMAV);
   if(copied!=count) return 0;
   copied=CopyBuffer(handle_maa,0,0,count,BufferMAA);
   if(copied!=count) return 0;

//--- Предварительный расчёт
   for(int i=limit;i>WRONG_VALUE;i--)
      BufferTMP[i]=2.0*BufferMAV[i]-BufferMAA[i];
      
//--- Расчёт индикатора
   if(SimpleMAOnBuffer(rates_total,prev_calculated,a,per,BufferTMP,BufferMAOSC)==0)
      return 0;
   for(int i=limit;i>WRONG_VALUE;i--)
     {
      BufferArrUP[i]=EMPTY_VALUE;
      BufferArrDN[i]=EMPTY_VALUE;
      BufferColorsARR[i]=(BufferMAOSC[i]>BufferMAOSC[i+1] ? 0 : BufferMAOSC[i]<BufferMAOSC[i+1] ? 1 : 2);
      if((BufferColorsARR[i]==0 && BufferColorsARR[i+1]==1) || (BufferColorsARR[i]==0 && BufferColorsARR[i+1]==2))
         BufferArrUP[i]=BufferMAOSC[i];
      if((BufferColorsARR[i]==1 && BufferColorsARR[i+1]==0) || (BufferColorsARR[i]==1 && BufferColorsARR[i+1]==2))
         BufferArrDN[i]=BufferMAOSC[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Valeriy Yastremskiy:

Je comprends cette idée, elle est utile, mais elle ne fonctionne pas pour moi dans ce cas. J'ai besoin de chronométrer le Testeur: bouton d'arrêt pressé dans l'indicateur

il n'est pas certain qu'après avoir appuyé sur le bouton, les impressions seront écrites dans le journal.

essayez donc d'écrire à chaque nouvelle barre dans le fichier toutes les fonctions de travail avec l'environnement - interdire le trading, tester, terminer le programme.....https://docs.mql4.com/ru/check

si aucune aide, vous ne pouvez pas, alors cherchez quelque chose au moyen de WinAPI

HH : créez un bouton et cliquez dessus - appuyez dessus, effectuez toutes les actions, puis laissez le visualiseur terminer l'exécution au ralenti, plus rapide que la recherche, je pense.

 
Igor Makanu:

il n'est pas certain que les impressions soient écrites dans le journal après l'appui sur le bouton

essayez donc d'écrire dans le fichier de chaque nouvelle barre toutes les fonctions permettant de travailler avec l'environnement - interdiction de négocier, test, fin du programme......

Si cela n'aide pas, alors vous ne pouvez pas, alors cherchez quelque chose au moyen de WinAPI

HH : Créez un bouton et appuyez dessus - appuyez dessus, effectuez toutes les actions, puis laissez le visualiseur terminer l'exécution au ralenti, ce qui est, je pense, plus rapide que la recherche de

Bouton d'arrêt d'impression dans le magasin Tester: bouton d'arrêt enfoncé

Mais je ne l'ai pas trouvé dans la documentation. Pour l'Expert Advisor le stop est appelé par OnDynit, pour l'indicateur seulement l'impression dans le journal. L'indicateur a cessé de tester et c'est tout. Il y a en fait une pause. Mais il n'est pas imprimé dans le journal.

Note

En général, il n'est pas difficile de supprimer l'indicateur ou de fermer la fenêtre manuellement. Mais la question est intéressante. C'est comme un accès au temps réel par le biais d'une requête à un symbole tiers). Il est censé suivre d'une manière ou d'une autre la fin des tests avec le bouton d'arrêt).

 
Valeriy Yastremskiy:

Impression du bouton d'arrêt dans le magazine Tester: bouton d'arrêt enfoncé

Mais je ne l'ai pas trouvé dans la documentation. Pour l'Expert Advisor l'arrêt est appelé par OnDeinit, pour l'indicateur seulement l'impression dans le journal. L'indicateur arrête de tester et c'est tout. Il y a en fait une pause. Mais il n'est pas imprimé dans le journal.

Note

En général, il n'est pas difficile de supprimer l'indicateur ou de fermer la fenêtre manuellement. Mais la question est intéressante. C'est comme un accès au temps réel par le biais d'une demande à un symbole tiers) Il semble qu'il devrait en quelque sorte suivre la fin de l'arrêt du bouton de test).

je ne sais pas

chercher dans le forum IsTesting() - trouvé des discussions similaires

ZZY : Je pense que le journal imprime le terminal, mais j'ai besoin du code MQL pour le faire.

ZZZY : écrire EA, imho, la visualisation de l'indicateur est fastidieuse ))))

 
Artyom Trishkin:

Je suis désolé que ça ait pris si longtemps - j'ai été occupé par le travail.

Voilà :

Les changements sont radicaux, mais là n'est pas la question.

Je vais m'occuper de iMAOnArray, c'était le but.

Merci !

 
Vitaly Muzichenko:

Les changements sont spectaculaires, mais là n'est pas la question.

Je vais m'occuper de iMAOnArray, c'était le but.

Merci !

C'est juste que tout ici est exactement la même chose que là-bas. Mais dans MQL5, c'est aussi simple que cela.

 

Bonjour. Pourquoi lors de la suppression d'une constante non décrite dansObjectCreate();

Par exemple, z_order ou hidden ? Cela provoquera-t-il une erreur après la compilation ? Ils ne participent pas à la définition de la ligne.

bool VLineCreate(const long            chart_ID=0,        // ID графика 
                 const string          name="VLine",      // имя линии 
                 const int             sub_window=0,      // номер подокна 
                 datetime              time=0,            // время линии 
                 const color           clr=clrRed,        // цвет линии 
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии 
                 const int             width=1,           // толщина линии 
                 const bool            back=false,        // на заднем плане 
                 const bool            selection=true,    // выделить для перемещений 
                 const bool            ray=true,          // продолжение линии вниз 
                 const bool            hidden=true,       // скрыт в списке объектов 
                 const long            z_order=0)         // приоритет на нажатие мышью 
  { 
//--- если время линии не задано, то проводим ее через последний бар 
   if(!time) 
      time=TimeCurrent(); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим вертикальную линию 
   if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать вертикальную линию! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
 
Дмитрий:

Bonjour. Pourquoi lors de la suppression d'une constante non décrite dansObjectCreate();

Par exemple, z_order ou hidden ? Cela provoquera-t-il une erreur après la compilation ? Ils ne participent pas à la définition de la ligne.

Lorsque vous supprimez l'un des paramètres de la fonction d'entrée, faites attention aux virgules et aux parenthèses fermantes.

 
Alexey Viktorov:

Lorsque vous supprimez l'un des paramètres d'entrée d'une fonction, faites attention aux virgules et aux parenthèses fermantes.

Alexey, merci. J'ai d'abord fait attention à la ponctuation. Le script a réduit au minimum, laissé nécessaire pour ObjectCreate()(point d'ancrage, symv, ET TD). Et il s'avère que seulement dans l'en-tête de ces constantes dans le code partout ne se produisent pas) sur ce et la question s'est posée, pourquoi supprimer au moins une erreur se produit. Et la question se pose, il peut y avoir des conditions obligatoires avec une liste de constantes dans l'en-tête. fonction header))) ?
 
Dzmitry Zaitsau:
Alexey, merci. J'ai d'abord fait attention à la ponctuation. Le script a été réduit au minimum, j'ai laissé le nécessaire pour ObjectCreate()(point d'ancrage, symv, ET TD). Et il s'avère que seulement dans l'en-tête de ces constantes dans le code partout ne se produisent pas) sur ce et la question s'est posée, pourquoi supprimer au moins une erreur se produit. Et la question se pose, il peut y avoir des conditions obligatoires avec une liste de constantes dans l'en-tête. fonction header))) ?

Si vous pouviez écrire quelle erreur apparaît, ce serait plus facile à comprendre, sinon cela ressemble à de la télépathie - devinez quelle erreur j'ai).