使用Python读取Amibroker价格和成交量数据

7

我想使用Python读取Amibroker股票符号的价格和成交量数据。我在谷歌上找不到有用的信息来做这件事。有人能帮忙吗?


1
这不是一个真正的编程问题。http://stackoverflow.com/help/mcve.这可能会有所帮助:https://dev59.com/JnRB5IYBdhLWcg3wvpqc - joel goldstick
4个回答

2

:不要犹豫,完全打开美味糖果盒子

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

虽然AB为数据访问提供了几种集成选项,但是在量化R&D中花费了大约12年的时间后,我的建议是:采用分布式(忘记花费时间实现特定数据元素(Volume)的特定访问,并且不再依赖状态共享 - 而是开始使用智能进程间通信和智能代理信号python-请求,AmiBroker-即时回应等)。

免费的Python端(无论是在localhost上还是在另一个大陆上运行)

这被认为是非常简单和非常灵活的,可以扩展和工具/模块可用性,让我在此直接跳过它,您更好地预先了解您在Python方面需要什么,大多数需求已经实现或者很容易添加为几个模块扩展。
AmiBroker方面--较难的部分
Tomasz Janeczko写了很多关于AB集成的特定模式--基于DLL的模式。为什么? DLL允许一个人在系统到系统通信架构中获得平稳和完全可控的集成。
“将...”翻译成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++代码的人)设计的。
当使用AmiBroker Development Kit(ADK)编写插件DLL时,通常会使用Microsoft C运行时库进行编译。问题在于,根据使用的编译器,操作系统需要加载不同版本的C运行时才能加载DLL。

例如,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 模式后,人们可以为几乎任何智能消息框架实现基于 DLL 的包装器,例如 ZeroMQnanomsg 等等,然后,在进一步进行系统间通信时,只有您的想象力是限制。

  • python-请求,AmiBroker-回复
  • AmiBroker-请求,python-回复
  • AmiBroker-请求,remote-GPU-回复
  • AmiBroker-请求,remote-AI/ML-预测并发布交易设置/交易管理的目标(适用于低延迟时间--数十毫秒--适合于低强度的高频交易策略)
  • AmiBroker-发布,remote-ComputingGrid-处理并向其他人发送任何后处理的信号

1
我不确定您的情况是什么,但您有几个选项。
最终,关于股票的所有信息都存储在AB数据库中,您可以从AFL访问该数据库。因此,要将价值传递到Python中,您可以创建一个文本文件,供Python代码读取。
您的下一个选择是直接与AB COM对象交互,请参阅指南。我不知道如何在Python中实现。
这是COM对象指南,在行情下面:
“Quotation类表示一条价格数据的栏。”

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

以下链接是我在另一个关于AB COM互操作的答案中提出的想法。

C#中CreateObject等效代码

Sethmo


文件化的数据元素交接是可行的,但已经是第三千年了,这样的自动化可能有一个更合适的架构,是吧?基于COM的集成模型是更好的一步,但限制了部署到与AmiBroker相同的<localhost>上的Python,这限制了处理性能(+在近期和将来始终需要完整的自顶向下的基于COM的集成路径=(Microsoft O/S+API+AmiBroker+(python)win32com.client),所以未来令人兴奋的希望 (对DDE在Vista64中未实现的情况))。 - user3666197

1
你可以尝试将我修改的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" ); ​


0
//Price Volume of the ticker (Formula: Close x Volume)

  Price_Volume = C*V

//Price Volume of specific ticker (eg. SPY) (Formula: Close x Volume)

  Price_Volume_SPY = foreign("SPY","C")*foreign("SPY","V")

//Yesterday Price Volume of specific ticker (eg. SPY) (Formula: Close x Volume)

  Yesterday_Price_Volume_SPY = Ref(foreign("SPY","C"),-1)*Ref(foreign("SPY","V"),-1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接