MT4_应用于外汇交易的量化模型

MT4_应用于外汇交易的量化模型

  • 你好!欢迎浏览本文章
    • 模型设计的数据来源
      • 历史数据的提取与处理
        • 历史数据的选取与提取
        • 历史数据的处理
      • 寻找符合涨跌要求的历史数据段
      • 对已选取时间段的值进行技术分析
      • 对每个时间段的值及技术指标值进行绘图
      • 调用所有函数并运行
    • 数据指标的分析
    • 量化模型的编写

你好!欢迎浏览本文章

我是一个交易爱好者,利用工作闲暇时间设计了本交易模型。该模型应用于外汇交易中的欧元与美元对,大致思路为通过对历史近一年的交易数据进行技术分析,找到该时间段内符合涨跌幅度的时间段并计算其对应的交易指标值,后通过对所有时间段下的交易指标值进行分析,综合得出一套交易模型。想法较为朴素简单,欢迎各位指点与交流。

模型设计的数据来源

历史数据的提取与处理

历史数据的选取与提取

关于选取哪个交易时间段,根据我的交易习惯及经验,同时又综合了对网上各种交易经验的总结,最终我选择了5Min的交易时间段。我平常交易的软件为MT4,该软件中存储有每个交易对每个时间段的历史数据,具体提取方式如下:
“工具”——“历史数据中心”——“导出”。历史数据提取界面
这里有一个小技巧,如果觉得历史数据太少可以往前拖动折线图的界面,直到拖到你想要的数据或者拖不动为止,”历史数据中心“会根据图形的覆盖范围储存相应时间的数据。亦可以在“工具”—“选项”—“图标”中将最多柱数调到最大。如果没有MT4软件的话,也可以直接从网上搜,附上一个网址“https://www.investing.com/currencies/eur-usd-historical-data”。

历史数据的处理

从MT4或者网上下载来的数据需要在表格简单处理一下,最终形式如下:
Excel处理后
需要注意的是,“Date”和“DateTime”两列的格式要与图片保持一致,“DateTime”的存在是为了后期给图片与数据存储的表格命名,其格式可参考公式“TEXT(A2,“yyyy-m-d”)&“-”&TEXT(C3,“h-mm”)”。

寻找符合涨跌要求的历史数据段

首先,应确定选取多大的涨跌幅度作为时间段的待选取条件,我选取的涨跌值为0.00350,时间间隔为3。由于外汇交易为双向交易,因此我们需要将做多方向的数据与做空方向的数据分开保存。以下函数的作用为将已有的历史数据进行分类再汇总,后利用遍历循环在历史数据中分别找出做多与做空方向中符合时间间隔为3、涨跌值大于0.00350的时间段。

import pandas as pddef data_process(path, num):# 引入数据列表csvdata = pd.read_csv(path)# 对数据进行简单分类汇总date = data['Date']time = data['Time']open = data['Open']high = data['High']low = data['Low']close = data['Close']volumes = data['Volumes']datetime = data['DateTime']# 遍历数据库,找到符合要求的数据集long_data = []short_data = []totalnum = 0for i in range(0, num, 1):if close[i + 3] - close[i] > 0.00350:totalnum += 1long_data.append({'Date': date[i - 56:i + 5], 'Time': time[i - 56:i + 5], 'Open': open[i - 56:i + 5],'High': high[i - 56:i + 5], 'Low': low[i - 56:i + 5], 'Close': close[i - 56:i + 5],'Volumes': volumes[i - 56:i + 5], 'DateTime': datetime[i - 56:i + 5]})if close[i + 3] - close[i] < -0.00350:totalnum += 1short_data.append({'Date': date[i - 56:i + 5], 'Time': time[i - 56:i + 5], 'Open': open[i - 56:i + 5],'High': high[i - 56:i + 5], 'Low': low[i - 56:i + 5], 'Close': close[i - 56:i + 5],'Volumes': volumes[i - 56:i + 5], 'DateTime': datetime[i - 56:i + 5]})else:continuepd.set_option('display.max_columns', None)pd.set_option('display.max_rows', None)return long_data, short_data

对已选取时间段的值进行技术分析

根据日常交易中常用的技术指标并结合MQL语言(MT4编程语言)中自带的技术指标库,我一共选取了11种技术指标用于分析整理,分别是:RSI、EMA、MACD、布林线、SAR、OBV、ATR、CCI、ADX、STOCH、MFI。本函数利用了Python自带的talib库,利用历史数据中的数据值分别将这些指标进行计算并保存,上手比较简单,理解起来也比较容易。

