Stage 7.2: manipulation detection (player price push, prediction/perp forfeits)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
002606056d
commit
786de325da
11 files changed
+99
-8
No files matched your search
@@ -604,6 +604,22 @@ namespace Decentralized
|
||||
if (pos == null) { _message = PerpErr(PerpResult.NoPosition); Open(); return; }
|
||||
double margin = pos.Margin;
|
||||
double paid = d.Perps.Close(d.Poinbase, _perpProduct, PerpSpot(_perpProduct), StoreStation.GetDayCounter(), out double deficit);
|
||||
// 操纵:平仓盈利,而且盈利方向和玩家自己推价的方向一致,按推价幅度被查:盈利没收,记诈骗罪证,永续账户冻结几天
|
||||
double push = d.Market.PlayerPush, profit = paid - margin;
|
||||
bool aligned = _perpProduct == "PSC" && profit > 0 && (pos.Long ? push > 0 : push < 0);
|
||||
if (aligned && d.Rng.Chance(Market.ManipChance(push)))
|
||||
{
|
||||
int day = StoreStation.GetDayCounter();
|
||||
d.Poinbase.Add(Assets.CRC, -Math.Min(profit, d.Poinbase.Avail(Assets.CRC)));
|
||||
d.Perps.BannedUntil = day + Tuning.ManipFreezeDays;
|
||||
PlayerStore.Instance.secData.CommitCrime("FRAUD", (int)Math.Round(Math.Min(Tuning.PredictFraudCap, profit * Tuning.PredictFraudShare)));
|
||||
News.Show("pd_news_manip_" + day, L.T("news.manip.title"), L.T("news.manip.desc"), 3);
|
||||
_message = L.T("perp.manip", Fmt.Credits(profit), Tuning.ManipFreezeDays);
|
||||
Log.Info($"永续操纵被查:盈利 {profit:0} 没收,推价 {push:0.000}");
|
||||
Session.Save();
|
||||
Open();
|
||||
return;
|
||||
}
|
||||
_message = L.T("perp.closed", Fmt.Num(paid), (paid - margin >= 0 ? "+" : "") + Fmt.Num(paid - margin)) + (deficit > 0 ? "\n" + L.T("perp.deficit", Fmt.Credits(deficit)) : "");
|
||||
Session.Save();
|
||||
Open();
|
||||
@@ -1446,7 +1462,9 @@ namespace Decentralized
|
||||
{
|
||||
string pay = buy ? p.Quote : p.Base, get = buy ? p.Base : p.Quote;
|
||||
if (w.Avail(pay) + 1e-9 < v) { _message = L.T(frozenPay(w, pay) ? "msg.frozen" : "msg.balance"); Open(); return; }
|
||||
double before = p.Price;
|
||||
double got = buy ? p.BuyBase(v) : p.SellBase(v);
|
||||
if (p == Session.Data.Market.Main) { Session.Data.Market.PlayerPush += Math.Log(p.Price / before); Log.Info($"现货推价:累计 {Session.Data.Market.PlayerPush:0.000}"); }
|
||||
double spent = v * Session.Price(pay);
|
||||
w.Add(pay, -v);
|
||||
w.Add(get, got);
|
||||
|
||||
Reference in new issue
Block a user