文章 "SQLite: MQL5 原生 SQL 数据库操纵" - 页 2

 

Renat Fatkhullin:

在一个终端启动的不同 MQL5 智能顾问中,您可以共享同一个数据库。

我已经测试了在一个终端中 使用相同数据库的两个 Expert Advisor 的工作情况。运行无误 - 两个 Expert Advisor 都以 2 秒钟的计时器将数据写入一个文件。

文件附后,它们的区别仅在于 Expert Advisor 的名称不同。

2020.02.19 17:56:14.624 SecondExpertDataBase (GBPUSD,H1)        16:56:14: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:16.627 SecondExpertDataBase (GBPUSD,H1)        16:56:16: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:18.616 SecondExpertDataBase (GBPUSD,H1)        16:56:18: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:20.630 SecondExpertDataBase (GBPUSD,H1)        16:56:20: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:22.078 FirstExpertDataBase (USDCHF,H1)         16:56:21: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:22.629 SecondExpertDataBase (GBPUSD,H1)        16:56:22: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:24.071 FirstExpertDataBase (USDCHF,H1)         16:56:24: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:24.619 SecondExpertDataBase (GBPUSD,H1)        16:56:24: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:26.070 FirstExpertDataBase (USDCHF,H1)         16:56:26: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:26.619 SecondExpertDataBase (GBPUSD,H1)        16:56:26: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:28.079 FirstExpertDataBase (USDCHF,H1)         16:56:27: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:28.625 SecondExpertDataBase (GBPUSD,H1)        16:56:28: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:30.079 FirstExpertDataBase (USDCHF,H1)         16:56:30: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:30.617 SecondExpertDataBase (GBPUSD,H1)        16:56:30: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:32.069 FirstExpertDataBase (USDCHF,H1)         16:56:32: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:32.627 SecondExpertDataBase (GBPUSD,H1)        16:56:32: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:34.073 FirstExpertDataBase (USDCHF,H1)         16:56:33: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:34.627 SecondExpertDataBase (GBPUSD,H1)        16:56:34: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:36.616 SecondExpertDataBase (GBPUSD,H1)        16:56:36: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:38.079 FirstExpertDataBase (USDCHF,H1)         16:56:38: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:38.615 SecondExpertDataBase (GBPUSD,H1)        16:56:38: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:40.072 FirstExpertDataBase (USDCHF,H1)         16:56:40: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:40.618 SecondExpertDataBase (GBPUSD,H1)        16:56:40: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:42.630 SecondExpertDataBase (GBPUSD,H1)        16:56:42: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:44.617 SecondExpertDataBase (GBPUSD,H1)        16:56:44: added 1 record on GBPUSD to timer.sqlite


下面是数据库在 MetaEditor 中的样子


附加的文件:
 
Chiripaha:

µl5 中描述的内容是否可以在 µl4 中使用?

在 MQL4 中,您可以通过 MQL 的包装器使用本地 Sqlite3_32.dll

/*
 * MT4 的 SQLite 接口
 */

#import "sqlite3_wrapper.dll"
int sqlite_exec (string db_fname, string sql);
int sqlite_table_exists (string db_fname, string table);
int sqlite_query (string db_fname, string sql, int& cols[]);
int sqlite_next_row (int handle);
string sqlite_get_col (int handle, int col);
int sqlite_free_query (int handle);
#import

这是 MQL 的封装器,请勿与SQLite3Wrapper.dll 混淆。

但我不知道它是否还在线,我以前用过它。

更新:https://github.com/Shmuma/sqlite3-mt4-wrapper
Shmuma/sqlite3-mt4-wrapper
Shmuma/sqlite3-mt4-wrapper
  • Shmuma
  • github.com
Database file is by default stored to . If you specify a full path as database filename, it's used. Terminal data path TERMINAL_DATA_PATH can be known by the following instruction. Open MT4 Open [File] menu Click "Open Data Folder" Sample Many sample scripts in under . Precautions Argument mess MT4 build 610 has a weird bug when dll function...
 
fxsaber:

谁想出了这个办法,请展示一下这项任务的执行情况。

  1. 有两个终端。
  2. 需要将一个符号的实时报价从终端 1 传输到终端 2 的相应自定义符号。