import talibdef indicators(path, num):indicator = []for i in range(0, num, 1):rsi = talib.RSI(path[i]['Close'])ema = talib.EMA(path[i]['Close'])macd = talib.MACD(path[i]['Close'])bbands = talib.BBANDS(path[i]['Close'])sar = talib.SAR(path[i]['High'], path[i]['Low'])obv = talib.OBV(path[i]['Close'], path[i]['Volumes'])atr = talib.ATR(path[i]['High'], path[i]['Low'], path[i]['Close'])cci = talib.CCI(path[i]['High'], path[i]['Low'], path[i]['Close'])adx = talib.ADX(path[i]['High'], path[i]['Low'], path[i]['Close'])stoch = talib.STOCH(path[i]['High'], path[i]['Low'], path[i]['Close'])mfi = talib.MFI(path[i]['High'], path[i]['Low'], path[i]['Close'], path[i]['Volumes'])indicator.append({'DateTime': path[i]['DateTime'], 'Date': path[i]['Date'], 'Time': path[i]['Time'],'Open': path[i]['Open'], 'High': path[i]['High'], 'Low': path[i]['Low'],'Close': path[i]['Close'], 'Volume': path[i]['Volumes'], 'EMA': ema, 'UpperBand': bbands[0],'MiddleBand': bbands[1], 'LowBand': bbands[2], 'OBV': obv, 'ATR': atr, 'MACD': macd[0],'MacdSignal': macd[1], 'MacdHist': macd[2], 'RSI': rsi, 'SAR': sar, 'StochSlowK': stoch[0],'StochSlowD': stoch[1], 'CCI': cci, 'ADX': adx, 'MFI': mfi})return indicator

对每个时间段的值及技术指标值进行绘图

在绘图这一模块,我选用了Python中的mplfinance库,该Python库专门用于绘制交易图。因为绘图的目的为直观上大致了解时间段内价格及技术指标的走向,因此本函数并没有对图像风格做过多的自定义编写。本函数的目的是将上文收集到符合条件的历史数据段内的价格走势及其相对应的技术指标走势进行绘图,后将图片保存至本地文件夹内。具体代码如下:

import mplfinance as mpf
import pandas as pddef make_graph(data, path):# 引入indicator并作简单数据处理indicator_process = pd.DataFrame(data)indicator_process['Time'] = pd.to_datetime(indicator_process['Time'])indicator_process.set_index('Time', inplace=True)# 设置图像的整体部署kwargs = dict(type='candle', volume=True)add_plot = [mpf.make_addplot(indicator_process['EMA'], panel=2, ylabel='EMA'),mpf.make_addplot(indicator_process['UpperBand']),mpf.make_addplot(indicator_process['MiddleBand']),mpf.make_addplot(indicator_process['LowBand']),mpf.make_addplot(indicator_process['OBV'], panel=3, ylabel='OBV'),mpf.make_addplot(indicator_process['ATR'], panel=4, ylabel='ATR'),mpf.make_addplot(indicator_process['MacdHist'], type='bar', panel=5, ylabel='MACD', color='darkslateblue'),mpf.make_addplot(indicator_process['MACD'], panel=5, color='orangered'),mpf.make_addplot(indicator_process['MacdSignal'], panel=5, color='limegreen'),mpf.make_addplot(indicator_process['RSI'], panel=6, ylabel='RSI'),mpf.make_addplot(indicator_process['SAR'], panel=7, ylabel='SAR'),mpf.make_addplot(indicator_process['StochSlowK'], panel=8, ylabel='StochSlowK'),mpf.make_addplot(indicator_process['StochSlowD'], panel=8),mpf.make_addplot(indicator_process['CCI'], panel=9, ylabel='CCI'),mpf.make_addplot(indicator_process['ADX'], panel=10, ylabel='ADX'),mpf.make_addplot(indicator_process['MFI'], panel=11, ylabel='MFI')]# 画出图像mpf.plot(indicator_process, **kwargs, addplot=add_plot, figratio=(16, 9), figscale=2.5,update_width_config=dict(line_width=0.8), savefig=path)return indicator_process

调用所有函数并运行

上文中,一共出现了三个函数分别为数据处理函数、技术指标计算函数以及绘图函数,现在将这三个函数调用并运行。在运行后,所有符合条件的时间段内的数据及其所对应的交易图像都将被保存至本地。具体调用代码如下:

