|
|
@@ -151,12 +151,14 @@ void CPluginInstance::OnOrderDelete(const IMTOrder * order)
|
|
|
IMTAccount* account = m_api->UserCreateAccount();
|
|
|
IMTOrder* new_order = m_api->OrderCreate();
|
|
|
|
|
|
- ScopeGuard guard([account, new_order]
|
|
|
+ ScopeGuard guard([account, new_order, this]
|
|
|
{
|
|
|
if (account)
|
|
|
account->Release();
|
|
|
if (new_order)
|
|
|
new_order->Release();
|
|
|
+
|
|
|
+ m_redis_client->commit();
|
|
|
});
|
|
|
|
|
|
// 订单在进入filled状态时,也会产生一个order delete回调
|
|
|
@@ -243,7 +245,9 @@ void CPluginInstance::OnOrderDelete(const IMTOrder * order)
|
|
|
m_api->LoggerOut(MTLogErr, L"redis: %s", r.error().c_str());
|
|
|
}
|
|
|
});
|
|
|
- m_redis_client->commit();
|
|
|
+
|
|
|
+ // 可以在退出前提交
|
|
|
+ // m_redis_client->commit();
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
@@ -341,7 +345,7 @@ void CPluginInstance::OnOrderDelete(const IMTOrder * order)
|
|
|
m_api->LoggerOut(MTLogErr, L"redis: %s", r.error().c_str());
|
|
|
}
|
|
|
});
|
|
|
- m_redis_client->commit();
|
|
|
+ // 下一次get会调用commit
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -425,7 +429,7 @@ void CPluginInstance::OnDealPerform(const IMTDeal * deal, IMTAccount * account,
|
|
|
|
|
|
std::vector<std::string>* fields = nullptr;
|
|
|
|
|
|
- ScopeGuard guard([new_deal, &fields]
|
|
|
+ ScopeGuard guard([new_deal, &fields, this]
|
|
|
{
|
|
|
new_deal->Release();
|
|
|
if (fields)
|
|
|
@@ -434,6 +438,9 @@ void CPluginInstance::OnDealPerform(const IMTDeal * deal, IMTAccount * account,
|
|
|
delete fields;
|
|
|
fields = nullptr;
|
|
|
}
|
|
|
+
|
|
|
+ // 退出前调用commit
|
|
|
+ m_redis_client->commit();
|
|
|
});
|
|
|
|
|
|
char login_buf[128];
|
|
|
@@ -508,6 +515,15 @@ void CPluginInstance::OnDealPerform(const IMTDeal * deal, IMTAccount * account,
|
|
|
}
|
|
|
|
|
|
m_api->LoggerOut(MTLogOK, L"add deal #%lld, original deal #%lld", new_deal->Deal(), deal->Deal());
|
|
|
+
|
|
|
+ m_redis_client->publish("mt5_balance_fix", login_buf, [this](cpp_redis::reply r)
|
|
|
+ {
|
|
|
+ if (r.ko())
|
|
|
+ {
|
|
|
+ m_api->LoggerOut(MTLogErr, L"redis publish: %s", r.error().c_str());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // commit 在退出前完成
|
|
|
}
|
|
|
|
|
|
m_api->LoggerOut(MTLogOK, L"deal #%lld, position #%lld, volume %lld", deal->Deal(), position->Position(), position->Volume());
|
|
|
@@ -530,7 +546,6 @@ void CPluginInstance::OnDealPerform(const IMTDeal * deal, IMTAccount * account,
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
- m_redis_client->commit();
|
|
|
}
|
|
|
|
|
|
// TODO 当position中的volume为0时,持仓被彻底平调,被跟订单是否也该检查
|
|
|
@@ -773,6 +788,7 @@ void CPluginInstance::stop_redis()
|
|
|
{
|
|
|
if (m_redis_client)
|
|
|
{
|
|
|
+ // 使用sync commit保证操作全部提交
|
|
|
m_redis_client->sync_commit();
|
|
|
m_redis_client->disconnect();
|
|
|
m_redis_client.reset();
|