From 4c1f112c11c1f54902420d6423f85e088da4b86e Mon Sep 17 00:00:00 2001 From: Nikolai Date: Sun, 5 May 2019 11:58:16 +0300 Subject: [PATCH] Beta release 1.00 --- .gitignore | 2 + Experts/api.mq5 | Bin 0 -> 42620 bytes Experts/backtrader.mq5 | 611 ----------------------------------------- 3 files changed, 2 insertions(+), 611 deletions(-) create mode 100644 .gitignore create mode 100644 Experts/api.mq5 delete mode 100644 Experts/backtrader.mq5 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9bea433 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +.DS_Store diff --git a/Experts/api.mq5 b/Experts/api.mq5 new file mode 100644 index 0000000000000000000000000000000000000000..28140e499bb67457794569a2b010c50605641345 GIT binary patch literal 42620 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 M=OMR2m!GQt1BOhj)Bpeg literal 0 HcmV?d00001 diff --git a/Experts/backtrader.mq5 b/Experts/backtrader.mq5 deleted file mode 100644 index ebc4839..0000000 --- a/Experts/backtrader.mq5 +++ /dev/null @@ -1,611 +0,0 @@ -//+------------------------------------------------------------------+ -// -// Copyright (C) 2019 Nikolai Khramkov -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -//+------------------------------------------------------------------+ - -// TODO: Close position -// TODO: Close orders -// TODO: Check If SymbolExist -// TODO: Check TF according to request -> change -// TODO: Check chart symbol according to request -> change -// TODO: RETURN OK or error -// TODO: Write comment about sockets -// TODO: Add defauld dict check -// TODO: Change description -// TODO: Comissinos - -#property copyright "Copyright 2019, Nikolai Khramkov." -#property link "https://github.com/khramkov" -#property version "0.70" - -#include -#include - -extern string PROJECT_NAME="Backtrader <-> Metatrader 5 interface"; -extern string PROTOCOL="tcp"; -extern string HOST="*"; -extern int SYS_PORT=15555; -extern int DATA_PORT=15556; -extern int LIVE_PORT=15557; -extern int MILLISECOND_TIMER=1; // 1 millisecond - -// ZeroMQ Cnnections -Context context(PROJECT_NAME); -Socket sysSocket(context,ZMQ_REP); -Socket dataSocket(context,ZMQ_PUSH); -Socket liveSocket(context,ZMQ_PUSH); - -// Global variables -bool debug = true; -datetime lastBar = 0; -string symbol = _Symbol; -ENUM_TIMEFRAMES period = _Period; - -//+------------------------------------------------------------------+ -//| Expert initialization function | -//+------------------------------------------------------------------+ -int OnInit() - { - /* - Bindinig ZMQ ports on init - */ - - // Set Millisecond Timer to get client socket input - EventSetMillisecondTimer(MILLISECOND_TIMER); - - Print("[REP] Binding System Socket on port "+IntegerToString(SYS_PORT)+"..."); - sysSocket.bind(StringFormat("%s://%s:%d",PROTOCOL,HOST,SYS_PORT)); - - Print("[PUSH] Binding Data Socket on port "+IntegerToString(DATA_PORT)+"..."); - dataSocket.bind(StringFormat("%s://%s:%d",PROTOCOL,HOST,DATA_PORT)); - - Print("[PUSH] Binding Live Socket on port "+IntegerToString(LIVE_PORT)+"..."); - liveSocket.bind(StringFormat("%s://%s:%d",PROTOCOL,HOST,LIVE_PORT)); - - // Maximum amount of time in milliseconds that the thread will try to send messages - // after its socket has been closed (the default value of -1 means to linger forever): - sysSocket.setLinger(1000); - - // How many messages do we want ZeroMQ to buffer in RAM before blocking the socket? - // 3 messages only. - sysSocket.setSendHighWaterMark(3); - dataSocket.setSendHighWaterMark(3); - liveSocket.setSendHighWaterMark(3); - - return(INIT_SUCCEEDED); - } -//+------------------------------------------------------------------+ -//| Expert deinitialization function | -//+------------------------------------------------------------------+ -void OnDeinit(const int reason) - { - /* - Closing ports on denit - */ - Print("[REP] Unbinding socket on port "+IntegerToString(SYS_PORT)+".."); - sysSocket.unbind(StringFormat("%s://%s:%d",PROTOCOL,HOST,SYS_PORT)); - - Print("[PUSH] Unbinding socket on port "+IntegerToString(DATA_PORT)+".."); - dataSocket.unbind(StringFormat("%s://%s:%d",PROTOCOL,HOST,DATA_PORT)); - - Print("[PUSH] Unbinding socket on port "+IntegerToString(LIVE_PORT)+".."); - liveSocket.unbind(StringFormat("%s://%s:%d",PROTOCOL,HOST,LIVE_PORT)); - - } -//+------------------------------------------------------------------+ -//| Expert timer function | -//+------------------------------------------------------------------+ -void OnTimer() - { - ZmqMsg request; - - // Get client's response, but don't wait. - sysSocket.recv(request,true); - - // Generating reply by passing request to ZmqMsg MessageHandler() function. - ZmqMsg reply=MessageHandler(request); - - // Reply to client via REP socket. - sysSocket.send(reply); - } - -//+------------------------------------------------------------------+ -//| Request handler | -//+------------------------------------------------------------------+ -ZmqMsg MessageHandler(ZmqMsg &request) - { - ZmqMsg reply; - CJAVal message; - - if(request.size()>0) - { - - string msg=request.getData(); - - if(debug==true) {Print("Processing request:"+msg);} - - if(!message.Deserialize(msg)) - { - Alert("Deserialization Error"); - - //ExpertRemove(); - //return; - } - - string action = message["action"].ToStr(); - - if(action=="CHECK") {CheckConnection(&dataSocket, &liveSocket);} - else if(action=="CONFIG") {ConfigScript(&dataSocket, message);} - else if(action=="ACCOUNT") {AccountInfo(&dataSocket);} - else if(action=="BALANCE") {BalanceInfo(&dataSocket);} - else if(action=="HISTORY") {HistoryInfo(&dataSocket, message);} - else if(action=="POSITIONS_INFO") {GetPositionsInfo(&dataSocket);} - else if(action=="ORDERS_INFO") {GetOrdersInfo(&dataSocket);} - else if(action=="TRADE") {TradingModule(&dataSocket, message);} - else {} // error processing - - // Construct response - ZmqMsg ret("OK"); - reply=ret; - - } - else - { - // NO DATA RECEIVED - ZmqMsg ret("FALSE"); - reply=ret; - } - - return(reply); - } - -//+------------------------------------------------------------------+ -//| Check sockets connection | -//+------------------------------------------------------------------+ -void CheckConnection (Socket &dataSocket, Socket &liveSocket) - { - InformClientSocket(dataSocket,"OK"); - InformClientSocket(liveSocket,"OK"); - } - - -//+------------------------------------------------------------------+ -//| Reconfigure the script params | -//+------------------------------------------------------------------+ -void ConfigScript(Socket &dataSocket, CJAVal &dataObject) - { - - } - -//+------------------------------------------------------------------+ -//| Change chart timeframe | -//+------------------------------------------------------------------+ -void CheckTimeframe(Socket &dataSocket, CJAVal &dataObject) - { - string chartTF=dataObject["chartTF"].ToStr(); - - if(chartTF=="1m") {period=PERIOD_M1;} - else if(chartTF=="5m") {period=PERIOD_M5;} - else if(chartTF=="15m") {period=PERIOD_M15;} - else if(chartTF=="30m") {period=PERIOD_M30;} - else if(chartTF=="1h") {period=PERIOD_H1;} - else if(chartTF=="2h") {period=PERIOD_H2;} - else if(chartTF=="3h") {period=PERIOD_H3;} - else if(chartTF=="4h") {period=PERIOD_H4;} - else if(chartTF=="6h") {period=PERIOD_H6;} - else if(chartTF=="8h") {period=PERIOD_H8;} - else if(chartTF=="12h") {period=PERIOD_H12;} - else if(chartTF=="1d") {period=PERIOD_D1;} - else if(chartTF=="1w") {period=PERIOD_W1;} - else if(chartTF=="1M") {period=PERIOD_MN1;} - } - -//+------------------------------------------------------------------+ -//| Account information | -//+------------------------------------------------------------------+ -void AccountInfo(Socket &dataSocket) - { - CJAVal info; - - info["brocker"] = AccountInfoString(ACCOUNT_COMPANY); - info["currency"] = AccountInfoString(ACCOUNT_CURRENCY); - info["server"] = AccountInfoString(ACCOUNT_SERVER); - info["balance"] = AccountInfoDouble(ACCOUNT_BALANCE); - info["equity"] = AccountInfoDouble(ACCOUNT_EQUITY); - info["margin"] = AccountInfoDouble(ACCOUNT_MARGIN); - info["margin_free"] = AccountInfoDouble(ACCOUNT_MARGIN_FREE); - info["margin_level"] = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); - info["bot_trading"] = AccountInfoInteger(ACCOUNT_TRADE_EXPERT); - string t=info.Serialize(); - if(debug==true) {Print(t);} - InformClientSocket(dataSocket,t); - } - -//+------------------------------------------------------------------+ -//| Balance information | -//+------------------------------------------------------------------+ -void BalanceInfo(Socket &dataSocket) - { - CJAVal info; - - info["balance"] = AccountInfoDouble(ACCOUNT_BALANCE); - info["equity"] = AccountInfoDouble(ACCOUNT_EQUITY); - info["margin"] = AccountInfoDouble(ACCOUNT_MARGIN); - info["margin_free"] = AccountInfoDouble(ACCOUNT_MARGIN_FREE); - string t=info.Serialize(); - if(debug==true) {Print(t);} - InformClientSocket(dataSocket,t); - } - - -//+------------------------------------------------------------------+ -//| Get historical data | -//+------------------------------------------------------------------+ -void HistoryInfo(Socket &dataSocket, CJAVal &dataObject) - { - CJAVal candles; - MqlRates rates[]; - - int copied; - string actionType=dataObject["actionType"].ToStr(); - string symbol=dataObject["symbol"].ToStr(); - string chartTF=dataObject["chartTF"].ToStr(); - datetime startTime=dataObject["startTime"].ToInt(); - - if(debug==true) - { - Print("Fetching HISTORY"); - Print("1) Symbol:"+symbol); - Print("2) Timeframe:"+chartTF); - Print("3) Date from:"+TimeToString(startTime)); - } - copied=CopyRates(symbol,period,startTime,TimeCurrent(),rates); - if(copied) - - { - for(int i=0;i