mirror of
https://github.com/vdemydiuk/mtapi.git
synced 2026-07-27 18:47:55 +00:00
Issue #16: Added Mt5Expert into MTApiService. Refactored MT5Connector
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Binary file not shown.
+366
-348
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user