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

 
inter78:

En fait, je l'ai fait, mais je n'aime pas le long temps de réponse.

Ce n'est pas long, c'est un tic... mais en général, vous devez lire l'aide. Vous ne pouvez pas apprendre MQL en "essayant", c'est basé sur С++, mais c'est lié à la plateforme МТ, donc vous devez étudier l'aide.

Vous devez manipuler des fichiers, travailler avec des variables globales et des graphiques dans votre code ... Il y a beaucoup d'opérations inutiles sur chaque tic.

Si vous voulez une réponse rapide, utilisez OnChartEvent(), il n'est pas généré dans le testeur, mais commencez d'abord à étudier l'aide MQL4.

 
Igor Makanu:

L'opération n'est pas longue, c'est tick by tick... mais en général, commencez à lire l'aide, vous ne pouvez pas apprendre MQL par "intuition", MQL est basé sur C++, mais il est lié à la plateforme MT, vous ne pouvez pas le faire sans lire l'aide.

Vous devez gérer des fichiers, travailler avec des variables globales et des graphiques dans votre code ... Il y a beaucoup d'opérations inutiles sur chaque tic.

Si vous voulez une exécution rapide, utilisez OnChartEvent(), il n'est pas généré dans le testeur, mais commencez d'abord à étudier l'aide MQL4.

Je vais probablement devoir demander à des techniciens de le ramener à la raison. Je ne pourrai pas. Cet indicateur est très pratique pour travailler avec un nombre illimité de graphiques ouverts. Les boutons indiquent le bénéfice actuel du symbole et le nombre d'ordres d'achat et de vente.
 

Bonjour à tous.

J'ai trouvé un indicateur Ind-Fractals utile dans la bibliothèque de codes. Cependant, il dessine des fractales sur chaque barre, au lieu de les calculer correctement. Je veux utiliser cet indicateur, mais il est "cassé" (( Aidez-moi à trouver une erreur, j'ai essayé de contacter l'auteur, mais il ne répond pas aux messages. Pour des raisons de commodité, le code a été dupliqué ici.

#property copyright "Copyright © 2005, MetaQuotes Software Corp.

#lien de propriété "http://www.metaquotes.net"

//----

#property indicator_chart_window

#property indicator_buffers 8

#property indicator_color1 Red

#property indicator_color2 Red

#property indicator_color3 Blue

#property indicator_color4 Blue

#propriété indicateur_color5 Lime

#propriété indicateur_color6 Lime

#property indicator_color7 Sienna

#property indicator_color8 Sienna

//---- paramètres d'entrée

extern bool Comm=true ;

//---- tampons

double ExtMapBuffer1[] ;

double ExtMapBuffer2[] ;

double ExtMapBuffer3[] ;

double ExtMapBuffer4[] ;

double ExtMapBuffer5[] ;

double ExtMapBuffer6[] ;

double ExtMapBuffer7[] ;

double ExtMapBuffer8[] ;

//+------------------------------------------------------------------+

//| Fonction d'initialisation de l'indicateur personnalisé |

//+------------------------------------------------------------------+

int init()

{

//---- indicateurs

SetIndexStyle(0,DRAW_ARROW);//le style de ligne de l'indicateur

SetIndexArrow(0,217) ; //prescrit le type de flèche

SetIndexBuffer(0,ExtMapBuffer1);//lien letampon indicateur avec un tableau dynamique unidimensionnel de type double. Il existe 2 versions de la fonction.

SetIndexEmptyValue(0,0.0);//Set la valeur vide pour la ligne de l'indicateur.

SetIndexStyle(1,DRAW_ARROW) ;

SetIndexArrow(1,218) ;

SetIndexBuffer(1,ExtMapBuffer2) ;

SetIndexEmptyValue(1,0.0) ;

SetIndexStyle(2,DRAW_ARROW) ;

SetIndexArrow(2,217) ;

SetIndexBuffer(2,ExtMapBuffer3) ;

SetIndexEmptyValue(2,0.0) ;

SetIndexStyle(3,DRAW_ARROW) ;

SetIndexArrow(3,218) ;

SetIndexBuffer(3,ExtMapBuffer4) ;

SetIndexEmptyValue(3,0.0) ;

SetIndexStyle(4,DRAW_ARROW) ;

SetIndexArrow(4,217) ;

SetIndexBuffer(4,ExtMapBuffer5) ;

SetIndexEmptyValue(4,0.0) ;

SetIndexStyle(5,DRAW_ARROW) ;

SetIndexArrow(5,218) ;

SetIndexBuffer(5,ExtMapBuffer6) ;

SetIndexEmptyValue(5,0.0) ;

SetIndexStyle(6,DRAW_ARROW) ;

SetIndexArrow(6,217) ;

SetIndexBuffer(6,ExtMapBuffer7) ;

SetIndexEmptyValue(6,0.0) ;

SetIndexStyle(7,DRAW_ARROW) ;

SetIndexArrow(7,218) ;

SetIndexBuffer(7,ExtMapBuffer8) ;

SetIndexEmptyValue(7,0.0) ;

return(0) ; }

