diff --git a/MtApi5/Events/Mt5EventTypes.cs b/MtApi5/Events/Mt5EventTypes.cs index 2201a791..6fb3a3bd 100644 --- a/MtApi5/Events/Mt5EventTypes.cs +++ b/MtApi5/Events/Mt5EventTypes.cs @@ -2,6 +2,7 @@ { internal enum Mt5EventTypes { - OnTradeTransaction = 1 + OnTradeTransaction = 1, + OnBookEvent = 2 } } diff --git a/MtApi5/Events/OnBookEvent.cs b/MtApi5/Events/OnBookEvent.cs new file mode 100644 index 00000000..d3f57811 --- /dev/null +++ b/MtApi5/Events/OnBookEvent.cs @@ -0,0 +1,7 @@ +namespace MtApi5.Events +{ + internal class OnBookEvent + { + public string Symbol { get; set; } + } +} \ No newline at end of file diff --git a/MtApi5/Mt5BookEventArgs.cs b/MtApi5/Mt5BookEventArgs.cs new file mode 100644 index 00000000..6a280cb5 --- /dev/null +++ b/MtApi5/Mt5BookEventArgs.cs @@ -0,0 +1,10 @@ +using System; + +namespace MtApi5 +{ + public class Mt5BookEventArgs : EventArgs + { + public int ExpertHandle { get; set; } + public string Symbol { get; set; } //Symbol of OnBookEvent event. + } +} \ No newline at end of file diff --git a/MtApi5/MtApi5.csproj b/MtApi5/MtApi5.csproj index 4507f832..58dfa757 100755 --- a/MtApi5/MtApi5.csproj +++ b/MtApi5/MtApi5.csproj @@ -48,6 +48,7 @@ + @@ -55,6 +56,7 @@ + diff --git a/MtApi5/MtApi5Client.cs b/MtApi5/MtApi5Client.cs index 393230e9..7c24ee34 100755 --- a/MtApi5/MtApi5Client.cs +++ b/MtApi5/MtApi5Client.cs @@ -2387,6 +2387,7 @@ namespace MtApi5 public event EventHandler QuoteRemoved; public event EventHandler ConnectionStateChanged; public event EventHandler OnTradeTransaction; + public event EventHandler OnBookEvent; #endregion #region Private Methods @@ -2464,6 +2465,9 @@ namespace MtApi5 case Mt5EventTypes.OnTradeTransaction: ReceivedOnTradeTransaction(e.ExpertHandle, e.Payload); break; + case Mt5EventTypes.OnBookEvent: + ReceivedOnBookEvent(e.ExpertHandle, e.Payload); + break; default: throw new ArgumentOutOfRangeException(); } @@ -2481,6 +2485,16 @@ namespace MtApi5 }); } + private void ReceivedOnBookEvent(int expertHandler, string payload) + { + var e = JsonConvert.DeserializeObject(payload); + OnBookEvent?.Invoke(this, new Mt5BookEventArgs + { + ExpertHandle = expertHandler, + Symbol = e.Symbol + }); + } + private void Connect(string host, int port) { var client = new MtClient(host, port); diff --git a/TestClients/MtApi5TestClient/ViewModel.cs b/TestClients/MtApi5TestClient/ViewModel.cs index cde86b92..31fe1dc1 100755 --- a/TestClients/MtApi5TestClient/ViewModel.cs +++ b/TestClients/MtApi5TestClient/ViewModel.cs @@ -175,6 +175,7 @@ namespace MtApi5TestClient _mtApiClient.QuoteRemoved += mMtApiClient_QuoteRemoved; _mtApiClient.QuoteUpdated += mMtApiClient_QuoteUpdated; _mtApiClient.OnTradeTransaction += mMtApiClient_OnTradeTransaction; + _mtApiClient.OnBookEvent += _mtApiClient_OnBookEvent; _quotesMap = new Dictionary(); @@ -1014,6 +1015,11 @@ namespace MtApi5TestClient AddLog($"OnTradeTransaction: ExpertHandle = {e.ExpertHandle}.{Environment.NewLine}Transaction = {e.Trans}.{Environment.NewLine}Request = {e.Request}.{Environment.NewLine}Result = {e.Result}."); } + private void _mtApiClient_OnBookEvent(object sender, Mt5BookEventArgs e) + { + AddLog($"OnBookEvent: ExpertHandle = {e.ExpertHandle}, Symbol = {e.Symbol}"); + } + private void AddQuote(Mt5Quote quote) { if (quote == null) diff --git a/mq5/MtApi5.ex5 b/mq5/MtApi5.ex5 index d76d6e4c..2c956cbb 100755 Binary files a/mq5/MtApi5.ex5 and b/mq5/MtApi5.ex5 differ diff --git a/mq5/MtApi5.mq5 b/mq5/MtApi5.mq5 index 48b14d51..71f7e987 100755 --- a/mq5/MtApi5.mq5 +++ b/mq5/MtApi5.mq5 @@ -41,7 +41,7 @@ bool getBooleanValue(int expertHandle, int paramIndex, bool& res, string& err); #import -#define __DEBUG_LOG__ +//#define __DEBUG_LOG__ input int Port = 8228; @@ -85,12 +85,23 @@ void OnTradeTransaction( ) { #ifdef __DEBUG_LOG__ - Print("%s:", __FUNCTION__); + PrintFormat("%s:", __FUNCTION__); #endif - OnTradeTransactionEvent* transEvent = new OnTradeTransactionEvent(trans, request, result); - SendMtEvent(ON_TRADE_TRANSACTION_EVENT, transEvent); - delete transEvent; + MtOnTradeTransactionEvent* trans_event = new MtOnTradeTransactionEvent(trans, request, result); + SendMtEvent(ON_TRADE_TRANSACTION_EVENT, trans_event); + delete trans_event; +} + +void OnBookEvent(const string& symbol) +{ +#ifdef __DEBUG_LOG__ + PrintFormat("%s: %s", __FUNCTION__, symbol); +#endif + + MtOnBookEvent * book_event = new MtOnBookEvent(symbol); + SendMtEvent(ON_BOOK_EVENT, book_event); + delete book_event; } int preinit() @@ -6043,7 +6054,8 @@ string ExecuteRequest_IndicatorCreate(JSONObject *jo) enum MtEventTypes { - ON_TRADE_TRANSACTION_EVENT = 1 + ON_TRADE_TRANSACTION_EVENT = 1, + ON_BOOK_EVENT = 2 }; class MtEvent @@ -6052,10 +6064,10 @@ public: virtual JSONObject* CreateJson() = 0; }; -class OnTradeTransactionEvent : public MtEvent +class MtOnTradeTransactionEvent : public MtEvent { public: - OnTradeTransactionEvent(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) + MtOnTradeTransactionEvent(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { _trans = trans; _request = request; @@ -6077,6 +6089,25 @@ private: MqlTradeResult _result; }; +class MtOnBookEvent : public MtEvent +{ +public: + MtOnBookEvent(const string& symbol) + { + _symbol = symbol; + } + + virtual JSONObject* CreateJson() + { + JSONObject *jo = new JSONObject(); + jo.put("Symbol", new JSONString(_symbol)); + return jo; + } + +private: + string _symbol; +}; + void SendMtEvent(MtEventTypes eventType, MtEvent* mtEvent) { #ifdef __DEBUG_LOG__