还有一个细微差别--在数据库中保存价值不断增长的一致数据,而不是分散的数据,如报价(日期不断增长)--这是一个非常昂贵的操作。数据树并不平衡,一个分支会无限增长,而引擎会定期重新平衡数据树(这比垃圾收集还要糟糕)。也许这只适用于索引表,我不记得了。或者,在我没有使用它的这几年里,这个问题已经解决了。我得试试看。也许开发人员也会分析一下,他们应该会对此感兴趣。

 

数据库导入

简单脚本

void OnStart()
  {
  string filename="DOMdb.db";
  int database=DatabaseOpen(filename, DATABASE_OPEN_READWRITE  );
  DatabaseImport(database,             // DatabaseOpen 中收到的数据库句柄
                     "DOMtb",             // 用于插入数据的表名
                     "AllDOM.csv",          // 导入数据的文件名
                       0,             // 标志组合
                      ";",         // 数据分隔符 
                        0,         // 跳过多少首行 
                      "//"     // 定义注释的字符串
   );
   
  }

2020.02.20 15:09:27.171 MQL5 'DOMcopy.ex5' 有较新的不支持版本,请更新客户端

版本 5 第 2323 版的最新元编辑器也是如此,调试不起作用。

有什么未完成的吗?

 

DatabaseImport 函数 尚未向公众发布。

请等待发布。

 
也许不在主题范围内,但是:我想知道为什么开发人员还没有实现与 MS SQL Server 的连接?
 
Rashid Umarov:

数据库导入功能尚未向公众发布。

请等待发布。

版本 5 第 2326 版也是如此,那么何时才能等到稳定版本?

 
IuriiPrugov:

版本 5 建 2326 同样的事情,是等待一个稳定的版本,什么时候?

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

新版本的MetaTrader 5建立2340:在测试仪管理帐户设置和扩大与Python的集成

MetaQuotes, 2020.02.20 14:55

