新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1870

 

我已经挣扎了几个小时,试图从数据库中读取数据,但做不到。

下面是测试的代码。

简而言之。一个数据库被创建,有一个表(如果数据库存在,表被删除并重新创建)。一个单一的行被添加到表中。

然后,数据库被关闭并再次打开。对这一记录进行了简单的选择,但命令返回错误,即查询结果为空。

通过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;

用手把所有的东西塞进一个Array数组,而不是用一个循环,这是一种狗的乐趣。而这只是一个例子。在现实中,可能会有很多的枚举。

我甚至不会说没有枚举和ENUM_TIMEFRAMES枚举的问题。这很令人厌烦。
 
x572intraday #:
我甚至不会提到缺乏枚举和ENUM_TIMEFRAMES枚举的问题。

曾几何时,我为了兴趣,试图做一个类似的超限动作。

关于交易、自动交易系统和交易策略测试的论坛

通过服务台与开发人员进行沟通!

Mihail Matkovskij, 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--一些难以置信的复杂任务?

在数据库中把枚举值保存为数字是不可取的,因为如果你在中间给枚举添加一个新的值--就是这样,数据库中的数据变成了南瓜,它们作为数字是无法阅读的,你无法用眼睛来查看它们。

 

有什么方法可以明确地将NULL值传递给数据库查询参数吗?

这是一种会导致编译时错误 的结构。

res = DatabaseBind(request, column, NULL);
 
Maksim Emeliashin 编译时错误 的结构。
DatabaseBind(request, column, "");