有关数据源:Universal DDE
DDE(动态数据交换)是一个在MS窗口环境应用中的数据交换所广泛使用的协议。更多资料,详见官方说明:
[url=https://docs.microsoft.com/zh-cn/windows/win32/dataxchg/about-dynamic-data-exchange?redirectedfrom=MSDN]https://docs.microsoft.com/zh-cn/windows/win32/dataxchg/about-dynamic-data-exchange?redirectedfrom=MSDN[/url]
[b]1 MC中的 DDE 功能和限制[/b][b]1.1 [/b][b]功能[/b][list][*]用户定义的 DDE Server/Topic/Item 可以使用 成交价、成交量、买价、买量、卖价和卖量。[*]极速的创建、编辑和应用 DDE 模板。[*]测试DDE服务器或新创建的模板的功能[*]支持各种服务器类型。一些DDE服务器与Microsoft规范相冲突。
为了最大限度地方便用户,该程序有一组可深度定制的选项(这里没有描述)。[/list][list][*]自动重新连接,以防与DDE服务器的连接丢失。[/list]
[b]1.2 [/b][b]限制[/b][list][*]目前不支持以下字段类型:时间、开盘价、最高价、最低价、收盘价、总成交量、变动。[*]程序只接收ticks资料,并将当前系统时间分配给tick。有时ticks的实时时间可能会因为延迟而与分配的时间不同。[*]状态栏不会显示在图表上,因为没有足够的字段来绘制它[/list]
[b]2 设置[/b][list=1][*]QM 上,工具栏,点击 数据源[*]选择“Universal DDE”并点击“设置”[*]输入一个模板名称(最多20个字符)[*]在相应的栏位输入 DDE 连接(字段包括成交价、买价、卖价;价格和量在每个字段必须同时设定;如果没有量,可以用对应的价格替代。)因为程序对每一个价格都要查询其交易量,所以这个字段永远不会是空的,因为程序将等待交易量数据形成一个新的tick。[*]在建立DDE连接之前,要先确保 EXCEL 中已经启用 DDE。
然后,将链接复制到通用DDE中相应的字段,并将静态符号名称替换为星号符号*。
比如:
WINROS|LAST!MSFT要换成 WINROS|LAST!*[*]点击“测试”,确认创建的模板是否能用。输入商品名称,点击确定。[/list]
[p=22, 2, left]如果DDE服务器正在运行,模板已经正确创建,并且可以访问查询的商品,那么您将看到每个字段的当前值和更新的数量。[/p][p=22, 2, left]如果行情不可使用,请检查模板和商品名称。[/p]
[b]3 使用 EXCEL 的Universal DDE[/b]
[b][attach]29022[/attach]
[/b]
[b][list=1][*]打开 UniversalDDE 数据源设定。[*]建立一个 EXCEL 表格,如:xls 并保持到电脑的文档中。[*]在 EXCEL 中,将坐标设置为R1C1格式(单击Office按钮- Excel选项-公式-使用公式-激活R1C1参考样式)。单元格坐标将从,例如A1变为R1C1,即第1行第1列。[*]在Universal DDE设置中,价格和成交量的公式如下:
[b]=EXCEL|'Book1.xls'!*C1[/b]
其中“*”星号是预留位置,可以设定商品名称,R1、R2、..RN.[*]手动添加商品,命名为 R1, R2,R3,...RN,这样当它们被加入到 * 的位置,就形成了一个完整的单元格地址。[*]当你打开一个 DDE商品图表时,它将根据公式引用相应的单元格。[/list]
[p=22, 2, left]https://www.multicharts.com/trading-software/index.php/Universal_DDE[/p][/b] 关于动态数据 Exchange
Windows提供了几种在应用程序之间传输数据的方法。 一个方法是使用 动态数据 Exchange (DDE) 协议。 DDE 协议是一组消息和准则。 它在共享数据的应用程序之间发送消息,并使用共享内存在应用程序之间交换数据。 应用程序可以使用 DDE 协议进行一次数据传输和持续交换,其中应用程序可以在新数据可用时向彼此发送更新。
Windows还支持 动态数据 Exchange Management Library (DDEML) 。 DDEML 是一个动态链接库 (DLL) 应用程序可用于共享数据。 DDEML 提供函数和消息,可简化向应用程序添加 DDE 功能的任务。 应用程序使用 DDEML 函数来管理 DDE 会话,而不是直接发送、发布和处理 DDE 消息。 (DDE 对话是客户端和服务器应用程序之间的交互。)
DDEML 还提供用于管理 DDE 应用程序共享字符串和数据功能。 DDE 应用程序不是使用原子和指向共享内存对象的指针,而是创建和交换字符串句柄(用于标识字符串)和数据句柄(用于标识内存对象)。 DDEML 还使服务器应用程序可以注册它支持的服务名称。 这些名称将广播到系统中其他应用程序,这些应用程序可以使用这些名称连接到服务器。 此外,DDEML 通过强制 DDE 应用程序以一致的方式实现 DDE 协议,确保这些应用程序之间的兼容性。
使用基于消息的 DDE 协议的现有应用程序与使用 DDEML 的应用程序完全兼容。 也就是说,使用基于消息的 DDE 的应用程序可以与使用 DDEML 的应用程序建立对话并执行事务。 由于 DDEML 具有许多优点,因此新应用程序应该使用它而不是 DDE 消息。 若要使用 DDEML 的 API 元素,必须在源文件中包括 DDEML 头文件,与 DDEML 库链接,并确保 DDEML 动态链接库位于系统的搜索路径中。
动态数据 Exchange协议
由于Windows具有基于消息的体系结构,因此传递消息是自动在应用程序之间传输信息的最合适方法。 但是,消息只包含 wParam (lParam) 用于传递数据的两个参数。 因此,当应用程序之间传递了多个信息词时,这些参数必须间接引用其他数据片段。 DDE 协议准确定义了应用程序如何使用 wParam 和 lParam 参数通过全局原子和共享内存句柄传递较大的数据片段。 DDE 协议具有用于分配和删除全局原子和共享内存对象的特定规则。
全局原子是对字符串的引用。 在 DDE 协议中,原子标识交换数据的应用程序、交换数据的性质以及数据项本身。 有关原子的信息,请参阅 关于原子。
用于Windows 动态数据 Exchange
DDE 最适用于不需要持续用户交互的数据交换。 通常,应用程序为用户提供一种方法,以在交换数据的应用程序之间建立链接。 但是,建立该链接后,应用程序无需进一步的用户参与即可交换数据。
DDE 可用于实现广泛的应用程序功能,例如:
链接到实时数据,例如股票更新、科学工具或流程控制。
创建复合文档,例如包含图形应用程序生成的图表的字处理文档。 使用 DDE 时,当源数据发生更改时,图表将发生更改,而文档的其余部分保持不变。
在应用程序之间执行数据查询,例如,在数据库中查询帐户到期的电子表格。
动态数据 Exchange用户的角度看问题
以下示例说明了两个 DDE 应用程序如何协作,如用户的角度来看。
电子表格用户想要使用Microsoft Excel来跟踪纽约股票股票Exchange。 用户有一个称为 Quote 的应用程序,该应用程序又有权访问该数据。 Excel与 Quote 之间的 DDE 对话如下所示:
用户通过提供应用程序的名称来启动聊天, (Quote) ,该名称将提供数据以及由 (与) 。 生成的 DDE 对话用于请求特定股票的报价。
Excel将应用程序和主题名称广播到系统中当前运行的所有 DDE 应用程序。 语录做出响应,建立与 EXCEL有关此主题的对话。
然后,用户可以在单元格中创建电子表格公式,该公式请求每当特定股票报价发生更改时自动更新电子表格。 例如,每当 ZAXX 股票的销售价格发生变化时,用户都可以请求自动更新,具体方法如下Excel公式:='Quote' | 'WHENEVER'!ZAXX
用户可随时终止 ZAXX 股票报价的自动更新。 单独建立的其他数据链接 (如其他股票的报价) 在同一个的按等同一个S/省/市/省/市
用户还可以终止有关该EXCEL与 Quote 之间的整个聊天,以便无需启动新聊天,就无法建立该主题的特定数据链接。
动态数据 Exchange概念
以下部分介绍了解动态数据交换的关键的重要概念和术语。
客户端、服务器和聊天
应用程序、主题和项名称
系统主题
永久数据链接
原子和共享内存对象
客户端、服务器和聊天
参与 DDE 的两个应用程序将参与 DDE 对话。 启动对话的应用程序是 DDE 客户端应用程序;响应客户端的应用程序是 DDE 服务器应用程序。 应用程序可以同时参与多个对话,在某些对话中充当客户端,在另一些对话中充当服务器。
DDE 对话在两个窗口之间进行,每个参与的应用程序各有一个。 窗口可能是应用程序的主窗口;与特定文档关联的窗口,如 MDI 应用程序 (多) 窗口;或隐藏 (隐藏) ,该窗口的唯一用途是处理 DDE 消息。
由于 DDE 会话由参与聊天的窗口的句柄对标识,因此不应将任何窗口与另一个窗口进行多个会话。 客户端应用程序或服务器应用程序必须为其与特定服务器或客户端应用程序的每个会话提供不同的窗口。
应用程序可以通过创建每个会话的隐藏窗口,确保一对客户端和服务器窗口永远不会涉及多个聊天。 此窗口的唯一用途是处理 DDE 消息。
应用程序、主题和项名称
DDE 协议使用应用程序、主题和项名称的三级层次结构标识客户端和服务器之间传递的数据单位。
每个 DDE 会话都由应用程序名称和主题唯一定义。 在 DDE 会话开始时,客户端和服务器确定应用程序名称和主题。 应用程序名称通常是服务器应用程序的名称。 例如,当Excel充当聊天中的服务器时,应用程序名称Excel。
DDE 主题是数据的一般分类,其中可以"讨论"多个数据项, (聊天) 交换数据项。 对于对基于文件的文档进行操作的应用程序,主题通常是文件名。 对于其他应用程序,该主题是特定于应用程序的名称。
由于客户端和服务器窗口一起处理标识 DDE 会话,因此在会话过程中无法更改定义会话的应用程序名称和主题。
DDE 数据项是应用程序之间交换的聊天主题相关信息。 数据项的值可以从服务器传递到客户端,也可以从客户端传递到服务器。 可以使用任何标准剪贴板格式或已注册的剪贴板格式传递数据。 名为 Link 的特殊已注册格式标识 DDE 聊天中的项。 有关剪贴板格式详细信息,请参阅 剪贴板。
系统主题
应用程序应支持系统主题。 本主题提供了一个上下文,用于了解另一个应用程序可能普遍感兴趣的信息。
数据项值必须以 CF _ TEXT 剪贴板格式呈现。 系统主题的项值的单个元素必须用制表符分隔。 下表为系统主题提供了一些建议。
[table]
[td][tr][td]项目[/td][td]说明[/td][/tr]
[tr][td]格式[/td][td]应用程序可以呈现的剪贴板格式的制表符分隔列表。 通常 _ ,CF 格式与名称的 _ "CF" 部分一起列出 (例如 ,CF _ TEXT 列为 "TEXT") 。[/td][/tr]
[tr][td]帮助[/td][td]简要说明如何使用 DDE 服务器的文本。[/td][/tr]
[tr][td]ReturnMessage[/td][td]有关最近使用的 [url=https://docs.microsoft.com/zh-cn/windows/win32/dataxchg/wm-dde-ack]WM _ DDE _ ACK[/url] 消息的支持详细信息。 当需要超过 8 位特定于应用程序的返回数据时,此项非常有用。[/td][/tr]
[tr][td]状态[/td][td]应用程序当前状态的指示。 当服务器收到此系统主题项 [url=https://docs.microsoft.com/zh-cn/windows/win32/dataxchg/wm-dde-request]的 WM _ DDE _ 请求[/url] 消息时,它应适当地发布包含 Busy 或 Ready 字符串的 [url=https://docs.microsoft.com/zh-cn/windows/win32/dataxchg/wm-dde-data]WM _ DDE _ DATA[/url] 消息进行响应。[/td][/tr]
[tr][td]SysItems[/td][td]应用程序支持的系统主题项的列表。[/td][/tr]
[tr][td]TopicItemList[/td][td]与 SysItems 项类似,只不过除系统主题以外的每个主题都应支持 TopicItemList。 这允许浏览任何主题下支持的项。 如果无法枚举项,则此项应仅包含"TopicItemList"。[/td][/tr]
[tr][td]主题[/td][td]应用程序当前支持的主题列表;此列表可能会因时刻而异。
[/td][/tr]
[/table] 永久数据链接
DDE 会话开始后,客户端可以与服务器建立一个或多个永久数据链接。 数据链接是一种通信机制,每当指定数据项的值发生更改时,服务器都会通过该机制通知客户端。 数据链接是永久性的,即此通知过程将一直持续到数据链接或 DDE 会话本身终止。
有两种类型的永久 DDE 数据链接:暖和热。 在暖数据链接中,服务器通知客户端数据项的值已更改,但服务器不会将数据值发送到客户端,直到客户端请求它。 在热数据链接中,服务器会立即将更改的数据值发送到客户端。
支持暖数据链接或热数据链接的应用程序通常会在"编辑"菜单中提供"复制或粘贴 链接"命令,使用户能够在应用程序之间建立链接。
原子和共享内存对象
DDE 消息的某些参数是全局原子或共享内存对象。 使用这些参数的应用程序必须遵循有关何时分配和删除这些参数的显式规则。 在任何情况下,消息发送方都必须删除由于错误条件(例如 PostMessage 函数失败)而预期接收方不会接收的任何原子或共享内存对象。
DDE 将共享内存对象用于三个目的:
携带要交换的数据项值。 这是 WM DDE DATA 和 WM _ DDE _ 一文的 hData 参数引用 _ _ 的 项。
在消息中携带选项。 这是 WM _ DDE _ 建议消息中的 hOptions 参数引用的项。
携带命令执行字符串。 这是 WM _ DDE _ EXECUTE消息及其对应的 WM DDE ACK 消息中的 hCommands 参数 _ _ 引用的项。
接收 DDE 共享内存对象的应用程序必须视为只读。 应用程序不得将 对象用作相互读写区域,以自由交换数据。
与 DDE 原子一样,应用程序应释放共享内存对象以有效地管理内存。 应用程序还应锁定和解锁内存对象。
动态数据 Exchange消息概述
由于 DDE 是基于消息的协议,因此不采用任何函数或库。 所有 DDE 事务都是通过客户端和服务器窗口之间传递某些定义的 DDE 消息进行的。
有 9 条 DDE 消息;这些消息的符号常量在 DDE 头文件中定义。 此头文件中还定义了各种 DDE 消息的某些结构。
下表总结了 DDE 消息。
动态数据 EXCHANGE消息概述
消息
说明
WM _ DDE _ ACK
确认接收或不接收消息。
WM _ DDE _ 建议
请求服务器应用程序在数据项发生更改时提供更新或通知。 这将建立永久数据链接。
WM _ DDE _ 数据
向客户端应用程序发送数据项值。
WM _ DDE _ EXECUTE
将字符串发送到服务器应用程序,预计会以一系列命令形式处理该字符串。
WM _ DDE _ INITIATE
启动客户端和服务器应用程序之间的会话。
WM _ DDE _ POKE
向服务器应用程序发送数据项值。
WM _ DDE _ 请求
请求服务器应用程序提供数据项的值。
WM _ DDE _ TERMINATE
终止会话。
WM _ DDE _ UNADVISE
终止永久数据链接。
应用程序调用 SendMessage 发出 WM _ DDE _ INITIATE 消息或 WM _ DDE _ ACK 消息,以响应 WM _ DDE _ INITIATE。 所有其他消息由 PostMessage 发送。 这些调用的第一个参数是接收窗口的句柄;第二个参数包含要发送的消息;第三个参数标识发送窗口;第四个参数包含特定于消息的参数。
动态数据交换消息 Flow
典型的 DDE 对话包含以下事件:
客户端应用程序启动会话,服务器应用程序进行响应。
应用程序通过以下任意或全部方法来交换数据:
服务器应用程序将数据发送到客户端请求的客户端。
客户端应用程序将未经请求的数据发送到服务器应用程序。
客户端应用程序请求服务器应用程序在数据项更改 (暖数据链接) 时通知客户端。
客户端应用程序请求服务器应用程序在数据更改时发送数据 (热数据链接) 。
服务器应用程序执行客户端请求发出的命令。
客户端或服务器应用程序终止会话。
处理来自客户端或服务器的请求的应用程序窗口必须严格地按接收顺序处理这些请求。
客户端可以与多台服务器建立会话;服务器可以与多个客户端建立会话。 处理来自多个源的消息时,客户端或服务器必须同步处理会话的消息,但不需要同步处理所有消息。 换句话说,它可以根据需要从一个会话切换到另一个会话。
如果某个应用程序由于正在等待 DDE 响应而无法处理传入的请求,则它必须通过将一个与 DDEACK结构的 fBusy 成员设置为1的 WM _ DDE _ 确认消息发布来防止死锁。 如果出于任何原因而无法在合理的时间内处理传入的请求,应用程序也可以发送繁忙的 WM _ DDE _ 确认 消息。
应用程序应该能够处理客户端或服务器在特定时间内响应消息的故障。 由于超时间隔可能因应用程序的性质和用户系统的配置而异 (包括是否连接到网络) ,因此应用程序应为用户提供指定时间间隔的方式。
参数包装函数
许多 DDE 消息的 lParam 参数包含两个数据片段。 例如, WM _ DDE _ DATA消息的 lParam 包含数据句柄和 atom。 应用程序必须使用 PackDDElParam 函数将句柄和 atom 打包到 lParam 参数,并使用 UnpackDDElParam 函数删除这些值。 DDE 应用程序必须将 PackDDElParam 和 UnpackDDElParam 用于 dde 对话过程中发布的所有消息。
应用程序还可以使用 ReuseDDElParam 和 FreeDDElParam 函数。 ReuseDDElParam 允许 DDE 应用程序重复使用打包的 lParam 参数,有助于减少在会话过程中应用程序必须执行的内存重新分配数。 应用程序可以使用 FreeDDElParam 来释放与 DDE 对话期间接收的数据句柄关联的内存。
动态数据交换和模拟
为了使服务器能够模拟客户端,客户端将调用 DdeSetQualityOfService 函数。 安全 _ 模拟 _ 级别结构用于控制服务器可能执行的模拟级别。
DDE 服务器可以通过调用 ImpersonateDdeClientWindow 函数来模拟 dde 客户端。 DDEML 服务器应使用 DdeImpersonateClient 函数。
页:
[1]