//+------------------------------------------------------------------+

//| Fonction de désinitialisation de l'indicateur de dépôt |

//+------------------------------------------------------------------+

int deinit() {return(0) ; }

//------------------------------------------------------------------

bool Fractal(string F,int Per,int shift) {

si(Période()>Per) retourner(-1) ;

Per=Per/Period()*2+MathCeil(Per/Period()/2) ;

si(shift<Per)retour(-1) ;

si (shift>Bars-Per)retour(-1) ;

for(int i=1;i<=Per;i++) {

si (shift+i>=Bars || shift-i<0) return(-1) ;

if(F=="U") {

si(High[shift+i]>High[shift])retourner(-1) ;

si(High[shift-i]>=High[shift])return(-1) ; }

if(F=="L") {

si(Low[shift+i]<Low[shift])return(-1) ;

si(Low[shift-i]<=Low[shift])return(-1) ; } }

retour(1) ; }

//------------------------------------------------------------------

int start()

{

int D1=1440,H4=240,H1=60,M15=15,B;

double P ;

int counted_bars=IndicatorCounted();// nombre de barres inchangées après le dernier appel de l'indicateur

B=Bars-counted_bars ;

si(counted_bars==0) B-- ;

if(Period()==D1)P=150*Point;// period retourne la période actuelle du graphique

si(Period()==H4)P=70*Point ;

si(Period()==H1)P=40*Point ;

if(Period()==30)P=30*Point;

si(Period()==M15)P=20*Point ;

si(Period()==5)P=10*Point ;

si(Period()==1)P=5*Point ;

for(int shift=B;shift>0;shift--)

{

si(Fractal("U",M15,shift)==1) ExtMapBuffer1[shift]=High[shift]+P ;

sinon ExtMapBuffer1[shift]=0 ;

si(Fractal("L",M15,shift)==1) ExtMapBuffer2[shift]=Low[shift]-P ;

sinon ExtMapBuffer2[shift]=0 ;

si(Fractal("U",H1,shift)==1) ExtMapBuffer3[shift]=High[shift]+P ;

sinon ExtMapBuffer3[shift]=0 ;

si(Fractal("L",H1,shift)==1) ExtMapBuffer4[shift]=Low[shift]-P ;

sinon ExtMapBuffer4[shift]=0 ;

si(Fractal("U",H4,shift)==1) ExtMapBuffer5[shift]=High[shift]+P ;

sinon ExtMapBuffer5[shift]=0 ;

si(Fractal("L",H4,shift)==1) ExtMapBuffer6[shift]=Low[shift]-P ;

sinon ExtMapBuffer6[shift]=0 ;

si(Fractal("U",D1,shift)==1) ExtMapBuffer7[shift]=High[shift]+P ;

sinon ExtMapBuffer7[shift]=0 ;

si(Fractal("L",D1,shift)==1) ExtMapBuffer8[shift]=Low[shift]-P ;

sinon ExtMapBuffer8[shift]=0 ;

}

if(Comm) Comment("D1 - brun\n H4 - vert\n H1 - bleu\nM15 - rouge ") ;


retour(0) ;

}

MetaQuotes Software Corp.
MetaQuotes Software Corp.
  • www.metaquotes.net
Миллионы трейдеров и сотни брокеров не могут ошибаться — они выбрали MetaTrader 5 для торговли на Форексе и финансовых рынках! Узнать больше
 

J'ai été réprimandé ici pour ce genre de code, c'est la première fois que je l'ai :-)

Le code doit être inséré dans un formulaire qui s'ouvre avec Alt+S.

 
psyman:

J'ai été réprimandé ici pour ce genre de code, c'est la première fois que je l'ai :-)

Vous devez coller le code dans un formulaire qui s'ouvre sur Alt+S.

Tu te fais gronder ? En aucun cas. Écrivez le code comme vous le souhaitez. Mais... si vous voulez une réponse à votre question, essayez de respecter ceux à qui vous demandez de l'aide. C'est aussi simple que cela.

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Toutes questions pour les débutants sur MQL4, aide et discussion sur les algorithmes et les codes

Artyom Trishkin, 2018.10.18 08:07

Disons-le ainsi : créez un modèle d'indicateur dans l'éditeur, ajoutez le bon nombre de variables d'entrée et de tampons de dessin lorsque vous le créez.

