[
  {
    "path": "README.md",
    "content": "# py-mt4\n用Python来写MT4的自动化交易脚本 🎉\n\n# 原理\n- 使用MQL4原生库调用ZERO-MQ作为消息服务端\n- 使用其它语言，如Python作为客户端调用接口\n\n# 机器环境\n- win10\n- python3.5\n\n# 安装教程\n- 安装C++运行环境[需要C++的运行环境，The DLLs require that you have the latest Visual C++ runtime (2015)]：https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads\n- 克隆代码下来\n- 关闭杀毒软件！！！\n- 解压MT4配置文件.rar\n- 把Include的东西放到MT4的Include文件夹下\n- 把Library/X86/的东西放到MT4的Library文件夹下\n- 把ZeroMQ_MT4_EA_Template_Edited.mq4放到MT4的Experts文件夹下\n- pip install pyzmq\n- pip install TA_Lib-0.4.17-cp35-cp35m-win_amd64.whl  (版本可以在这里下载：https://www.lfd.uci.edu/~gohlke/pythonlibs/)\n\n# 启动EA脚本\n- 打开MT4，在左下方把ZeroMQ_MT4_EA_Template_Edited.mq4托入想交易的图形中， 并允许EA添加外部DLL和自动交易\n- 右上角会有个哭脸，说明没启动\n- 点击【自动交易】，哭脸变笑脸则启动成功\n- 修改和运行自动化EA脚本.py进行测试\n\n# 效果\n![](./1.png)\n![](./2.png)\n"
  },
  {
    "path": "pythonicMT4.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\nCreated on Mon Apr 30 20:15:31 2018\n@author: Ars\n\"\"\"\nimport zmq\nimport numpy as np\nclass zmq_python():\n    \n    def __init__(self):\n        # Create ZMQ Context\n        self.context = zmq.Context()\n\n        # Create REQ Socket\n        self.reqSocket = self.context.socket(zmq.REQ)\n        self.reqSocket.connect(\"tcp://localhost:5555\")\n\n        # Create PULL Socket\n        self.pullSocket = self.context.socket(zmq.PULL)\n        self.pullSocket.connect(\"tcp://localhost:5556\")\n    \n    def remote_send(self, socket, data):\n    \n        try:\n            socket.send_string(data)\n            msg_send = socket.recv_string()\n            print (msg_send)\n\n        except zmq.Again as e:\n            print (\"Waiting for PUSH from MetaTrader 4..\")\n            \n    def remote_pull(self, socket):\n    \n        try:\n            msg_pull = socket.recv(flags=zmq.NOBLOCK)\n            return msg_pull\n\n        except zmq.Again as e:\n            print (\"Waiting for PUSH from MetaTrader 4..\")\n            \n    \n    def get_data(self, symbol, timeframe, start_bar, end_bar):\n        '''\n        only start_bar and end_bar as int\n        '''\n        self.data = \"DATA|\"+ symbol+\"|\"+\"PERIOD_\"+timeframe+\"|\"+str(start_bar)+\"|\"+str(end_bar+1)\n        self.remote_send(self.reqSocket, self.data)\n        prices= self.remote_pull(self.pullSocket)\n        prices_str= str(prices)\n        price_lst= prices_str.split(sep='|')[1:-1]\n        price_lst= [float(i) for i in price_lst]\n        price_lst= price_lst[::-1]\n        price_arr= np.array(price_lst)\n        return price_arr\n    \n    def buy_order(self, symbol, stop_loss, take_profit):\n        self.buy= \"TRADE|OPEN|0|\"+ str(symbol)+\"|\"+str(stop_loss)+\"|\"+str(take_profit)\n        self.remote_send(self.reqSocket, self.buy)\n        reply= self.remote_pull(self.pullSocket)\n        return reply\n    \n    def sell_order(self, symbol, stop_loss, take_profit):\n        self.buy= \"TRADE|OPEN|1|\"+ str(symbol)+\"|\"+str(stop_loss)+\"|\"+str(take_profit)\n        self.remote_send(self.reqSocket, self.buy)\n        reply= self.remote_pull(self.pullSocket)\n        return reply\n    \n    def close_buy_order(self):\n        self.close_buy= \"TRADE|CLOSE|0\"\n        self.remote_send(self.reqSocket, self.close_buy)\n        reply= self.remote_pull(self.pullSocket)\n        return reply\n    \n    def close_sell_order(self):\n        self.close_sell= \"TRADE|CLOSE|1\"\n        self.remote_send(self.reqSocket, self.close_sell)\n        reply= self.remote_pull(self.pullSocket)\n        return reply"
  },
  {
    "path": "自动化EA脚本.py",
    "content": "import pythonicMT4 \nimport talib\nfrom time import sleep\n\nsymbol= 'EURUSD'\ntimeframe= 'H1'\nstart= 0\nend= 2000\nperiod= 96\nstopLoss= 500\ntakeProfit= 1000\norder= ''\n\ntrade= pythonicMT4.zmq_python()\n\nwhile True:\n    try:\n        prices= trade.get_data(symbol= symbol, timeframe= 'H1', start_bar=start, end_bar=end)\n        SMA= talib.SMA(prices, timeperiod=period)\n        print (\"Current price: {} \\nSMA: {}\".format(prices[-1], SMA[-1]))\n        \n        if order != 'Buy' and order != 'Sell':\n            if (prices[-1] > prices [-2]) and (prices[-1]<SMA[-1]):\n                order= 'Buy'\n                trade.buy_order(symbol= symbol, stop_loss= stopLoss, take_profit= takeProfit)\n                \n            else:\n                if (prices[-1] < prices[-2]) and (prices[-1] > SMA[-1]):\n                    order= 'Sell'\n                    trade.sell_order(symbol= symbol, stop_loss= stopLoss, take_profit= takeProfit)\n                \n        if order== 'Buy' and prices[-1]>SMA[-1]:\n            order= ''\n            trade.close_buy_order()\n        \n        else:\n            if order== 'Sell' and prices[-1]<SMA[-1]:\n                order= ''\n                trade.close_sell_order()\n    except:\n        continue\n    \n    sleep(100)"
  }
]