Przeglądaj źródła

加入publish功能用于balance fix。优化commit

KarsusNeko 6 lat temu
rodzic
commit
7b9bb80662
1 zmienionych plików z 21 dodań i 5 usunięć
  1. 21 5
      MT5MonkPAMM/PluginInstance.cpp

+ 21 - 5
MT5MonkPAMM/PluginInstance.cpp

@@ -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();