Ensuite, analysons ce qu'il faut faire à partir de cette tâche spécifique.

J'ai fait ça la dernière fois, j'ai juste changé le nom de la variable et du tableau.

Lorsque vous utilisez iMA, il ne fonctionne que sur les semaines et les daires, où la bougie contient plus de 100 points, il ne fait rien sur les échelles de temps inférieures. La raison semble être l'arrondi.




Si iMAOnArray est utilisé, la fenêtre i-ras est vide à tous les TFs. Il n'y a pas d'erreurs dans le journal.




//+------------------------------------------------------------------+
//|                                                        _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
#property indicator_buffers 1
#property indicator_plots   1
//--- plot OC
#property indicator_label1  "O-C"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrSteelBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         ip1Buf[];

input int ip1=100;
double tmp1[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  
IndicatorBuffers(2);
string s_name1;

s_name1="O-C (" + IntegerToString(ip1) + ")";

IndicatorShortName(s_name1);
SetIndexLabel(0, s_name1);
SetIndexBuffer(1, tmp1);


//--- indicator buffers mapping
   SetIndexBuffer(0,ip1Buf);
   
//---
   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 i;

      Print("rates_total = ",rates_total);
      for(i=1; i<rates_total-1; i++)
      {
      //Print("i = ",i);
      tmp1[i]=MathMax(open[i],close[i])-MathMin(open[i],close[i]);      
     // tmp1[i]=close[i];      
      //ip1Buf[i]=iMA(NULL,0,1,0,0,tmp1[i],0);
      ip1Buf[i]=iMAOnArray(tmp1,1,1,0,0,0);
      
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


 
psyman:

Si iMAOnArray est utilisé, la fenêtre i-ra est vide sur tous les TFs. Il n'y a pas d'erreurs dans le journal.

Vous utilisez iMAOnArray() avec la période 1, c'est-à-dire que la valeur de iMAOnArray() sera essentiellement la valeur du tableau tmp1.

Si vous voulez voir ce que vous calculez, faites une boucle plus courtefor(i=1; i<10; i++)

et désimprimez toutes les données que vous voulez calculer, même s'il peut être plus facile de ne pas calculer une formule complexe, mais d'utiliser iMAOnArray() pour construire iMA et iMAOnArray() - iMA et iMAOnArray() sont les mêmes calculs.... hélas, si vous pouvez obtenir une réponse à une question technique sur ce forum, vous devriez apprendre seul à calculer et à traiter l'information.

 
psyman:

La dernière fois que j'ai fait ça, j'ai seulement changé le nom de la variable et du tableau.

En utilisant l'iMA, l'i-r ne fonctionne que sur les semaines et les jours où il y a plus de 100 pips dans une bougie, il ne dessine rien sur les TFs inférieurs. La raison semble être l'arrondi.




Si iMAOnArray est utilisé, la fenêtre i-ras est vide à tous les TFs. Il n'y a pas d'erreurs dans le journal.





Le premier cycle calcule les valeurs du premier tampon ;

Le deuxième cycle calcule MA par les valeurs calculées dans le premier cycle.

Considérez ce que signifie iMAOnArray(). Écrire MA sur Array. Comment le traduire ? Tout le monde a un Google-translator au bout des doigts. Mets, traduis, reçois : MA sur Array.

Cela signifie qu'il s'agit d'une moyenne mobile basée sur un tableau préalablement calculé et rempli.

En conséquence : le premier cycle - préparation du tableau nécessaire, et le second cycle - construction d'une moyenne mobile basée sur le tableau, préparé dans le premier cycle.

Et que faites-vous ? Vous entrez une valeur dans le premier tableau (les autres valeurs n'ont pas encore été préparées) et vous essayez de construire le MA sur cette valeur.

Je vous ai donné un modèle :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Toutes les questions des débutants de MQL4, l'aide et la discussion sur les algorithmes et les codes

Artyom Trishkin, 2018.10.18 09:39

Indicateur :

//+------------------------------------------------------------------+
//|                                                       TestMA.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_chart_window
#ifdef __MQL4__
#property strict
#property indicator_buffers 2
#else 
#property indicator_buffers 3
#property indicator_plots   2
#endif 
//--- plot MAstd
#property indicator_label1  "Calculation MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  4
//--- plot MAcalc
#property indicator_label2  "Standart MA"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkOrange
#property indicator_style2  STYLE_DOT
#property indicator_width2  2
//--- input parameters
input int      InpPeriod                     =  10;            // Period
input ENUM_MA_METHOD       InpMethod         =  MODE_EMA;      // Method
input ENUM_APPLIED_PRICE   InpAppliedPrice   =  PRICE_CLOSE;   // Applied price  
//--- indicator buffers
double         BufferMAcalc[];
double         BufferMAstd[];
double         BufferPrice[];
//---
int            digits;
int            period_ma;
int            handle_ma;
CAvg           avg();
//--- includes

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
#ifdef __MQL4__
   IndicatorBuffers(3);
#endif 
    period_ma=(InpPeriod<1? 1 : InpPeriod);
   digits=Digits()+1;
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAcalc,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMAstd,INDICATOR_DATA);
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
//---
   ArraySetAsSeries(BufferMAcalc,true);
   ArraySetAsSeries(BufferMAstd,true);
   ArraySetAsSeries(BufferPrice,true);
//---
#ifdef __MQL5__
   ResetLastError();
   handle_ma=iMA(NULL,PERIOD_CURRENT,period_ma,0,InpMethod,InpAppliedPrice);
   if(handle_ma==INVALID_HANDLE)
     {
      Print("Error creation iMA(",(string)period_ma,"): ",GetLastError());
      return INIT_FAILED;
     }
#endif 
//---
   Comment("\nMA type: ",avg.MethodToString(InpMethod),", price: ",avg.PriceToString(InpAppliedPrice),", period: ",(string)period_ma);
//---
   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[])
  {
//--- Установка массивов буферов как таймсерий
#ifdef __MQL5__
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
#endif 
//--- Проверка количества доступных баров
   if(rates_total<fmax(period_ma,4)) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferMAcalc,EMPTY_VALUE);
      ArrayInitialize(BufferMAstd,EMPTY_VALUE);
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
#ifdef __MQL5__
   int count=(limit>1 ? rates_total : 1),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferMAstd);
   if(copied!=count) return 0;
