mirror of
https://github.com/vdemydiuk/mtapi.git
synced 2026-07-28 11:07:48 +00:00
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
|
||
|
|
|