MtApi5: Moving some functions to new core

This commit is contained in:
Viacheslav Demydiuk
2024-01-14 21:57:07 +02:00
parent 931dc82524
commit caac11cdad
14 changed files with 344 additions and 327 deletions
-11
View File
@@ -1,11 +0,0 @@
namespace MtApi5.Events
{
internal enum Mt5EventTypes
{
OnTradeTransaction = 1,
OnBookEvent = 2,
OnTick = 3,
OnLastTimeBar = 4,
OnLockTicks = 5
}
}
+2 -8
View File
@@ -1,13 +1,7 @@
namespace MtApi5
{
public class ExecutionException: Exception
public class ExecutionException(ErrorCode errorCode, string? message) : Exception(message)
{
public ExecutionException(ErrorCode errorCode, string? message)
:base(message)
{
ErrorCode = errorCode;
}
public ErrorCode ErrorCode { get; private set; }
public ErrorCode ErrorCode { get; private set; } = errorCode;
}
}
-261
View File
@@ -1,261 +0,0 @@
// ReSharper disable InconsistentNaming
namespace MtApi5
{
internal enum Mt5CommandType
{
//NoCommand = 0
//trade operations
//OrderSend = 1,
GetQuote = 1,
OrderCalcMargin = 2,
OrderCalcProfit = 3,
//OrderSendAsync = 5,
PositionsTotal = 6,
PositionGetSymbol = 7,
PositionSelect = 8,
PositionGetDouble = 9,
PositionGetInteger = 10,
PositionGetString = 11,
PositionGetTicket = 4,
OrdersTotal = 12,
OrderGetTicket = 13,
OrderSelect = 14,
OrderGetDouble = 15,
OrderGetInteger = 16,
OrderGetString = 17,
HistorySelect = 18,
HistorySelectByPosition = 19,
HistoryOrderSelect = 20,
HistoryOrdersTotal = 21,
HistoryOrderGetTicket = 22,
HistoryOrderGetDouble = 23,
HistoryOrderGetInteger = 24,
HistoryOrderGetString = 25,
HistoryDealSelect = 26,
HistoryDealsTotal = 27,
HistoryDealGetTicket = 28,
HistoryDealGetDouble = 29,
HistoryDealGetInteger = 30,
HistoryDealGetString = 31,
//Account Information
AccountInfoDouble = 32,
AccountInfoInteger = 33,
AccountInfoString = 34,
//Access to Timeseries and Indicator Data
SeriesInfoInteger = 35,
Bars = 36,
Bars2 = 1036,
BarsCalculated = 37,
// IndicatorCreate = 38,
// IndicatorParameters = 38,
// IndicatorRelease = 39,
CopyBuffer = 40,
CopyBuffer1 = 1040,
CopyBuffer2 = 1140,
CopyRates = 41,
CopyRates1 = 1041,
CopyRates2 = 1141,
CopyTime = 42,
CopyTime1 = 1042,
CopyTime2 = 1142,
CopyOpen = 43,
CopyOpen1 = 1043,
CopyOpen2 = 1143,
CopyHigh = 44,
CopyHigh1 = 1044,
CopyHigh2 = 1144,
CopyLow = 45,
CopyLow1 = 1045,
CopyLow2 = 1145,
CopyClose = 46,
CopyClose1 = 1046,
CopyClose2 = 1146,
CopyTickVolume = 47,
CopyTickVolume1 = 1047,
CopyTickVolume2 = 1147,
CopyRealVolume = 48,
CopyRealVolume1 = 1048,
CopyRealVolume2 = 1148,
CopySpread = 49,
CopySpread1 = 1049,
CopySpread2 = 1149,
//Market Information
SymbolsTotal = 50,
SymbolName = 51,
SymbolSelect = 52,
SymbolIsSynchronized = 53,
SymbolInfoDouble = 54,
SymbolInfoInteger = 55,
SymbolInfoString = 56,
SymbolInfoTick = 57,
SymbolInfoSessionQuote = 58,
SymbolInfoSessionTrade = 59,
MarketBookAdd = 60,
MarketBookRelease = 61,
//MarketBookGet = 62,
OrderCloseAll = 63,
//CTrade
PositionClose = 64,
PositionOpen = 65,
PositionModify = 6066,
PositionClosePartial_bySymbol = 6067,
PositionClosePartial_byTicket = 6068,
//PositionOpenWithResult = 1065,
//Backtesting
BacktestingReady = 66,
IsTesting = 67,
//Requests
MtRequest = 155,
PositionSelectByTicket = 69,
ObjectCreate = 70,
ObjectName = 71,
ObjectDelete = 72,
ObjectsDeleteAll = 73,
ObjectFind = 74,
ObjectGetTimeByValue = 75,
ObjectGetValueByTime = 76,
ObjectMove = 77,
ObjectsTotal = 78,
ObjectGetDouble = 79,
ObjectGetInteger = 80,
ObjectGetString = 81,
ObjectSetDouble = 82,
ObjectSetInteger = 83,
ObjectSetString = 84,
//TextSetFont = 85,
//TextOut = 86,
//TextGetSize = 87,
iAC = 88,
iAD = 89,
iADX = 90,
iADXWilder = 91,
iAlligator = 92,
iAMA = 93,
iAO = 94,
iATR = 95,
iBearsPower = 96,
iBands = 97,
iBullsPower = 98,
iCCI = 99,
iChaikin = 100,
//iCustom = 101,
iDEMA = 102,
iDeMarker = 103,
iEnvelopes = 104,
iForce = 105,
iFractals = 106,
iFrAMA = 107,
iGator = 108,
iIchimoku = 109,
iBWMFI = 110,
iMomentum = 111,
iMFI = 112,
iMA = 113,
iOsMA = 114,
iMACD = 115,
iOBV = 116,
iSAR = 117,
iRSI = 118,
iRVI = 119,
iStdDev = 120,
iStochastic = 121,
iTEMA = 122,
iTriX = 123,
iWPR = 124,
iVIDyA = 125,
iVolumes = 126,
//Date and Time
TimeCurrent = 127,
TimeTradeServer = 128,
TimeLocal = 129,
TimeGMT = 130,
IndicatorRelease = 131,
//Chart Operations
ChartId = 206,
ChartRedraw = 207,
ChartApplyTemplate = 236,
ChartSaveTemplate = 237,
ChartWindowFind = 238,
//ChartTimePriceToXY = 239,
//ChartXYToTimePrice = 240,
ChartOpen = 241,
ChartFirst = 242,
ChartNext = 243,
ChartClose = 244,
ChartSymbol = 245,
ChartPeriod = 246,
ChartSetDouble = 247,
ChartSetInteger = 248,
ChartSetString = 249,
ChartGetDouble = 250,
ChartGetInteger = 251,
ChartGetString = 252,
ChartNavigate = 253,
ChartIndicatorDelete = 254,
ChartIndicatorName = 255,
ChartIndicatorsTotal = 256,
ChartWindowOnDropped = 257,
ChartPriceOnDropped = 258,
ChartTimeOnDropped = 259,
ChartXOnDropped = 260,
ChartYOnDropped = 261,
ChartSetSymbolPeriod = 262,
ChartScreenShot = 263,
ChartIndicatorAdd = 280,
ChartIndicatorGet = 281,
// Terminal Operations
TerminalCompany = 68,
TerminalName = 69,
TerminalPath = 70,
//Checkup
GetLastError = 132,
TerminalInfoString = 153,
TerminalInfoInteger = 204,
TerminalInfoDouble = 205,
//Common Functions
Alert = 136,
Comment = 137, //TODO
GetTickCount = 138, //TODO
GetMicrosecondCount = 139, //TODO
MessageBox = 140, //TODO
PeriodSeconds = 141, //TODO
PlaySound = 142, //TODO
Print = 68,
ResetLastError = 143,
SendNotification = 144, //TODO
SendMail = 145, //TODO
//Global Variables
GlobalVariableCheck = 146,
GlobalVariableTime = 147,
GlobalVariableDel = 148,
GlobalVariableGet = 149,
GlobalVariableName = 150,
GlobalVariableSet = 151,
GlobalVariablesFlush = 152,
GlobalVariableTemp = 154,
GlobalVariableSetOnCondition = 156,
GlobalVariablesDeleteAll = 157,
GlobalVariablesTotal = 158,
UnlockTicks = 159,
PositionCloseAll = 160,
TesterStop = 161
}
}
+42 -38
View File
@@ -1,10 +1,10 @@
using System.Collections;
using MtApi5.Requests;
using Newtonsoft.Json;
using MtApi5.Events;
using MtClient;
using System.Reflection.Metadata;
using System.Collections.Generic;
using MtApi5.MtProtocol;
using System.Linq;
using System.Net.Http.Headers;
namespace MtApi5
{
@@ -265,11 +265,12 @@ namespace MtApi5
///Returns the symbol corresponding to the open position and automatically selects the position for further working with it using functions PositionGetDouble, PositionGetInteger, PositionGetString.
///</summary>
///<param name="index">Number of the position in the list of open positions.</param>
public string PositionGetSymbol(int index)
public string? PositionGetSymbol(int index)
{
var commandParameters = new ArrayList { index };
Dictionary<string, object> commandParameters = [];
commandParameters["Index"] = index;
return SendCommand<string>(Mt5CommandType.PositionGetSymbol, commandParameters);
return SendCommand<string>(ExecutorHandle, Mt5CommandType.PositionGetSymbol, commandParameters);
}
///<summary>
@@ -789,9 +790,8 @@ namespace MtApi5
///<param name="propertyId">Identifier of the property.</param>
public double AccountInfoDouble(ENUM_ACCOUNT_INFO_DOUBLE propertyId)
{
var commandParameters = new ArrayList { (int)propertyId };
return SendCommand<double>(Mt5CommandType.AccountInfoDouble, commandParameters);
Dictionary<string, object> commandParameters = new() { { "PropertyId", propertyId } };
return SendCommand<double>(ExecutorHandle, Mt5CommandType.AccountInfoDouble, commandParameters);
}
///<summary>
@@ -800,20 +800,18 @@ namespace MtApi5
///<param name="propertyId">Identifier of the property.</param>
public long AccountInfoInteger(ENUM_ACCOUNT_INFO_INTEGER propertyId)
{
var commandParameters = new ArrayList { (int)propertyId };
return SendCommand<long>(Mt5CommandType.AccountInfoInteger, commandParameters);
Dictionary<string, object> commandParameters = new() { { "PropertyId", propertyId } };
return SendCommand<long>(ExecutorHandle, Mt5CommandType.AccountInfoInteger, commandParameters);
}
///<summary>
///Returns the value of the corresponding account property.
///</summary>
///<param name="propertyId">Identifier of the property.</param>
public string AccountInfoString(ENUM_ACCOUNT_INFO_STRING propertyId)
public string? AccountInfoString(ENUM_ACCOUNT_INFO_STRING propertyId)
{
var commandParameters = new ArrayList { (int)propertyId };
return SendCommand<string>(Mt5CommandType.AccountInfoString, commandParameters);
Dictionary<string, object> commandParameters = new() { { "PropertyId", propertyId } };
return SendCommand<string>(ExecutorHandle, Mt5CommandType.AccountInfoString, commandParameters);
}
#endregion
@@ -3424,6 +3422,8 @@ namespace MtApi5
{
_experts = experts;
_quotes = quotes;
if (_executorHandle == 0)
_executorHandle = (_experts.Count > 0) ? _experts.ElementAt(0) : 0;
}
_quotesWaiter.Set();
@@ -3470,6 +3470,9 @@ namespace MtApi5
_experts.Remove(handle);
if (_quotes.TryGetValue(handle, out quote))
_quotes.Remove(handle);
if (_executorHandle == handle)
_executorHandle = (_experts.Count > 0) ? _experts.ElementAt(0) : 0;
}
if (quote != null)
@@ -3480,19 +3483,19 @@ namespace MtApi5
{
Log?.Debug($"GetQuote: expertHandle = {expertHandle}");
var e = SendCommand<OnTickEvent>(expertHandle, Mt5CommandType.GetQuote);
var e = SendCommand<MtQuote>(expertHandle, Mt5CommandType.GetQuote);
if (e == null || string.IsNullOrEmpty(e.Instrument) || e.Tick == null)
return null;
Mt5Quote quote = new()
{
Instrument = e.Instrument,
Bid = e.Tick.bid,
Ask = e.Tick.ask,
Bid = e.Tick.Bid,
Ask = e.Tick.Ask,
ExpertHandle = expertHandle,
Volume = e.Tick.volume,
Time = e.Tick.time,
Last = e.Tick.last
Volume = e.Tick.Volume,
Time = Mt5TimeConverter.ConvertFromMtTime(e.Tick.Time),
Last = e.Tick.Last
};
return quote;
@@ -3510,62 +3513,62 @@ namespace MtApi5
Disconnect(false);
}
private void ReceivedOnTradeTransactionEvent(int expertHandler, string payload)
private void ReceivedOnTradeTransactionEvent(int expertHandle, string payload)
{
var e = JsonConvert.DeserializeObject<OnTradeTransactionEvent>(payload);
if (e == null)
return;
OnTradeTransaction?.Invoke(this, new Mt5TradeTransactionEventArgs
{
ExpertHandle = expertHandler,
ExpertHandle = expertHandle,
Trans = e.Trans,
Request = e.Request,
Result = e.Result
});
}
private void ReceivedOnBookEvent(int expertHandler, string payload)
private void ReceivedOnBookEvent(int expertHandle, string payload)
{
var e = JsonConvert.DeserializeObject<OnBookEvent>(payload);
if (e == null || string.IsNullOrEmpty(e.Symbol))
return;
OnBookEvent?.Invoke(this, new Mt5BookEventArgs
{
ExpertHandle = expertHandler,
ExpertHandle = expertHandle,
Symbol = e.Symbol
});
}
private void ReceivedOnTickEvent(int expertHandler, string payload)
private void ReceivedOnTickEvent(int expertHandle, string payload)
{
var e = JsonConvert.DeserializeObject<OnTickEvent>(payload);
var e = JsonConvert.DeserializeObject<MtQuote>(payload);
if (e == null || string.IsNullOrEmpty(e.Instrument) || e.Tick == null)
return;
QuoteUpdated?.Invoke(this, e.Instrument, e.Tick.bid, e.Tick.ask);
QuoteUpdated?.Invoke(this, e.Instrument, e.Tick.Bid, e.Tick.Ask);
Mt5Quote quote = new()
{
Instrument = e.Instrument,
Bid = e.Tick.bid,
Ask = e.Tick.ask,
ExpertHandle = expertHandler,
Volume = e.Tick.volume,
Time = e.Tick.time,
Last = e.Tick.last
Bid = e.Tick.Bid,
Ask = e.Tick.Ask,
ExpertHandle = expertHandle,
Volume = e.Tick.Volume,
Time = Mt5TimeConverter.ConvertFromMtTime(e.Tick.Time),
Last = e.Tick.Last
};
QuoteUpdate?.Invoke(this, new Mt5QuoteEventArgs(quote));
}
private void ReceivedOnLastTimeBarEvent(int expertHandler, string payload)
private void ReceivedOnLastTimeBarEvent(int expertHandle, string payload)
{
var e = JsonConvert.DeserializeObject<OnLastTimeBarEvent>(payload);
if (e == null || string.IsNullOrEmpty(e.Instrument) || e.Rates == null)
return;
OnLastTimeBar?.Invoke(this, new Mt5TimeBarArgs(expertHandler, e.Instrument, e.Rates));
OnLastTimeBar?.Invoke(this, new Mt5TimeBarArgs(expertHandle, e.Instrument, e.Rates));
}
private void ReceivedOnLockTicksEvent(int expertHandler, string payload)
private void ReceivedOnLockTicksEvent(int expertHandle, string payload)
{
var e = JsonConvert.DeserializeObject<OnLockTicksEvent>(payload);
if (e == null || string.IsNullOrEmpty(e.Instrument))
@@ -3592,6 +3595,7 @@ namespace MtApi5
_quotes.Clear();
_experts.Clear();
_executorHandle = 0;
}
client?.Disconnect();
+8
View File
@@ -0,0 +1,8 @@
namespace MtApi5.MtProtocol
{
internal class FuncResult<T>
{
public bool RetVal { get; set; }
public T? Result { get; set; }
}
}
+12
View File
@@ -0,0 +1,12 @@
namespace MtApi5.MtProtocol
{
public class MtTick
{
public double Bid { get; set; } // Current Bid price
public double Ask { get; set; } // Current Ask price
public long Time { get; set; } // Time of the last prices update
public double Last { get; set; } // Price of the last deal (Last)
public ulong Volume { get; set; } // Volume for the current Last price
public double VolumeReal { get; set; } // Volume for the current Last price with greater accuracy
}
}
+260
View File
@@ -0,0 +1,260 @@
// ReSharper disable InconsistentNaming
namespace MtApi5.MtProtocol
{
internal enum Mt5CommandType
{
//NoCommand = 0
GetQuote = 1,
//trade operations
OrderCalcMargin = 2,
OrderCalcProfit = 3,
//OrderSendAsync = 5,
PositionsTotal = 6,
PositionGetSymbol = 7,
PositionSelect = 8,
PositionGetDouble = 9,
PositionGetInteger = 10,
PositionGetString = 11,
PositionGetTicket = 4,
OrdersTotal = 12,
OrderGetTicket = 13,
OrderSelect = 14,
OrderGetDouble = 15,
OrderGetInteger = 16,
OrderGetString = 17,
HistorySelect = 18,
HistorySelectByPosition = 19,
HistoryOrderSelect = 20,
HistoryOrdersTotal = 21,
HistoryOrderGetTicket = 22,
HistoryOrderGetDouble = 23,
HistoryOrderGetInteger = 24,
HistoryOrderGetString = 25,
HistoryDealSelect = 26,
HistoryDealsTotal = 27,
HistoryDealGetTicket = 28,
HistoryDealGetDouble = 29,
HistoryDealGetInteger = 30,
HistoryDealGetString = 31,
//Account Information
AccountInfoDouble = 32,
AccountInfoInteger = 33,
AccountInfoString = 34,
//Access to Timeseries and Indicator Data
SeriesInfoInteger = 35,
Bars = 36,
Bars2 = 1036,
BarsCalculated = 37,
// IndicatorCreate = 38,
// IndicatorParameters = 38,
// IndicatorRelease = 39,
CopyBuffer = 40,
CopyBuffer1 = 1040,
CopyBuffer2 = 1140,
CopyRates = 41,
CopyRates1 = 1041,
CopyRates2 = 1141,
CopyTime = 42,
CopyTime1 = 1042,
CopyTime2 = 1142,
CopyOpen = 43,
CopyOpen1 = 1043,
CopyOpen2 = 1143,
CopyHigh = 44,
CopyHigh1 = 1044,
CopyHigh2 = 1144,
CopyLow = 45,
CopyLow1 = 1045,
CopyLow2 = 1145,
CopyClose = 46,
CopyClose1 = 1046,
CopyClose2 = 1146,
CopyTickVolume = 47,
CopyTickVolume1 = 1047,
CopyTickVolume2 = 1147,
CopyRealVolume = 48,
CopyRealVolume1 = 1048,
CopyRealVolume2 = 1148,
CopySpread = 49,
CopySpread1 = 1049,
CopySpread2 = 1149,
//Market Information
SymbolsTotal = 50,
SymbolName = 51,
SymbolSelect = 52,
SymbolIsSynchronized = 53,
SymbolInfoDouble = 54,
SymbolInfoInteger = 55,
SymbolInfoString = 56,
SymbolInfoTick = 57,
SymbolInfoSessionQuote = 58,
SymbolInfoSessionTrade = 59,
MarketBookAdd = 60,
MarketBookRelease = 61,
//MarketBookGet = 62,
OrderCloseAll = 63,
//CTrade
PositionClose = 64,
PositionOpen = 65,
PositionModify = 6066,
PositionClosePartial_bySymbol = 6067,
PositionClosePartial_byTicket = 6068,
//PositionOpenWithResult = 1065,
//Backtesting
BacktestingReady = 66,
IsTesting = 67,
//Requests
MtRequest = 155,
PositionSelectByTicket = 69,
ObjectCreate = 70,
ObjectName = 71,
ObjectDelete = 72,
ObjectsDeleteAll = 73,
ObjectFind = 74,
ObjectGetTimeByValue = 75,
ObjectGetValueByTime = 76,
ObjectMove = 77,
ObjectsTotal = 78,
ObjectGetDouble = 79,
ObjectGetInteger = 80,
ObjectGetString = 81,
ObjectSetDouble = 82,
ObjectSetInteger = 83,
ObjectSetString = 84,
//TextSetFont = 85,
//TextOut = 86,
//TextGetSize = 87,
iAC = 88,
iAD = 89,
iADX = 90,
iADXWilder = 91,
iAlligator = 92,
iAMA = 93,
iAO = 94,
iATR = 95,
iBearsPower = 96,
iBands = 97,
iBullsPower = 98,
iCCI = 99,
iChaikin = 100,
//iCustom = 101,
iDEMA = 102,
iDeMarker = 103,
iEnvelopes = 104,
iForce = 105,
iFractals = 106,
iFrAMA = 107,
iGator = 108,
iIchimoku = 109,
iBWMFI = 110,
iMomentum = 111,
iMFI = 112,
iMA = 113,
iOsMA = 114,
iMACD = 115,
iOBV = 116,
iSAR = 117,
iRSI = 118,
iRVI = 119,
iStdDev = 120,
iStochastic = 121,
iTEMA = 122,
iTriX = 123,
iWPR = 124,
iVIDyA = 125,
iVolumes = 126,
//Date and Time
TimeCurrent = 127,
TimeTradeServer = 128,
TimeLocal = 129,
TimeGMT = 130,
IndicatorRelease = 131,
//Chart Operations
ChartId = 206,
ChartRedraw = 207,
ChartApplyTemplate = 236,
ChartSaveTemplate = 237,
ChartWindowFind = 238,
//ChartTimePriceToXY = 239,
//ChartXYToTimePrice = 240,
ChartOpen = 241,
ChartFirst = 242,
ChartNext = 243,
ChartClose = 244,
ChartSymbol = 245,
ChartPeriod = 246,
ChartSetDouble = 247,
ChartSetInteger = 248,
ChartSetString = 249,
ChartGetDouble = 250,
ChartGetInteger = 251,
ChartGetString = 252,
ChartNavigate = 253,
ChartIndicatorDelete = 254,
ChartIndicatorName = 255,
ChartIndicatorsTotal = 256,
ChartWindowOnDropped = 257,
ChartPriceOnDropped = 258,
ChartTimeOnDropped = 259,
ChartXOnDropped = 260,
ChartYOnDropped = 261,
ChartSetSymbolPeriod = 262,
ChartScreenShot = 263,
ChartIndicatorAdd = 280,
ChartIndicatorGet = 281,
// Terminal Operations
TerminalCompany = 68,
TerminalName = 69,
TerminalPath = 70,
//Checkup
GetLastError = 132,
TerminalInfoString = 153,
TerminalInfoInteger = 204,
TerminalInfoDouble = 205,
//Common Functions
Alert = 136,
Comment = 137, //TODO
GetTickCount = 138, //TODO
GetMicrosecondCount = 139, //TODO
MessageBox = 140, //TODO
PeriodSeconds = 141, //TODO
PlaySound = 142, //TODO
Print = 68,
ResetLastError = 143,
SendNotification = 144, //TODO
SendMail = 145, //TODO
//Global Variables
GlobalVariableCheck = 146,
GlobalVariableTime = 147,
GlobalVariableDel = 148,
GlobalVariableGet = 149,
GlobalVariableName = 150,
GlobalVariableSet = 151,
GlobalVariablesFlush = 152,
GlobalVariableTemp = 154,
GlobalVariableSetOnCondition = 156,
GlobalVariablesDeleteAll = 157,
GlobalVariablesTotal = 158,
UnlockTicks = 159,
PositionCloseAll = 160,
TesterStop = 161
}
}
+11
View File
@@ -0,0 +1,11 @@
namespace MtApi5.MtProtocol
{
internal enum Mt5EventTypes
{
OnTradeTransaction = 1,
OnBookEvent = 2,
OnTick = 3,
OnLastTimeBar = 4,
OnLockTicks = 5
}
}
+3 -3
View File
@@ -1,8 +1,8 @@
namespace MtApi5.Events
namespace MtApi5.MtProtocol
{
internal class OnTickEvent
internal class MtQuote
{
public MqlTick? Tick { get; set; }
public MtTick? Tick { get; set; }
public string? Instrument { get; set; }
public int ExpertHandle { get; set; }
}
+1 -1
View File
@@ -1,4 +1,4 @@
namespace MtApi5.Events
namespace MtApi5.MtProtocol
{
internal class OnBookEvent
{
+2 -2
View File
@@ -1,6 +1,6 @@
namespace MtApi5.Events
namespace MtApi5.MtProtocol
{
public class OnLastTimeBarEvent
internal class OnLastTimeBarEvent
{
public MqlRates? Rates { get; set; }
public string? Instrument { get; set; }
+1 -1
View File
@@ -1,4 +1,4 @@
namespace MtApi5.Events
namespace MtApi5.MtProtocol
{
internal class OnLockTicksEvent
{
@@ -1,4 +1,4 @@
namespace MtApi5.Events
namespace MtApi5.MtProtocol
{
internal class OnTradeTransactionEvent
{
+1 -1
View File
@@ -1,4 +1,4 @@
namespace MtApi5.Requests
namespace MtApi5.MtProtocol
{
internal class Response<T>
{