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

 
Андрей #:

Bonne nuit !

Chers utilisateurs du forum, j'ai besoin d'aide. J'ai écrit un script en MQL4 qui dessine une ligne par une formule basée sur trois points donnés sur un graphique. Il prend 130 lignes, y compris les retraits et les espaces. J'ai récemment décidé de le porter vers MQL5 et j'ai réalisé que mes faibles connaissances en programmation ne m'aideront pas car je dois réapprendre.

Il y a une erreur dans le code de division par zéro, corrigez-la d'abord.

a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+x1*x2);

Ici, la division par "0" parce que x1 et x2 sont égaux à "1", ce qui donne "0".

Effectuez un contrôle avant l'opération de la matrice

 
Manter84 #:

Vous êtes un plaisantin. Mais le problème est réel, et il y a des sujets sur le fait que la commande Print s'imprime deux fois dans l'onglet Experts et Allert vient aussi deux fois, mais il n'y a pas de réponse hélas comment le résoudre. Et pour l'avenir, si vous ne savez pas, vous pouvez simplement vous taire et passer votre chemin, mais gagner une cote en répondant de manière non professionnelle est stupide. Oui, d'ailleurs, vos réponses sont vraiment très faibles.

Quelle que soit la question, quelle que soit la réponse.
 
Андрей #:

Bonne nuit !

Chers utilisateurs du forum, j'ai besoin d'aide. J'ai écrit un script en MQL4 qui dessine une ligne par une formule basée sur trois points donnés sur un graphique. Il prend 130 lignes, y compris les retraits et les espaces. J'ai récemment décidé de le porter vers MQL5 et j'ai réalisé que mes faibles connaissances en programmation ne m'aideront pas, je dois étudier à nouveau.

Je serai reconnaissant si quelqu'un est prêt à porter le script vers MQL5. Je serais très reconnaissant si quelqu'un voulait bien convertir le script en MQL5.

Si vous avez écrit le script, pourquoi en avez-vous besoin dans votre code ?

 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 int init()
   {SetIndexBuffer(0,Buffer1);
   SetIndexStyle(0,DRAW_LINE);
 //---- indicators
 //----
    return(0);
   }
 
#property indicator_chart_window
int            FR_handle;
int OnInit()
  {

    FR_handle = iFractals(NULL,PERIOD_CURRENT);
   return(INIT_SUCCEEDED);

  }

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[])
  {
    Print("Проверка 111 "); 
    return(rates_total);
  }
Alexey Viktorov #
:
La réponse à la question est la même que la réponse à la question.

Vous auriez pu simplement écrire que plus de détails sont nécessaires. J'ai écrit le code de l'indicateur le plus simple (il ne peut pas être plus simple), mais il génère aussi deux messages à la commande Print. Et si vous omettez d'obtenir Handle, cela donne un message.

***

Dossiers :
111.png  15 kb
 
Alexey Viktorov #:

Si vous avez écrit le script, pourquoi dans le code il y a

Comme mes compétences en programmation sont du niveau d'un écolier, j'ai pris un morceau de code fonctionnel et j'en ai fait des règles. Ce qui n'a pas interféré, n'a pas touché)
 
Manter84 #:

Vous auriez pu simplement écrire que plus de détails sont nécessaires. J'ai écrit le code de l'indicateur le plus simple (il ne peut pas être plus simple), mais il génère aussi deux messages à la commande Print. Et si tu n'obtiens pas Handle, tu en obtiens une.

Oh, mon cher... Je n'ai que des mots grossiers dans mon vocabulaire. C'est pourquoi je ferais mieux de me taire.

 
Андрей #:
Comme mes compétences en programmation sont du niveau d'un écolier, j'ai pris un morceau de code fonctionnel et des règles à partir de celui-ci. Ce qui n'a pas interféré, n'a pas touché)

Je l'ai.

Andrew #:
Si quelqu'un aide, je vous dois un whisky de toute façon !)

Je pense que le whisky de ......... n'est pas moins cher que 30 $. Par conséquent, il est plus facile de créer une application sur un site de freelance et il y aura des volontaires, environ 20 personnes... Et c'est votre message : vous provoquez les gens à enfreindre les règles. Qui en a besoin ? Eh bien, faites-le gratuitement, et puis quoi ? Après tout, vous ne passez pas la bouteille spécifiquement, donc c'est un travail pour l'argent en contournant le freelancing.

 
Андрей #:

#property strict
//+------------------------------------------------------------------+
#property indicator_chart_window
 #property indicator_buffers 1
 #property  indicator_color1 clrBlue
 #property  indicator_width1 2
 #property  indicator_style1 0
 
#property indicator_label1  "3T" 
#property indicator_type1   DRAW_LINE 

#property indicator_style1  STYLE_SOLID 


#define Point _Point
#define Period()  _Period
#define Symbol  _Symbol
#define  TimeToStr TimeToStruct



// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.


#define  DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get(const string Symb,const int TimeFrame,const int iShift) \
    {                                                                                                         \
      T tValue[];                                                                                             \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
    T operator[](const int iPos) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
  CLASS##NAME  NAME;                                                                                           \
  T i##NAME(const string Symb,const int TimeFrame,const int iShift) \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb,  TimeFrame, iShift));                                                        \
  }
