mirror of
https://github.com/vdemydiuk/mtapi.git
synced 2026-07-27 18:47:55 +00:00
76a6216cf7
It uses its own API which I packed between MTApi5 and MatLab. Possible that this is useless, but errors from the .NET assembly are more tradable.
508 lines
16 KiB
Matlab
508 lines
16 KiB
Matlab
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
|
|
|