Refactoring MtApiService

This commit is contained in:
vdemydiuk
2016-10-11 12:23:47 +03:00
parent 3785ee4ace
commit e373f7976c
3 changed files with 198 additions and 218 deletions
+28
View File
@@ -19,6 +19,8 @@ namespace MTApiService
typeof(MtResponseArrayList), typeof(MtResponseMqlRatesArray),
typeof(MtResponseMqlBookInfoArray)};
}
public abstract object GetValue();
}
[DataContract]
@@ -31,6 +33,8 @@ namespace MTApiService
[DataMember]
public int Value { get; private set; }
public override object GetValue() { return Value; }
}
[DataContract]
@@ -43,6 +47,8 @@ namespace MTApiService
[DataMember]
public long Value { get; private set; }
public override object GetValue() { return Value; }
}
[DataContract]
@@ -55,6 +61,8 @@ namespace MTApiService
[DataMember]
public ulong Value { get; private set; }
public override object GetValue() { return Value; }
}
[DataContract]
@@ -67,6 +75,8 @@ namespace MTApiService
[DataMember]
public double Value { get; private set; }
public override object GetValue() { return Value; }
}
[DataContract]
@@ -79,6 +89,8 @@ namespace MTApiService
[DataMember]
public string Value { get; private set; }
public override object GetValue() { return Value; }
}
[DataContract]
@@ -91,6 +103,8 @@ namespace MTApiService
[DataMember]
public bool Value { get; private set; }
public override object GetValue() { return Value; }
}
[DataContract]
@@ -103,6 +117,8 @@ namespace MTApiService
[DataMember]
public double[] Value { get; private set; }
public override object GetValue() { return Value; }
}
[DataContract]
@@ -115,6 +131,8 @@ namespace MTApiService
[DataMember]
public int[] Value { get; private set; }
public override object GetValue() { return Value; }
}
[DataContract]
@@ -127,6 +145,8 @@ namespace MTApiService
[DataMember]
public long[] Value { get; private set; }
public override object GetValue() { return Value; }
}
[DataContract]
@@ -139,6 +159,8 @@ namespace MTApiService
[DataMember]
public ArrayList Value { get; private set; }
public override object GetValue() { return Value; }
}
[DataContract]
@@ -151,6 +173,8 @@ namespace MTApiService
[DataMember]
public MtMqlRates[] Value { get; private set; }
public override object GetValue() { return Value; }
}
[DataContract]
@@ -163,6 +187,8 @@ namespace MTApiService
[DataMember]
public MtMqlTick Value { get; private set; }
public override object GetValue() { return Value; }
}
[DataContract]
@@ -175,6 +201,8 @@ namespace MTApiService
[DataMember]
public MtMqlBookInfo[] Value { get; private set; }
public override object GetValue() { return Value; }
}
}
+169 -175
View File
@@ -15,8 +15,7 @@ namespace MtApi
public sealed class MtApiClient
{
private const int DoubleArrayLimit = 64800;
private volatile bool IsBacktestingMode = false;
private volatile bool _isBacktestingMode;
#region MetaTrader Constants
@@ -25,15 +24,21 @@ namespace MtApi
public const int EMPTY = -1;
#endregion
#region Private Fields
private readonly MtClient _client = new MtClient();
private readonly object _locker = new object();
private MtConnectionState _connectionState = MtConnectionState.Disconnected;
#endregion
#region ctor
public MtApiClient()
{
_client.QuoteAdded += mClient_QuoteAdded;
_client.QuoteRemoved += mClient_QuoteRemoved;
_client.QuoteUpdated += mClient_QuoteUpdated;
_client.ServerDisconnected += mClient_ServerDisconnected;
_client.ServerFailed += mClient_ServerFailed;
_client.QuoteAdded += _client_QuoteAdded;
_client.QuoteRemoved += _client_QuoteRemoved;
_client.QuoteUpdated += _client_QuoteUpdated;
_client.ServerDisconnected += _client_ServerDisconnected;
_client.ServerFailed += _client_ServerFailed;
_client.MtEventReceived += _client_MtEventReceived;
}
#endregion
@@ -46,15 +51,8 @@ namespace MtApi
///<param name="port">Port of host connection (default 8222) </param>
public void BeginConnect(string host, int port)
{
//if (string.IsNullOrEmpty(host) == false && (host.Equals("localhost") || host.Equals("127.0.0.1")))
//{
// this.BeginConnect(port);
//}
//else
//{
Action<string, int> connectAction = Connect;
connectAction.BeginInvoke(host, port, null, null);
//}
}
///<summary>
@@ -81,12 +79,16 @@ namespace MtApi
///</summary>
public IEnumerable<MtQuote> GetQuotes()
{
var quotes = _client.GetQuotes();
return quotes != null ? (from q in quotes select q.Convert()) : null;
IEnumerable<MTApiService.MtQuote> quotes;
lock (_client)
{
quotes = _client.GetQuotes();
}
return quotes?.Select(q => q.Convert());
}
#endregion
#region Properties
#region Properties
///<summary>
///Connection status of MetaTrader API.
@@ -174,7 +176,7 @@ namespace MtApi
public double OrderOpenPrice(int ticket)
{
var commandParameters = new ArrayList { ticket };
double retVal = SendCommand<double>(MtCommandType.OrderOpenPriceByTicket, commandParameters);
var retVal = SendCommand<double>(MtCommandType.OrderOpenPriceByTicket, commandParameters);
return retVal;
}
@@ -219,7 +221,7 @@ namespace MtApi
[Obsolete("OrderType is deprecated, please use GetOrder instead.")]
public TradeOperation OrderType()
{
int retVal = SendCommand<int>(MtCommandType.OrderType, null);
var retVal = SendCommand<int>(MtCommandType.OrderType, null);
return (TradeOperation)retVal;
}
@@ -250,7 +252,7 @@ namespace MtApi
Expiration = MtApiTimeConverter.ConvertToMtTime(expiration),
ArrowColor = MtApiColorConverter.ConvertToMtColor(arrowColor)
});
return response != null ? response.Ticket : -1;
return response?.Ticket ?? -1;
}
public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit
@@ -278,7 +280,7 @@ namespace MtApi
public int OrderSend(string symbol, TradeOperation cmd, double volume, string price, int slippage, double stoploss, double takeprofit)
{
double dPrice = 0;
double dPrice;
return double.TryParse(price, out dPrice) ?
OrderSend(symbol, cmd, volume, dPrice, slippage, stoploss, takeprofit, null, 0, DateTime.MinValue, Color.Empty) : 0;
}
@@ -316,7 +318,7 @@ namespace MtApi
Comment = comment,
Magic = magic,
});
return response != null ? response.Ticket : -1;
return response?.Ticket ?? -1;
}
public int OrderSendSell(string symbol, double volume, int slippage, double stoploss, double takeprofit, string comment, int magic)
@@ -332,7 +334,7 @@ namespace MtApi
Comment = comment,
Magic = magic,
});
return response != null ? response.Ticket : -1;
return response?.Ticket ?? -1;
}
public bool OrderClose(int ticket, double lots, double price, int slippage, Color color)
@@ -421,7 +423,7 @@ namespace MtApi
return response != null;
}
public bool OrderModify(int ticket, double price, double stoploss, double takeprofit, DateTime expiration, Color arrow_color)
public bool OrderModify(int ticket, double price, double stoploss, double takeprofit, DateTime expiration, Color arrowColor)
{
var response = SendRequest<ResponseBase>(new OrderModifyRequest
{
@@ -430,7 +432,7 @@ namespace MtApi
Stoploss = stoploss,
Takeprofit = takeprofit,
Expiration = MtApiTimeConverter.ConvertToMtTime(expiration),
ArrowColor = MtApiColorConverter.ConvertToMtColor(arrow_color)
ArrowColor = MtApiColorConverter.ConvertToMtColor(arrowColor)
});
return response != null;
}
@@ -482,7 +484,7 @@ namespace MtApi
public MtOrder GetOrder(int index, OrderSelectMode select, OrderSelectSource pool)
{
var response = SendRequest<GetOrderResponse>(new GetOrderRequest { Index = index, Select = (int) select, Pool = (int) pool});
return response != null ? response.Order : null;
return response?.Order;
}
public List<MtOrder> GetOrders(OrderSelectSource pool)
@@ -712,15 +714,15 @@ namespace MtApi
return SendCommand<bool>(MtCommandType.SendFTP, commandParameters);
}
public bool SendFTP(string filename, string ftp_path)
public bool SendFTP(string filename, string ftpPath)
{
var commandParameters = new ArrayList { filename, ftp_path };
var commandParameters = new ArrayList { filename, ftpPath };
return SendCommand<bool>(MtCommandType.SendFTPA, commandParameters);
}
public void SendMail(string subject, string some_text)
public void SendMail(string subject, string someText)
{
var commandParameters = new ArrayList { subject, some_text };
var commandParameters = new ArrayList { subject, someText };
SendCommand<object>(MtCommandType.SendMail, commandParameters);
}
@@ -888,15 +890,15 @@ namespace MtApi
return MtApiTimeConverter.ConvertFromMtTime(commandResponse);
}
public bool GlobalVariableSetOnCondition(string name, double value, double check_value)
public bool GlobalVariableSetOnCondition(string name, double value, double checkValue)
{
var commandParameters = new ArrayList { name, value, check_value };
var commandParameters = new ArrayList { name, value, checkValue };
return SendCommand<bool>(MtCommandType.GlobalVariableSetOnCondition, commandParameters);
}
public int GlobalVariablesDeleteAll(string prefix_name)
public int GlobalVariablesDeleteAll(string prefixName)
{
var commandParameters = new ArrayList { prefix_name };
var commandParameters = new ArrayList { prefixName };
return SendCommand<int>(MtCommandType.GlobalVariableSetOnCondition, commandParameters);
}
@@ -920,15 +922,15 @@ namespace MtApi
return SendCommand<double>(MtCommandType.iAD, commandParameters);
}
public double iAlligator(string symbol, int timeframe, int jaw_period, int jaw_shift, int teeth_period, int teeth_shift, int lips_period, int lips_shift, int ma_method, int applied_price, int mode, int shift)
public double iAlligator(string symbol, int timeframe, int jawPeriod, int jawShift, int teethPeriod, int teethShift, int lipsPeriod, int lipsShift, int maMethod, int appliedPrice, int mode, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, jaw_period, jaw_shift, teeth_period, teeth_shift, lips_period, lips_shift, ma_method, applied_price, mode, shift };
var commandParameters = new ArrayList { symbol, timeframe, jawPeriod, jawShift, teethPeriod, teethShift, lipsPeriod, lipsShift, maMethod, appliedPrice, mode, shift };
return SendCommand<double>(MtCommandType.iAlligator, commandParameters);
}
public double iADX(string symbol, int timeframe, int period, int applied_price, int mode, int shift)
public double iADX(string symbol, int timeframe, int period, int appliedPrice, int mode, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, period, applied_price, mode, shift };
var commandParameters = new ArrayList { symbol, timeframe, period, appliedPrice, mode, shift };
return SendCommand<double>(MtCommandType.iADX, commandParameters);
}
@@ -944,50 +946,50 @@ namespace MtApi
return SendCommand<double>(MtCommandType.iAO, commandParameters);
}
public double iBearsPower(string symbol, int timeframe, int period, int applied_price, int shift)
public double iBearsPower(string symbol, int timeframe, int period, int appliedPrice, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, period, applied_price, shift };
var commandParameters = new ArrayList { symbol, timeframe, period, appliedPrice, shift };
return SendCommand<double>(MtCommandType.iBearsPower, commandParameters);
}
public double iBands(string symbol, int timeframe, int period, int deviation, int bands_shift, int applied_price, int mode, int shift)
public double iBands(string symbol, int timeframe, int period, int deviation, int bandsShift, int appliedPrice, int mode, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, period, deviation, bands_shift, applied_price, mode, shift };
var commandParameters = new ArrayList { symbol, timeframe, period, deviation, bandsShift, appliedPrice, mode, shift };
return SendCommand<double>(MtCommandType.iBands, commandParameters);
}
public double iBandsOnArray(double[] array, int total, int period, int deviation, int bands_shift, int mode, int shift)
public double iBandsOnArray(double[] array, int total, int period, int deviation, int bandsShift, int mode, int shift)
{
int arraySize = array != null ? array.Length : 0;
var arraySize = array?.Length ?? 0;
var commandParameters = new ArrayList { arraySize };
commandParameters.AddRange(array);
commandParameters.AddRange(array ?? new double[] {});
commandParameters.Add(total);
commandParameters.Add(period);
commandParameters.Add(deviation);
commandParameters.Add(bands_shift);
commandParameters.Add(bandsShift);
commandParameters.Add(mode);
commandParameters.Add(shift);
return SendCommand<double>(MtCommandType.iBandsOnArray, commandParameters);
}
public double iBullsPower(string symbol, int timeframe, int period, int applied_price, int shift)
public double iBullsPower(string symbol, int timeframe, int period, int appliedPrice, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, period, applied_price, shift };
var commandParameters = new ArrayList { symbol, timeframe, period, appliedPrice, shift };
return SendCommand<double>(MtCommandType.iBullsPower, commandParameters);
}
public double iCCI(string symbol, int timeframe, int period, int applied_price, int shift)
public double iCCI(string symbol, int timeframe, int period, int appliedPrice, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, period, applied_price, shift };
var commandParameters = new ArrayList { symbol, timeframe, period, appliedPrice, shift };
return SendCommand<double>(MtCommandType.iCCI, commandParameters);
}
public double iCCIOnArray(double[] array, int total, int period, int shift)
{
int arraySize = array != null ? array.Length : 0;
var arraySize = array?.Length ?? 0;
var commandParameters = new ArrayList { arraySize };
commandParameters.AddRange(array);
commandParameters.AddRange(array ?? new double[] { });
commandParameters.Add(total);
commandParameters.Add(period);
commandParameters.Add(shift);
@@ -1007,7 +1009,7 @@ namespace MtApi
Params = new ArrayList(parameters),
ParamsType = ICustomRequest.ParametersType.Int
});
return response != null ? response.Value : double.NaN;
return response?.Value ?? double.NaN;
}
public double iCustom(string symbol, int timeframe, string name, double[] parameters, int mode, int shift)
@@ -1022,7 +1024,7 @@ namespace MtApi
Params = new ArrayList(parameters),
ParamsType = ICustomRequest.ParametersType.Double
});
return response != null ? response.Value : double.NaN;
return response?.Value ?? double.NaN;
}
public double iCustom(string symbol, int timeframe, string name, int mode, int shift)
@@ -1035,7 +1037,7 @@ namespace MtApi
Mode = mode,
Shift = shift
});
return response != null ? response.Value : double.NaN;
return response?.Value ?? double.NaN;
}
public double iDeMarker(string symbol, int timeframe, int period, int shift)
@@ -1044,21 +1046,21 @@ namespace MtApi
return SendCommand<double>(MtCommandType.iDeMarker, commandParameters);
}
public double iEnvelopes(string symbol, int timeframe, int ma_period, int ma_method, int ma_shift, int applied_price, double deviation, int mode, int shift)
public double iEnvelopes(string symbol, int timeframe, int maPeriod, int maMethod, int maShift, int appliedPrice, double deviation, int mode, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, ma_period, ma_method, ma_shift, applied_price, deviation, mode, shift };
var commandParameters = new ArrayList { symbol, timeframe, maPeriod, maMethod, maShift, appliedPrice, deviation, mode, shift };
return SendCommand<double>(MtCommandType.iEnvelopes, commandParameters);
}
public double iEnvelopesOnArray(double[] array, int total, int ma_period, int ma_method, int ma_shift, double deviation, int mode, int shift)
public double iEnvelopesOnArray(double[] array, int total, int maPeriod, int maMethod, int maShift, double deviation, int mode, int shift)
{
int arraySize = array != null ? array.Length : 0;
var arraySize = array?.Length ?? 0;
var commandParameters = new ArrayList { arraySize };
commandParameters.AddRange(array);
commandParameters.AddRange(array ?? new double[] {});
commandParameters.Add(total);
commandParameters.Add(ma_period);
commandParameters.Add(ma_method);
commandParameters.Add(ma_shift);
commandParameters.Add(maPeriod);
commandParameters.Add(maMethod);
commandParameters.Add(maShift);
commandParameters.Add(deviation);
commandParameters.Add(mode);
commandParameters.Add(shift);
@@ -1066,9 +1068,9 @@ namespace MtApi
return SendCommand<double>(MtCommandType.iEnvelopesOnArray, commandParameters);
}
public double iForce(string symbol, int timeframe, int period, int ma_method, int applied_price, int shift)
public double iForce(string symbol, int timeframe, int period, int maMethod, int appliedPrice, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, period, ma_method, applied_price, shift };
var commandParameters = new ArrayList { symbol, timeframe, period, maMethod, appliedPrice, shift };
return SendCommand<double>(MtCommandType.iForce, commandParameters);
}
@@ -1078,15 +1080,15 @@ namespace MtApi
return SendCommand<double>(MtCommandType.iFractals, commandParameters);
}
public double iGator(string symbol, int timeframe, int jaw_period, int jaw_shift, int teeth_period, int teeth_shift, int lips_period, int lips_shift, int ma_method, int applied_price, int mode, int shift)
public double iGator(string symbol, int timeframe, int jawPeriod, int jawShift, int teethPeriod, int teethShift, int lipsPeriod, int lipsShift, int maMethod, int appliedPrice, int mode, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, jaw_period, jaw_shift, teeth_period, teeth_shift, lips_period, lips_shift, ma_method, applied_price, mode, shift };
var commandParameters = new ArrayList { symbol, timeframe, jawPeriod, jawShift, teethPeriod, teethShift, lipsPeriod, lipsShift, maMethod, appliedPrice, mode, shift };
return SendCommand<double>(MtCommandType.iGator, commandParameters);
}
public double iIchimoku(string symbol, int timeframe, int tenkan_sen, int kijun_sen, int senkou_span_b, int mode, int shift)
public double iIchimoku(string symbol, int timeframe, int tenkanSen, int kijunSen, int senkouSpanB, int mode, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, tenkan_sen, kijun_sen, senkou_span_b, mode, shift };
var commandParameters = new ArrayList { symbol, timeframe, tenkanSen, kijunSen, senkouSpanB, mode, shift };
return SendCommand<double>(MtCommandType.iIchimoku, commandParameters);
}
@@ -1096,17 +1098,17 @@ namespace MtApi
return SendCommand<double>(MtCommandType.iBWMFI, commandParameters);
}
public double iMomentum(string symbol, int timeframe, int period, int applied_price, int shift)
public double iMomentum(string symbol, int timeframe, int period, int appliedPrice, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, period, applied_price, shift };
var commandParameters = new ArrayList { symbol, timeframe, period, appliedPrice, shift };
return SendCommand<double>(MtCommandType.iMomentum, commandParameters);
}
public double iMomentumOnArray(double[] array, int total, int period, int shift)
{
int arraySize = array != null ? array.Length : 0;
var arraySize = array?.Length ?? 0;
var commandParameters = new ArrayList { arraySize };
commandParameters.AddRange(array);
commandParameters.AddRange(array ?? new double[] {});
commandParameters.Add(total);
commandParameters.Add(period);
commandParameters.Add(shift);
@@ -1120,41 +1122,41 @@ namespace MtApi
return SendCommand<double>(MtCommandType.iMFI, commandParameters);
}
public double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
public double iMA(string symbol, int timeframe, int period, int maShift, int maMethod, int appliedPrice, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, period, ma_shift, ma_method, applied_price, shift };
var commandParameters = new ArrayList { symbol, timeframe, period, maShift, maMethod, appliedPrice, shift };
return SendCommand<double>(MtCommandType.iMA, commandParameters);
}
double iMAOnArray(double[] array, int total, int period, int ma_shift, int ma_method, int shift)
public double iMAOnArray(double[] array, int total, int period, int maShift, int maMethod, int shift)
{
int arraySize = array != null ? array.Length : 0;
var arraySize = array?.Length ?? 0;
var commandParameters = new ArrayList { arraySize };
commandParameters.AddRange(array);
commandParameters.AddRange(array ?? new double[] {});
commandParameters.Add(total);
commandParameters.Add(period);
commandParameters.Add(ma_shift);
commandParameters.Add(ma_method);
commandParameters.Add(maShift);
commandParameters.Add(maMethod);
commandParameters.Add(shift);
return SendCommand<double>(MtCommandType.iMAOnArray, commandParameters);
}
public double iOsMA(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int shift)
public double iOsMA(string symbol, int timeframe, int fastEmaPeriod, int slowEmaPeriod, int signalPeriod, int appliedPrice, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, fast_ema_period, slow_ema_period, signal_period, applied_price, shift };
var commandParameters = new ArrayList { symbol, timeframe, fastEmaPeriod, slowEmaPeriod, signalPeriod, appliedPrice, shift };
return SendCommand<double>(MtCommandType.iOsMA, commandParameters);
}
public double iMACD(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int mode, int shift)
public double iMACD(string symbol, int timeframe, int fastEmaPeriod, int slowEmaPeriod, int signalPeriod, int appliedPrice, int mode, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, fast_ema_period, slow_ema_period, signal_period, applied_price, mode, shift };
var commandParameters = new ArrayList { symbol, timeframe, fastEmaPeriod, slowEmaPeriod, signalPeriod, appliedPrice, mode, shift };
return SendCommand<double>(MtCommandType.iMACD, commandParameters);
}
public double iOBV(string symbol, int timeframe, int applied_price, int shift)
public double iOBV(string symbol, int timeframe, int appliedPrice, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, applied_price, shift };
var commandParameters = new ArrayList { symbol, timeframe, appliedPrice, shift };
return SendCommand<double>(MtCommandType.iOBV, commandParameters);
}
@@ -1164,17 +1166,17 @@ namespace MtApi
return SendCommand<double>(MtCommandType.iSAR, commandParameters);
}
public double iRSI( string symbol, int timeframe, int period, int applied_price, int shift)
public double iRSI( string symbol, int timeframe, int period, int appliedPrice, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, period, applied_price, shift };
var commandParameters = new ArrayList { symbol, timeframe, period, appliedPrice, shift };
return SendCommand<double>(MtCommandType.iRSI, commandParameters);
}
public double iRSIOnArray(double[] array, int total, int period, int shift)
{
int arraySize = array != null ? array.Length : 0;
var arraySize = array?.Length ?? 0;
var commandParameters = new ArrayList { arraySize };
commandParameters.AddRange(array);
commandParameters.AddRange(array ?? new double[] {});
commandParameters.Add(total);
commandParameters.Add(period);
commandParameters.Add(shift);
@@ -1188,29 +1190,29 @@ namespace MtApi
return SendCommand<double>(MtCommandType.iRVI, commandParameters);
}
public double iStdDev(string symbol, int timeframe, int ma_period, int ma_shift, int ma_method, int applied_price, int shift)
public double iStdDev(string symbol, int timeframe, int maPeriod, int maShift, int maMethod, int appliedPrice, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, ma_period, ma_shift, ma_method, applied_price, shift };
var commandParameters = new ArrayList { symbol, timeframe, maPeriod, maShift, maMethod, appliedPrice, shift };
return SendCommand<double>(MtCommandType.iStdDev, commandParameters);
}
public double iStdDevOnArray(double[] array, int total, int ma_period, int ma_shift, int ma_method, int shift)
public double iStdDevOnArray(double[] array, int total, int maPeriod, int maShift, int maMethod, int shift)
{
int arraySize = array != null ? array.Length : 0;
var arraySize = array?.Length ?? 0;
var commandParameters = new ArrayList { arraySize };
commandParameters.AddRange(array);
commandParameters.AddRange(array ?? new double[] {});
commandParameters.Add(total);
commandParameters.Add(ma_period);
commandParameters.Add(ma_shift);
commandParameters.Add(ma_method);
commandParameters.Add(maPeriod);
commandParameters.Add(maShift);
commandParameters.Add(maMethod);
commandParameters.Add(shift);
return SendCommand<double>(MtCommandType.iStdDevOnArray, commandParameters);
}
public double iStochastic(string symbol, int timeframe, int pKperiod, int pDperiod, int slowing, int method, int price_field, int mode, int shift)
public double iStochastic(string symbol, int timeframe, int pKperiod, int pDperiod, int slowing, int method, int priceField, int mode, int shift)
{
var commandParameters = new ArrayList { symbol, timeframe, pKperiod, pDperiod, slowing, method, price_field, mode, shift };
var commandParameters = new ArrayList { symbol, timeframe, pKperiod, pDperiod, slowing, method, priceField, mode, shift };
return SendCommand<double>(MtCommandType.iStochastic, commandParameters);
}
@@ -1353,7 +1355,7 @@ namespace MtApi
{
result = new DateTime[response.Length];
for(int i = 0; i < response.Length; i++)
for(var i = 0; i < response.Length; i++)
{
result[i] = MtApiTimeConverter.ConvertFromMtTime(response[i]);
}
@@ -1367,54 +1369,54 @@ namespace MtApi
return SendCommand<bool>(MtCommandType.RefreshRates, null);
}
public List<MqlRates> CopyRates(string symbol_name, ENUM_TIMEFRAMES timeframe, int start_pos, int count)
public List<MqlRates> CopyRates(string symbolName, ENUM_TIMEFRAMES timeframe, int startPos, int count)
{
var response = SendRequest<CopyRatesResponse>(new CopyRates1Request
{
SymbolName = symbol_name,
SymbolName = symbolName,
Timeframe = timeframe,
StartPos = start_pos,
StartPos = startPos,
Count = count
});
return response != null ? response.Rates : null;
return response?.Rates;
}
public List<MqlRates> CopyRates(string symbol_name, ENUM_TIMEFRAMES timeframe, DateTime start_time, int count)
public List<MqlRates> CopyRates(string symbolName, ENUM_TIMEFRAMES timeframe, DateTime startTime, int count)
{
var response = SendRequest<CopyRatesResponse>(new CopyRates2Request
{
SymbolName = symbol_name,
SymbolName = symbolName,
Timeframe = timeframe,
StartTime = MtApiTimeConverter.ConvertToMtTime(start_time),
StartTime = MtApiTimeConverter.ConvertToMtTime(startTime),
Count = count
});
return response != null ? response.Rates : null;
return response?.Rates;
}
public List<MqlRates> CopyRates(string symbol_name, ENUM_TIMEFRAMES timeframe, DateTime start_time, DateTime stop_time)
public List<MqlRates> CopyRates(string symbolName, ENUM_TIMEFRAMES timeframe, DateTime startTime, DateTime stopTime)
{
var response = SendRequest<CopyRatesResponse>(new CopyRates3Request
{
SymbolName = symbol_name,
SymbolName = symbolName,
Timeframe = timeframe,
StartTime = MtApiTimeConverter.ConvertToMtTime(start_time),
StopTime = MtApiTimeConverter.ConvertToMtTime(stop_time)
StartTime = MtApiTimeConverter.ConvertToMtTime(startTime),
StopTime = MtApiTimeConverter.ConvertToMtTime(stopTime)
});
return response != null ? response.Rates : null;
return response?.Rates;
}
#endregion
#region Checkup
public string TerminalInfoString(ENUM_TERMINAL_INFO_STRING property_id)
public string TerminalInfoString(ENUM_TERMINAL_INFO_STRING propertyId)
{
var commandParameters = new ArrayList { (int)property_id };
var commandParameters = new ArrayList { (int)propertyId };
return SendCommand<string>(MtCommandType.TerminalInfoString, commandParameters);
}
public string SymbolInfoString(string name, ENUM_SYMBOL_INFO_STRING prop_id)
public string SymbolInfoString(string name, ENUM_SYMBOL_INFO_STRING propId)
{
var commandParameters = new ArrayList { name, (int)prop_id };
var commandParameters = new ArrayList { name, (int)propId };
return SendCommand<string>(MtCommandType.SymbolInfoString, commandParameters); ;
}
#endregion
@@ -1422,51 +1424,60 @@ namespace MtApi
#region Private Methods
private void Connect(string host, int port)
{
UpdateConnectionState(MtConnectionState.Connecting, string.Format("Connecting to {0}:{1}", host, port));
UpdateConnectionState(MtConnectionState.Connecting, $"Connecting to {host}:{port}");
try
{
_client.Open(host, port);
_client.Connect();
lock (_client)
{
_client.Open(host, port);
_client.Connect();
}
}
catch (Exception e)
{
UpdateConnectionState(MtConnectionState.Failed, string.Format("Failed connection to {0}:{1}. {2}", host, port, e.Message));
UpdateConnectionState(MtConnectionState.Failed, $"Failed connection to {host}:{port}. {e.Message}");
return;
}
UpdateConnectionState(MtConnectionState.Connected, string.Format("Connected to {0}:{1}", host, port));
UpdateConnectionState(MtConnectionState.Connected, $"Connected to {host}:{port}");
OnConnected();
}
private void Connect(int port)
{
UpdateConnectionState(MtConnectionState.Connecting, string.Format("Connecting to 'localhost':{0}", port));
UpdateConnectionState(MtConnectionState.Connecting, $"Connecting to 'localhost':{port}");
try
{
_client.Open(port);
_client.Connect();
lock (_client)
{
_client.Open(port);
_client.Connect();
}
}
catch (Exception e)
{
UpdateConnectionState(MtConnectionState.Failed, string.Format("Failed connection to 'localhost':{0}. {1}", port, e.Message));
UpdateConnectionState(MtConnectionState.Failed, $"Failed connection to 'localhost':{port}. {e.Message}");
return;
}
UpdateConnectionState(MtConnectionState.Connected, string.Format("Connected to 'localhost':{0}", port));
UpdateConnectionState(MtConnectionState.Connected, $"Connected to 'localhost':{port}");
OnConnected();
}
private void OnConnected()
{
IsBacktestingMode = IsTesting();
if (IsBacktestingMode)
{
_isBacktestingMode = IsTesting();
if (_isBacktestingMode)
{
BacktestingReady();
}
}
private void Disconnect()
{
_client.Disconnect();
_client.Close();
lock (_client)
{
_client.Disconnect();
_client.Close();
}
UpdateConnectionState(MtConnectionState.Disconnected, "Disconnected");
}
@@ -1494,37 +1505,18 @@ namespace MtApi
MtResponse response;
try
{
response = _client.SendCommand((int)commandType, commandParameters);
lock (_client)
{
response = _client.SendCommand((int)commandType, commandParameters);
}
}
catch (CommunicationException ex)
{
throw new MtConnectionException(ex.Message, ex);
}
T result = default(T);
if (response is MtResponseDouble)
result = (T)Convert.ChangeType(((MtResponseDouble)response).Value, typeof(T));
if (response is MtResponseInt)
result = (T)Convert.ChangeType(((MtResponseInt)response).Value, typeof(T));
if (response is MtResponseBool)
result = (T)Convert.ChangeType(((MtResponseBool)response).Value, typeof(T));
if (response is MtResponseString)
result = (T)Convert.ChangeType(((MtResponseString)response).Value, typeof(T));
if (response is MtResponseDoubleArray)
result = (T)Convert.ChangeType(((MtResponseDoubleArray)response).Value, typeof(T));
if (response is MtResponseIntArray)
result = (T)Convert.ChangeType(((MtResponseIntArray)response).Value, typeof(T));
if (response is MtResponseArrayList)
result = (T)Convert.ChangeType(((MtResponseArrayList)response).Value, typeof(T));
return result;
var responseValue = response.GetValue();
return responseValue != null ? (T)responseValue : default(T);
}
private T SendRequest<T>(RequestBase request) where T : ResponseBase, new()
@@ -1532,17 +1524,20 @@ namespace MtApi
if (request == null)
return default(T);
var serializer = JsonConvert.SerializeObject(request, Newtonsoft.Json.Formatting.None,
var serializer = JsonConvert.SerializeObject(request, Formatting.None,
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
});
var commandParameters = new ArrayList { serializer };
MtResponseString res;
try
{
res = (MtResponseString)_client.SendCommand((int)MtCommandType.MtRequest, commandParameters);
lock (_client)
{
res = (MtResponseString)_client.SendCommand((int)MtCommandType.MtRequest, commandParameters);
}
}
catch (CommunicationException ex)
{
@@ -1563,44 +1558,44 @@ namespace MtApi
return response;
}
private void mClient_QuoteUpdated(MTApiService.MtQuote quote)
private void _client_QuoteUpdated(MTApiService.MtQuote quote)
{
if (quote != null)
{
if (IsBacktestingMode)
if (_isBacktestingMode)
{
QuoteUpdated?.Invoke(this, quote.Instrument, quote.Bid, quote.Ask);
}
}
else
{
QuoteUpdated.FireEventAsync(this, quote.Instrument, quote.Bid, quote.Ask);
}
}
}
}
private void mClient_ServerDisconnected(object sender, EventArgs e)
private void _client_ServerDisconnected(object sender, EventArgs e)
{
UpdateConnectionState(MtConnectionState.Disconnected, "MtApi is disconnected");
}
private void mClient_ServerFailed(object sender, EventArgs e)
private void _client_ServerFailed(object sender, EventArgs e)
{
UpdateConnectionState(MtConnectionState.Failed, "Failed connection with MtApi");
}
private void mClient_QuoteRemoved(MTApiService.MtQuote quote)
private void _client_QuoteRemoved(MTApiService.MtQuote quote)
{
QuoteRemoved.FireEventAsync(this, new MtQuoteEventArgs(quote.Convert()));
}
private void mClient_QuoteAdded(MTApiService.MtQuote quote)
private void _client_QuoteAdded(MTApiService.MtQuote quote)
{
QuoteAdded.FireEventAsync(this, new MtQuoteEventArgs(quote.Convert()));
}
private void _client_MtEventReceived(object sender, MtEventArgs e)
{
MtEventTypes eventType = (MtEventTypes) e.Event.EventType;
var eventType = (MtEventTypes) e.Event.EventType;
switch(eventType)
{
@@ -1609,6 +1604,8 @@ namespace MtApi
FireOnLastTimeBar(JsonConvert.DeserializeObject<MtTimeBar>(e.Event.Payload));
}
break;
default:
throw new ArgumentOutOfRangeException();
}
}
@@ -1621,20 +1618,17 @@ namespace MtApi
{
SendCommand<object>(MtCommandType.BacktestingReady, null);
}
#endregion
#region Events
public event MtApiQuoteHandler QuoteUpdated;
public event EventHandler<MtQuoteEventArgs> QuoteAdded;
public event EventHandler<MtQuoteEventArgs> QuoteRemoved;
public event EventHandler<MtConnectionEventArgs> ConnectionStateChanged;
public event EventHandler<TimeBarArgs> OnLastTimeBar;
#endregion
#region Private Fields
private readonly MtClient _client = new MtClient();
private readonly object _locker = new object();
private MtConnectionState _connectionState = MtConnectionState.Disconnected;
#endregion
}
}
+1 -43
View File
@@ -1492,52 +1492,10 @@ namespace MtApi5
throw new Exception(ex.Message, ex);
}
var responseValue = GetResponseValue(response);
var responseValue = response.GetValue();
return responseValue != null ? (T) responseValue : default(T);
}
private static object GetResponseValue(MtResponse response)
{
var doubleValue = (response as MtResponseDouble)?.Value;
if (doubleValue != null) return doubleValue;
var intValue = (response as MtResponseInt)?.Value;
if (intValue != null) return intValue;
var longValue = (response as MtResponseLong)?.Value;
if (longValue != null) return longValue;
var ulongValue = (response as MtResponseULong)?.Value;
if (ulongValue != null) return ulongValue;
var boolValue = (response as MtResponseBool)?.Value;
if (boolValue != null) return boolValue;
var stringValue = (response as MtResponseString)?.Value;
if (stringValue != null) return stringValue;
var doubleArrayValue = (response as MtResponseDoubleArray)?.Value;
if (doubleArrayValue != null) return doubleArrayValue;
var intArrayValue = (response as MtResponseIntArray)?.Value;
if (intArrayValue != null) return intArrayValue;
var longArrayValue = (response as MtResponseLongArray)?.Value;
if (longArrayValue != null) return longArrayValue;
var arrayListValue = (response as MtResponseArrayList)?.Value;
if (arrayListValue != null) return arrayListValue;
var mqlRatesArrayValue = (response as MtResponseMqlRatesArray)?.Value;
if (mqlRatesArrayValue != null) return mqlRatesArrayValue;
var mqlTickValue = (response as MtResponseMqlTick)?.Value;
if (mqlTickValue != null) return mqlTickValue;
var mqlBookInfoArrayValue = (response as MtResponseMqlBookInfoArray)?.Value;
return mqlBookInfoArrayValue;
}
private void mClient_QuoteUpdated(MtQuote quote)
{
if (quote != null)