Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1870

 

Ich versuche schon seit einigen Stunden, Daten aus der Datenbank zu lesen, und es gelingt mir nicht.

Hier ist der Code für die Tests.

Kurz und bündig. Es wird eine Datenbank mit einer Tabelle erstellt (wenn die Datenbank existiert, wird die Tabelle gelöscht und neu erstellt). Der Tabelle wird eine einzige Zeile hinzugefügt.

Dann wird die Datenbank geschlossen und erneut geöffnet. Die einfache Auswahl dieses Datensatzes wird durchgeführt, aber der Befehl gibt den Fehler zurück, dass das Abfrageergebnis leer ist.

Überprüft durch IDE - alles wird durch dieselbe Abfrage ausgewählt. Ich kann nicht herausfinden, ob dies ein Fehler oder eine Korrektur ist?

int OnInit()
{
//---
   int db_handle = DatabaseOpen("test3", DATABASE_OPEN_COMMON | DATABASE_OPEN_CREATE | DATABASE_OPEN_READWRITE);
   if (db_handle != INVALID_HANDLE)
      {
         // Структура таблицы
         if (DatabaseTableExists(db_handle, "ea_dsc"))
            if(!DatabaseExecute(db_handle, "DROP TABLE IF EXISTS ea_dsc"))
               Print("Failed to drop table with code ", GetLastError());

         string t_create = "CREATE TABLE ea_dsc (dsc_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
                           " ea_symb TEXT NOT NULL, dt_from TEXT NOT NULL, dt_to TEXT, magic_buy INTEGER NOT NULL, "
                           " magic_sell INTEGER NOT NULL, version TEXT NOT NULL, ea_method TEXT NOT NULL)";
         if(!DatabaseExecute(db_handle, t_create))
            Print("Failed to create table with code ", GetLastError());

         string t_add = "INSERT INTO ea_dsc (ea_symb, dt_from, dt_to, magic_buy, magic_sell, version, ea_method)"
                        "VALUES ('EURUSD', 'dt_from', NULL, '123', '456', 'version', 'ea_method')";

         if(!DatabaseExecute(db_handle, t_add))
            Print("Failed to add table data  with code ", GetLastError());

         DatabaseClose(db_handle);
      }

   db_handle = DatabaseOpen("test3", DATABASE_OPEN_COMMON | DATABASE_OPEN_READWRITE);
   if (db_handle != INVALID_HANDLE)
      {
         // Запрос
         string s_quer = "SELECT dsc_id, ea_symb, dt_from, dt_to, magic_buy,"
                         "magic_sell, version, ea_method FROM ea_dsc WHERE ea_symb = ?1";
         int c_request = DatabasePrepare(db_handle, s_quer);
         if (c_request != INVALID_HANDLE)
            {
               if (DatabaseBind(c_request, 0, "EURUSD"))
                  if (DatabaseRead(c_request))
                     {
                        Print("Found!");
                     }
                  else
                     PrintFormat("Error=%d", GetLastError());
               DatabaseFinalize(c_request);
            }
         DatabaseClose(db_handle);
      }

//---
   return(INIT_SUCCEEDED);
}

Ergebnis der Arbeit:

 PrintFormat("Error=%d", GetLastError());

Außerdem ist der vollständige Code beigefügt

Dateien:
testDB_NW.mq5  8 kb
 
Warum können wir die Eingabeparameter nicht in einer Schleife durchlaufen? Warum bestrafen Sie uns auf diese Weise?
 
x572intraday #:
Warum können Sie die Eingangsparameter nicht in einer Schleife durchlaufen? Warum bestrafen Sie uns auf diese Weise?

Was ist der Sinn dieser Aktion? Teilen Sie das Geheimnis...

 
Wie installiere ich EAs vom Markt? Ich habe mehrere Terminals.
Wenn ich im Markt auf Download drücke, wird standardmäßig das falsche Terminal geöffnet. Ich habe sie gelöscht. Nach dem Drücken der Schaltfläche "Herunterladen" geschieht nichts mehr.
 
Vladimir Makhnin #:
Wie installiere ich EAs vom Markt? Ich habe mehrere Terminals.
Ich habe im Markt auf Download geklickt und standardmäßig wurde das falsche Terminal geöffnet. Ich habe es gelöscht. Jetzt passiert nichts mehr, nachdem ich die Taste "Download" gedrückt habe.

Mit welchem Browser laden Sie herunter?

 
Alexey Viktorov #:

Was ist der Sinn dieser Aktion? Teilen Sie das Geheimnis...

Es war im nächsten Thread, Sie müssen nicht weit gehen:

enum LIST
  {
   L01=111,   // ITEM 1
   L02=222,   // ITEM 2
   L03=333,   // ITEM 3
   L04=444,   // ITEM 4
   L05=555,   // ITEM 5
   L06=666,   // ITEM 6
   L07=777,   // ITEM 7
   L08=888,   // ITEM 8
  };

input LIST LISTING_01=L01;
input LIST LISTING_02=L02;
input LIST LISTING_03=L03;
input LIST LISTING_04=L04;
input LIST LISTING_05=L05;
input LIST LISTING_06=L06;
input LIST LISTING_07=L07;
input LIST LISTING_08=L08;

LArray[0]=LISTING_01;
LArray[1]=LISTING_02;
LArray[2]=LISTING_03;
LArray[3]=LISTING_04;
LArray[4]=LISTING_05;
LArray[5]=LISTING_06;
LArray[6]=LISTING_07;
LArray[7]=LISTING_08;

Es ist ein wahres Vergnügen, alles von Hand in ein LArray-Array zu schieben, anstatt eine Schleife zu verwenden. Und das ist nur ein Beispiel. In Wirklichkeit könnte es eine Vielzahl von Aufzählungen geben.

Über das Fehlen der Aufzählung enum und ENUM_TIMEFRAMES will ich gar nicht erst reden. Es ist ermüdend.
 
x572intraday #:
Das Fehlen von enum und ENUM_TIMEFRAMES Aufzählung will ich gar nicht erst erwähnen.

Vor einiger Zeit habe ich versucht, aus Interesse eine ähnliche Überschreitung zu machen:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Kommunizieren Sie mit Entwicklern über Service Desk!

Mihail Matkovskij, 2019.10.05 22:07

Dies ist sehr nützlich, wenn Sie einen Versatz oder eine Rechts-/Linksverschiebung um eine beliebige Anzahl von Konstanten vornehmen müssen. Hier ist das Ergebnis:

#property script_show_inputs
//--- input parameters
input uint     shift = 1;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool incE_TF(ENUM_TIMEFRAMES &__tf, int _n = 1) {
  int i = __tf, n = _n;
  if(_n > 0) {
    while(i < PERIOD_W1) {
      i++;
      if(StringFind(EnumToString((ENUM_TIMEFRAMES)i), "PERIOD_", 0) == 0){
        n--;
        if(n == 0) {
          __tf = (ENUM_TIMEFRAMES)i;
          return true;
        }
      }
    }
  }
  else if(_n < 0) {
    while(i > PERIOD_CURRENT) {
      i--;
      if(StringFind(EnumToString((ENUM_TIMEFRAMES)i), "PERIOD_", 0) == 0){
        n++;
        if(n == 0) {
          __tf = (ENUM_TIMEFRAMES)i;
          return true;
        }
      }
    }
  }
  return false;
}

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() {
  ENUM_TIMEFRAMES i;
  i = PERIOD_CURRENT;
  Print("Go");
  Print(EnumToString(i), " = ", i);
  while(i < PERIOD_W1) {
    if(!incE_TF(i, shift))
      break;
    Print(EnumToString(i), " = ", i);
  }
  i = PERIOD_W1;
  Print("Back");
  Print(EnumToString(i), " = ", i);
  while(i > PERIOD_CURRENT) {
    if(!incE_TF(i, -shift))
      break;
    Print(EnumToString(i), " = ", i);
  } 
}

Versetzt um 1:

2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     Go
2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_CURRENT = 0
2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M1 = 1
2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M2 = 2
2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M3 = 3
2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M4 = 4
2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M5 = 5
2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M6 = 6
2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M10 = 10
2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M12 = 12
2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M15 = 15
2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M20 = 20
2019.10.05 23:04:12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M30 = 30
2019.10.05 23:04:12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H1 = 16385
2019.10.05 23:04:12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H2 = 16386
2019.10.05 23:04:12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H3 = 16387
2019.10.05 23:04:12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H4 = 16388
2019.10.05 23:04:12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H6 = 16390
2019.10.05 23:04:12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H8 = 16392
2019.10.05 23:04:12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H12 = 16396
2019.10.05 23:04:12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_D1 = 16408
2019.10.05 23:04:12.210 EnumTimeframeIteration (EURUSD,M12)     PERIOD_W1 = 32769
2019.10.05 23:04:12.210 EnumTimeframeIteration (EURUSD,M12)     Back
2019.10.05 23:04:12.210 EnumTimeframeIteration (EURUSD,M12)     PERIOD_W1 = 32769
2019.10.05 23:04:12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_D1 = 16408
2019.10.05 23:04:12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H12 = 16396
2019.10.05 23:04:12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H8 = 16392
2019.10.05 23:04:12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H6 = 16390
2019.10.05 23:04:12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H4 = 16388
2019.10.05 23:04:12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H3 = 16387
2019.10.05 23:04:12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H2 = 16386
2019.10.05 23:04:12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H1 = 16385
2019.10.05 23:04:12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M30 = 30
2019.10.05 23:04:12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M20 = 20
2019.10.05 23:04:12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M15 = 15
2019.10.05 23:04:12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M12 = 12
2019.10.05 23:04:12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M10 = 10
2019.10.05 23:04:12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M6 = 6
2019.10.05 23:04:12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M5 = 5
2019.10.05 23:04:12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M4 = 4
2019.10.05 23:04:12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M3 = 3
2019.10.05 23:04:12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M2 = 2
2019.10.05 23:04:12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M1 = 1
2019.10.05 23:04:12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_CURRENT = 0

Versetzt um 2:

2019.10.05 23:06:11.462 EnumTimeframeIteration (EURUSD,M12)     Go
2019.10.05 23:06:11.462 EnumTimeframeIteration (EURUSD,M12)     PERIOD_CURRENT = 0
2019.10.05 23:06:11.462 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M2 = 2
2019.10.05 23:06:11.462 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M4 = 4
2019.10.05 23:06:11.462 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M6 = 6
2019.10.05 23:06:11.463 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M12 = 12
2019.10.05 23:06:11.463 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M20 = 20
2019.10.05 23:06:11.469 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H1 = 16385
2019.10.05 23:06:11.469 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H3 = 16387
2019.10.05 23:06:11.469 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H6 = 16390
2019.10.05 23:06:11.469 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H12 = 16396
2019.10.05 23:06:11.475 EnumTimeframeIteration (EURUSD,M12)     PERIOD_W1 = 32769
2019.10.05 23:06:11.475 EnumTimeframeIteration (EURUSD,M12)     Back
2019.10.05 23:06:11.475 EnumTimeframeIteration (EURUSD,M12)     PERIOD_W1 = 32769
2019.10.05 23:06:11.482 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H12 = 16396
2019.10.05 23:06:11.482 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H6 = 16390
2019.10.05 23:06:11.482 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H3 = 16387
2019.10.05 23:06:11.482 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H1 = 16385
2019.10.05 23:06:11.488 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M20 = 20
2019.10.05 23:06:11.488 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M12 = 12
2019.10.05 23:06:11.488 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M6 = 6
2019.10.05 23:06:11.488 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M4 = 4
2019.10.05 23:06:11.488 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M2 = 2
2019.10.05 23:06:11.488 EnumTimeframeIteration (EURUSD,M12)     PERIOD_CURRENT = 0

Diese Methode ist jedoch immer noch weniger schnell als die Switch-Methode.

Es ist also alles möglich, wenn man es will!
 
x572intraday #:
Warum können die Eingabeparameter nicht in einer Schleife aufgezählt werden? Warum bestrafen Sie uns?

Ich schließe mich der Frage an.

Auch über enum: Wenn es EnumToString Funktion, warum nicht StringToEnum - einige unglaublich komplexe Aufgabe dort?

Das Speichern von Enum-Werten in der Datenbank als Zahlen ist keine Option, denn wenn man in der Mitte einen neuen Wert zu Enum hinzufügt, verwandeln sich die Daten in der Datenbank in einen Kürbis, und sie sind als Zahlen unlesbar, man kann sie nicht mit den Augen sehen.

 

Gibt es eine Möglichkeit, explizit einen NULL-Wert an den Datenbankabfrageparameter zu übergeben?

Dies ist die Art von Konstrukt, die einen Kompilierzeitfehler verursacht:

res = DatabaseBind(request, column, NULL);
 
Maksim Emeliashin einen Kompilierzeitfehler verursacht:
DatabaseBind(request, column, "");