diff --git a/MtApi/ChartEventArgs.cs b/MtApi/ChartEventArgs.cs new file mode 100644 index 00000000..79f534ea --- /dev/null +++ b/MtApi/ChartEventArgs.cs @@ -0,0 +1,24 @@ +using System; + +namespace MtApi +{ + public class ChartEventArgs : EventArgs + { + internal ChartEventArgs(int expertHandle, MtChartEvent chartEvent) + { + ExpertHandle = expertHandle; + ChartId = chartEvent.ChartId; + EventId = chartEvent.EventId; + Lparam = chartEvent.Lparam; + Dparam = chartEvent.Dparam; + Sparam = chartEvent.Sparam; + } + + public int ExpertHandle { get; } + public long ChartId { get; } + public int EventId { get; } + public long Lparam { get; } + public double Dparam { get; } + public string Sparam { get; } + } +} \ No newline at end of file diff --git a/MtApi/EnumChartEvent.cs b/MtApi/EnumChartEvent.cs new file mode 100644 index 00000000..a27c10eb --- /dev/null +++ b/MtApi/EnumChartEvent.cs @@ -0,0 +1,18 @@ +namespace MtApi +{ + public enum EnumChartEvent + { + CHARTEVENT_KEYDOWN = 0, + CHARTEVENT_MOUSE_MOVE = 10, + CHARTEVENT_OBJECT_CREATE = 7, + CHARTEVENT_OBJECT_CHANGE = 8, + CHARTEVENT_OBJECT_DELETE = 6, + CHARTEVENT_CLICK = 4, + CHARTEVENT_OBJECT_CLICK = 1, + CHARTEVENT_OBJECT_DRAG = 2, + CHARTEVENT_OBJECT_ENDEDIT = 3, + CHARTEVENT_CHART_CHANGE = 9, + CHARTEVENT_CUSTOM = 1000, + CHARTEVENT_CUSTOM_LAST = 66534 + } +} \ No newline at end of file diff --git a/MtApi/MtApi.csproj b/MtApi/MtApi.csproj index b6e7a415..3a7b9699 100755 --- a/MtApi/MtApi.csproj +++ b/MtApi/MtApi.csproj @@ -58,6 +58,7 @@ + @@ -77,6 +78,7 @@ + diff --git a/MtApi/MtApiClient.cs b/MtApi/MtApiClient.cs index f4becd06..83756173 100755 --- a/MtApi/MtApiClient.cs +++ b/MtApi/MtApiClient.cs @@ -3068,18 +3068,24 @@ namespace MtApi switch(eventType) { case MtEventTypes.LastTimeBar: - { - FireOnLastTimeBar(JsonConvert.DeserializeObject(e.Payload)); - } + FireOnLastTimeBar(e.ExpertHandle, JsonConvert.DeserializeObject(e.Payload)); + break; + case MtEventTypes.ChartEvent: + FireOnChartEvent(e.ExpertHandle, JsonConvert.DeserializeObject(e.Payload)); break; default: throw new ArgumentOutOfRangeException(); } } - private void FireOnLastTimeBar(MtTimeBar timeBar) + private void FireOnLastTimeBar(int expertHandler, MtTimeBar timeBar) { - OnLastTimeBar?.Invoke(this, new TimeBarArgs(timeBar)); + OnLastTimeBar?.Invoke(this, new TimeBarArgs(expertHandler, timeBar)); + } + + private void FireOnChartEvent(int expertHandler, MtChartEvent chartEvent) + { + OnChartEvent?.Invoke(this, new ChartEventArgs(expertHandler, chartEvent)); } private void BacktestingReady() @@ -3097,6 +3103,7 @@ namespace MtApi public event EventHandler QuoteRemoved; public event EventHandler ConnectionStateChanged; public event EventHandler OnLastTimeBar; + public event EventHandler OnChartEvent; #endregion } diff --git a/MtApi/MtChartEvent.cs b/MtApi/MtChartEvent.cs new file mode 100644 index 00000000..838d2af9 --- /dev/null +++ b/MtApi/MtChartEvent.cs @@ -0,0 +1,11 @@ +namespace MtApi +{ + internal class MtChartEvent + { + public long ChartId { get; set; } + public int EventId { get; set; } + public long Lparam { get; set; } + public double Dparam { get; set; } + public string Sparam { get; set; } + } +} \ No newline at end of file diff --git a/MtApi/MtEventTypes.cs b/MtApi/MtEventTypes.cs index 28616df7..735f20c4 100644 --- a/MtApi/MtEventTypes.cs +++ b/MtApi/MtEventTypes.cs @@ -2,6 +2,7 @@ { public enum MtEventTypes { - LastTimeBar = 1 + LastTimeBar = 1, + ChartEvent = 2 } } diff --git a/MtApi/MtTimeBar.cs b/MtApi/MtTimeBar.cs index dfb1208a..5cb01da4 100644 --- a/MtApi/MtTimeBar.cs +++ b/MtApi/MtTimeBar.cs @@ -11,16 +11,7 @@ namespace MtApi public double Close { get; set; } public double High { get; set; } public double Low { get; set; } - - public DateTime OpenTime - { - get { return MtApiTimeConverter.ConvertFromMtTime(MtOpenTime); } - } - - public DateTime CloseTime - { - get { return MtApiTimeConverter.ConvertFromMtTime(MtCloseTime); } - } - + public DateTime OpenTime => MtApiTimeConverter.ConvertFromMtTime(MtOpenTime); + public DateTime CloseTime => MtApiTimeConverter.ConvertFromMtTime(MtCloseTime); } } diff --git a/MtApi/Properties/AssemblyInfo.cs b/MtApi/Properties/AssemblyInfo.cs index bd74ab33..249e6ea5 100644 --- a/MtApi/Properties/AssemblyInfo.cs +++ b/MtApi/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.37.0")] -[assembly: AssemblyFileVersion("1.0.37.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.0.38.0")] +[assembly: AssemblyFileVersion("1.0.38.0")] \ No newline at end of file diff --git a/MtApi/TimeBarArgs.cs b/MtApi/TimeBarArgs.cs index 10694b75..93ddad01 100644 --- a/MtApi/TimeBarArgs.cs +++ b/MtApi/TimeBarArgs.cs @@ -4,11 +4,18 @@ namespace MtApi { public class TimeBarArgs: EventArgs { + internal TimeBarArgs(int expertHandle, MtTimeBar timeBar) + : this(timeBar) + { + ExpertHandle = expertHandle; + } + public TimeBarArgs(MtTimeBar timeBar) { TimeBar = timeBar; } - public MtTimeBar TimeBar { get; private set; } + public int ExpertHandle { get; } + public MtTimeBar TimeBar { get; } } } diff --git a/MtApi5/Mt5CommandType.cs b/MtApi5/Mt5CommandType.cs index 3b468ebc..8a8aab49 100755 --- a/MtApi5/Mt5CommandType.cs +++ b/MtApi5/Mt5CommandType.cs @@ -114,5 +114,7 @@ namespace MtApi5 //Requests MtRequest = 155, + + PositionSelectByTicket = 69 } } diff --git a/MtApi5/MtApi5Client.cs b/MtApi5/MtApi5Client.cs index 8352c369..33bf084b 100755 --- a/MtApi5/MtApi5Client.cs +++ b/MtApi5/MtApi5Client.cs @@ -223,6 +223,17 @@ namespace MtApi5 return SendCommand(Mt5CommandType.PositionSelect, commandParameters); } + /// + ///Selects an open position to work with based on the ticket number specified in the position. If successful, returns true. Returns false if the function failed. + /// + ///Position ticket. + public bool PositionSelectByTicket(ulong ticket) + { + var commandParameters = new ArrayList { ticket }; + + return SendCommand(Mt5CommandType.PositionSelectByTicket, commandParameters); + } + /// ///The function returns the requested property of an open position, pre-selected using PositionGetSymbol or PositionSelect. /// diff --git a/TestClients/TestApiClientUI/Form1.cs b/TestClients/TestApiClientUI/Form1.cs index b2b4b819..acf0bf87 100644 --- a/TestClients/TestApiClientUI/Form1.cs +++ b/TestClients/TestApiClientUI/Form1.cs @@ -42,6 +42,7 @@ namespace TestApiClientUI _apiClient.QuoteRemoved += apiClient_QuoteRemoved; _apiClient.ConnectionStateChanged += apiClient_ConnectionStateChanged; _apiClient.OnLastTimeBar += _apiClient_OnLastTimeBar; + _apiClient.OnChartEvent += _apiClient_OnChartEvent; InitOrderCommandsGroup(); @@ -134,7 +135,15 @@ namespace TestApiClientUI private void _apiClient_OnLastTimeBar(object sender, TimeBarArgs e) { var msg = - $"TimeBar: Symbol = {e.TimeBar.Symbol}, OpenTime = {e.TimeBar.OpenTime}, CloseTime = {e.TimeBar.CloseTime}, Open = {e.TimeBar.Open}, Close = {e.TimeBar.Close}, High = {e.TimeBar.High}, Low = {e.TimeBar.Low}"; + $"TimeBar: ExpertHandle = {e.ExpertHandle}, Symbol = {e.TimeBar.Symbol}, OpenTime = {e.TimeBar.OpenTime}, CloseTime = {e.TimeBar.CloseTime}, Open = {e.TimeBar.Open}, Close = {e.TimeBar.Close}, High = {e.TimeBar.High}, Low = {e.TimeBar.Low}"; + Console.WriteLine(msg); + PrintLog(msg); + } + + private void _apiClient_OnChartEvent(object sender, ChartEventArgs e) + { + var msg = + $"OnChartEvent: ExpertHandle = {e.ExpertHandle}, ChartId = {e.ChartId}, EventId = {e.EventId}, Lparam = {e.Lparam}, Dparam = {e.Dparam}, Sparam = {e.Sparam}"; Console.WriteLine(msg); PrintLog(msg); } diff --git a/mq4/MtApi.ex4 b/mq4/MtApi.ex4 index 44d817ce..f26b7368 100755 Binary files a/mq4/MtApi.ex4 and b/mq4/MtApi.ex4 differ diff --git a/mq4/MtApi.mq4 b/mq4/MtApi.mq4 index fb232bbe..3d461b73 100755 Binary files a/mq4/MtApi.mq4 and b/mq4/MtApi.mq4 differ diff --git a/mq5/MtApi5.ex5 b/mq5/MtApi5.ex5 index 000963b3..da066927 100755 Binary files a/mq5/MtApi5.ex5 and b/mq5/MtApi5.ex5 differ diff --git a/mq5/MtApi5.mq5 b/mq5/MtApi5.mq5 index c3501f59..bc4e935a 100755 --- a/mq5/MtApi5.mq5 +++ b/mq5/MtApi5.mq5 @@ -1719,15 +1719,19 @@ int executeCommand() case 68: //Print { - string printMsg; - StringInit(printMsg, 1000, 0); + string printMsg; + StringInit(printMsg, 1000, 0); - getStringValue(ExpertHandle, 0, printMsg); + getStringValue(ExpertHandle, 0, printMsg); - Print(printMsg); - sendBooleanResponse(ExpertHandle, true); + Print(printMsg); + sendBooleanResponse(ExpertHandle, true); } break; + + case 69: //PositionSelectByTicket + Execute_PositionSelectByTicket(); + break; default: Print("Unknown command type = ", commandType); @@ -1738,6 +1742,13 @@ int executeCommand() return (commandType); } +void Execute_PositionSelectByTicket() +{ + ulong ticket; + getULongValue(ExpertHandle, 0, ticket); + sendBooleanResponse(ExpertHandle, PositionSelectByTicket(ticket)); +} + void PrintParamError(string paramName) { Print("[ERROR] parameter: ", paramName);