Erreurs, bugs, questions - page 2853

 

pourquoi une erreur de compilation se produit-elle ?

int j = 1 e3;         // OK
if(j % 1000 == 0);   // OK
if(j % 1 e3 == 0);    // '%' - illegal operation use
 
Igor Makanu:

Pourquoi une erreur de compilation se produit-elle ?

double

 
Vladimir Simakov:

double

OK. Merci.

Vérifié, il l'est.

Print(typename(1 e3)); //        double
 
Publication de la bêta 2617 avec des corrections expérimentales du travail avec l'historique des graphiques dans MQL5.
 
Les MPs sur le site web ne fonctionnent plus.
 

Dites-moi, les développeurs de Metatrader 5 ont-ils cassé les tampons des indicateurs dans la dernière mise à jour ? Ou c'est quelque chose qui ne va pas avec ma tête ?

Le fait est que tous les indicateurs fléchés qui n'ont pas de recalcul complet sur une nouvelle barre ont commencé à produire le même problème. Les flèches commencent à se multiplier comme des lapins sur les barres adjacentes à la nouvelle barre. Exemple ci-joint.

Seul le recalcul complet de l'indicateur sur une nouvelle barre est utile.


//+------------------------------------------------------------------+
//|                                                   test_arrow.mq5 |
//|                                               Efremov Konstantin |
//|                          https://www.mql5.com/ru/users/leonardo4 |
//+------------------------------------------------------------------+
#property copyright "Efremov Konstantin"
#property link      "https://www.mql5.com/ru/users/leonardo4"
#property version   "1.00"
#property indicator_chart_window
//--- init indicator buffers
#property indicator_buffers 1
#property indicator_plots   1

#property indicator_label1  "Arrows"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrLawnGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input int      History  = 10;             // История, дней  

double   Arrows[];
int      cnt_bars;
int      HistoryCandle;
bool     FirstStartFlag;
int bar, limit;
datetime counted_bar;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer       (0,Arrows,INDICATOR_DATA);
   ArraySetAsSeries     (Arrows,true);
   PlotIndexSetInteger  (0,PLOT_DRAW_TYPE,DRAW_ARROW);
   PlotIndexSetInteger  (0,PLOT_LINE_COLOR,clrDodgerBlue);
   PlotIndexSetString   (0,PLOT_LABEL,"Arrows");
   PlotIndexSetInteger  (0,PLOT_ARROW,233);
   
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

//--- Рассчитываем количество свечей истории текущего таймфрейма от настройки "дней"
   HistoryCandle           = History*24*60*60/PeriodSeconds(PERIOD_CURRENT);
   cnt_bars                = HistoryCandle;  // Кол-во баров для подсчета сигналов
   FirstStartFlag          = true;
   
//---
   return(INIT_SUCCEEDED);
  }
 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ChartRedraw(0);
  }
  