import pandas as pd
from dataprocess import data_process
from indicator import indicators
from Graph import make_graphcolumn_num = len(pd.read_csv('EURUSD5min.csv'))-3
long_data, short_data = data_process('EURUSD5min.csv', column_num)long_indicator = indicators(long_data, len(long_data))
short_indicator = indicators(short_data, len(short_data))# 将所有数据绘图
for data_indicator in long_indicator:graph_indicator = pd.DataFrame(data_indicator)graph_indicator.set_index('Date', inplace=True)make_graph(data_indicator, ('Graph/long/{}'.format(graph_indicator['DateTime'][59])))for data_indicator in short_indicator:graph_indicator = pd.DataFrame(data_indicator)graph_indicator.set_index('Date', inplace=True)make_graph(data_indicator, ('Graph/short/{}'.format(graph_indicator['DateTime'][59])))# 将所有数据保存为csv格式
for csv_indicator in long_indicator:csv_indicator = pd.DataFrame(csv_indicator)csv_indicator.set_index('Date', inplace=True)csv_indicator.to_csv('csv/long/{}.csv'.format(csv_indicator['DateTime'][59]))for csv_indicator in short_indicator:csv_indicator = pd.DataFrame(csv_indicator)csv_indicator.set_index('Date', inplace=True)csv_indicator.to_csv('csv/short/{}.csv'.format(csv_indicator['DateTime'][59]))

至此,所有的历史数据的处理工作已经完成。本次数据选取的时间间隔为2021年12月6日14:45至2022年11月25日22:50(UTC/GMT +1小时 东一区)。其中符合做多条件时间段的数量为114个,符合做空条件时间段的数量为93个。附上一张数据图及其对应的交易图:
请添加图片描述

请添加图片描述

数据指标的分析

对于这一十个指标的分析,我的想法是分成做多与做空两大类并将每种指标当作小类来对待。对每个大类下的每个小类所对应的数百个数据组进行统计分析以找出其中的共性。但遗憾的是,我尝试了如回归、因子分析等一些统计方法都无法达到我预想的分析目标。最终,我选择了最传统的统计分析方法,人工分析并进行数据回测检验。
若各位对如何将这些数据组进行分析有更好的想法,欢迎交流与指点!

量化模型的编写

本次代码的编写我将在交易软件MT4中直接编写,所使用的语言为MQL(MT4制定的编写语言,类似C++)。根据我自己对数据的理解与分析,本次选取EMA、ATR、RSI三种指标进行量化的设计。
首先分别编写EMA、ATR、RSI以及买入的函数。指标函数逻辑分别为:当第2、3、4根K线所对应的EMA之和(第0根对应的是当下k线,数字向前K线向后以此类推)大于第5、6、7根K线所对应的EMA之和时判定为真;当第1、2、3根K线所对应的ATR之和与第4、5、6根K线所对应的ATR之和的比大于1.15时判定为真;当第1、2根K线所对应的RSI之和小于第3、4根所对应的RSI之和时判定为真。
量化的执行逻辑为当以上三个指标函数都判定为真时买入2手,止损价格为买入价减200点,止盈价格为买入价加200点,时间周期为5分钟。代码如下:

