发布于: Android转发:0回复:2喜欢:0
大概在一年前,当时写了MT4接入A股数据,其实本质上是为了利用MT4/5成熟的回测环境和交易环境以及好用的图表操作,用于研究。这一年中也陆陆续续的尝试了杜卡的JFroex,cTrader。这几个产品,个人认为都是交易软件中非常 优秀的。MT4/5和JFroex相比,优势在于国内使用者较多,社区资源也相对比较丰富。劣势在于其DSL的设计上没有形成和当前主流编程语言相匹配的设计,编写起来较为繁杂,想引用开源的类库需要使用dll,并且生态比较脆弱,自带的开发工具也比较弱。就算是用习惯的vim或者vscode进行相应的配置,然后自己也写了相关的插件用起来确实还是不舒服,没有社区的力量要偷懒起来没有那么容易。有一段时间我就直接socket把数据发到python,然后用mt5提供的python接口拿数据出来运算,再往里面丢单子,稳定性一般,非常依赖警报和日志排错(这里也许是因为我有部分代码是在c++中完成的缘故。和JFrox相比,他的图表流程性也是远在其之上的。

JFroex是纯java编写,有提供一个脱离本身应用的sdk,是个maven项目,除了网络环境限制,在各方面都非常不错。本身java的生态就非常棒,不像mt5需要借助windows-api里面的socket或者自己编译zmq来和其他语言通讯来便捷的实现功能。JFroex-SDK上生成脱机图表,回测报告一条龙写起来也非常的舒服,网络原因的话设置一下缓存目录也能解决,开发工具有IDEA更是如虎添翼。并且熟悉虚拟机底层的话,进行一些hook操作和抓包把任何交易品种的数据灌进去也是没有问题的,A股当然也不在话下,但是这么做仅限于个人研究。

网页链接

上面我是用杜卡官网的demo基于swing界面做了一些简单的修改,用于个人回测足够了。java的稳定性足够好,杜卡提供的历史数据足够多,策略放在云服务器上面跑也是挺放心的,起码不会像MT4/5那样担心自己对指针和内存不熟悉导致程序崩溃,这点也是我半路出家程序的缘故,对于c/c++较为不熟悉。

这几款优秀的产品的目的和重心大都在交易上,而不是研究上。平台的本质就是让交易者不断进行交易才能给他们带来丰厚的利润这点无可厚非。但是在研究上,不得不说给初入门槛的人造成了不小的障碍和门槛。国内在量化研究上也有一些优秀的社区例如vn.py和tushare。两个社区都非常活跃,但是在图形化上相对Tradingview还是比较弱的,我当时的想法是一份有历史数据的csv文件和一个趁手的编程语言和相关的金融知识,就可以开始简单的量化研究。

但是每次看到可以拿来就用的上述平台工具就犯懒,直到我真正无法忍受大量的时间用于核对平台提供给我的错误信息去让我修改我的代码。我决定自己实现一套单纯用于研究的框架。当我真的拿出一天的时间来细细思考过后,其实我发现任何编程语言加上历史数据都可以让一个程序员实现出适合自己的探索工具。花了几天时间当我写完之后,发现这一切并不是当初所想的那么困难

接下来,我们用python简单的描述一下其中的逻辑,如果有人面临和我一样困局,经过一段时间的思考和编程之后,都可以实现让自己舒服的探索工具,这里我只依赖了少数几个python的开源库,例如pandas,arrow(用于时间处理的)

首先我们需要一个市场

class SimpleMarket(): # 数据队列 bar_queue = queue.Queue() istrategy = None # 历史数据 history = [] # 当前时间戳 timestamp = 0 def __init__(self, params): log.info("init market finished") def initialization(self, csvpath: str): """ 初始化数据 1.读文件 2.构成列表 3.根据时间排序 bar_queue.put() """ database = pd.read_csv(csvpath, ',')[:1000] # 初始化数据仓库 def mount_strategy(self, istrategy: strategy.StrategyBase): """ 挂载策略 """ self.istrategy = istrategy self.istrategy.mk = self log.info("mount strategy=[%s]", istrategy.name) def get_bars(self, start, end): hs = self.history r = [b for b in hs if start
这个市场其实就是一份csv文件的内存映射,他的主要功能有

1.初始化历史数据仓库

2.挂载策略

3.维护一个历史数据的队列

4.获取历史数据

然后在初始化完成之后,进行队列的出栈操作,把一根K线数据或者Tick价格推入策略中


接下来我们需要一个策略的抽象类

class StrategyBase(metaclass=abc.ABCMeta): # 策略名 name = "" # 本金 principal = 0 # 维持的最低本金 deadline = 0 # 未成交订单 undel_orders = {} # 持单的订单 holding_orders = {} # 已关闭的订单 close_orders = {} # 是否正在运行 running = True # 波动点数和盈利金额的系数 __coefficient = 1000 mk = None def __init__(self, name): self.name = name @abc.abstractmethod def onBar(ibar: bar.IBar): """ 每根K线产生的时候触发 """ pass @abc.abstractmethod def onFinish(self): """ 结束触发 """ pass def submitOrder(self, iOrder: order.Order): """ 提交一个订单 """ return iOrder.orderId def orderCheck(self, ibar: bar.IBar): """ 订单检查 """ # 1.检查是否有订单进场 self.orderCheckEnter(ibar) # 2.检查是否有订单止损 self.orderCheckEnter(ibar) # 3.检查是否有订单止盈 self.orderCheckEnter(ibar) def orderCheckEnter(self, ibar: bar.IBar): """ 检测是否有订单进场 """ def orderCheckStopLoss(self, ibar: bar.IBar): """ 检测是否有订单止损 """ def orderCheckTakeProfit(self, ibar: bar.IBar): """ 检测是否有订单止盈 """ def __orderClose(self, iOrder: order.Order, isTakProfit): """ 关闭订单事件触发 """ @abc.abstractmethod def orderCloseEvent(self, iOrder, isTakProfit): """ 订单被关闭 :param iOrder: 订单 :param isTakProfit 是否盈利 :return: """ pass def stop(self): running = False

策略类的主要功能就是

1.监听价格变化和订单变化并获取相应信息

2.下单

3.记录订单的变化和下单的依据

4.记录资金曲线

策略抽象类里面应该挂载着订单信息和账户信息,这里我纠结了一段时间这些信息是否要和其他平台一样放在大的市场容器中,但是后来我想这些东西本质还是策略在管理的,所以把他作为策略的一部分。一开始的时候我们不可能一下子就进行多个策略并行的研究,这个策略的抽象类负责管理订单,和账户相关的逻辑。相关代码被我隐去,根据注释实现起来并不难

到这里,我们的回测框架其实已经大致完成了。从上面可以看出,当SimpleMarket.start的时候, 我们自己实现一个StrategyBase的子类,并且将其挂载在Market上,就会被每个onBar触发,当策略结束的时候,我们就可以对我们的订单进行分析


最后我们来到了可视化部分

可视化是为了帮助我们从图形上来分辨和研究一些东西,python的matplotlib和其他语言都有相对应的库。但是matplotlib搞这个真的太累了。所以我还是选了js。毕竟h5搞起这些图表来还是毕竟轻松的,资金曲线和一些常用曲线可以用echart,highchart等实现。K线图可以用anystock,tradingview来实现,在上面绘制矩形或者画个指标什么的还是很容易的。这里我用的是flask作为容器,tradingview作为前端来实现的

网页链接

当可视化完成之后,我们可以利用之前策略中的很多信息,提出很多假设。最简单的拿决策树来说,我们可以根据各种收集到的观察变量为基础,订单是否盈利为目标.利用这些观察变量的相对信息熵来发掘其中的逻辑。

网页链接


这大概就是我心中的对于市场的探索的途径,也许十分不成熟,和大的机构相比堪称简陋。在这个时代的市场中,我有幸能听到很多关于市场确定性的理论。也有百年一人这样的前辈甘于分享自己的思想,当然还有很多不愿意透露姓名的前辈教给了我很多很多关于认知世界,认知自己的思想,以及认知的不同角度和不同层次。这些都是鼓励我不断往下走下去的力量,让我学会去思考。希望在将来,我们都可以为这个行业做出一份自己贡献
引用:
2020-06-03 12:19
已经找到解决办法了:在淘宝买了个接口程序,目前已经实现所期望的功能,谢谢大家回复。 本悬赏终止。//有没有一个可用的软件,能把A股数据实时应用在外汇MT4里? 求告知现成的程序软件,或教我简单的实现方法。谢谢了!
$东方财富(SZ300059)$ $大智慧(SH601519)$ $同花顺(SZ300033)$

全部讨论

2020-06-04 09:24

不客气

2020-06-03 18:53

谢谢你回复了这么多,无论是不是转发的。只是我是编程外行,看不懂。 我要实现的只是用MT4将股票/ETF数据用来套利,用MT4的MQL4简单编写EA程序直观显示两个品种的比值。我只会一点点MQL4,别的都不会。 因为套利的其中一个外盘指数品种,只有MT4平台里可以交易(或许MT5/cTrade也有,但我不会编程)。 能在MT4内仅用EA直观显示达到半自动目的就好。