Erreurs, bugs, questions - page 2133

 
Oh, je devrais demander à Nikolay Semko d'écrire une version alternative du kanvas, avec un bon anticrénelage, peut-être une vision différente, et d'écrire un article, peut-être le fera-t-il ?
 
Aleksandr Teleguz:

Bonjour. Veuillez m'aider à trouver la cause de cette erreur. Je transfère un indicateur de mql4 à mql5. J'utilise le "shell" suivant pour les fonctions iHigh :

En conséquence, je reçois l'erreur 4301 : "Unknown symbol", même si une chaîne de caractères renvoyée par la fonction Symbol() est passée comme paramètre du symbole. Voici un fragment de code de la fonction appelant iHigh

Qui est "i" ? Quelle est sa valeur avant la boucle ?


Faites-vous l'appel ResetLastError avantiHigh ?

 
Vladimir Karputov:

Qui est le "i" ? Quelle est sa valeur avant la boucle ?


Faites-vous un appel à ResetLastError avantiHigh ?

La valeur de i est parcourue en boucle dans la fonction OnCalculate.

for(int i=rates_total-prev_calculated; i>0 && !IsStopped(); i--)
     {
      if(i>rates_total-10) continue;


Je n'ai pas fait l'appel ResetLastError, maintenant je l'ai fait - le code d'erreur est le même. J'utilise les tableaux low[i], high[i] etc. dans la fonction OnCalculate, et iHigh, iLow etc. dans les fonctions externes.

 
Aleksandr Teleguz:

La valeur de i est bouclée dans la fonction OnCalculate


Je n'ai pas appelé ResetLastError, maintenant je l'ai fait - le code d'erreur est le même. J'utilise les tableaux low[i], high[i] etc. dans la fonction OnCalculate et iHigh, iLow etc. dans les fonctions externes.

Fournissez le code MQL5 qui peut être exécuté et décrivez les conditions dans lesquelles l'erreur se produit.

 
Vladimir Karputov:

Fournissez un code MQL5 qui peut être exécuté et décrivez les conditions dans lesquelles l'erreur se produit.

Il semble y avoir un problème avec mon terminal. J'ai exécuté le même code sur un netbook sur un autre mt5, même compte de démonstration - pas d'erreur.

Voici le code lui-même :

/+------------------------------------------------------------------+
//|                                                      Strelka.mq4 |
//|                                                Alexander Teleguz |
//|                                            https://investmany.ru |
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 12
#property indicator_plots   6

#define OP_SELL 1

int OnInit()
{
  
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   
}
//+------------------------------------------------------------------+

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(time,true);
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
   
   for(int i = rates_total-prev_calculated; i>0 && !IsStopped(); i--)
   {
      if(i>rates_total-10) continue;
      bool filtr = Filtr1(OP_SELL, i);
   }
      
   return(rates_total);
}
//+------------------------------------------------------------------+
bool Filtr1(int type, int i)
{
   ENUM_TIMEFRAMES tf = Period();
   string symbol = Symbol();
   int i1, i2=0; //индекс внешнего бара, счетчик
   for(i1=i+1; i2<6; i1++)
   {
      if(iLow(symbol, tf, i1)<=iLow(symbol, tf, i1+1)&&
         iHigh(symbol, tf, i1)>=iHigh(symbol, tf, i1+1)) //если бар внешний
      {
         break; //выход из цикла
      }
      else
      {
         i2++;
      }
   }
   return(false);
}
//+------------------------------------------------------------------+
double iHigh(string symbol, ENUM_TIMEFRAMES tf,int index)
{
   if(index < 0) return(-1);
   double Arr[1];
   if(CopyHigh(symbol,tf, index, 1, Arr)>0) 
        return(Arr[0]);
   else
   {
      Print(__FUNCTION__, GetLastError());
      return(-1);
   } 
}
//+------------------------------------------------------------------+
double iLow(string symbol, ENUM_TIMEFRAMES tf,int index)
{
   if(index < 0) return(-1);
   double Arr[1];
   if(CopyLow(symbol,tf, index, 1, Arr)>0) 
        return(Arr[0]);
   else
   {
      Print(__FUNCTION__, GetLastError());
      return(-1);
   }
}
//+------------------------------------------------------------------+
 
Aleksandr Teleguz:

Il semble y avoir un problème avec mon terminal. J'ai exécuté le même code sur un netbook sur un autre mt5, même compte de démonstration - pas d'erreur.

Voici le code lui-même :

Note : Vous écrivez dans la section principale du forum MQL5, c'est là que MQL5 est discuté. Pour MQL4, il existe une section spéciale :MQL4 et MetaTrader 4. Veuillez publier votre code dans la section appropriée. C'est encore mieux lorsque l'éditeur respecte les utilisateurs et publie le code dans l'en-tête où le type de langue est affiché.

 
C'est MQL5.
 

