Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1219

 
Vladimir Karputov:

Es sieht so aus, als ob das Terminal die Historie immer wieder aufpumpt, so dass der Indikator immer wieder neu berechnet wird. Oder eine andere Variante: Sie haben im Terminal eine SEHR große Anzahl von Balken für die Anzeige im Diagramm eingestellt, und Ihr Computer hat eine SEHR große Anzahl von Balken im Diagramm.

Vielen Dank für die Hilfe!

Wenn Sie ein anderes Datum wählen, wird die Berechnung sofort durchgeführt. Beim ersten Test gab es eine Preislücke, möglicherweise fehlten einige Preise - das ist höchstwahrscheinlich das Problem.

 

Hallo! Es gibt einen MT5-Indikator "Grid Builder", derhorizontale Linien in Kursabstufungenzeichnet. Sie können z.B. 100p, 200p usw. auswählen. Und es baut ein horizontales Gitter auf und ab mit einem bestimmten Schritt. Aber es hat ein Problem, zum Beispiel, wenn ich zeichnen horizontale Ebenen auf Zeitrahmen H4 (ich setzen horizontale Linien aus Zeichnung Werkzeuge im Terminal) und wechseln Sie zu einem anderen Zeitrahmen, alle meine Linien werden entfernt. Es verbleiben nur horizontale Anzeigeebenen. Wie kann ich diesen Fehler im Code korrigieren? Um sicherzustellen, dass meine horizontalen Ebenen niemals gelöscht werden. Hier ist der Indikator-Code (ich schrieb diese Frage in einem anderen Thread, aber es gibt noch keine Antwort)

//+------------------------------------------------------------------+
//|                                                  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. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.
 
Александр:

Hallo! Es gibt einen MT5-Indikator "Grid Builder", derhorizontale Linien in Kursabstufungenzeichnet. Sie können z.B. 100p, 200p usw. auswählen. Und es baut ein horizontales Gitter auf und ab mit einem bestimmten Schritt. Aber es hat ein Problem, zum Beispiel, wenn ich zeichnen horizontale Ebenen auf Zeitrahmen H4 (ich setzen horizontale Linien aus Zeichnung Werkzeuge im Terminal) und wechseln Sie zu einem anderen Zeitrahmen, alle meine Linien werden entfernt. Es verbleiben nur horizontale Anzeigeebenen. Wie kann ich diesen Fehler im Code korrigieren? Um sicherzustellen, dass meine horizontalen Ebenen niemals gelöscht werden. Hier ist der Code des Indikators (ich schrieb diese Frage in einem anderen Thema, aber es gibt keine Antwort)

Achten Sie auf diesen Code:

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

Lesen Sie insbesondere über ObjectsDeleteAll() - dort finden Sie die Ursache und die Lösung zur Behebung des Problems.

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

Achten Sie auf diesen Code:

Lesen Sie insbesondere über ObjectsDeleteAll() - dort finden Sie den Grund und die Antwort auf die Frage, wie Sie es optimieren können.

Ich danke Ihnen!!! Ich habe das Problem behoben, und jetzt funktioniert es ohne Löschung.

 
Sind SQLite-Datenbankoperationen vom Tester aus verfügbar? Ich meine das Hinzufügen und Ändern von Daten.
 
Dmitri Custurov:
Sind SQLite-Datenbankoperationen vom Prüfgerät aus verfügbar? Ich meine das Hinzufügen und Ändern von Daten.

Verfügbar. Behalten Sie einfach den Standort der Basis im Auge. Sie werden auf die gleiche Weise wie die Dateien erstellt.

 
Alexey Viktorov:

Verfügbar. Behalten Sie einfach den Standort der Basis im Auge. Sie werden genau wie die Dateien erstellt.

#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";
   }
}

Hier ist mein Code. Bei der Initialisierung wird ein Datensatz in der Tabelle erstellt. Im OnTick-Body sollte sofort ein Fehler zurückgegeben werden, weil ich versuche, einen Datensatz mit demselben PRIMARY KEY hinzuzufügen, und danach wird die Basis sofort geschlossen. Aber gleichzeitig sollte ich zumindest den ersten Datensatz sehen, wenn ich ihn öffne, aber wenn ich ihn im Testprogramm ausführe, ist er nicht da. Und auch die Tabelle wird nicht erstellt. Wenn ich es einfach im Terminal öffne, ist alles normal. Der erste Datensatz ist da.

 
Dmitri Custurov:

Hier ist mein Code. Bei der Initialisierung wird ein Datensatz in der Tabelle erstellt. Im OnTick-Body sollte sofort ein Fehler zurückgegeben werden, weil ich versuche, einen Datensatz mit demselben PRIMARY KEY hinzuzufügen, und danach wird die Basis sofort geschlossen. Aber gleichzeitig sollte ich zumindest den ersten Datensatz sehen, wenn ich ihn öffne, aber wenn ich ihn im Testprogramm ausführe, ist er nicht da. Und auch die Tabelle wird nicht erstellt. Wenn ich es einfach im Terminal öffne, ist alles normal. Der erste Datensatz ist da.

Einmal mehr bin ich davon überzeugt, dass das Prüfgerät und das Terminal selbst unterschiedliche Hypostasen sind...

 
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:

Es wird seit langem empfohlen,TimeCurrent() um einen Tag zu verlängern. Es ist nur so, dass das Terminal Ihnen jetzt als Reaktion auf Ihren nicht ganz korrekten Code Ratschläge gibt.