mirror of
https://github.com/vdemydiuk/mtapi.git
synced 2026-07-30 12:07:51 +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
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
classdef Deal < handle
|
||||
%DEAL Summary of this class goes here
|
||||
% Detailed explanation goes here
|
||||
|
||||
properties
|
||||
% Integer
|
||||
DEAL_TICKET = int32([]); % Das Ticket des Trades. Das ist eine einmalige Nummer, die jedem Trade zugewiesen wird.
|
||||
DEAL_ORDER = int32([]); % Order, auf deren Grund der Deal abgeschlossen wurde
|
||||
DEAL_TIME = datetime([],[],[]); % Zeit des Dealabschlusses
|
||||
DEAL_TIME_MSC = int32([]) % Zeitpunkt der Transaktion in Millisekunden seit 01.01.1970
|
||||
DEAL_TYPE = MtApi5.ENUM_DEAL_TYPE; % Typ des Deals
|
||||
DEAL_ENTRY = MtApi5.ENUM_DEAL_ENTRY; % Dealsrichtung - Markteingang, Marktausgang oder Kehrwendung
|
||||
DEAL_MAGIC = int32([]) % Magic number für Deal (sehen Sie ORDER_MAGIC)
|
||||
DEAL_REASON = MtApi5.ENUM_DEAL_REASON; % Grund oder Ursprung der Ausführung eines Abschlusses
|
||||
DEAL_POSITION_ID = int32([]) % Indetifikator der Position, an deren Öffnung, Veränderung oder Schliessung sich der Deal teilnahm. Jede Position hat ihren unikalen Identifikator, der allen Deals zugeordnet wird, die im Instrument innerhalb des ganzen Lebens der Position abgeschlossen wurde.
|
||||
|
||||
% Double
|
||||
DEAL_VOLUME = double([]); % Dealvolumen
|
||||
DEAL_PRICE = double([]); % Dealpreis
|
||||
DEAL_COMMISSION = double([]); % Dealkommission
|
||||
DEAL_SWAP = double([]); % Gesamtswap beim Schliessen
|
||||
DEAL_PROFIT = double([]); % finanzielles Ergebnis des Deals
|
||||
|
||||
% String
|
||||
DEAL_SYMBOL = char([]); % Dealssymbol
|
||||
DEAL_COMMENT = char([]); % Kommentar zum Deal
|
||||
DEAL_EXTERNAL_ID = char([]); % Identifikator des Deals im Außenhandelssystem (an der Börse)
|
||||
|
||||
end
|
||||
|
||||
methods
|
||||
function obj = Deal()
|
||||
% DEAL Construct an instance of this class
|
||||
% Detailed explanation goes here
|
||||
% Create an empty Deal Object
|
||||
|
||||
end
|
||||
|
||||
function outputArg = method1(obj,inputArg)
|
||||
%METHOD1 Summary of this method goes here
|
||||
% Detailed explanation goes here
|
||||
outputArg = obj.Property1 + inputArg;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
classdef Position < handle
|
||||
%POSITION Summary of this class goes here
|
||||
% Detailed explanation goes here
|
||||
|
||||
properties
|
||||
POSITION_TIME = datetime([],[],[]);
|
||||
POSITION_TICKET = int64([]);
|
||||
POSITION_TIME_MSC = int64([]);
|
||||
POSITION_TIME_UPDATE = int64([]);
|
||||
POSITION_TIME_UPDATE_MSC = int64([]);
|
||||
POSITION_TYPE = MtApi5.ENUM_POSITION_TYPE;
|
||||
POSITION_MAGIC = int64([]);
|
||||
POSITION_IDENTIFIER = int64([]);
|
||||
POSITION_REASON = MtApi5.ENUM_POSITION_REASON;
|
||||
|
||||
POSITION_VOLUME = double([]);
|
||||
POSITION_PRICE_OPEN = double([]);
|
||||
POSITION_SL = double([]);
|
||||
POSITION_TP = double([]);
|
||||
POSITION_PRICE_CURRENT = double([]);
|
||||
POSITION_SWAP = double([]);
|
||||
POSITION_PROFIT = double([]);
|
||||
|
||||
POSITION_SYMBOL = char([]);
|
||||
POSITION_COMMENT = char([]);
|
||||
end
|
||||
|
||||
methods
|
||||
function obj = Position()
|
||||
%POSITION Construct an instance of this class
|
||||
% Detailed explanation goes here
|
||||
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
classdef Tick < handle
|
||||
% Tick Summary of this class goes here
|
||||
% Detailed explanation goes here
|
||||
|
||||
properties
|
||||
|
||||
sdt_Time; % Zeit des letzten Updates der Preise
|
||||
d_Bid; % Laufender Preis Bid
|
||||
d_Ask; % Laufender Preis Ask
|
||||
d_Last; % Laufender Preis des letzten Deals (Last)
|
||||
uI_Volume; % Volumen für laufenden Preis Last
|
||||
I_Time_msc; % Zeit der letzten Aktualisierung der Preise in Millisekunden
|
||||
I_MtTime; % Zeit der letzten Aktualisierung der Preise
|
||||
ui_Flags % Tick-Flags
|
||||
|
||||
|
||||
end
|
||||
|
||||
methods
|
||||
|
||||
function obj = Tick()
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
classdef Ticks < handle
|
||||
% Ticks Summary of this class goes here
|
||||
% Detailed explanation goes here
|
||||
|
||||
properties
|
||||
|
||||
mqlTicks; % DataStore.Tick Handles
|
||||
|
||||
I_Size = 0; % Anzahl der Ticks
|
||||
|
||||
|
||||
|
||||
end
|
||||
|
||||
methods
|
||||
|
||||
function obj = Ticks()
|
||||
|
||||
|
||||
end
|
||||
|
||||
function ok = createMqlTicks(self,i_Count)
|
||||
|
||||
if isinteger(i_Count)
|
||||
|
||||
newticks(i_Count) = DataStore.Tick();
|
||||
self.mqlTicks = newticks;
|
||||
% self.I_Size = i_Count;
|
||||
ok = true;
|
||||
else
|
||||
warning('Count must be Integer');
|
||||
ok = false;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function ok = fillMqlTicks(self, I_Count, MqlTicks)
|
||||
|
||||
if self.I_Size == 0
|
||||
|
||||
|
||||
|
||||
ok = true;
|
||||
else
|
||||
warning('mqlTicks object size must be 0')
|
||||
ok = false;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function ok = storeNewMqlTick(self,MqlTick)
|
||||
|
||||
|
||||
I_newsize = self.I_Size+1;
|
||||
|
||||
self.mqlTicks(I_newsize).d_Bid = MqlTick.bid;
|
||||
self.mqlTicks(I_newsize).d_Ask = MqlTick.ask;
|
||||
|
||||
self.mqlTicks(I_newsize).I_MtTime = MqlTick.MtTime;
|
||||
self.mqlTicks(I_newsize).sdt_Time = MqlTick.time;
|
||||
|
||||
self.I_Size = I_newsize;
|
||||
|
||||
ok = true;
|
||||
end
|
||||
function ok = storeNewQuoteEvent(self,Event)
|
||||
|
||||
|
||||
I_newsize = self.I_Size+1;
|
||||
|
||||
self.mqlTicks(I_newsize).d_Bid = Event.Quote.Bid;
|
||||
self.mqlTicks(I_newsize).d_Ask = Event.Quote.Ask;
|
||||
|
||||
% self.mqlTicks(I_newsize).I_MtTime = MqlTick.MtTime;
|
||||
% self.mqlTicks(I_newsize).sdt_Time = MqlTick.time;
|
||||
|
||||
self.I_Size = I_newsize;
|
||||
|
||||
% fprintf('%d Ticks stored \n',self.I_Size);
|
||||
% fprintf('Bid: %d Ask: %d \n',Event.Quote.Bid , Event.Quote.Ask);
|
||||
|
||||
ok = true;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
classdef TradingData < handle
|
||||
%TRADINGDATA Summary of this class goes here
|
||||
% Detailed explanation goes here
|
||||
|
||||
properties
|
||||
core_trades
|
||||
net_signal
|
||||
net_class
|
||||
net_score
|
||||
net_input
|
||||
|
||||
end
|
||||
|
||||
properties (SetAccess=protected)
|
||||
size
|
||||
cnt
|
||||
end
|
||||
|
||||
methods
|
||||
function obj = TradingData()
|
||||
%TRADINGDATA Construct an instance of this class
|
||||
% Create datastore for logging all data
|
||||
|
||||
end
|
||||
|
||||
function ok = setup(self,size,sizeTrades)
|
||||
%SETUP Summary of this method goes here
|
||||
% Setup Object
|
||||
% args:
|
||||
% 1 = Array Size (Bars)
|
||||
% 2 = Array Size Trades (default 1000)
|
||||
|
||||
self.size = size;
|
||||
|
||||
self.core_trades = zeros(sizeTrades,4);
|
||||
self.net_signal = zeros(size,1);
|
||||
self.net_signal = zeros(size,1);
|
||||
self.net_score = zeros(size,4,'single');
|
||||
|
||||
a = repmat([0],3,500);
|
||||
self.net_input = repmat({a},size,1);
|
||||
|
||||
classArray(size,1) = categorical(0);
|
||||
self.net_class = classArray;
|
||||
ok = true;
|
||||
end
|
||||
function set_Count(self,cnt)
|
||||
self.cnt = cnt;
|
||||
end
|
||||
function store_NetInput(self,data)
|
||||
self.net_input{self.cnt,1} = data{1,1};
|
||||
end
|
||||
function store_NetOutSignal(self,data)
|
||||
self.net_signal(self.cnt) = data;
|
||||
end
|
||||
function store_NetOutClass(self,data)
|
||||
self.net_class(self.cnt,1) = data;
|
||||
end
|
||||
function store_NetOutScore(self,data)
|
||||
size = length(data);
|
||||
self.net_score(self.cnt,1:size) = data(:);
|
||||
end
|
||||
|
||||
function reorganizeData(self)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
end
|
||||
% Getters
|
||||
function data = get_Data(self)
|
||||
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user