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; 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]() { return Execute<int>([&expertHandle, &port, symbol, &bid, &ask, &isTestMode]() {
auto expert = gcnew MtExpert(expertHandle, gcnew String(symbol), bid, ask, gcnew MT5Handler()); bool isTesting = (isTestMode != 0) ? true : false;
auto expert = gcnew Mt5Expert(expertHandle, gcnew String(symbol), bid, ask, gcnew MT5Handler(), isTesting);
MtAdapter::GetInstance()->AddExpert(port, expert); MtAdapter::GetInstance()->AddExpert(port, expert);
return 1; return 1;
}, err, 0); }, err, 0);
+1
View File
@@ -64,6 +64,7 @@
<Compile Include="IMetaTraderHandler.cs" /> <Compile Include="IMetaTraderHandler.cs" />
<Compile Include="ITaskExecutor.cs" /> <Compile Include="ITaskExecutor.cs" />
<Compile Include="LogConfigurator.cs" /> <Compile Include="LogConfigurator.cs" />
<Compile Include="Mt5Expert.cs" />
<Compile Include="MtCommandEventArgs.cs" /> <Compile Include="MtCommandEventArgs.cs" />
<Compile Include="IDisposableChannel.cs" /> <Compile Include="IDisposableChannel.cs" />
<Compile Include="IMtApiServer.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 #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) public void AddExpert(int port, MtExpert expert)
{ {
if (expert == null) if (expert == null)
@@ -135,7 +99,7 @@ namespace MTApiService
public void SendQuote(int expertHandle, string symbol, double bid, double ask) 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; MtExpert expert;
lock (_experts) lock (_experts)
@@ -145,14 +109,14 @@ namespace MTApiService
if (expert != null) 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 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) public void SendEvent(int expertHandle, int eventType, string payload)
+6 -2
View File
@@ -29,7 +29,7 @@ namespace MTApiService
_mtHadler = mtHandler; _mtHadler = mtHandler;
} }
public void Deinit() public virtual void Deinit()
{ {
Log.Debug("Deinit: begin."); Log.Debug("Deinit: begin.");
@@ -119,9 +119,13 @@ namespace MTApiService
Log.Debug("SendEvent: end."); 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; Quote = quote;
Log.Debug("UpdateQuote: end.");
} }
public override string ToString() public override string ToString()
+1 -1
View File
@@ -1672,7 +1672,7 @@ namespace MtApi5
private void OnConnected() private void OnConnected()
{ {
// INFO: disabled backtesting mode while solution of window handle in testing mode is not found // INFO: disabled backtesting mode while solution of window handle in testing mode is not found
//_isBacktestingMode = IsTesting(); //_isBacktestingMode = IsTestMode();
if (_isBacktestingMode) if (_isBacktestingMode)
{ {
BIN
View File
Binary file not shown.
+366 -348
View File
File diff suppressed because it is too large Load Diff