//+------------------------------------------------------------------+
//| 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[])
  {
//---

      ArraySetAsSeries(close,true);
      ArraySetAsSeries(open,true);
      ArraySetAsSeries(low,true);
      
     if(HistoryCandle>=rates_total) cnt_bars=rates_total-1;
     else cnt_bars=HistoryCandle;
     
//----+ проверка количества баров на достаточность для корректного расчёта индикатора
      if(rates_total<=cnt_bars)
         {
            Print("Недостаточно истории. Есть "+IntegerToString(rates_total-1)+" надо "+IntegerToString(cnt_bars));                                                                                                                                                                                                                                                                                                              
            return(0);
         }
         
//--- инициализация индикаторного буфера  
     if(FirstStartFlag) 
      {
//--- обнулим все буферы стрелок и времени от мусора                                                             
         for(int x=cnt_bars; x>=0 && !IsStopped(); x--) Arrows[x] = EMPTY_VALUE;
         FirstStartFlag = false;
         ChartRedraw(0);
      }
      
   if(prev_calculated>rates_total || prev_calculated<=0) // проверка на первый старт расчёта индикатора
      {
         limit=cnt_bars-1; // стартовый номер для расчёта всех баров
      }
   else limit=rates_total-prev_calculated; // стартовый номер для расчёта новых баров
   
   if(rates_total != prev_calculated) Arrows[0] = EMPTY_VALUE;
   

   
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
      {
         if(close[bar+1]>open[bar]+5*_Point)  {Arrows[bar]=NormalizeDouble(low[bar]-5*_Point,_Digits);}
      }
      
   MqlRates rates[];
   MqlTick tick;
   SymbolInfoTick(Symbol(),tick);
   CopyRates(Symbol(),PERIOD_CURRENT,0,1,rates);
   double i;
   long m,s;
   m=rates[0].time+GetMinute()*60-tick.time;
   i=m/60.0;
   s=m%60;
   m=(m-m%60)/60;
            
   Comment(" Candle: "+IntegerToString(m,0,' ')+" m "+IntegerToString(s,0,' ')+" s left");
   
   if(iTime( _Symbol, PERIOD_M1, 0 ) > counted_bar ) 
      {
         counted_bar = iTime( _Symbol, PERIOD_M1, 0 );
         ChartRedraw(0);
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

int GetMinute()
  {
   switch(Period())
     {
      case PERIOD_M1: return(1);
      case PERIOD_M2: return(2);
      case PERIOD_M3: return(3);
      case PERIOD_M4: return(4);
      case PERIOD_M5: return(5);
      case PERIOD_M6: return(6);
      case PERIOD_M10: return(10);
      case PERIOD_M12: return(12);
      case PERIOD_M15: return(15);
      case PERIOD_M20: return(20);
      case PERIOD_M30: return(30);
      case PERIOD_H1: return(60);
      case PERIOD_H2: return(120);
      case PERIOD_H3: return(180);
      case PERIOD_H4: return(240);
      case PERIOD_H6: return(360);
      case PERIOD_H8: return(480);
      case PERIOD_H12: return(720);
      case PERIOD_D1: return(1440);
      case PERIOD_W1: return(10080);
      case PERIOD_MN1: return(43200);
     }
   return(1);
  }
Dossiers :
test_arrow.mq5  12 kb
 
Konstantin Efremov:

Dites-moi, les développeurs de Metatrader 5 ont-ils cassé les tampons des indicateurs dans la dernière mise à jour ? Ou c'est quelque chose qui ne va pas avec ma tête ?

Le fait est que tous les indicateurs fléchés qui n'ont pas de recalcul complet sur une nouvelle barre ont commencé à produire le même problème. Les flèches commencent à se multiplier comme des lapins sur les barres adjacentes à la nouvelle barre. Exemple ci-joint.

Seul le recalcul complet de l'indicateur sur une nouvelle barre est utile.


Remplacez cette absurdité

//--- инициализация индикаторного буфера  
     if(FirstStartFlag) 
      {
//--- обнулим все буферы стрелок и времени от мусора                                                             
         for(int x=cnt_bars; x>=0 && !IsStopped(); x--) Arrows[x] = EMPTY_VALUE;
         FirstStartFlag = false;
         ChartRedraw(0);
      }

avec cette absurdité.

  if(prev_calculated == 0)
    ArrayInitialize(Arrows, 0.0);
 

>>Il ya deux terminaux MT5 sur la machinevirtuelle.L'un travaille avec le courtier A, l'autre avec le courtier B. Les deux terminaux utilisent >>le même robot. Tout allait bien jusqu'à hier, jusqu'à ce que je mette à jour la version 2615.


J'ai récupéré la version 2560, tout fonctionne bien, pas de freeze ni de deadlocks.

Les développeurs répondent-ils au moins aux messages ?

Виртуальный хостинг для MetaTrader 5
Виртуальный хостинг для MetaTrader 5
  • www.mql5.com
Виртуальный хостинг для MetaTrader 4/5 является лучшим VPS-решением для Форекса. Оно не требует настройки, дает минимальные задержки до сервера и отличается низкими ценами. Всего за 15 USD в месяц вы получите виртуальную платформу, которая работает круглые сутки, экономит вашу прибыль и даже окупает себя. Создать удаленную копию приложения...
 
elavr:

>>Il ya deux terminaux MT5 sur la machinevirtuelle.L'un travaille avec le courtier A, l'autre avec le courtier B. Les deux terminaux utilisent >>le même robot. Tout allait bien jusqu'à hier, jusqu'à ce que je mette à jour la version 2615.


J'ai récupéré la version 2560, tout fonctionne bien, pas de freeze ni de deadlocks.

Les développeurs répondent-ils au moins aux messages ?

Avez-vous signalé des détails techniques à comprendre ou à reproduire ?

Les questions sans détails sont presque toujours laissées sans attention.

 
Renat Fatkhullin:

Avez-vous donné des détails techniques à comprendre ou à reproduire ?

Les questions sans détails sont presque toujours laissées sans attention.

Renat, puis-je vous poser une question sur l'indicateur ? Au premier passage (prev_calcul==0), l'indicateur est-il obligé de charger l'historique sans aucun écart entre les barres ?

Maintenant, je rencontre souvent des situations où, lors du passage suivant à la partie droite du graphique, les barres sont chargées en plus. En gros, lors du premier passage de l'indicateur dans le tableau de temps de OnCalcvulate, la dernière date est 2020.09.16, et lors du deuxième passage, c'est la date d'aujourd'hui.