//+------------------------------------------------------------------+
//|                                                Tang_Discover.mq4 |
//|                        Copyright 2022, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strictdouble mylot;
string currency_pair;
bool ema_longjudge=false;
bool atr_longjudge=false;
bool rsi_longjudge=false;void OnTick(){
//---currency_pair=Symbol();ema_long();atr_long();rsi_long();if(ema_longjudge==true&&atr_longjudge==true&&rsi_longjudge==true){mylot=0.5;buy();}}void buy(){double stoploss=MarketInfo(currency_pair,MODE_ASK)-200*Point;double takeprofit=MarketInfo(currency_pair,MODE_ASK)+200*Point;int ticket=OrderSend(currency_pair,OP_BUY,mylot,MarketInfo(currency_pair,MODE_ASK),5,stoploss,takeprofit);if(ticket<0){Print("OrderSend failed with error",GetLastError());}elsePrint("OrderSend placed successfully");}void ema_long(){double ema_near=iMA(currency_pair,5,30,0,1,PRICE_CLOSE,2)+iMA(currency_pair,5,30,0,1,PRICE_CLOSE,3)+iMA(currency_pair,5,30,0,1,PRICE_CLOSE,4);double ema_far=iMA(currency_pair,5,30,0,1,PRICE_CLOSE,5)+iMA(currency_pair,5,30,0,1,PRICE_CLOSE,6)+iMA(currency_pair,5,30,0,1,PRICE_CLOSE,7);if(ema_near>ema_far){ema_longjudge=true;}else{ema_longjudge=false;}}void atr_long(){double atr_near=iATR(currency_pair,5,14,1)+iATR(currency_pair,5,14,2)+iATR(currency_pair,5,14,3);double atr_far=iATR(currency_pair,5,14,4)+iATR(currency_pair,5,14,5)+iATR(currency_pair,5,14,6);if((atr_near/atr_far)>1.15){atr_longjudge=true;}else{atr_longjudge=false;}}void rsi_long(){double rsi_near=iRSI(currency_pair,5,14,PRICE_CLOSE,1)+iRSI(currency_pair,5,14,PRICE_CLOSE,2);double rsi_far=iRSI(currency_pair,5,14,PRICE_CLOSE,3)+iRSI(currency_pair,5,14,PRICE_CLOSE,4);if(rsi_near<rsi_far){rsi_longjudge=true;}else{rsi_longjudge=false;}}

对于这个量化模型,我进行了数据回测,时间为2022年1月1日至2022年11月29日,回测数据如下:
请添加图片描述
结束!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3977.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

量化交易之数据获取篇

该篇主要是是用来展示量化交易的效果&#xff0c;不构成任何投资建议&#xff0c;仅供参考 先说说思路 该篇主要是教你怎么去获取数据&#xff0c;包括怎么去选取一支好的基金&#xff0c;怎么去获取基金往期的历史数据 先说说怎么去选取一支好的基金吧 个人认为如何判断一…

期货CTP接口与程序化(量化交易)的对接(1)

很多人写CTP都是为了自动交易。 费好大劲&#xff0c;CTP接口写好了&#xff0c;该往策略方面靠了。 有同学说&#xff1a;“那简单&#xff0c;把文华的策略翻译到CTP里去。” 姑且不论这么做是否可行。我这篇文章要说的&#xff0c;不是这么简单的一个东西&#xff0c;而是一…

散户如何进行开展量化股票交易的?

散户如何进行开展量化股票交易的&#xff1f;也就是投资者交易的条件&#xff0c;达到了投资者设定的条件时候&#xff0c;系统接口就会自动交易&#xff0c;下面来看看具体的流程&#xff1a; 依据个股的历史记录&#xff0c;进行多因子选股&#xff0c;比如&#xff0c;把市…

带你了解Ptrade量化交易功能

Ptrade&#xff0c;适用于交易活跃用户、量化爱好者以及专业量化投资者&#xff0c;又可面向高净值的机构或个人。 PTrade个人专业交易系统&#xff0c;是一款面向个人投资者&#xff0c;尤其是中高净值个人投资者的专业交易系统。系统采用先进的技术框架&#xff0c;具有功能…

ChatGPT真猛!直接写了一本量化交易的书(附下载)

量化投资与机器学习微信公众号&#xff0c;是业内垂直于量化投资、对冲基金、Fintech、人工智能、大数据等领域的主流自媒体。公众号拥有来自公募、私募、券商、期货、银行、保险、高校等行业30W关注者&#xff0c;曾荣获AMMA优秀品牌力、优秀洞察力大奖&#xff0c;连续4年被腾…

音视频技术开发周刊 | 296

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 22字声明、近400名专家签署、AI教父Hinton与OpenAI CEO领头预警&#xff1a;AI可能灭绝人类&#xff01; 这份声明一经发布&#xff0c;便迅速得到了多伦多大学计算机科学…

青云科技财务负责人、核心技术人员相继离职;作业帮正在内测大模型;OpenAI月活用户数量超8亿丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 新媒股份与科大讯飞共同成立元宇宙XR联合创新实验室 近日&#xff0c;广东南方新媒体股份有限公司&#xff08;以下简称“新媒股份”&#xff09;与科大讯飞股份有限公司&#xff08;以下简称“科大讯飞”&…

美国新闻集团拟起诉微软谷歌OpenAI;大厂核心技术人员开启创业潮;京东云首次发布数智平台“优加”丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 美国新闻集团拟起诉微软谷歌OpenAI 自ChatGPT风靡全球后&#xff0c;AI版权问题就成为近来国外争论不休的一个焦点。据报道&#xff0c;AI技术的发展已经引发了新闻出版业的不满&#xff0c;他们认为自己的内容…

OpenAI创始人的Web3愿景:Worldcoin打造AI数字通行证

摘要 以Chatgpt为代表的人工智能的能力正在迅速接近人类&#xff0c;并且已经在许多利基领域超越了人类。越来越强大的模型似乎越来越超出人控制的可能&#xff0c; AI既可以助人&#xff0c;也存在“鸠占鹊巢”挤占人类的存在空间和利益&#xff0c;甚至不排除AI作恶的可能。在…

现在就是成为“新程序员”的黄金时刻!

整理 | 王启隆 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; “自然语言代替了编程语言&#xff0c;大大地降低了程序员的门槛。现在&#xff0c;ChatGPT 将全球的知识库和代码都放在了你的手中&#xff0c;只要有想象力&#xff0c;人人都能成为「新程序员」。…

ChatGPT 爆火的背后:深度解读“智能对话”与“人机交互”技术

图灵人工智能 作者 | 鲁冬雪 智能对话技术在近几年来取得了惊人的进步&#xff0c;最近爆火的 ChatGPT 更是将智能对话推到了至高潮。像 ChatGPT 这样的聊天机器人有着广泛的用途&#xff0c;然而想要让其达到真正的智能水平&#xff0c;还有很多挑战需要克服&#xff0c;比…

图灵逝世 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 7 日&#xff0c;在 1742 年的今天&#xff0c;普鲁士数学家克里斯蒂安哥德巴赫在写给瑞士数学家莱昂哈德欧拉的通信中&#xff0c;提出了以下的猜想&…

苹果今年或无法推出M3芯片;​微软将推私有版ChatGPT:价格是常规版10倍;sudo和su用Rust重写|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

大白话说ChatGPT

ChatGPT是如何流行的&#xff1f; 在经历了2016年&#xff0c;由AlphGo击败李世石而掀起的AI浪潮后&#xff0c;AI行业沉寂良久&#xff0c;上一波浪潮里起来的AI算法公司&#xff0c;在硬件化和数据的泥沼里寻找出路&#xff0c;这么多年&#xff0c;AI行业太需要一个现象级的…

论文版「ChatGPT」来了!看论文问问题可同时进行,网友:看文献更省时了|开源...

Pine 发自 凹非寺量子位 | 公众号 QbitAI 科研人员福音&#xff01;专门和论文对话的“ChatGPT”来了。 懒得看论文&#xff1f;没关系&#xff0c;直接让这个工具帮你看&#xff0c;有什么问题直接问它就好了。 而你全程要做的就只有上传论文和问问题。 但又感觉心里没谱&…

AI帮忙做论文笔记——高端Prompt技巧——chatGPT时代背景下文献阅读新范式

之前读文献坑: 这样读文献是单个的,没有成体系。 正确的应该是先画个总的思维导图(通过chatGPT ,返回的TXT自动转思维导图) 然后每读一篇文献,就在总的导图上修修补补。 新范式步骤 1 和GPT要个基础的大纲。作为认知底座,主要 包含3w。 例如,以精准教学为例,向chat…

ChatGPT有趣测试(ChatGPT课表安排)

我的问题&#xff1a; 有4名教师分别是&#xff1a;唐僧&#xff0c;孙悟空&#xff0c;猪八戒&#xff0c; 沙悟净。他们四位老师要给两个班级&#xff08;class1&#xff0c;class2&#xff09; 授课。分别是唐僧&#xff08;咒语概论&#xff09;&#xff0c;孙悟空&#x…

图灵测试还重要吗?

撰文丨Harry Collins&#xff08;卡迪夫大学社会学教授&#xff09; 来源丨原理&#xff08;ID&#xff1a;principia1687&#xff09; 1 我们正在步入人工智能时代。随着人工智能程序越来越擅长像人类般行事&#xff0c;我们也越来越多地面临这样一个问题&#xff1a;人类的智…

图灵测试与人工智能

什么是图灵测试&#xff1f; 在一篇1950年发表的著名论文《Computing Machinery and Intelligence》中&#xff0c;数学家阿兰图灵详细讨论了“机器能否拥有智能&#xff1f;”的问题。有趣的是&#xff0c;作为计算机科学与人工智能领域共同的先驱&#xff0c;图灵成功定义了…

软件测试/测试开发丨ChatGPT训练营来,手把手带你玩转ChatGPT

ChatGPT的出现为测试行业带来了新的机遇和挑战。尽管许多人担心它的强大可能会取代测试人员&#xff0c;但实际上ChatGPT可以成为测试人员的强大助手&#xff0c;提高测试工作的效率和准确性。那么&#xff0c;我们应该如何借助 ChatGPT&#xff0c;让我们的测试工作更高效呢&a…