2020年2月21日星期五,将发布MetaTrader 5平台的更新版本。更新包含以下更改:

  1. MetaEditor: 添加了方便使用 SQLite 数据库的功能。

    之前的平台更新 中,我们增加了直接从 MQL5 使用 SQLite 数据库的支持。现在,主要功能可通过 MetaEditor 用户界面使用:

    • 创建和连接数据库
    • 查看表格和快速数据查询
    • 制作和执行 SQL 查询,回滚更改

    工作原理
    要快速创建数据库,请使用 "MQL5 向导"。在这里,您可以立即创建第一个表并定义其字段列表。




    创建数据库后,您将进入 "导航器 "的一个新部分。所有数据处理工作都在该部分进行。左侧显示的是数据库表。要快速查询前 1000 条记录,请双击表名。在这里,您还可以创建和打开其他数据库并处理表格。编辑器的主要部分是处理数据库的地方:在表中填入数据、进行搜索和选择、输入 SQL 查询等。 。






    有关在 MetaTrader 5 中使用数据库的更多详情,请阅读文章"SQLite:在 MQL5 中使用 SQL 数据库的本地工作"。

  2. MetaEditor: 我们继续增加对多语言项目的支持。在此版本中,我们扩展了用于处理 Python 脚本的功能:

    • 现在,您可以通过 "MQL5 向导 "方便地创建脚本,并立即在代码中加入对必要库的依赖。
    • 在导航器中为其添加了特殊图标,在编辑器中添加了语法高亮显示。
    • 通过 MetaEditor 运行脚本时,来自 Python 控制台(stdout、stderr)的消息将显示在 "错误 "部分。




    要在编辑器中运行脚本,请点击 "编译": 。





    要使用 Python,不要忘记在 MetaEditor 的 "设置/编译器 "部分指定 Python 的路径。要使用 MetaTrader 5 库,请使用以下命令安装: 。
    pip install MetaTrader 5
    阅读更多关于与 Python 集成的文档

    .
  3. MQL5:与 Python 的集成完全重新设计。添加了许多新功能,并更改了命令命名。

    新命令命名
    现有命令已 重新命名:
    MT5Initialize       -> initialize
    MT5Shutdown         -> shutdown
    MT5TerminalInfo     -> terminal_info
    MT5Version          -> version
    MT5CopyRatesFrom    -> copy_rates_from
    MT5CopyRatesFromPos -> copy_rates_from_pos
    MT5CopyRatesRange   -> copy_rates_range
    MT5CopyTicksFrom    -> copy_ticks_from
    MT5CopyTicksRange   -> copy_tick_range

    新命令
    支持的命令列表已大大扩展。增加了交易功能,可处理交易历史、获取金融工具和当前账户信息。

    • account_info() - 获取当前账户信息。类似于AccountInfoIntegerAcountInfoDoubleAccountInfoString
    • positions_total() - 接收未结头寸的数量。类似于PositionsTotal
    • positions_get(symbol, ticket) - 按符号或票据获取未结头寸。
    • orders_total() - 获取订单数。类似于OrdersTotal
    • orders_get(symbol, ticket) - 按符号或票据获取未平仓订单。
    • history_orders_total(from, to) - 获取指定时间间隔内的历史订单数。
    • history_orders_get(from, to, position, ticket) - 按票据或按位置过滤从历史记录中获取指定时间间隔内的订单。
    • history_deals_total() - 从历史记录中获取交易数量。与HistoryDealsTotal 类似。
    • history_deals_get(from, to, position, ticket) - 通过票据或位置过滤从历史记录中获取指定时间间隔内的交易。
    • symbol_info(symbol) - 获取金融工具的信息。类似于SymbolInfoIntegerSymbolInfoDoubleSymbolInfoString
    • symbol_info_tick(symbol) - 按符号获取最后一个刻度。与SymbolInfoTick 类似。
    • symbol_select(symbol, enable) - 在 "市场观察 "中启用/禁用符号。类似于SymbolSelect
    • order_check(request) - 检查订单的保证金。类似于OrderCheck
    • order_send(request) - 向服务器发送订单。类似于OrderSend
    • order_calc_margin(action, symbol, volume, price) - 计算订单的保证金。类似于OrderCalcMargin
    • order_calc_profit(action, symbol, volume, price_open, price_close) - 利润计算。与OrderCalcProfit 类似。

    在图表上运行 Python 脚本
    现在,Python 脚本可以直接在平台的图表上运行,类似于普通的 MQL5 程序。这些脚本将以特殊图标显示在 "导航器 "中。



    脚本信息将显示在 "工具/专家 "部分。如果脚本使用MetaTrader 5 库,则可接收有关工具、账户和交易的信息。

    Python 脚本可与其他 MQL5 脚本和智能交易系统并行运行在同一图表上。要在脚本循环执行时停止脚本,只需将其从图表中删除即可。

    附加保护
    为了在使用第三方 Python 库时进一步保护您的账户,在终端设置中添加了 "禁止通过外部 Python API 自动交易 "选项。




    只有明确禁用该选项,才允许 Python 脚本进行交易。 。

  4. MQL5:重新启动 MQL5 程序和从 MQL5 程序重新创建自定义指标的速度已显著加快。在某些情况下,速度提高了数百倍。
  5. MQL5:添加了数据库工作函数:

    DatabaseImport
    将数据从文件导入表格。
    long  DatabaseImport(
       int           database,          // DatabaseOpen 中收到的数据库句柄
       const string  table,             // 用于插入数据的表名
       const string  filename,          // 导入数据的文件名
       uint          flags,             // 标志组合
       const string  separator,         // 数据分隔符 
       ulong         skip_rows,         // 跳过多少首行 
       const string  skip_comments      // 定义注释的字符串
       );

    DatabaseExport
    将表或 SQL 查询执行结果导出为 CSV 文件。文件以 UTF-8 编码创建。
    long  DatabaseExport( 
       int           database,           // DatabaseOpen 中收到的数据库句柄 
       const string  table_or_sql,       // 表名或 SQL 查询 
       const string  filename,           // 导出数据的 CSV 文件名 
       uint          flags,              // 标志组合 
       const string  separator           // CSV 文件中的数据分隔符 
       );

    DatabasePrint
    将表或 SQL 查询执行结果打印到 Expert Advisor 日志中。
    long  DatabasePrint(
       int           database,          // DatabaseOpen 中收到的数据库句柄
       const string  table_or_sql,      // 表格或 SQL 查询
       uint          flags              // 标志组合
       );

  6. MQL5:添加了 FileSelectDialog 函数,调用系统对话创建/打开文件或文件夹。
    int  FileSelectDialog(
       string   caption,              // 窗口标题
       string   initial_dir,          // 启动文件夹
       string   filter,               // 扩展过滤器
       uint     flags,                // 标志组合
       string&  filenames[],          // 包含文件名的数组
       string   default_filename      // 默认文件名
       );
    新函数将使用户与 MQL5 程序的交互更加方便。

    .
  7. MQL5:ENUM_DEAL_PROPERTY_DOUBLE 枚举中添加了 DEAL_FEE - 进行交易的付款。事实上,这是经纪人可以收取的一种单独类型的佣金。

    .
  8. 测试器:添加了在测试策略时设置自己的交易账户设置的功能--交易限额、保证金设置和佣金。因此,您有更多机会模拟经纪人的不同交易条件。




    常规设置
    在本节中,您可以设置账户上同时可拥有的最大未结订单数和头寸数。您还可以在此设置测试程序不允许交易的时段。


    保证金
    在这里,您可以完全控制如何预留保证金,以及在测试期间使用何种头寸会计系统: 。

    • 风险管理 - 风险管理模式:场外交易和交易所交易,具有净额结算和对冲功能。有关详细信息,请参阅帮助
    • "Margin call"(追加保证金)水平 - 帐户上的资金水平,当达到该水平时,将切换到追加保证金状态。
    • 止损 "水平 - 帐户被迫撤销订单和关闭交易头寸的资金水平。这两种水平都可以百分比和货币为单位指定。在第一种情况下,水平被定义为账户上 "资金 "指标的值。如果选择 "百分比 "选项,则水平定义为账户上 "保证金水平 "指标的值(资金/保证金*100)。
    • 未实现 - 该字段指定当前未实现利润/亏损如何计入自由保证金:
      • 不使用未实现利润/亏损 - 计算时不考虑未结头寸。
      • 使用未实现利润/亏损 - 在计算中使用未结头寸的亏损和利润。
      • 使用未变现利润 - 只使用利润。
      • 使用未变现亏损 - 只使用亏损。
    • Daily fixed(每日固定)- 该字段指定如何在自由保证金中考虑交易者在交易日内固定的利润/亏损:
      • 使用每日固定利润/亏损 - 在自由保证金中考虑交易日内固定的利润和亏损。
      • 使用每日固定损失 - 在自由保证金中只考虑交易日内的固定损失。当日累计利润固定在一个单独的账户字段("锁定")中。交易日结束时,累计利润被释放(清零),并反映在账户余额中(计入自由保证金)。
    • 当日结束时释放累计利润 - 只有启用 "使用每日固定损失 "选项后,才可使用该选项。如果启用,则在交易日结束时,当日累积的利润将被释放并记录在余额中(并相应计入自由保证金)。否则将不会被释放。


    佣金
    在此部分,您可以完全控制所有交易的佣金收取方式。 。

    • 佣金可以是单层次或多层次的,即无论交易量/交易额多少,都收取相同金额的佣金,或者根据交易量/交易额的大小收取不同的佣金。相关信息显示在规范中。
    • 佣金可以在交易执行时立即收取,也可以在交易日/月结束时收取。
    • 佣金可根据交易方向收取:进场交易、出场交易或两类交易。
    • 佣金可按每手或每笔交易收取。
    • 佣金可按不同金额收取:货币、百分比或点数。



  9. 测试器:在 "Market Scan"(市场扫描)模式下,对 "Market Watch"(市场观察)中的所有符号进行多次测试时,可优化并大大加快工作速度。
  10. 测试:在计算点数利润时,现在会考虑交易或头寸的大小。以前,计算时不考虑交易量 - 如一手。
  11. 测试员:改进了优化结果图表管理。放大常规优化图表时,现在可以滚动它。双击图表上的某一点,现在可在通过率表中高亮显示相应结果。
  12. 元编辑器:在 "导航器 "中增加了 SQLite 数据库文件 (*.db;*.sdb;*.sqlite;*.db3;*.s3db;*.sqlite3) 的显示。
  13. 元编辑器:修复了保存项目属性时的错误。
  14. 更新了文档。

更新将通过 LiveUpdate 系统提供。


 

稳定版 5 build 2340DatabaseImport 在执行时显示相同的DatabaseImport

2020.02.22 14:01:42.338 MQL5 'DOMcopy.ex5' 有较新的不支持版本,请更新您的客户终端

 

您好!

,我试图在指标中创建一个与数据库的连接,但不知为什么没有成功。

为什么没有在任何地方写明,我可以在哪些程序中使用数据库?