【问题标题】:Read Amibroker price volume data using python使用 python 读取 Amibroker 价格交易量数据
【发布时间】:2016-07-19 22:43:56
【问题描述】:

我想使用 python 读取 Amibroker 股票代码的价格交易量数据。我在谷歌上找不到任何有用的东西。有人可以帮忙吗?

【问题讨论】:

标签: python stocks trading amibroker


【解决方案1】:

Cool:请不要犹豫,把美味的糖果盒完全打开

与其他交易框架一样,AmiBroker 可以提供数据,但它是一个紧凑的 (~ 3.5 MB .EXE + .DLLs)、性能优化的可执行文件,不像 Java 或 .NET 程序那样需要任何内部虚拟机都可以在字节码级别解释用户进程,但在机器码级别上全速运行。

虽然 AB 为数据访问提供了多种集成选项,但我的建议——在过去 12 年从事定量研发之后——将是:去分布式(忘了花时间来实现对某些数据元素( Volume )的特定访问,而不是进一步依赖状态共享——而是开始使用智能进程间通信和智能代理间信令python-询问,AmiBroker-临时回复等)。

Python 方面——免费(......无论是在localhost 还是其他大陆上运行)

众所周知,根据扩展和工具/模块的可用性,这非常简单且非常灵活,这让我可以直接跳过它,您先验地知道您在 python 方面需要什么,并且大部分需求已经实现已经或很简单地添加为一些模块扩展。

AmiBroker 方面——更难的部分

Tomasz Janeczko 写了很多关于 AB 集成的特定模式 - 基于 DLL 的模式。为什么? DLL-s 允许在系统间通信架构中实现所需的平滑且完全可控的集成。

(cit.:) "... 将 ... 翻译成 C/C++ 语言并编译为 AFL 插件 DLL。这样做需要一些C/C++ 编程知识、C/C++ 编译器(可以使用免费的 Visual Studio Express 或 GNU 工具)和 AmiBroker 开发工具包 (ADK)。

ADK 包含如何编写您自己的 AFL 插件的说明以及可以编译的代码示例。不过需要一些 C/C++ 知识。

ADK 是免费的可从
http://www.amibroker.com/bin/ADK.exe 下载(自解压 exe) 要么 http://www.amibroker.com/bin/ADK.zip(zip 存档)

注意:ADK 不适合初学者。它适用于程序员(即那些已经写过一些 C/C++ 代码的人)。”

小心:

当插件DLL 使用 AmiBroker 开发工具包 (ADK) 编写时,它通常使用 Microsoft C 运行时库进行编译。 “问题”在于,根据使用的编译器,操作系统加载DLL 需要不同版本的 C 运行时。

例如,Visual C++ 6.0 链接到 MSVCRT.DLL,这在从 Windows XP 开始的所有 Windows 中都很常见,因此您可以“忘记”安装运行时。但是,当使用更新的 Visual C++ 2005、2008 或 2010 编译插件时,目标(客户端)计算机上几乎不会出现所需的 C 运行时库。

为了加载使用 VC2005 或更高版本编译的插件,必须在客户端计算机上安装适当的运行库。运行时必须与编译器版本和用于编译DLL 的最终编译器服务包完全匹配,否则操作系统将不会加载DLL。适当的运行时 (vcredist.exe) 位于:

VCInstallDir\SDK\v2.0\Bootstrapper\Packgages\vcredist_x86 要么
VCInstallDir\SDK\v2.0\Bootstrapper\Packgages\vcredist_x64

或类似的目录(取决于所使用的 VC 版本)。然后,必须将此类vcredist.exe 与 DLL 一起提供给所有客户端以进行安装。

或者,可以使用静态运行时库编译DLL

