diff --git a/MtApi5/Events/Mt5EventTypes.cs b/MtApi5/Events/Mt5EventTypes.cs index 99e1a1a4..2d9177ba 100644 --- a/MtApi5/Events/Mt5EventTypes.cs +++ b/MtApi5/Events/Mt5EventTypes.cs @@ -5,6 +5,7 @@ OnTradeTransaction = 1, OnBookEvent = 2, OnTick = 3, - OnLastTimeBar = 4 + OnLastTimeBar = 4, + OnLockTicks = 5 } } diff --git a/MtApi5/Events/OnLockTicksEvent.cs b/MtApi5/Events/OnLockTicksEvent.cs new file mode 100644 index 00000000..0e460d79 --- /dev/null +++ b/MtApi5/Events/OnLockTicksEvent.cs @@ -0,0 +1,7 @@ +namespace MtApi5.Events +{ + internal class OnLockTicksEvent + { + public string Instrument { get; set; } + } +} \ No newline at end of file diff --git a/MtApi5/Mt5LockTicksEventArgs.cs b/MtApi5/Mt5LockTicksEventArgs.cs new file mode 100644 index 00000000..61e99cfd --- /dev/null +++ b/MtApi5/Mt5LockTicksEventArgs.cs @@ -0,0 +1,14 @@ +using System; + +namespace MtApi5 +{ + public class Mt5LockTicksEventArgs : EventArgs + { + internal Mt5LockTicksEventArgs(string symbol) + { + Symbol = symbol; + } + + public string Symbol { get; } + } +} \ No newline at end of file diff --git a/MtApi5/MtApi5.csproj b/MtApi5/MtApi5.csproj index 8bd98c21..27cb2f9a 100755 --- a/MtApi5/MtApi5.csproj +++ b/MtApi5/MtApi5.csproj @@ -50,8 +50,10 @@ + + diff --git a/MtApi5/MtApi5Client.cs b/MtApi5/MtApi5Client.cs index 60ae0658..1e6aee78 100755 --- a/MtApi5/MtApi5Client.cs +++ b/MtApi5/MtApi5Client.cs @@ -52,8 +52,9 @@ namespace MtApi5 _mtEventHandlers[Mt5EventTypes.OnBookEvent] = ReceivedOnBookEvent; _mtEventHandlers[Mt5EventTypes.OnTick] = ReceivedOnTickEvent; - _mtEventHandlers[Mt5EventTypes.OnTradeTransaction] = ReceivedOnTradeTransaction; - _mtEventHandlers[Mt5EventTypes.OnLastTimeBar] = ReceivedOnLastTimeBar; + _mtEventHandlers[Mt5EventTypes.OnTradeTransaction] = ReceivedOnTradeTransactionEvent; + _mtEventHandlers[Mt5EventTypes.OnLastTimeBar] = ReceivedOnLastTimeBarEvent; + _mtEventHandlers[Mt5EventTypes.OnLockTicks] = ReceivedOnLockTicksEvent; } /// @@ -3118,6 +3119,7 @@ namespace MtApi5 public event EventHandler OnTradeTransaction; public event EventHandler OnBookEvent; public event EventHandler OnLastTimeBar; + public event EventHandler OnLockTicks; #endregion #region Private Methods @@ -3193,7 +3195,7 @@ namespace MtApi5 _mtEventHandlers[eventType](e.ExpertHandle, e.Payload); } - private void ReceivedOnTradeTransaction(int expertHandler, string payload) + private void ReceivedOnTradeTransactionEvent(int expertHandler, string payload) { var e = JsonConvert.DeserializeObject(payload); OnTradeTransaction?.Invoke(this, new Mt5TradeTransactionEventArgs @@ -3230,12 +3232,18 @@ namespace MtApi5 QuoteUpdate?.Invoke(this, new Mt5QuoteEventArgs(quote)); } - private void ReceivedOnLastTimeBar(int expertHandler, string payload) + private void ReceivedOnLastTimeBarEvent(int expertHandler, string payload) { var e = JsonConvert.DeserializeObject(payload); OnLastTimeBar?.Invoke(this, new Mt5TimeBarArgs(expertHandler, e.Instrument, e.Rates)); } + private void ReceivedOnLockTicksEvent(int expertHandler, string payload) + { + var e = JsonConvert.DeserializeObject(payload); + OnLockTicks?.Invoke(this, new Mt5LockTicksEventArgs(e.Instrument)); + } + 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 5cb712dc..971dd8d2 100755 --- a/TestClients/MtApi5TestClient/ViewModel.cs +++ b/TestClients/MtApi5TestClient/ViewModel.cs @@ -291,7 +291,8 @@ namespace MtApi5TestClient _mtApiClient.QuoteUpdate += mMtApiClient_QuoteUpdate; _mtApiClient.OnTradeTransaction += mMtApiClient_OnTradeTransaction; _mtApiClient.OnBookEvent += _mtApiClient_OnBookEvent; - _mtApiClient.OnLastTimeBar += _mtApiClient_OnOnLastTimeBar; + _mtApiClient.OnLastTimeBar += _mtApiClient_OnLastTimeBar; + _mtApiClient.OnLockTicks += _mtApiClient_OnLockTicks; ConnectionState = _mtApiClient.ConnectionState; ConnectionMessage = "Disconnected"; @@ -1650,11 +1651,16 @@ namespace MtApi5TestClient AddLog($"OnBookEvent: ExpertHandle = {e.ExpertHandle}, Symbol = {e.Symbol}"); } - private void _mtApiClient_OnOnLastTimeBar(object sender, Mt5TimeBarArgs e) + private void _mtApiClient_OnLastTimeBar(object sender, Mt5TimeBarArgs e) { AddLog($"OnBookEvent: ExpertHandle = {e.ExpertHandle}, Symbol = {e.Symbol}, open = {e.Rates.open}, close = {e.Rates.close}, time = {e.Rates.time}, high = {e.Rates.high}, low = {e.Rates.low}"); } + private void _mtApiClient_OnLockTicks(object sender, Mt5LockTicksEventArgs e) + { + AddLog($"OnLockTicksEvent: Symbol = {e.Symbol}"); + } + private void AddQuote(Mt5Quote quote) { if (_quotesMap.ContainsKey(quote.ExpertHandle)) diff --git a/mq5/MtApi5.ex5 b/mq5/MtApi5.ex5 index 06948ab2..a5cc4ad3 100755 Binary files a/mq5/MtApi5.ex5 and b/mq5/MtApi5.ex5 differ diff --git a/mq5/MtApi5.mq5 b/mq5/MtApi5.mq5 index 3dc9297b..5d20ccb0 100644 --- a/mq5/MtApi5.mq5 +++ b/mq5/MtApi5.mq5 @@ -96,9 +96,9 @@ void OnTick() MqlRates rates_array[]; CopyRates(symbol, Period(), 1, 1, rates_array); - MtTimeBar* timeBar = new MtTimeBar(symbol, rates_array[0]); - SendMtEvent(LAST_TIME_BAR_EVENT, timeBar); - delete timeBar; + MtTimeBarEvent* time_bar = new MtTimeBarEvent(symbol, rates_array[0]); + SendMtEvent(ON_LAST_TIME_BAR_EVENT, time_bar); + delete time_bar; lastbar_time_changed = true; } @@ -119,6 +119,10 @@ void OnTick() (BacktestingLockTicks == LOCK_EVERY_CANDLE && lastbar_time_changed)) { _is_ticks_locked = true; + + MtLockTickEvent * lock_tick_event = new MtLockTickEvent(symbol); + SendMtEvent(ON_LOCK_TICKS_EVENT, lock_tick_event); + delete lock_tick_event; } OnTimer(); @@ -7283,7 +7287,8 @@ enum MtEventTypes ON_TRADE_TRANSACTION_EVENT = 1, ON_BOOK_EVENT = 2, ON_TICK_EVENT = 3, - LAST_TIME_BAR_EVENT = 4 + ON_LAST_TIME_BAR_EVENT = 4, + ON_LOCK_TICKS_EVENT = 5 }; class MtEvent @@ -7359,10 +7364,10 @@ private: MqlTick _tick; }; -class MtTimeBar: public MtEvent +class MtTimeBarEvent: public MtEvent { public: - MtTimeBar(string symbol, const MqlRates& rates) + MtTimeBarEvent(string symbol, const MqlRates& rates) { _symbol = symbol; _rates = rates; @@ -7382,6 +7387,25 @@ private: MqlRates _rates; }; +class MtLockTickEvent: public MtEvent +{ +public: + MtLockTickEvent(string symbol) + { + _symbol = symbol; + } + + virtual JSONObject* CreateJson() + { + JSONObject *jo = new JSONObject(); + jo.put("Instrument", new JSONString(_symbol)); + return jo; + } + +private: + string _symbol; +}; + void SendMtEvent(MtEventTypes eventType, MtEvent* mtEvent) { #ifdef __DEBUG_LOG__