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:
Christian_x7
2020-10-24 10:14:58 +02:00
parent 9eedf15e9e
commit 76a6216cf7
35 changed files with 7125 additions and 0 deletions
@@ -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