classdef Mt5Api < handle %CONNECTMT5 Connects to the MtApi Client via .NET properties MTApi5_dll_Location = 'dll\MtApi5.dll' % MTApi5_dll_Location = 'E:\GitHub-RePos\MtApi\build\products\Release\MtApi5.dll';% 1.021 % MTApi5_dll_Location = ' E:\GitHub-RePos\MtApi\MtApi5\bin\x64\Release\MtApi5.dll' ;% 1.021 % MTApi5_dll_Location = 'd:\Git-Extern\mtapi\build\products\Debug\MtApi5.dll';% 1.019 % MTApi5_dll_Location = 'D:\GitHub-RePos\MtApi\build\products\Release\MtApi5.dll'; % 1.0191 vVersion = 1.021; h; asm; cAccount; cCommon; cCheckup; cDateTime; cEvents; cMarketInfo; cObject; cProp; cTeIndicator; cTimeSeries; cTrade; cLogger; fDeleteLogger; hQuoteAddedListener; hQuoteListener; hConnectionListener; hOnTradeTransactionListener; hOnTesterDeInitListener % Listener for Tester DeInit Event charConnectionState = 'StartUp'; bStatusDeInit = false; % Status Flag of DeInit Tester end methods %% constructor function obj = Mt5Api(MTApi5_dll_Location) if nargin > 1 if isempty(MTApi5_dll_Location) disp('No Path for API dll using standard'); end end obj.MTApi5_dll_Location = strcat(pwd(),'\',MTApi5_dll_Location); [obj.cLogger, obj.fDeleteLogger] = logging.getLogger('ApiLogMain'); MtApi_asm = NET.addAssembly(obj.MTApi5_dll_Location); obj.cLogger.debug('Net Assembly loaded',0); obj.cLogger.debug(char(MtApi_asm.AssemblyHandle.CodeBase),0); obj.cLogger.debug(char(MtApi_asm.AssemblyHandle.ToString),0); obj.h = MtApi5.MtApi5Client(); obj.asm = MtApi_asm; obj.cAccount = cntMt5Api_account(obj); obj.cCommon = cntMt5Api_common(obj); obj.cCheckup = cntMt5Api_checkup(obj); obj.cDateTime = cntMt5Api_datetime(obj); obj.cEvents = cntMt5Api_events(obj); obj.cMarketInfo = cntMt5Api_marketinfo(obj); obj.cTeIndicator = cntMt5Api_teindicator(obj); obj.cTimeSeries = cntMt5Api_timeseries(obj); obj.cTimeSeries.mSymbol = 'EURUSD'; obj.cTrade = cntMt5Api_trade(obj); % obj.cEnum = cntMtApi_enums(obj); end %% destructor function delete(self) self.asm.delete; % delete(self.hOnTesterDeInitListener); end %% class functions function ok = startMT5 (self,addr,port) %% Handle to the .NET client self.cLogger.info(sprintf('Connecting to %s:%d ...',addr,port)); ok = false; t = timer('TimerFcn', @errorWhileNoConnection, 'StartDelay',60); start(t); status=true; while (status==true) try self.h.BeginConnect(addr,port); catch ME end pause(1); if self.h.ConnectionState == MtApi5.Mt5ConnectionState.Connected stop(t); delete(t); ok = true; self.cLogger.info(sprintf('Conneced to %s:%d ',addr,port)); return; end end ok = false; self.cLogger.error('Connection Timer Out!'); function errorWhileNoConnection(self,event) status=false; stop(t); delete(t); end end function stopMT5(self) self.cLogger.info('Close Connection...'); self.h.BeginDisconnect(); end function init_Loggers(self,cmdLineLevel,logLevel,WebHook,Instance) % cmdLineLevel,logLevel -> ALL,TRACE,DEBUG,INFO,WARNING,ERROR,CRITICAL,OFF self.cLogger.setSlackWebHook(WebHook); self.cLogger.setSlackInstance(Instance) % self.cLogger = logging.getLogger('ApiLog'); self.cLogger.setFilename('C:\Work\NeuronalTrader_matlab\Log\Api.log'); switch logLevel case 'ALL' self.cLogger.setLogLevel(logging.logging.ALL); case 'TRACE' self.cLogger.setLogLevel(logging.logging.TRACE); case 'DEBUG' self.cLogger.setLogLevel(logging.logging.DEBUG); case 'INFO' self.cLogger.setLogLevel(logging.logging.INFO); case 'WARNING' self.cLogger.setLogLevel(logging.logging.WARNING); case 'ERROR' self.cLogger.setLogLevel(logging.logging.ERROR); case 'CRITICAL' self.cLogger.setLogLevel(logging.logging.CRITICAL); case 'OFF' self.cLogger.setLogLevel(logging.logging.OFF); otherwise error('cLogger Init'); end switch cmdLineLevel case 'ALL' self.cLogger.setCommandWindowLevel(logging.logging.ALL); case 'TRACE' self.cLogger.setCommandWindowLevel(logging.logging.TRACE); case 'DEBUG' self.cLogger.setCommandWindowLevel(logging.logging.DEBUG); case 'INFO' self.cLogger.setCommandWindowLevel(logging.logging.INFO); case 'WARNING' self.cLogger.setCommandWindowLevel(logging.logging.WARNING); case 'ERROR' self.cLogger.setCommandWindowLevel(logging.logging.ERROR); case 'CRITICAL' self.cLogger.setCommandWindowLevel(logging.logging.CRITICAL); case 'OFF' self.cLogger.setCommandWindowLevel(logging.logging.OFF); otherwise error('cLogger Init'); end self.cLogger.info(' ********* Parameter: LogLevel = ALL **************** '); self.cLogger.trace('Trace Line Test'); self.cLogger.debug('Debug Line Test'); self.cLogger.info('Info Line Test'); self.cLogger.warn('Warning Line Test'); self.cLogger.error('Error Line Test'); self.cLogger.critical('Critical Line Test'); self.cLogger.info('Api Logger is started'); end function result = isApiConnected(self) % Check if Api is Connected if self.h.ConnectionState == MtApi5.Mt5ConnectionState.Connected result = true; else result = false; end end function result = isMarketOpen(self) % Check if Market is Open end function res = isTesterMode(self) % Checks if the Expert Advisor runs in the testing mode.. res = self.h.IsTesting(); end function res = send_TesterStop(self) % Checks if the Expert Advisor runs in the testing mode.. res = self.cCommon.TimeGMT(); end function res = GetQuotes(self) % Load quotes connected into MetaTrader API. res = self.h.GetQuotes(); end %% ASM Functions function version = getVersion(self) version = char(self.asm.AssemblyHandle.ToString()); self.cLogger.info(version),0; end function path = getBasePath(self) path = char(self.asm.AssemblyHandle.CodeBase); self.cLogger.info(path),0; end %% develop function function ticks = readTicks(self) end function eurusd = runOnX7Live(self) self.InitLogger; self.cLogger.info('Develop on X7 live started'); self.setConnectionListener; self.setOnTradeTransactionListener; if self.startMT5('192.168.178.15',8228) % Connnect to Live eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); self.setQuoteListener(eurusd); end end function stopX7Live(self) self.cLogger.trace('Cleanup Listener ,Objects'); self.hConnectionListener.delete; self.hOnTradeTransactionListener.delete; self.stopMT5; while self.isApiConnected() pause(0.1); end logging.clearLogger('ApiLogMain') end function [connected ,eurusd] = runOn(self,mode) self.cLogger.info('Setup Connection'); self.setConnectionListener(); self.setOnTradeTransactionListener(); switch mode case 'AA' self.startMT5('192.168.178.15',8301); % Connnect to Pool Tester AA eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); % self.setQuoteListener(eurusd); case 'AB' self.startMT5('192.168.178.15',8302); % Connnect to Pool Tester AB eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); % self.setQuoteListener(eurusd); case 'AC' self.startMT5('192.168.178.15',8303); % Connnect to Pool Tester AC eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); case 'AD' self.startMT5('192.168.178.15',8304); % Connnect to Pool Tester AD eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); case 'X7T' self.startMT5('192.168.178.15',8230); % Connnect to Tester eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); % self.setQuoteListener(eurusd); case 'X7L' self.startMT5('192.168.178.15',8228); % Connnect to Live eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); % self.setQuoteListener(eurusd); case 'X3CommandPoolAA' self.startMT5('127.0.0.1',8231); % Connnect to Pool Tester AA eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); % self.setQuoteListener(eurusd); case 'X3T' self.startMT5('192.168.178.25',8231); % Connnect to Tester eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); % self.setQuoteListener(eurusd); case 'X3L' self.startMT5('192.168.178.25',8228); % Connnect to Live eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); % self.setQuoteListener(eurusd); case 'X2T' self.startMT5('192.168.178.11',8211); % Connnect to Tester eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); % self.setQuoteListener(eurusd); case 'X2L' self.startMT5('192.168.178.11',8228); % Connnect to Live eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); % self.setQuoteListener(eurusd); case 'default' self.startMT5('127.0.0.1',8300); % Connnect to default PC eurusd = DataStore.Ticks(); eurusd.createMqlTicks(int32(100)); self.setQuoteListener(eurusd); end if ~self.isApiConnected() connected = false; return; end connected = true; end function stopX7Tester(self) self.cLogger.trace('Cleanup Listener ,Objects'); self.hConnectionListener.delete; self.stopMT5; while self.isApiConnected() pause(0.1); end logging.clearLogger('ApiLogMain') end %% Event Listener function r = setQuoteListener(self,tickHandle) r = addlistener(self.h, 'QuoteUpdate', @(src,event)self.quoteListener(src,event,tickHandle)); self.hQuoteListener = r; end function r = setQuoteAddedListener(self) r = addlistener(self.h, 'QuoteAdded', @self.quoteAddedListener); self.hQuoteAddListener = r; end function r = setConnectionListener(self) r = addlistener(self.h, 'ConnectionStateChanged', @(src,event)self.connectionListener(src,event,self.cLogger)); self.hConnectionListener = r; end function r = setDeInitListener(self) r = addlistener(self.h, 'OnTesterDeInit', @(src,event)self.OnDeInitListener(src,event,self.cLogger)); self.hTesterDeInitListener = r; end function r = setOnTradeTransactionListener(self) r = addlistener(self.h, 'OnTradeTransaction', @self.OnTradeTransactionListener); self.hOnTradeTransactionListener= r; end function setupDeInitListener(self) self.hOnTesterDeInitListener = addlistener(self.h, 'OnTesterDeInit', @(src,event)self.processOnDeInitEvent(src,event)); self.cLogger.trace('DeInit Listener set'); end function quoteAddedListener(event) askString = num2str(event.Quote.Ask,'%01.5f'); % askString = sprintf(event.Quote.Ask,'%01.5f'); bidString = num2str(event.Quote.Bid,'%01.5f'); % bidString = num2str(event.Quote.Bid,'%01.5f'); transmitString = strcat(askString,',',bidString); fprintf('%s: %s\n',char(event.Quote.Instrument),transmitString); end function quoteListener(~,~,event,tickHandle) % askString = num2str(event.Quote.Ask,'%01.5f'); % bidString = num2str(event.Quote.Bid,'%01.5f'); % transmitString = strcat(askString,',',bidString); % fprintf('%s: %s\n',char(event.Quote.Instrument),transmitString); if ~feature('IsDebugMode') tickHandle.storeNewQuoteEvent(event); end % tickHandle.bid.push(event.Quote.Bid); end function OnTradeTransactionListener(~,~,event) % askString = num2str(event.Quote.Ask,'%01.5f'); % askString = sprintf(event.Quote.Ask,'%01.5f'); % bidString = num2str(event.Quote.Bid,'%01.5f'); % bidString = num2str(event.Quote.Bid,'%01.5f'); % transmitString = strcat(askString,',',bidString); % fprintf('%s: %s\n',char(event.Deal),transmitString); end function connectionListener(obj,~, event,logger) connectState = event.Status.ToString(); obj.charConnectionState = connectState.char; logger.trace('New Connection State:'); logger.info(char(connectState)); switch connectState.char case 'Connecting' case 'Connected' case 'Disconnected' logger.error('case Disconnected !!!'); case 'Failed' logger.warn('Connection failed'); logger.warn(sprintf('Reason: %s',char(event.ConnectionMessage))); end end function [ok] = processOnDeInitEvent(self,~,event) self.cLogger.trace('DeInit Event: Code 0'); % disp(event) self.bStatusDeInit = true; ok=true; end end end