mirror of
https://github.com/vdemydiuk/mtapi.git
synced 2026-07-28 11:07:48 +00:00
Add a advanced example
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.
This commit is contained in:
@@ -0,0 +1,283 @@
|
||||
classdef Bars < handle
|
||||
%BARS Summary of this class goes here
|
||||
% Detailed explanation goes here
|
||||
|
||||
properties
|
||||
|
||||
|
||||
chSymbol = 'EURUSD' ;
|
||||
iSize = int32(0) ;
|
||||
iLast = int32(0) ;
|
||||
sStart = "" ;
|
||||
sEnd = "" ;
|
||||
sdtStart = System.DateTime.Now;
|
||||
sdtEnd = System.DateTime.Now;
|
||||
enTimeframe = MtApi5.ENUM_TIMEFRAMES;
|
||||
|
||||
mqlRates = NET.createArray('MtApi5.MqlRates', 0);
|
||||
sdOpen = NET.createArray('System.Double[]', 3) ;
|
||||
sdHigh = NET.createArray('System.Double[]', 3) ;
|
||||
sdLow = NET.createArray('System.Double[]', 3) ;
|
||||
sdClose = NET.createArray('System.Double[]', 3) ;
|
||||
sdtTime = NET.createArray('System.DateTime[]', 3) ;
|
||||
si32Spread = NET.createArray('System.Int32[]', 3) ;
|
||||
si64TickVolume = NET.createArray('System.Int64[]', 3) ;
|
||||
si64RealVolume = NET.createArray('System.Int64[]', 3) ;
|
||||
si64RealVolumeH = NET.createArray('System.Int64[]', 3) ;
|
||||
si64RealVolumeL = NET.createArray('System.Int64[]', 3) ;
|
||||
|
||||
dOpen = double(0);
|
||||
dHigh = double(0);
|
||||
dLow = double(0);
|
||||
dClose = double(0);
|
||||
i64MTtime = int64(0) ;
|
||||
dtTime = datetime();
|
||||
i32Spread = int32(0) ;
|
||||
i64TickVol = int64(0) ;
|
||||
i64RealVol = int64(0) ;
|
||||
i64RealVolH = int64(0) ;
|
||||
i64RealVolL = int64(0) ;
|
||||
end
|
||||
|
||||
methods
|
||||
|
||||
function obj = Bars(chSymbol,enTF,iSize)
|
||||
|
||||
switch nargin
|
||||
case 0
|
||||
obj.chSymbol = 'EURUSD';
|
||||
obj.iSize = 1000;
|
||||
obj.enTimeframe = MtApi5.ENUM_TIMEFRAMES.PERIOD_M1;
|
||||
return
|
||||
|
||||
case 1
|
||||
case 2
|
||||
case 3
|
||||
|
||||
obj.chSymbol = chSymbol;
|
||||
obj.iSize = iSize;
|
||||
obj.enTimeframe = enTF;
|
||||
|
||||
otherwise
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
obj.mqlRates = NET.createArray('MtApi5.MqlRates', obj.iSize);
|
||||
|
||||
|
||||
obj.sdOpen = NET.createArray('System.Double', obj.iSize);
|
||||
obj.sdHigh = NET.createArray('System.Double', obj.iSize);
|
||||
obj.sdLow = NET.createArray('System.Double', obj.iSize);
|
||||
obj.sdClose = NET.createArray('System.Double', obj.iSize);
|
||||
|
||||
obj.sdtTime = NET.createArray('System.DateTime', obj.iSize);
|
||||
|
||||
obj.si32Spread = NET.createArray('System.Int32', obj.iSize);
|
||||
obj.si64TickVolume = NET.createArray('System.Int64', obj.iSize);
|
||||
obj.si64RealVolume = NET.createArray('System.Int64', obj.iSize);
|
||||
|
||||
obj.sdtStart = System.DateTime.Now;
|
||||
obj.sdtEnd = System.DateTime.Now;
|
||||
|
||||
obj.sStart = char(obj.sdtStart.ToString);
|
||||
obj.sEnd = char(obj.sdtStart.ToString);
|
||||
|
||||
obj.enTimeframe = enTF;
|
||||
|
||||
|
||||
obj.dOpen = zeros(obj.iSize,1,'double') ;
|
||||
obj.dHigh = zeros(obj.iSize,1,'double') ;
|
||||
obj.dLow = zeros(obj.iSize,1,'double') ;
|
||||
obj.dClose = zeros(obj.iSize,1,'double') ;
|
||||
|
||||
obj.i32Spread = zeros(obj.iSize,1,'int32') ;
|
||||
obj.i64TickVol = zeros(obj.iSize,1,'int64') ;
|
||||
obj.i64RealVol = zeros(obj.iSize,1,'int64') ;
|
||||
obj.i64RealVolH = zeros(obj.iSize,1,'int64') ;
|
||||
obj.i64RealVolL = zeros(obj.iSize,1,'int64') ;
|
||||
obj.i64MTtime = zeros(obj.iSize,1,'int64') ;
|
||||
|
||||
|
||||
obj.dtTime(iSize,1) = datetime;
|
||||
|
||||
obj.dtTime.Format = 'default';
|
||||
|
||||
|
||||
|
||||
end
|
||||
function setMqlRates(self,MqlRates)
|
||||
|
||||
self.MqlRates = MqlRates;
|
||||
|
||||
end
|
||||
function saveDataAsByteStream(self,filename)
|
||||
|
||||
mc = ?DataStore.Bars;
|
||||
|
||||
propList = mc.PropertyList;
|
||||
propCnt = length(propList);
|
||||
|
||||
for i=1:1:propCnt
|
||||
bytestream.(propList(i).Name) = [];
|
||||
end
|
||||
formatter = System.Runtime.Serialization.Formatters.Binary.BinaryFormatter;
|
||||
|
||||
for idx=1:1:propCnt
|
||||
|
||||
if isa(propList(idx).DefaultValue,'System.Object')
|
||||
stream = System.IO.MemoryStream;
|
||||
formatter.Serialize(stream,self.(propList(idx).Name));
|
||||
data = uint8(stream.ToArray);
|
||||
|
||||
bytestream.(propList(idx).Name) = data;
|
||||
else
|
||||
% stream = System.IO.MemoryStream;
|
||||
% formatter.Serialize(stream,self.(propList(idx).Name));
|
||||
% data = uint8(stream.ToArray);
|
||||
|
||||
bytestream.(propList(idx).Name) = self.(propList(idx).Name);
|
||||
end
|
||||
|
||||
|
||||
|
||||
end
|
||||
|
||||
save(filename,'bytestream');
|
||||
|
||||
end
|
||||
function ok = loadDataAsByteStream(self,filename)
|
||||
ok = false;
|
||||
load(filename);
|
||||
mc = ?DataStore.Bars;
|
||||
|
||||
propList = mc.PropertyList;
|
||||
propCnt = length(propList);
|
||||
|
||||
|
||||
formatter = System.Runtime.Serialization.Formatters.Binary.BinaryFormatter;
|
||||
|
||||
for idx=1:1:propCnt
|
||||
|
||||
if isa(propList(idx).DefaultValue,'System.Object')
|
||||
data = bytestream.(propList(idx).Name);
|
||||
stream = System.IO.MemoryStream(data);
|
||||
self.(propList(idx).Name) = formatter.Deserialize(stream);
|
||||
else
|
||||
data = bytestream.(propList(idx).Name);
|
||||
self.(propList(idx).Name) = data;
|
||||
end
|
||||
|
||||
|
||||
|
||||
end
|
||||
ok = true;
|
||||
end
|
||||
function saveableData = Get_Saveable_MATfileData(self,varargin)
|
||||
|
||||
|
||||
|
||||
switch nargin
|
||||
|
||||
case 1 % no options
|
||||
|
||||
first = 1;
|
||||
last = self.iLast;
|
||||
|
||||
case 2 % first = 1 , last = input
|
||||
|
||||
first = 1;
|
||||
last = varargin{2};
|
||||
|
||||
case 3
|
||||
|
||||
first = varargin{1};
|
||||
last = varargin{2};
|
||||
|
||||
end
|
||||
|
||||
|
||||
if last > self.iLast
|
||||
last = self.iLast;
|
||||
warn('Index is out of array')
|
||||
warn('Using iLast for last')
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
saveableData.chSymbol = self.chSymbol;
|
||||
saveableData.iSize = self.iLast;
|
||||
saveableData.iLast = self.iLast;
|
||||
saveableData.sStart = self.sStart;
|
||||
saveableData.sEnd = self.sEnd;
|
||||
|
||||
saveableData.dOpen = self.dOpen(first:last,1);
|
||||
saveableData.dHigh = self.dHigh(first:last,1);
|
||||
saveableData.dLow = self.dLow(first:last,1);
|
||||
saveableData.dClose = self.dClose(first:last,1);
|
||||
saveableData.dtTime = self.dtTime(first:last,1);
|
||||
saveableData.i64MTtime = self.i64MTtime(first:last,1);
|
||||
saveableData.i32Spread = self.i32Spread(first:last,1);
|
||||
saveableData.i64TickVol = self.i64TickVol(first:last,1);
|
||||
saveableData.i64RealVol = self.i64RealVol(first:last,1);
|
||||
|
||||
|
||||
|
||||
end
|
||||
function tt= Get_TimeTable(self,varargin)
|
||||
|
||||
|
||||
switch nargin
|
||||
|
||||
case 1 % no options
|
||||
|
||||
first = 1;
|
||||
last = self.iLast;
|
||||
|
||||
case 2 % first = 1 , last = input
|
||||
|
||||
first = 1;
|
||||
last = varargin{2};
|
||||
|
||||
case 3
|
||||
|
||||
first = varargin{1};
|
||||
last = varargin{2};
|
||||
|
||||
end
|
||||
|
||||
|
||||
if last > self.iLast
|
||||
last = self.iLast;
|
||||
warn('Index is out of array')
|
||||
warn('Using iLast for last')
|
||||
end
|
||||
|
||||
Open = self.dOpen(first:last,1);
|
||||
High = self.dHigh(first:last,1);
|
||||
Low = self.dLow(first:last,1);
|
||||
Close = self.dClose(first:last,1);
|
||||
Time = self.dtTime(first:last,1);
|
||||
TicklVol = self.i64TickVol(first:last,1);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
tt = timetable(Time,Open,High,Low,Close,TicklVol);
|
||||
|
||||
tt.Properties.VariableNames = {'Open','High','Low','Close','TickVol'};
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user