Questions des débutants MQL5 MT5 MetaTrader 5 - page 1219

 
Vladimir Karputov:

On dirait que le terminal continue à gonfler l'historique - donc l'indicateur continue à recalculer. Ou une autre variante : vous avez un TRES grand nombre de barres définies dans le terminal pour l'affichage sur le graphique, et votre ordinateur a un TRES grand nombre de barres sur le graphique.

Merci pour votre aide !

Lorsque vous sélectionnez une autre date, le calcul s'effectue immédiatement. Dans le premier test, il y a eu un écart de prix, peut-être que certains prix manquaient - c'est très probablement le problème.

 

Bonjour, Il existe un indicateur MT5 "Grid Builder" qui dessine deslignes horizontales par incréments de prix. Vous pouvez sélectionner par exemple 100p, 200p etc. Et il construit une grille horizontale de haut en bas avec un pas donné. Mais il y a un problème, par exemple, lorsque je dessine des niveaux horizontaux sur le timeframe H4 (je mets des lignes horizontales à partir des outils de dessin dans le terminal) et que je passe à un autre timeframe, toutes mes lignes sont supprimées. Il ne reste que des niveaux d'indicateurs horizontaux. Comment puis-je corriger cette erreur dans le code ? Pour faire en sorte que mes niveaux horizontaux ne soient jamais supprimés. Voici le code de l'indicateur (j'ai écrit cette question dans un autre fil, mais il n'y a pas encore de réponse)

//+------------------------------------------------------------------+
//|                                                  GridBuilder.mq5 |
//|                                              Copyright 2015, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"
#property indicator_chart_window

//---- для расчёта и отрисовки индикатора использовано ноль буферов
#property indicator_buffers 0
//---- использовано всего ноль графических построений
#property indicator_plots   0
//--- входные параметры 
input int count = 50;      //количество линий вверх вниз от цены
input int step  = 333;     //шаг линий 
input double pr = 1.4622;  //цена от которой пляшем
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   ObjectsDeleteAll(0,0,OBJ_HLINE);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectsDeleteAll(0,0,OBJ_HLINE);
  }
//+------------------------------------------------------------------+ 
//| Создает горизонтальную линию                                     | 
//+------------------------------------------------------------------+ 
bool HLine(const string name="HLine",double price=0)
  {
//--- создадим горизонтальную линию 
   if(!ObjectCreate(0,name,OBJ_HLINE,0,0,price))
     {
      Print(__FUNCTION__,
            ": не удалось создать горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим цвет линии 
   ObjectSetInteger(0,name,OBJPROP_COLOR,clrGreen);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
   return(true);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   double price=pr;
//--- создадим горизонтальную линию 
   for(int i=0;i<=count;i++)
     {
      HLine("HLine"+(string)i,price+step*i*_Point);
      HLine("HLine"+(string)(i+count+1),price-step*i*_Point);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
При создании графического объекта функцией ObjectCreate() необходимо указать тип создаваемого объекта, который может принимать одно из значений перечисления ENUM_OBJECT. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.
 
Александр:

Bonjour, Il existe un indicateur MT5 "Grid Builder" qui dessine deslignes horizontales par incréments de prix. Vous pouvez sélectionner par exemple 100p, 200p etc. Et il construit une grille horizontale de haut en bas avec un pas donné. Mais il y a un problème, par exemple, lorsque je dessine des niveaux horizontaux sur le timeframe H4 (je mets des lignes horizontales à partir des outils de dessin dans le terminal) et que je passe à un autre timeframe, toutes mes lignes sont supprimées. Il ne reste que des niveaux d'indicateurs horizontaux. Comment puis-je corriger cette erreur dans le code ? Pour faire en sorte que mes niveaux horizontaux ne soient jamais supprimés. Voici le code de l'indicateur (j'ai écrit cette question dans un autre sujet, mais il n'y a pas de réponse)

Faites attention à ce code :

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectsDeleteAll(0,0,OBJ_HLINE);
  }
//+------------------------------------------------------------------+ 

En particulier, lisez l'article sur ObjectsDeleteAll() - là, la cause et la réponse pour la correction.

Документация по MQL5: Графические объекты / ObjectsDeleteAll
Документация по MQL5: Графические объекты / ObjectsDeleteAll
  • www.mql5.com
[in]  Префикс, по которому будут удалены все объекты, чьи имена начинаются с данного набора символов. Префикс можно указывать как 'name' или 'name*' – оба варианта работают одинаково. Если в качестве префикса указана пустая строка, то будут удалены объекты с любым именем. Функция использует синхронный вызов – это...
 
Artyom Trishkin:

Faites attention à ce code :

Lisez en particulier ObjectsDeleteAll() - vous y trouverez la raison et la réponse à la question de savoir comment le modifier.

Merci ! !! Je l'ai résolu, maintenant ça fonctionne sans suppression.

 
Les opérations sur la base de données SQLite sont-elles disponibles pour le testeur ? Je veux dire ajouter et modifier des données.
 
Dmitri Custurov:
Les opérations sur la base de données SQLite sont-elles disponibles pour le testeur ? Je veux dire ajouter et modifier des données.

Disponible. Gardez juste un œil sur l'emplacement de la base. Ils sont créés de la même manière que les dossiers.

 
Alexey Viktorov:

Disponible. Gardez juste un œil sur l'emplacement de la base. Ils sont créés tout comme les dossiers.

#define  DB_NAME "OHLC_DB"

int db_handle;
string TableName;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(){
   db_handle = DatabaseOpen(DB_NAME, DATABASE_OPEN_READWRITE|DATABASE_OPEN_CREATE); 

   if (db_handle != INVALID_HANDLE){
      Print(StringFormat("Database %s was opened", DB_NAME));
      
      TableName = Symbol() + "_" + enumTimeFrameToString(Period());
      if (DatabaseTableExists(db_handle, TableName)){
         Print(StringFormat("Table %s is exist", TableName));
      }else{
         if (DatabaseExecute(db_handle, "CREATE TABLE " + TableName + "("
                             "TIME TEXT PRIMARY KEY  NOT NULL,"
                             "OPEN              REAL NOT NULL,"
                             "HIGH              REAL NOT NULL,"
                             "LOW               REAL NOT NULL,"
                             "CLOSE             REAL NOT NULL );")){
            Print(StringFormat("Table %s was created", TableName));
            string time = "'" + TimeToString(iTime(Symbol(), PERIOD_CURRENT, 0)) + "'";
            double open = iOpen(Symbol(), PERIOD_CURRENT, 0);
            double high = iHigh(Symbol(), PERIOD_CURRENT, 0);
            double low = iLow(Symbol(), PERIOD_CURRENT, 0);
            double close = iClose(Symbol(), PERIOD_CURRENT, 0);

            if (!DatabaseExecute(db_handle,"INSERT INTO " + TableName + " (TIME,OPEN,HIGH,LOW,CLOSE) "
                                           "VALUES (" + StringFormat("%s,%.5f,%.5f,%.5f,%.5f", time, open, high, low, close) + ");")){
               Print("Table: ", TableName, " insert failed with code ", GetLastError());
               DatabaseClose(db_handle);
               return(INIT_FAILED);
            }else
               Print("New table started:");   
         }else{
            Print(StringFormat("Could not create %s table. Error is: %d", TableName, GetLastError()));
            DatabaseClose(db_handle);
            return(INIT_FAILED); 
         }
      }
      
      return(INIT_SUCCEEDED);
   }else{
      Print("Could not open db. Error is: ", GetLastError());
      return(INIT_FAILED); 
   }     
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
   DatabaseClose(db_handle);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(){
   string time = "'" + TimeToString(iTime(Symbol(), PERIOD_CURRENT, 0)) + "'";
   double open = iOpen(Symbol(), PERIOD_CURRENT, 0);
   double high = iHigh(Symbol(), PERIOD_CURRENT, 0);
   double low = iLow(Symbol(), PERIOD_CURRENT, 0);
   double close = iClose(Symbol(), PERIOD_CURRENT, 0);
   if (!DatabaseExecute(db_handle,"INSERT INTO " + TableName + " (TIME,OPEN,HIGH,LOW,CLOSE) "
                                  "VALUES (" + StringFormat("%s,%.5f,%.5f,%.5f,%.5f", time, open, high, low, close) + ");")){
      Print("Table: ", TableName, " insert failed with code ", GetLastError());
      DatabaseClose(db_handle);
   }   
}
//+------------------------------------------------------------------+
string enumTimeFrameToString(ENUM_TIMEFRAMES frame){
   switch(frame){
      case PERIOD_M1:  return "M1";
      case PERIOD_M2:  return "M2";
      case PERIOD_M3:  return "M3";
      case PERIOD_M4:  return "M4";
      case PERIOD_M5:  return "M5";
      case PERIOD_M6:  return "M6";
      case PERIOD_M10: return "M10";
      case PERIOD_M12: return "M12";
      case PERIOD_M15: return "M15";
      case PERIOD_M20: return "M20";
      case PERIOD_M30: return "M30";
      case PERIOD_H1:  return "H1";
      case PERIOD_H2:  return "H2";
      case PERIOD_H3:  return "H3";
      case PERIOD_H4:  return "H4";
      case PERIOD_H6:  return "H6";
      case PERIOD_H8:  return "H8";
      case PERIOD_D1:  return "D1";
      case PERIOD_W1:  return "W1";
      default:         return "MN1";
   }
}

Voici mon code. Dans l'initialisation, il crée un enregistrement dans la table. Dans le corps du OnTick, il devrait immédiatement renvoyer une erreur, car j'essaie d'ajouter un enregistrement avec la même PRIMARY KEY, et après cela, la base se ferme immédiatement. Mais en même temps, je devrais voir au moins le premier enregistrement lorsque je l'ouvre, mais lorsque je l'exécute dans le testeur, il n'y est pas. Et même la table n'est pas créée. Si je l'ouvre simplement dans le terminal, tout est normal. Le premier disque est là.

 
Dmitri Custurov:

Voici mon code. Dans l'initialisation, il crée un enregistrement dans la table. Dans le corps du OnTick, il devrait immédiatement renvoyer une erreur, car j'essaie d'ajouter un enregistrement avec la même PRIMARY KEY, et après cela, la base se ferme immédiatement. Mais en même temps, je devrais voir au moins le premier enregistrement lorsque je l'ouvre, mais lorsque je l'exécute dans le testeur, il n'y est pas. Et même la table n'est pas créée. Si je l'ouvre simplement dans le terminal, tout est normal. Le premier disque est là.

Une fois de plus, je suis convaincu que le testeur et le terminal lui-même sont des hypostases différentes...

 
HistorySelect(xxx,TimeCurrent()) miss the latest history order / deal sometimes. Now you have to use HistorySelect(xxx,TimeCurrent()+1) To get a more accurate result.

 
tickfenix:

Il est recommandé depuis longtemps d'ajouter un jour àTimeCurrent(). C'est juste que maintenant, en réponse à votre code pas tout à fait correct, le terminal vous donne des conseils.