Issue #16: Added Mt5Expert into MTApiService. Refactored MT5Connector

This commit is contained in:
DW
2017-09-08 12:44:14 +03:00
parent 1f72b2b790
commit c82787473f
8 changed files with 430 additions and 394 deletions
+4 -3
View File
@@ -72,10 +72,11 @@ template <typename T> T Execute(std::function<T()> func, wchar_t* err, T default
return result;
}
_DLLAPI int _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, wchar_t* err)
_DLLAPI int _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, int isTestMode, wchar_t* err)
{
return Execute<int>([&expertHandle, &port, symbol, &bid, &ask]() {
auto expert = gcnew MtExpert(expertHandle, gcnew String(symbol), bid, ask, gcnew MT5Handler());
return Execute<int>([&expertHandle, &port, symbol, &bid, &ask, &isTestMode]() {
bool isTesting = (isTestMode != 0) ? true : false;
auto expert = gcnew Mt5Expert(expertHandle, gcnew String(symbol), bid, ask, gcnew MT5Handler(), isTesting);
MtAdapter::GetInstance()->AddExpert(port, expert);
return 1;
}, err, 0);
+1
View File
@@ -64,6 +64,7 @@
<Compile Include="IMetaTraderHandler.cs" />
<Compile Include="ITaskExecutor.cs" />
<Compile Include="LogConfigurator.cs" />
<Compile Include="Mt5Expert.cs" />
<Compile Include="MtCommandEventArgs.cs" />
<Compile Include="IDisposableChannel.cs" />
<Compile Include="IMtApiServer.cs" />
+48
View File
@@ -0,0 +1,48 @@
using log4net;
namespace MTApiService
{
public class Mt5Expert : MtExpert
{
private static readonly ILog Log = LogManager.GetLogger(typeof(MtExpert));
private const int StopExpertInterval = 2000; // 2 sec for testing mode
private readonly System.Timers.Timer _stopTimer = new System.Timers.Timer();
public Mt5Expert(int handle, string symbol, double bid, double ask, IMetaTraderHandler mtHandler, bool isTestMode) :
base(handle, symbol, bid, ask, mtHandler)
{
IsTestMode = isTestMode;
_stopTimer.Interval = StopExpertInterval;
_stopTimer.Elapsed += _stopTimer_Elapsed;
}
public bool IsTestMode { get; }
public override void UpdateQuote(MtQuote quote)
{
Log.Debug("UpdateQuote: begin.");
base.UpdateQuote(quote);
if (IsTestMode)
{
//reset timer
_stopTimer.Stop();
_stopTimer.Start();
}
Log.Debug("UpdateQuote: end.");
}
private void _stopTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Log.Debug("_stopTimer_Elapsed: begin.");
Log.Warn("Mt5Expert has received new tick during 2 sec in testing mode. The possible cause: user has stopped the tester manually in MetaTrader 5.");
Deinit();
Log.Debug("_stopTimer_Elapsed: end.");
}
}
}
+4 -40
View File
@@ -36,42 +36,6 @@ namespace MTApiService
#region Public Methods
//public void InitExpert(int expertHandle, int port, string symbol, double bid, double ask, IMetaTraderHandler mtHandler)
//{
// if (mtHandler == null)
// throw new ArgumentNullException(nameof(mtHandler));
// Log.InfoFormat("InitExpert: begin. symbol = {0}, expertHandle = {1}, port = {2}", symbol, expertHandle, port);
// MtServer server;
// lock (_servers)
// {
// if (_servers.ContainsKey(port))
// {
// server = _servers[port];
// }
// else
// {
// server = new MtServer(port);
// server.Stopped += server_Stopped;
// _servers[port] = server;
// server.Start();
// }
// }
// var expert = new MtExpert(expertHandle, new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle }, mtHandler);
// lock (_experts)
// {
// _experts[expert.Handle] = expert;
// }
// server.AddExpert(expert);
// Log.Info("InitExpert: end");
//}
public void AddExpert(int port, MtExpert expert)
{
if (expert == null)
@@ -135,7 +99,7 @@ namespace MTApiService
public void SendQuote(int expertHandle, string symbol, double bid, double ask)
{
Log.DebugFormat("SendQuote: begin. symbol = {0}, bid = {1}, ask = {2}", symbol, bid, ask);
Log.DebugFormat("UpdateQuote: begin. symbol = {0}, bid = {1}, ask = {2}", symbol, bid, ask);
MtExpert expert;
lock (_experts)
@@ -145,14 +109,14 @@ namespace MTApiService
if (expert != null)
{
expert.SendQuote(new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle });
expert.UpdateQuote(new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle });
}
else
{
Log.WarnFormat("SendQuote: expert with id {0} has not been found.", expertHandle);
Log.WarnFormat("UpdateQuote: expert with id {0} has not been found.", expertHandle);
}
Log.Debug("SendQuote: end");
Log.Debug("UpdateQuote: end");
}
public void SendEvent(int expertHandle, int eventType, string payload)
+6 -2
View File
@@ -29,7 +29,7 @@ namespace MTApiService
_mtHadler = mtHandler;
}
public void Deinit()
public virtual void Deinit()
{
Log.Debug("Deinit: begin.");
@@ -119,9 +119,13 @@ namespace MTApiService
Log.Debug("SendEvent: end.");
}
public virtual void SendQuote(MtQuote quote)
public virtual void UpdateQuote(MtQuote quote)
{
Log.DebugFormat("UpdateQuote: begin. quote = {0}", quote);
Quote = quote;
Log.Debug("UpdateQuote: end.");
}
public override string ToString()
+1 -1
View File
@@ -1672,7 +1672,7 @@ namespace MtApi5
private void OnConnected()
{
// INFO: disabled backtesting mode while solution of window handle in testing mode is not found
//_isBacktestingMode = IsTesting();
//_isBacktestingMode = IsTestMode();
if (_isBacktestingMode)
{
BIN
View File
Binary file not shown.
+366 -348
View File
File diff suppressed because it is too large Load Diff