//+------------------------------------------------------------------+
DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
//+------------------------------------------------------------------+





 double     Buffer1[];
 //+------------------------------------------------------------------+
 //| Объявляем внешние переменные                                     |
 //+------------------------------------------------------------------+
 datetime point_1;
 datetime point_2;
 datetime point_3;
 datetime LastBarTime;
 string line_name[10];
 int gg=1;
 int x1;
 int x2;
 int x3;
 int xx1; // В эту переменную сохраняется значение номера бара вершины перед прогоном при появлении нового бара.
 int xx2; // Если линии стоят, значит при поялвении нового бара номер бара вершины должен увеличиться на 1.
 int xx3; // Если этого не произошло и xx1=x1 после прогона, значит увеличиваем вручную.
 int max;
 int maxx;
 double y1;
 double y2;
 double y3;
 double y11;
 double y22;
 double y33;
 double x11;
 double x22;
 double x33;
 double y;
 double a1;
 double a2;
 double a3;

bool Deinit = true;
 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 

MqlDateTime str;
//--------------------------------------------------------------------
int OnInit()                             // Специальная функция init()
  {
   {SetIndexBuffer(0,Buffer1);
   
 //---- indicators
 //----
    return(0);
   }
  
   return(INIT_SUCCEEDED);                             // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
//int start()                            // Специальная функция start()
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[])

  {
   // Пересчитываем инликатор только при появлении нового бара
   if(LastBarTime == iTime(Symbol, 0, 0))
      return(0);
    LastBarTime = iTime(Symbol, 0, 0);
   
   
 // Присваиваем значения переменных времени


 int obj_total=ObjectsTotal(0,0,-1);

   for(int ii=0;ii<100;ii++)
     {string name = ObjectName(0,0,ii,OBJ_VLINE);
       if(ObjectGetInteger(0, name,OBJPROP_TYPE)!=OBJ_VLINE)
       continue;
       line_name[gg] = ObjectName(0,0,ii,OBJ_VLINE);
       gg=gg+1;
     
     }
    
   
    point_1=ObjectGetTimeByValue(0,line_name[1],0, OBJPROP_TIME);
    point_2=ObjectGetTimeByValue(0,line_name[2],0, OBJPROP_TIME);
    point_3=ObjectGetTimeByValue(0,line_name[3],0, OBJPROP_TIME);
   
 // Запоминаем текущий номер бара вершины

 xx1=x1; 
    
 //Определяем номера баров ключевых точек
   for (int j=0;j<500; j++)
   { if (Time[j]==point_1) x1=j;}
  
  
   // Если после прогона сдвиг по вершине не произошел, значит линий нет, добавляем +1 вручную.
 if (x1==xx1) x1=x1+1;
  
  
 xx2=x2;
  
   for (int k=0;k<500; k++)
   {if (Time[k]==point_2) x2=k;  }
  
 if (x2==xx2) x2=x2+1;
  
 xx3=x3;

   for (int l=0;l<500; l++)
   {if (Time[l]==point_3) x3=l; }
  
 if (x3==xx3) x3=x3+1;

 // Comment ("n1=", j," n2=", k, " n3=", l);
 //Находим "высоту" вершин
   {
   y1=High[x1];
   y2=High[x2];
   y3=High[x3];
   //Comment ("y1=", y1," x1=", x1, " y2=", y2, "x2=", x2," y3=", y3, " x3=", x3);
   //Принимаем первую из них за начало координат
  
 a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+x1*x2);
 a2=((y2-y1)/(x2-x1))-a1*(x1+x2);
 a3=((x2*y1-x1*y2)/(x2-x1))+a1*x1*x2;

 max=MathMax(x1,x2);
 maxx=MathMax(max,x3);
  
  
   for (int i=maxx; i>=0; i--)
  
   { y=a1*i*i+a2*i+a3;
   Buffer1[i]=y;}
  

    return(0);
   }


//--------------------------------------------------------------------
   return(rates_total);                           // Выход из спец. ф-ии start()
  }
//--------------------------------------------------------------------
void OnDeinit(const int reason)
  {

   if( Deinit == true)                         // Стираем  с графика, если включена функция очистки графика
     {
      int obj_total=ObjectsTotal(0,0,-1);
      PrintFormat("Всего %d объектов",obj_total);
      for(int i=obj_total-1; i>=0; i--)
        {
         string name=ObjectName(0,i,-1,-1);
         //         PrintFormat("Объект %d: %s",i,name);
         ObjectDelete(0,name);
        }
     }
     Comment("");
//--- destroy timer
   EventKillTimer();

  }


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

Il n'y a pas d'erreurs, mais la fonction de chronométrage n'est pas correcte, il n'y avait pas assez de temps)

Et il est préférable de vérifier la division par zéro en 5, avant l'opération de division Si le diviseur est zéro, alors.....

 
Manter84 #:

Oui, d'ailleurs, vos réponses sont vraiment très faibles.

Manter84 #:

Voici le code de l'inducteur le plus simple (il ne pourrait pas être plus simple)

Il y a cinq erreurs dans un mot de six lettres...

et je suis trop faible pour te corriger.

 
Alexey Viktorov #:

La poisse... Les seuls mots qui me restent dans mon vocabulaire sont des mots grossiers. Donc je préfère ne rien dire.

Qu'est-ce que je t'ai fait ? Ou êtes-vous tous si agressifs ?

Raison: