diff --git a/Examples/MatLab/BasicExample/ConnectToMT5_Api.m b/Examples/MatLab/BasicExample/ConnectToMT5_Api.m new file mode 100644 index 00000000..1f1239cf --- /dev/null +++ b/Examples/MatLab/BasicExample/ConnectToMT5_Api.m @@ -0,0 +1,135 @@ +classdef ConnectToMT5_Api < handle + %CONNECTMT5 Connects to the MtApi Client via .NET + + properties + h; + hOutputWindow + end + + methods +%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + function obj = ConnectToMT5_Api + + obj.h = MtApi5.MtApi5Client(); + end +%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + function startMT5 (self,addr,port) + %% Handle to the .NET client + + fprintf('Connecting...\n'); + + self.h.BeginConnect(addr,port); + + + end + + function stopMT5(self) + self.h.BeginDisconnect(); + end + function setOutputWindowHandle(self,h) + self.hOutputWindow = h; + end + %% + function [copied_cnt, MqlRates] = getHistoryBars(self) + + symbol = 'EURUSD'; + period = 'M1'; + start_cnt = 0; + end_cnt = 5; + + + [ copied_cnt,MqlRates ] = self.h.CopyRates(symbol,period,start_cnt,end_cnt); + + end +% ************************************************************************* +% **************** Api Function ********************************************** +%************************************************************************** + + + +%% double = AccountInfoDouble(enum MtApi5.ENUM_ACCOUNT_INFO_DOUBLE) + + function res = AccountInfoDouble(self,enum) + res = self.h.AccountInfoDouble(enum); + end + +%% uint32 = SymbolsTotal(bool selected) + +function res = SymbolsTotal(self,selected) + + res = self.h.SymbolsTotal(selected); + +end + + +%% Market Info + +%% public bool SymbolInfoTick(string symbol, out MqlTick tick) +function [mqltick] = SymbolInfoTick(self,symbol) + + [mqltick] = self.h.SymbolInfoTick(symbol); + +end + +%% Trading functions + +%% bool OrderSend(MqlTradeRequest request, out MqlTradeResult result) +%% +function [res,result] = OrderSend(self, request) + + [res,result] = self.h.OrderSend(request); + + +end + + + + +%% + function r = setQuoteListener(self) + r = addlistener(self.h, 'QuoteUpdate', @self.quoteListener); + end + + function r = setQuoteAddedListener(self) + r = addlistener(self.h, 'QuoteAdded', @self.quoteAddedListener); + end + + function r = setConnectionListener(self) + r = addlistener(self.h, 'ConnectionStateChanged', @self.connectionListener); + 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(self,~,event) + askString = num2str(event.Quote.Ask,'%01.5f'); + bidString = num2str(event.Quote.Bid,'%01.5f'); + transmitString = strcat(askString,',',bidString); + text_to = sprintf('%s: %s\n',char(event.Quote.Instrument),transmitString); + + NT_TextToOutputWindow(self.hOutputWindow,text_to); + + end + + function connectionListener(self, ~, event) + connectState = event.Status.ToString; + text_to = sprintf('Connection changed: %s\n', char(connectState)); + NT_TextToOutputWindow(self.hOutputWindow,text_to); + + if (connectState.eq('Failed') == true) + text_to = sprintf('Reason: %s\n', char(event.ConnectionMessage)); + NT_TextToOutputWindow(self.hOutputWindow,text_to); + end + + end + end +end \ No newline at end of file diff --git a/Examples/MatLab/BasicExample/NT_CreateOutputWindow.m b/Examples/MatLab/BasicExample/NT_CreateOutputWindow.m new file mode 100644 index 00000000..e14b6f07 --- /dev/null +++ b/Examples/MatLab/BasicExample/NT_CreateOutputWindow.m @@ -0,0 +1,24 @@ +function [FigH,ListH] = NT_CreateOutputWindow(windowname,position) + + + +FigH = figure('Name',windowname, ... + 'menubar', 'none', ... + 'Position', position,... + 'NumberTitle','off'); + +ListH = uicontrol('Style', 'listbox', ... + 'Units', 'normalized', ... + 'Position', [0,0,1,1], ... + 'String', {}, ... + 'Min', 0, 'Max', 2, ... + 'Value', []); +end + +% for i = 1:10 +% pause(0.5); +% Str = datestr(now, 0); +% newString = cat(1, get(ListH, 'String'), {Str}); +% set(ListH, 'String', newString); +% drawnow; +% end diff --git a/Examples/MatLab/BasicExample/NT_TextToOutputWindow.m b/Examples/MatLab/BasicExample/NT_TextToOutputWindow.m new file mode 100644 index 00000000..7b754201 --- /dev/null +++ b/Examples/MatLab/BasicExample/NT_TextToOutputWindow.m @@ -0,0 +1,32 @@ +function [] = NT_TextToOutputWindow(ListH,Text) + +if isempty(Text) + error(' Text for Outputwindow is empty '); + Text = 'error'; +end + +% FigH = figure('Name',windowname, ... +% 'menubar', 'none', ... +% 'NumberTitle','off'); +% +% ListH = uicontrol('Style', 'listbox', ... +% 'Units', 'normalized', ... +% 'Position', [0,0,1,1], ... +% 'String', {}, ... +% 'Min', 0, 'Max', 2, ... +% 'Value', []); + + + + newString = cat(1, get(ListH, 'String'), {Text}); + set(ListH, 'String', newString); + drawnow; + + + + +end + + + + diff --git a/Examples/MatLab/BasicExample/TestClient.m b/Examples/MatLab/BasicExample/TestClient.m new file mode 100644 index 00000000..0f3b971c --- /dev/null +++ b/Examples/MatLab/BasicExample/TestClient.m @@ -0,0 +1,107 @@ +function TestClient +% Main program + +% interfaces to the MT5 client +% receives price data from MT5 via .NET interface +% recieives history bars from MT5 + + +ordersend_ok = false; + + [output_figH,output_listH] = NT_CreateOutputWindow('Test OutputWindow ',[400,400,800,200]); + NT_TextToOutputWindow(output_listH,'Startup ...'); + + [Trades_figH,Trades_listH] = NT_CreateOutputWindow('Trades OutputWindow ',[400,800,800,200]); + NT_TextToOutputWindow(Trades_listH,'Startup Trades Window ...'); + + [Events_figH,Events_listH] = NT_CreateOutputWindow('Events OutputWindow ',[400,1200,800,200]); + NT_TextToOutputWindow(Events_listH,'Startup Events Window ...'); + + +format short +MTApi5_dll_Location = 'C:\Program Files\MtApi5\MtApi5.dll'; + + +%% Connect to .NET + +asm1 = NET.addAssembly (MTApi5_dll_Location); + +NT_TextToOutputWindow(output_listH,'MtApi5.dll loaded ...'); +%% Open the Metatrader Link via .NET +MT5 = ConnectToMT5_Api; % creates the MT5 object +MT5.setOutputWindowHandle(Events_listH) % copy output window pointer to listener +MT5.setConnectionListener; % create connection listener +MT5.setQuoteListener; % create quote listener +MT5.setQuoteAddedListener; % create quote added listener + +port = 8301; +addr = '127.0.0.1'; +MT5.startMT5(addr,port); % establishes .NET connection + +NT_TextToOutputWindow(output_listH,'Setup Mt5Api ...'); + +while MT5.h.ConnectionState ~= MtApi5.Mt5ConnectionState.Connected + pause(0.01); + NT_TextToOutputWindow(output_listH,'Waiting for Connection....'); +end + + +NT_TextToOutputWindow(output_listH,'Connected ...'); + + +%% Test SymbolsTotal +text_to = sprintf('Symbols= %d ', MT5.SymbolsTotal(true)); +NT_TextToOutputWindow(output_listH,text_to); +%% Test AccountInfo + +text_to = sprintf('Balance = %d \n',MT5.AccountInfoDouble(MtApi5.ENUM_ACCOUNT_INFO_DOUBLE.ACCOUNT_BALANCE)); +NT_TextToOutputWindow(output_listH,text_to); +%% Test OrderSend +request = MtApi5.MqlTradeRequest; +tick = MtApi5.MqlTick; + +% [tick] = MT5.SymbolInfoTick('EURUSD'); + + +request.Action = MtApi5.ENUM_TRADE_REQUEST_ACTIONS.TRADE_ACTION_DEAL; +request.Symbol = 'EURUSD'; +request.Deviation = 30; +request.Volume = 0.01; %% Account MIN 10000 ! +request.Type = MtApi5.ENUM_ORDER_TYPE.ORDER_TYPE_BUY; + +request.Price = tick.ask; + +try + [ordersend_ok,result] = MT5.OrderSend(request); + catch exception + text_to = sprintf('NET Error in OrderSend = %s\n ',exception.message); + NT_TextToOutputWindow(Trades_listH,text_to); + end +if (ordersend_ok) + text_to = sprintf('OrderSend OK \n'); + NT_TextToOutputWindow(Trades_listH,text_to); + + text_to = sprintf('Result: %s \n',char(result.ToString)); + NT_TextToOutputWindow(Trades_listH,text_to); + +else + text_to = sprintf('OrderSend ERROR \n'); + NT_TextToOutputWindow(Trades_listH,text_to); + +end + + + +%% while not pressed 0 +while true + pause(0.1); + prompt = 'Press 0 key to stop\n'; + x = input(prompt); + if (x == 0) + break; + end +end +MT5.stopMT5; +fprintf('Connection Stopped \n'); + +end \ No newline at end of file diff --git a/Examples/MatLab/BasicExample/run.m b/Examples/MatLab/BasicExample/run.m new file mode 100644 index 00000000..db37fb9e --- /dev/null +++ b/Examples/MatLab/BasicExample/run.m @@ -0,0 +1,2 @@ + +TestClient(); \ No newline at end of file