#endif 
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      #ifdef __MQL4__ BufferMAstd[i]=iMA(NULL,PERIOD_CURRENT,period_ma,0,InpMethod,InpAppliedPrice,i); #endif 
       BufferPrice[i]=avg.AppliedPrice(InpAppliedPrice,NULL,PERIOD_CURRENT,i);
      BufferMAcalc[i]=avg.GetMA(rates_total,InpMethod,period_ma,i,BufferPrice);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Vous pouvez jeter tout ce qui concerne les cinq et obtenir un modèle pour les quatre. Bien que ce modèle soit multiplateforme - vous pouvez l'utiliser pour les deux terminaux - il suffit de définir vos tampons et leur nombre. Dans ce modèle, il y a deux dessins et un calcul, que vous pouvez voir ici :

//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAcalc,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMAstd,INDICATOR_DATA);
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
//---
 

=aussi, vous utilisez iMAOnArray() avec la période 1, c'est-à-dire que la valeur de iMAOnArray() sera essentiellement la valeur du tableau tmp1


J'ai essayé différentes valeurs à utiliser, 1 reste la dernière variante de ces expériences.

Pour une raison quelconque, la valeur ip1Buf[4] = 2147483647.0 écrit le même nombre dans le tampon i-r sur toutes les TF, par exemple, alors que les valeurs du tableau sont toutes différentes tmp1[4] = 0,1300000000000097, etc.

Mais même dans ce cas, une ligne droite devrait être tracée, et il n'y a absolument rien sur le graphique i-r, l'échelle est marquée de 0 à 0.



 
psyman:

=aussi, vous utilisez iMAOnArray() avec la période 1, c'est-à-dire que la valeur de iMAOnArray() sera essentiellement la valeur du tableau tmp1


J'ai essayé différentes valeurs à utiliser, 1 reste la dernière variante de ces expériences.

Pour une raison quelconque, le même nombre est écrit dans le tampon i-ras sur toutes les TF, par exemple ip1Buf[4] = 2147483647.0, même si les valeurs du tableau sont toutes différentes tmp1[4] = 0,1300000000000097, etc.

Mais même dans ce cas, une ligne droite devrait être tracée, et il n'y a absolument rien sur le graphique i-r, l'échelle est marquée de 0 à 0.



2147483647.0 Commencez à utiliser le moteur de recherche !https://www.mql5.com/ru/forum/224831

Encore une fois, je viens d'écrire Artem, tu dois le lire toi-même, commence par un simple... Dessinez un prix de clôture sur un graphique avec un indicateur, puis essayez de le rendre plus compliqué, faites la même chose dans un cycle et dans le deuxième cycle faites МА calcul basé sur le tampon déjà calculé où se trouve la clôture.

2147483647 в буфере
2147483647 в буфере
  • 2018.01.15
  • www.mql5.com
День Добрый! Подскажите, пожалуйста, что это за хрень. Не первый раз сталкиваюсь...
Raison: