Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 473

 
Kutuzov:

Aidez-nous à lutter contre les bugs !

J'ai décidé de faire un EA pour moi-même sur la base d'un exemple du manuel mql4. Je m'amuse avec depuis une semaine maintenant, mais ça me donne toujours une sorte d'erreur.

Veuillez vérifier ce qui ne va pas, peut-être que quelque chose doit être modifié ou supprimé en plus des parenthèses.

Erreurs :

'}' - fin inattendue du programme expert.mq4 218 3

'{' - parenthèses non équilibrées expert.mq4 23 2


Essayez de traduire ce qui est écrit dans les erreurs. Je pense que c'est la façon la plus simple de trouver la cause de l'erreur.

Qu'est-ce que ça fait au départ ?

#property  indicator_level1 20 // Задаём верхний уровень                             
#property  indicator_level2 80 // Задаём нижний уровень 

Vous avez un conseiller expert, pas un indicateur.

 DPeriod,      // "Redline" индикатора StochRSI.mq4 
 DPeriod=Bid;   // Запрашивем значение "Redline"

pourquoi n'est-il pas défini comme un type ?

  return;      // Выход из start()

Où est la parenthèse fermante ?

 };

Qu'est-ce que c'est que cette nouvelle ?

Montrez-moi où c'est écrit dans l'exemple ?

bool Ans =false,  // Ответ сервера после закрытия
bool Cls_B=false,

pourquoi y a-t-il une virgule à la fin et non un point-virgule ? pourquoi écrire deux fois la même chose ?

Tu mets une virgule, écris-le comme ça :

bool Ans =false,  // Ответ сервера после закрытия
 Cls_B=false, // Критерий для закрытия Buy
 Cls_S=false, // Критерий для закрытия Sell
 Opn_B=false, // Критерий для открытия Buy
 Opn_S=false; // Критерий для открытия Sell

Qu'est-ce que c'est ?

[1]Close

Je n'ai pas cherché plus loin, j'étais fatigué,

Alors ne blâmez pas les erreurs, elles sont dues à votre inattention. Vous devez relire l'aide, et regarder la vidéo pour lire un article sur la façon de programmer dans ce langage.

 
Vladon:

J'ai corrigé les erreurs... Mais pendant le test, il est indiqué "Lesindicateurs personnalisés ne peuvent pas être vérifiés".

J'ai d'abord douté du tampon indicateur spécifié, mais après avoir spécifié les deux à tour de rôle, l'erreur n'a toujours pas disparu. Est-ce que j'ai encore foiré quelque part ?

Dossiers :
expert_2.mq4  9 kb
 
Aide du gourou de la programmation). J'étais en train de tester un EA et je pense que j'ai réussi) dès que j'allume le testeur EA et que mon bot commence à fonctionner le testeur se fige et reste en place pendant un très long moment, qu'est-ce qui peut être dans le code qui ralentit le testeur ?
 
miha91:
Aide du gourou de la programmation). J'étais en train de tester un EA et je pense que j'ai réussi) dès que j'allume le testeur EA et que mon bot commence à fonctionner le testeur se fige et reste en place pendant un très long moment, qu'est-ce qui peut être dans le code qui ralentit le testeur ?
J'ai aussi quelque chose qui bruisse sous la baignoire ! Qu'est-ce que ça peut être ?
 
int OnInit()
  {
//--- indicator buffers mapping
 SetIndexBuffer(0,buf1);
SetIndexStyle(0,DRAW_LINE,0,1,Red);



 SetIndexBuffer(1,buf2);
SetIndexStyle(1,DRAW_LINE,0,1,Aqua);


 SetIndexBuffer(2,buf3);
SetIndexStyle(2,DRAW_LINE,0,1,Green);



 SetIndexBuffer(3,buf4);
SetIndexStyle(3,DRAW_LINE,0,1,Yellow);



//---
   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[])
  {
//---



   
   buf1[pos]=iOpen(Symbol(),0,pos);
   buf2[pos]=iHigh(Symbol(),0,pos);
   buf3[pos]=iClose(Symbol(),0,pos);
   buf4[pos]=iLow(Symbol(),0,pos);
   
  
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
il devrait dessiner 4 lignes, mais il ne dessine que le premier tampon si les autres sont manquants
 

J'essaie de déterminer un point sur la ligne après sa modification, cela fonctionne bien à toutes les périodes, mais à 1 et 4 heures il y a périodiquement une erreur de 100-200 points, comment faire ?

mariage

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   SetTLine(Red,"LineAlert",Time[15],High[15],0,High[0]+15*Point,0,0,1);
//---
   return(INIT_SUCCEEDED);
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Уравнение прямой.                                              |
//|             Вычисляет значение Y для X в точке пересечения с прямой.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x1,y1 - координаты первой точки,                                        |
//|    x2,y2 - координаты второй точки,                                        |
//|    x     - значение, для которого вычислить Y                              |
//+----------------------------------------------------------------------------+
double EquationDirect(double x1,double y1,double x2,double y2,double x)
  {
   double tk;
   if(x2==x1) return(y1);
   tk=(y2-y1)/(x2-x1)*(x-x1)+y1;

   return(NormalizeDouble(tk,Digits));
  }
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TREND трендовая линия                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLine(color cl,string nm="",
              datetime t1=0,double p1=0,datetime t2=0,double p2=0,
              bool ry=False,int st=0,int wd=1)
  {
   if(nm=="") nm=DoubleToStr(Time[0],0);
   if(t1<=0) t1=Time[10];
   if(p1<=0) p1=Low[10];
   if(t2<=0) t2=Time[0];
   if(p2<=0) p2=Bid;
   if(ObjectFind(nm)<0) ObjectCreate(nm,OBJ_TREND,0,0,0,0,0);
   ObjectSet(nm,OBJPROP_TIME1,t1);
   ObjectSet(nm,OBJPROP_PRICE1,p1);
   ObjectSet(nm,OBJPROP_TIME2,t2);
   ObjectSet(nm,OBJPROP_PRICE2,p2);
   ObjectSet(nm,OBJPROP_COLOR,cl);
   ObjectSet(nm,OBJPROP_RAY,ry);
   ObjectSet(nm,OBJPROP_STYLE,st);
   ObjectSet(nm,OBJPROP_WIDTH,wd);
  }
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cd - код значка                                                         |
//|    cl - цвет значка                                                        |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    t1 - время открытия бара        (0  - текущий бар)                      |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    sz - размер значка              (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetArrow(int cd,color cl,
              string nm="",datetime t1=0,double p1=0,int sz=0)
  {
   if(nm=="") nm=DoubleToStr(Time[0],0);
   if(t1<=0) t1=Time[0];
   if(p1<=0) p1=Bid;
   if(ObjectFind(nm)<0) ObjectCreate(nm,OBJ_ARROW,0,0,0);
   ObjectSet(nm,OBJPROP_TIME1,t1);
   ObjectSet(nm,OBJPROP_PRICE1,p1);
   ObjectSet(nm,OBJPROP_ARROWCODE,cd);
   ObjectSet(nm,OBJPROP_COLOR,cl);
   ObjectSet(nm,OBJPROP_WIDTH,sz);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int d=0;
   int    X_1,X_2,X3d;
   double Y_1,Y_2,Y3d;
   static int _time_waiting=0;
   static int i;
//---
   X_1=   ObjectGet("LineAlert",OBJPROP_TIME1);
   X_2 = ObjectGet("LineAlert", OBJPROP_TIME2);
   Y_1 = ObjectGet("LineAlert", OBJPROP_PRICE1);
   Y_2 = ObjectGet("LineAlert", OBJPROP_PRICE2);
   SetArrow(6,Orange,"X1",X_1,Y_1,3);
   SetArrow(6,Orange,"X2",X_2,Y_2,3);
   X3d=Time[0];Y3d=EquationDirect(X_1,Y_1,X_2,Y_2,X3d);
   SetArrow(6,Orange,"X",X3d,Y3d,3);
  }
//+------------------------------------------------------------------+
 
beginner:

J'essaie de déterminer un point sur la ligne après sa modification, à toutes les périodes cela fonctionne normalement, mais à 1 et 4 heures périodiquement il y a une erreur de 100-200 points, comment la traiter ?


Je ne l'ai pas essayé.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   SetTLine(Red,"LineAlert",Time[15],High[15],0,High[0]+15*Point,0,0,1);
//---
   return(INIT_SUCCEEDED);
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Уравнение прямой.                                              |
//|             Вычисляет значение Y для X в точке пересечения с прямой.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x1,y1 - координаты первой точки,                                        |
//|    x2,y2 - координаты второй точки,                                        |
//|    x     - значение, для которого вычислить Y                              |
//+----------------------------------------------------------------------------+
double EquationDirect(double x1,double y1,double x2,double y2,double x)
  {
   double tk;
   if(x2==x1) return(y1);
   tk=(y2-y1)/(x2-x1)*(x-x1)+y1;

   return(NormalizeDouble(tk,Digits));
  }
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TREND трендовая линия                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLine(color cl,string nm="",
              datetime t1=0,double p1=0,datetime t2=0,double p2=0,
              bool ry=False,int st=0,int wd=1)
  {
   if(nm=="") nm=DoubleToStr(Time[0],0);
   if(t1<=0) t1=Time[10];
   if(p1<=0) p1=Low[10];
   if(t2<=0) t2=Time[0];
   if(p2<=0) p2=Bid;
   if(ObjectFind(nm)<0) ObjectCreate(nm,OBJ_TREND,0,0,0,0,0);
   ObjectSet(nm,OBJPROP_TIME1,t1);
   ObjectSet(nm,OBJPROP_PRICE1,p1);
   ObjectSet(nm,OBJPROP_TIME2,t2);
   ObjectSet(nm,OBJPROP_PRICE2,p2);
   ObjectSet(nm,OBJPROP_COLOR,cl);
   ObjectSet(nm,OBJPROP_RAY,ry);
   ObjectSet(nm,OBJPROP_STYLE,st);
   ObjectSet(nm,OBJPROP_WIDTH,wd);
  }
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cd - код значка                                                         |
//|    cl - цвет значка                                                        |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    t1 - время открытия бара        (0  - текущий бар)                      |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    sz - размер значка              (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetArrow(int cd,color cl,
              string nm="",datetime t1=0,double p1=0,int sz=0)
  {
   if(nm=="") nm=DoubleToStr(Time[0],0);
   if(t1<=0) t1=Time[0];
   if(p1<=0) p1=Bid;
   if(ObjectFind(nm)<0) ObjectCreate(nm,OBJ_ARROW,0,0,0);
   ObjectSet(nm,OBJPROP_TIME1,t1);
   ObjectSet(nm,OBJPROP_PRICE1,p1);
   ObjectSet(nm,OBJPROP_ARROWCODE,cd);
   ObjectSet(nm,OBJPROP_COLOR,cl);
   ObjectSet(nm,OBJPROP_WIDTH,sz);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int d=0;
   int    X_1,X_2,X3d;
   double Y_1,Y_2,Y3d;
   static int _time_waiting=0;
   static int i;
//---
   X_1=   ObjectGet("LineAlert",OBJPROP_TIME1);
   X_2 = ObjectGet("LineAlert", OBJPROP_TIME2);
   Y_1 = ObjectGet("LineAlert", OBJPROP_PRICE1);
   Y_2 = ObjectGet("LineAlert", OBJPROP_PRICE2);
   SetArrow(6,Orange,"X1",X_1,Y_1,3);
   SetArrow(6,Orange,"X2",X_2,Y_2,3);
   X3d=Time[0];Y3d=ObjectGetValueByShift("LineAlert", 0);
   SetArrow(6,Orange,"X",X3d,Y3d,3);
  }
//+------------------------------------------------------------------+

Essayez, je n'ai pas essayé.

 

Alternativement, vous pourriez faire comme ceci

Y3d = ObjectGetValueByTime("LineAlert",Time[0],2);
  

En termes modernes

 
r772ra:

Alternativement, vous pourriez faire comme ceci

Dans le langage moderne.


Ça a l'air de marcher, je vais continuer à regarder.

Merci !

 
Question aux personnes compétentes - le problème s'est posé récemment : sur le signal UPU au courrier a cessé de venir, avant tout était normal, maintenant dans le journal du terminal écrit pendant le test : a été sant, mais le courrier ne vient rien. J'ai redémarré l'UPU, le terminal aussi, aucun résultat.
Raison: