MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1870

 

データベースからデータを読み込もうとして、2時間ほど格闘しているのですが、できません。

以下は、そのテストのコードです。

簡単に説明するとデータベースは1つのテーブルで作成されます(データベースが存在する場合は、テーブルを削除して再作成されます)。テーブルに1行が追加されます。

その後、データベースを閉じ、再び開く。このレコードを単純に選択すると、コマンドはクエリ結果が空であるというエラーを返します。

IDEで確認 - すべて同じクエリで選択されています。バグなのか修正なのかわからない?

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);
}

作品の結果

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

また、全コードを添付

ファイル:
testDB_NW.mq5  8 kb
 
なぜ、入力パラメータを ループさせることができないのでしょうか?なぜ、こんな仕打ちをするのですか?
 
x572intraday #:
なぜ、入力パラメータを ループで処理できないのですか?なぜ、こんな仕打ちをするのですか?

こんなことして何になるんだ?秘密を共有する...

 
マーケットからEAをインストールするにはどうすればよいですか?
マーケットでダウンロードを押すと、デフォルトで間違ったターミナルが開いてしまいます。削除しました。ダウンロード」ボタンを押しても何も起こらない
 
Vladimir Makhnin #:
マーケットからEAをインストールするにはどうすればよいですか? マーケットでダウンロードを押したら、デフォルトで間違った端末が開かれました。削除しました。ダウンロード」ボタンを押しても何も起こらない。

どのようなブラウザでダウンロードしていますか?

 
Alexey Viktorov #:

こんなことして何になるんだ?秘密を共有する...

次スレにあったよ、遠くまで行く必要はない。

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;

ループではなく、手でLArrayの配列に全部突っ込むのは犬の喜びです。そして、これはほんの一例です。実際には、多くの列挙があり得る。

enumやENUM_TIMEFRAMESの列挙がないことについても、何も言いません。面倒くさい。
 
x572intraday #:
enumとENUM_TIMEFRAMESの列挙がないことについては言及しない。

むかし、興味本位で同じようなオーバーシュートをやってみたことがあります。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

サービスデスクで開発者とコミュニケーション!

ミハイル・マトコフスキー、2019.10.05 22:07

定数の数だけオフセットや左右のシフトを行う必要がある場合、非常に便利です。こんな感じです。

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

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

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

しかし、この方法でもスイッチ方式に速度で負ける。

だから、望めば何でも可能なんだ!
 
x572intraday #:
なぜループ内で入力パラメータを 列挙できないのですか?なぜ、私たちを罰するのですか?

という質問に参加します。

EnumToString関数があるのに、なぜStringToEnumがないのでしょうか?

データベース内のenumの値を数値として保存することは、途中でenumに新しい値を追加すると-それだけでデータベース内のデータがかぼちゃになってしまい、数値として読めなくなるので、目で見て確認することができない。

 

データベースのクエリーパラメーターに明示的にNULL値を渡す方法はありますか?

このような構成は、コンパイル時のエ ラーの原因となります。

res = DatabaseBind(request, column, NULL);
 
Maksim Emeliashin コンパイル時のエ ラーの原因となります。
DatabaseBind(request, column, "");