有一个名为 Dependency Walker (http://www.dependencywalker.com/) 的免费软件工具,允许检查给定的 DLL 需要由操作系统加载。

另外——您绝对需要确保您的插件使用“多线程 DLL”运行时库。天哪,Visual C++ 编译器(2005 和 2010)不再允许选择单线程运行时。

所以 - 将您的 DLL 放入“插件”目录,如果它没有出现在数据源列表中,则意味着它的位数(32 位 / 64 位)与 AmiBroker 不匹配。

准备好使用DLL-mode,可以为几乎任何类似的智能消息框架实现基于DLL的包装器ZeroMQnanomsg 等人实现了这一点,您的想象力是与 python 进行进一步系统间通信的唯一限制。

  • python-询问,AmiBroker-回复
  • AmiBroker-询问,python-回复
  • AmiBroker-询问,remote-GPU-回复
  • AmiBroker-询问,remote-AI/ML-预测并发布交易设置/交易管理的目标(以低延迟时间工作 - 数十个 [ms] - - 适用于即使是低强度的 HFT 策略),
  • AmiBroker-发布,remote-ComputingGrid-处理并向其他任何人发出信号以进行任何后期处理

【讨论】:

    【解决方案2】:

    我不确定您的方案是什么,但您有几个选择。

    最终,有关股票的所有信息都存储在 AB 数据库中,您可以从 AFL 访问该数据库。因此,要将值导入 Python,您可以创建一个 Python 代码可以读取的文本文件。

    您的下一个选项是直接与 AB COM 对象交互,请参阅指南。我不知道如何在 Python 中做到这一点。

    这是 COM 对象指南,在引文下:

    报价类代表一根价格数据

    https://www.amibroker.com/guide/objects.html

    下面的链接是我发布的关于 AB COM 互操作的另一个答案的想法。

    Equivalent code of CreateObject in C#

    赛斯莫

    【讨论】:

    • 基于文件的数据元素移交是可行的,但它是第三个千年,这种自动化可以有一个更好的定制架构,不是吗?基于 COM 的集成模型更好,同时将部署限制为与 AmiBroker 驻留在同一 上的 python,这限制了处理性能(+引入了对拥有整个自上而下的基于 COM 的集成路径的最终依赖在不久的将来总是可用 = (Microsoft O/S+API +AmiBroker +(python)win32com.client) 如此激动人心的未来(发生在 Vista64 中未实现的 DDE)
    【解决方案3】:

    您可以尝试将我修改 Amibroker 示例的这个 javascript 更改为 Python。此 javascript 会将 Amibroker 数据库转储到文件中。该脚本将让您了解如何访问 Amibroker 中的数据库。

    function FormatFloat( number )
    {
    	number = 0.001 * Math.round( number * 1000 );
    	str = number.toString();
    	return str.substring( 0, str.indexOf(".") + 4 );
    }
    
    var oAB = new ActiveXObject("Broker.Application"); 
    var fso = new ActiveXObject("Scripting.FileSystemObject"); 
    
    /* Indicate the location and file name for the database dump. */
    file = fso.OpenTextFile( "C:\\Info.txt", 2, true ); 
    
    /* Indicate the location and name of the database to dump. */
    oAB.LoadDatabase("C:\\Program Files (x86)\\AmiBroker\\Data");
    
    var oStocks = oAB.Stocks; 
    var Qty = oStocks.Count;
    
    for( i = 0; i < Qty; i++ ) { /* Loop through all the stocks in the database. */
    	oStock = oStocks(i);
    	for (j = 0; j < oStocks(i).Quotations.Count; j++) { /* Loop through all the ohlcv in each stock. */
    		oQuote = oStock.Quotations( j );
    		var oDate = new Date( oQuote.Date );
    		file.WriteLine( oStocks(i).Ticker + "," + 
    			(oDate.getMonth()+1) + "/" + oDate.getDate() + "/" + oDate.getFullYear() + "," + 
    			FormatFloat( oQuote.Open ) + "," + 
    			FormatFloat( oQuote.High ) + "," +
    			FormatFloat( oQuote.Low ) + "," +
    			FormatFloat( oQuote.Close ) + "," + 
    			Math.round( oQuote.Volume )  );
    	}
    } 
    file.Close(); 
    WScript.Echo("Export finished" ); ​

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 1970-01-01
      • 2020-09-26
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      相关资源
      最近更新 更多