Bonjour !
Je ne peux pas modifier l'horizon temporel d'un objet graphique. Je ne sais pas si c'est le terminal qui se plante ou moi.
Voici le code de vérification

int OnStart(void)
{
        double price;
        datetime time0, time1;
        string obj_name= "test_of_line_timeframe_setting";
        ENUM_TIMEFRAMES tf1, tf2;

        // берем последнюю цену и время 
        MqlRates rates[];
        int copied=CopyRates(NULL,0,0,3,rates);
        price= rates[0].open;
        time0= rates[0].time;
        
        // рисуем линию
        ObjectCreate(0, obj_name, OBJ_HLINE, 0, time0, price);
// --- отображение на переднем плане (false) или background (true)
    ObjectSetInteger (0, obj_name, OBJPROP_BACK , false);
// --- Включить (true) или отключить (false) режим для перемещения меток с помощью мыши
    ObjectSetInteger (0, obj_name, OBJPROP_SELECTABLE , true);
    ObjectSetInteger (0, obj_name, OBJPROP_SELECTED , false);
// --- Скрыть (true) или отобразить (false) графический объект в списке объектов
    ObjectSetInteger (0, obj_name, OBJPROP_HIDDEN , false);
// --- Установите порядок приоритета для получения события щелчка мыши по диаграмме
    ObjectSetInteger (0, obj_name, OBJPROP_ZORDER , 0);

        
        // устанавливаем видимость на дневном таймфрэйме
        ObjectSetInteger(0,obj_name,OBJPROP_PERIOD,PERIOD_D1); 
        // считываем видимость 
        tf1= ObjectGetInteger(0,obj_name,OBJPROP_PERIOD);

        // устанавливаем видимость на часовом таймфрэйме
        ObjectSetInteger(0,obj_name,OBJPROP_PERIOD,PERIOD_H1); 
        // считываем видимость 
        tf2= ObjectGetInteger(0,obj_name,OBJPROP_PERIOD);

        if (tf1==tf2) Alert("таймфрейм изменить не удается");
        else Alert("таймфрейм успешно изменен");

        ObjectDelete(0,obj_name); 

        return(0);
}
 
bogue OBJ_CHART. Indicateur
#property indicator_chart_window

#property indicator_buffers 0
#property indicator_plots indicator_buffers

#define  PRINT(A) Print(#A + " = " + (string)(A))

// Создаем OBJ_CHART
const string Name = __FILE__;
const bool Init = ObjectCreate(0, Name, OBJ_CHART, 0, 0, 0) && EventSetTimer(1);
const long Chart = ObjectGetInteger(0, Name, OBJPROP_CHART_ID);

void OnInit()
{  
  // Задаем свойства объекта
  ObjectSetInteger(0, Name, OBJPROP_XSIZE, 400); // Ширина
  ObjectSetInteger(0, Name, OBJPROP_YSIZE, 250); // Высота
  ChartSetInteger(Chart, CHART_SHOW, false);

  ChartGetInteger(Chart, CHART_WIDTH_IN_PIXELS); // Если закомментировать строку, то все будет работать правильно
}

void OnDeinit( const int )
{
  ObjectDelete(0, Name);
}

void OnTimer()
{
  // Считываем свойства объекта
  PRINT(ChartGetInteger(Chart, CHART_WIDTH_IN_PIXELS));  // Правильное значение - 400
  PRINT(ChartGetInteger(Chart, CHART_HEIGHT_IN_PIXELS)); // Правильное значение - 250

  EventKillTimer();
}

int OnCalculate( const int, const int, const int, const double& [] )
{  
  return(0);
}


Le résultat est incorrect

ChartGetInteger(Chart,CHART_WIDTH_IN_PIXELS) = 330
ChartGetInteger(Chart,CHART_HEIGHT_IN_PIXELS) = 226


Mais dès que vous commentez la ligne sélectionnée, l'indicateur commence à fonctionner correctement.

ChartGetInteger(Chart,CHART_WIDTH_IN_PIXELS) = 400
ChartGetInteger(Chart,CHART_HEIGHT_IN_PIXELS) = 250


Pour une raison quelconque, ChartGetInteger dans OnInit affecte les propriétés de l'objet graphique.

 
fxsaber:
bogue OBJ_CHART. Indicateur

Le résultat est faux.

J'ai ajouté ::ChartRedraw

Voici le résultat :

2018.02.19 23:27:35.526 ChartGetInteger(Chart,CHART_WIDTH_IN_PIXELS) = 400
2018.02.19 23:27:36.323 ChartGetInteger(Chart,CHART_WIDTH_IN_PIXELS) = 400
2018.02.19 23:27:36.324 ChartGetInteger(Chart,CHART_HEIGHT_IN_PIXELS) = 250

Tout d'abord, la ligne non commentée (ajoutée par PRINT pour plus de clarté)

Raison: