|
|
@@ -341,7 +341,7 @@ footer{margin-top:34px;padding-top:22px;border-top:1px solid var(--border);color
|
|
|
|
<nav class="topnav">
|
|
|
|
<nav class="topnav">
|
|
|
|
<div class="brand">
|
|
|
|
<div class="brand">
|
|
|
|
<div class="logo">🏆</div>
|
|
|
|
<div class="logo">🏆</div>
|
|
|
|
<div><div class="brand-name">Polymarket Arena</div><div class="brand-sub">10 agents · 5 core + 5 aggressive</div><div class="build-badge">Adaptive strategy 62 · contest-level learning · build 107</div></div>
|
|
|
|
<div><div class="brand-name">Polymarket Arena</div><div class="brand-sub">10 agents · 5 core + 5 aggressive</div><div class="build-badge">Adaptive strategy 62 · contest-level learning · build 108</div></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="tabs" id="tabs">
|
|
|
|
<div class="tabs" id="tabs">
|
|
|
|
<button class="tab" data-tab="overview">Overview</button>
|
|
|
|
<button class="tab" data-tab="overview">Overview</button>
|
|
|
@@ -363,7 +363,7 @@ footer{margin-top:34px;padding-top:22px;border-top:1px solid var(--border);color
|
|
|
|
<div class="personal-banner" id="personalBanner">
|
|
|
|
<div class="personal-banner" id="personalBanner">
|
|
|
|
<b>Personal research mode.</b> This copy is for your own analysis, paper tracking, and manual trade research only. It does not pool money, onboard investors, custody funds, bypass eligibility rules, or place orders without your manual approval.
|
|
|
|
<b>Personal research mode.</b> This copy is for your own analysis, paper tracking, and manual trade research only. It does not pool money, onboard investors, custody funds, bypass eligibility rules, or place orders without your manual approval.
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="live-build-banner"><b>Build 107 active:</b> The public paper agents run autonomously every five minutes while every user device is closed. Each cycle scans the 500 most-active eligible markets and 1,000 most-active events, carries exact Gamma fee schedules through cloud and offline caches, and checks complete bundles against live depth. Strategy 62 adds a bounded sports-contest NO exploration lane: one highest-priced NO contract per real contest near the three-day checkpoint, exact entry fee plus slippage, 0.5% initial size, 3% total cap, and automatic forward promotion or suspension. This point-positive historical pattern is not a proven edge. Phones and computers display the same read-only autonomous state. Profits are not guaranteed.</div>
|
|
|
|
<div class="live-build-banner"><b>Build 108 active:</b> The public paper agents run autonomously every five minutes while every user device is closed. Each cycle scans the 500 most-active eligible markets and 1,000 most-active events, carries exact Gamma fee schedules through cloud and offline caches, and checks complete bundles against live depth. Strategy 62 adds a bounded sports-contest NO exploration lane: one highest-priced NO contract per real contest near the three-day checkpoint, exact entry fee plus slippage, 0.5% initial size, 3% total cap, and automatic forward promotion or suspension. This point-positive historical pattern is not a proven edge. Phones and computers display the same read-only autonomous state. Profits are not guaranteed.</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ============ OVERVIEW ============ -->
|
|
|
|
<!-- ============ OVERVIEW ============ -->
|
|
|
|
<section class="tabpanel" data-tab="overview">
|
|
|
|
<section class="tabpanel" data-tab="overview">
|
|
|
@@ -745,7 +745,7 @@ footer{margin-top:34px;padding-top:22px;border-top:1px solid var(--border);color
|
|
|
|
</section>
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
|
|
<footer>
|
|
|
|
<footer>
|
|
|
|
Build 107 · Adaptive strategy 62 · Five-minute autonomous scans · Exact-fee directional learning · Contest-deduplicated sports exploration · Live depth, fee, and size-verified bundle audit · Corrected one-decision-per-event settlement audit · Autonomous runtime 1 · Offline runtime 2 · Maker research 3 · Agent learning 3 · Paper trading only · Live prices from Polymarket's public Gamma and CLOB APIs · Not financial advice ·
|
|
|
|
Build 108 · Adaptive strategy 62 · Five-minute autonomous scans · Exact-fee directional learning · Contest-deduplicated sports exploration · Live depth, fee, and size-verified bundle audit · Corrected one-decision-per-event settlement audit · Autonomous runtime 1 · Offline runtime 2 · Maker research 3 · Agent learning 3 · Paper trading only · Live prices from Polymarket's public Gamma and CLOB APIs · Not financial advice ·
|
|
|
|
<a class="market-link" href="https://github.com/theodore-song/polymarket-analyst" target="_blank" rel="noopener">Source on GitHub</a>
|
|
|
|
<a class="market-link" href="https://github.com/theodore-song/polymarket-analyst" target="_blank" rel="noopener">Source on GitHub</a>
|
|
|
|
</footer>
|
|
|
|
</footer>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
@@ -774,7 +774,7 @@ const POLITICS_TREND_MIN_HOLD_HOURS = 72;
|
|
|
|
const EXIT_CONFIRM_HOURS = 6;
|
|
|
|
const EXIT_CONFIRM_HOURS = 6;
|
|
|
|
const AGENTS_KEY = "pma_agents_v2";
|
|
|
|
const AGENTS_KEY = "pma_agents_v2";
|
|
|
|
const SUG_KEY = "pma_suggestions_v5";
|
|
|
|
const SUG_KEY = "pma_suggestions_v5";
|
|
|
|
const BUILD_VERSION = 107;
|
|
|
|
const BUILD_VERSION = 108;
|
|
|
|
const AGENT_LEARNING_VERSION = 3;
|
|
|
|
const AGENT_LEARNING_VERSION = 3;
|
|
|
|
const SUGGESTION_ENGINE_VERSION = 62;
|
|
|
|
const SUGGESTION_ENGINE_VERSION = 62;
|
|
|
|
const MAKER_STRATEGY_VERSION = 3;
|
|
|
|
const MAKER_STRATEGY_VERSION = 3;
|
|
|
@@ -1261,6 +1261,12 @@ function bundleExecutableLeg(book,units,feeSchedule){
|
|
|
|
const askPrice=cost/Number(units),feePerShare=feeConfigValid?fees/Number(units):SIGNAL_ROUND_TRIP_COST;
|
|
|
|
const askPrice=cost/Number(units),feePerShare=feeConfigValid?fees/Number(units):SIGNAL_ROUND_TRIP_COST;
|
|
|
|
return {ask_price:askPrice,fee_per_share:feePerShare,total_price:askPrice+feePerShare,fee_config_valid:feeConfigValid};
|
|
|
|
return {ask_price:askPrice,fee_per_share:feePerShare,total_price:askPrice+feePerShare,fee_config_valid:feeConfigValid};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function bundleMinimumExecutionUnits(unitCost,baselineUnits=0){
|
|
|
|
|
|
|
|
const cost=Number(unitCost),baseline=Math.max(0,Number(baselineUnits)||0);
|
|
|
|
|
|
|
|
if(!(cost>0))return +Math.max(BUNDLE_MIN_UNITS,baseline).toFixed(2);
|
|
|
|
|
|
|
|
const notionalUnits=Math.ceil(((BUNDLE_MIN_NOTIONAL+0.01)/cost)*100)/100;
|
|
|
|
|
|
|
|
return +Math.max(BUNDLE_MIN_UNITS,baseline,notionalUnits).toFixed(2);
|
|
|
|
|
|
|
|
}
|
|
|
|
async function fetchBundleBooks(tokenIds){
|
|
|
|
async function fetchBundleBooks(tokenIds){
|
|
|
|
const books=new Map(),unique=[...new Set((tokenIds||[]).map(String).filter(Boolean))];
|
|
|
|
const books=new Map(),unique=[...new Set((tokenIds||[]).map(String).filter(Boolean))];
|
|
|
|
for(let index=0;index<unique.length;index+=BUNDLE_BOOK_BATCH_SIZE){
|
|
|
|
for(let index=0;index<unique.length;index+=BUNDLE_BOOK_BATCH_SIZE){
|
|
|
@@ -1291,7 +1297,7 @@ async function verifyExecutableBundles(candidates){
|
|
|
|
const shortlist=(candidates||[]).slice().sort((a,b)=>Number(b.net_edge||-Infinity)-Number(a.net_edge||-Infinity)).slice(0,BUNDLE_DEPTH_CANDIDATE_LIMIT);
|
|
|
|
const shortlist=(candidates||[]).slice().sort((a,b)=>Number(b.net_edge||-Infinity)-Number(a.net_edge||-Infinity)).slice(0,BUNDLE_DEPTH_CANDIDATE_LIMIT);
|
|
|
|
const tokenIds=shortlist.flatMap(candidate=>(candidate.bundle_legs||[]).map(leg=>leg.token_id));
|
|
|
|
const tokenIds=shortlist.flatMap(candidate=>(candidate.bundle_legs||[]).map(leg=>leg.token_id));
|
|
|
|
const books=await fetchBundleBooks(tokenIds),depthChecked=shortlist.map(candidate=>{
|
|
|
|
const books=await fetchBundleBooks(tokenIds),depthChecked=shortlist.map(candidate=>{
|
|
|
|
const estimatedCost=Number(candidate.bundle_cost_per_unit),requiredUnits=+(Math.max(BUNDLE_MIN_UNITS,BUNDLE_MIN_NOTIONAL/Math.max(estimatedCost,0.01))).toFixed(2);
|
|
|
|
const estimatedCost=Number(candidate.bundle_cost_per_unit),requiredUnits=bundleMinimumExecutionUnits(Math.max(estimatedCost,0.01));
|
|
|
|
const legs=(candidate.bundle_legs||[]).map(leg=>{
|
|
|
|
const legs=(candidate.bundle_legs||[]).map(leg=>{
|
|
|
|
const book=books.get(String(leg.token_id||"")),minimum=Number(book&&book.min_order_size||0),units=Math.max(requiredUnits,minimum);
|
|
|
|
const book=books.get(String(leg.token_id||"")),minimum=Number(book&&book.min_order_size||0),units=Math.max(requiredUnits,minimum);
|
|
|
|
const executable=bundleExecutableLeg(book,units,leg.fee_schedule);
|
|
|
|
const executable=bundleExecutableLeg(book,units,leg.fee_schedule);
|
|
|
@@ -1299,15 +1305,28 @@ async function verifyExecutableBundles(candidates){
|
|
|
|
fee_per_share:executable?+executable.fee_per_share.toFixed(6):null,entry_price:executable?+executable.total_price.toFixed(6):null,
|
|
|
|
fee_per_share:executable?+executable.fee_per_share.toFixed(6):null,entry_price:executable?+executable.total_price.toFixed(6):null,
|
|
|
|
fee_config_valid:Boolean(executable&&executable.fee_config_valid),depth_verified:Boolean(executable)});
|
|
|
|
fee_config_valid:Boolean(executable&&executable.fee_config_valid),depth_verified:Boolean(executable)});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
const commonUnits=Math.max(requiredUnits,...legs.map(leg=>Number(leg.required_units||0)));
|
|
|
|
let commonUnits=Math.max(requiredUnits,...legs.map(leg=>Number(leg.required_units||0)));
|
|
|
|
const repricedLegs=legs.map(leg=>{
|
|
|
|
let repricedLegs=legs.map(leg=>{
|
|
|
|
if(Number(leg.required_units)===commonUnits)return leg;
|
|
|
|
if(Number(leg.required_units)===commonUnits)return leg;
|
|
|
|
const executable=bundleExecutableLeg(books.get(String(leg.token_id||"")),commonUnits,leg.fee_schedule);
|
|
|
|
const executable=bundleExecutableLeg(books.get(String(leg.token_id||"")),commonUnits,leg.fee_schedule);
|
|
|
|
return Object.assign({},leg,{required_units:+commonUnits.toFixed(2),ask_vwap:executable?+executable.ask_price.toFixed(6):null,
|
|
|
|
return Object.assign({},leg,{required_units:+commonUnits.toFixed(2),ask_vwap:executable?+executable.ask_price.toFixed(6):null,
|
|
|
|
fee_per_share:executable?+executable.fee_per_share.toFixed(6):null,entry_price:executable?+executable.total_price.toFixed(6):null,
|
|
|
|
fee_per_share:executable?+executable.fee_per_share.toFixed(6):null,entry_price:executable?+executable.total_price.toFixed(6):null,
|
|
|
|
fee_config_valid:Boolean(executable&&executable.fee_config_valid),depth_verified:Boolean(executable)});
|
|
|
|
fee_config_valid:Boolean(executable&&executable.fee_config_valid),depth_verified:Boolean(executable)});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
const depthVerified=repricedLegs.length>=2&&repricedLegs.every(leg=>leg.depth_verified),cost=depthVerified?repricedLegs.reduce((sum,leg)=>sum+Number(leg.entry_price),0):Infinity;
|
|
|
|
let depthVerified=repricedLegs.length>=2&&repricedLegs.every(leg=>leg.depth_verified);
|
|
|
|
|
|
|
|
let cost=depthVerified?repricedLegs.reduce((sum,leg)=>sum+Number(leg.entry_price),0):Infinity;
|
|
|
|
|
|
|
|
const finalUnits=depthVerified?bundleMinimumExecutionUnits(cost,commonUnits):commonUnits;
|
|
|
|
|
|
|
|
if(finalUnits>commonUnits){
|
|
|
|
|
|
|
|
commonUnits=finalUnits;
|
|
|
|
|
|
|
|
repricedLegs=repricedLegs.map(leg=>{
|
|
|
|
|
|
|
|
const executable=bundleExecutableLeg(books.get(String(leg.token_id||"")),commonUnits,leg.fee_schedule);
|
|
|
|
|
|
|
|
return Object.assign({},leg,{required_units:+commonUnits.toFixed(2),ask_vwap:executable?+executable.ask_price.toFixed(6):null,
|
|
|
|
|
|
|
|
fee_per_share:executable?+executable.fee_per_share.toFixed(6):null,entry_price:executable?+executable.total_price.toFixed(6):null,
|
|
|
|
|
|
|
|
fee_config_valid:Boolean(executable&&executable.fee_config_valid),depth_verified:Boolean(executable)});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
depthVerified=repricedLegs.length>=2&&repricedLegs.every(leg=>leg.depth_verified);
|
|
|
|
|
|
|
|
cost=depthVerified?repricedLegs.reduce((sum,leg)=>sum+Number(leg.entry_price),0):Infinity;
|
|
|
|
|
|
|
|
}
|
|
|
|
const payout=Number(candidate.bundle_payout_per_unit),profit=payout-cost,netReturn=Number.isFinite(cost)&&cost>0?profit/cost:-Infinity;
|
|
|
|
const payout=Number(candidate.bundle_payout_per_unit),profit=payout-cost,netReturn=Number.isFinite(cost)&&cost>0?profit/cost:-Infinity;
|
|
|
|
return Object.assign({},candidate,{bundle_legs:repricedLegs,execution_units:+commonUnits.toFixed(2),execution_notional:Number.isFinite(cost)?+(cost*commonUnits).toFixed(2):null,
|
|
|
|
return Object.assign({},candidate,{bundle_legs:repricedLegs,execution_units:+commonUnits.toFixed(2),execution_notional:Number.isFinite(cost)?+(cost*commonUnits).toFixed(2):null,
|
|
|
|
bundle_cost_per_unit:Number.isFinite(cost)?+cost.toFixed(6):null,bundle_net_profit_per_unit:Number.isFinite(profit)?+profit.toFixed(6):null,
|
|
|
|
bundle_cost_per_unit:Number.isFinite(cost)?+cost.toFixed(6):null,bundle_net_profit_per_unit:Number.isFinite(profit)?+profit.toFixed(6):null,
|
|
|
@@ -3823,7 +3842,7 @@ function openNegativeRiskBundle(p,cfg,s,stake,decision){
|
|
|
|
peak_price:+current.toFixed(4),gain_stops:{},stop_losses:{}};
|
|
|
|
peak_price:+current.toFixed(4),gain_stops:{},stop_losses:{}};
|
|
|
|
});
|
|
|
|
});
|
|
|
|
const totalCost=+positions.reduce((sum,pos)=>sum+pos.cost,0).toFixed(2);
|
|
|
|
const totalCost=+positions.reduce((sum,pos)=>sum+pos.cost,0).toFixed(2);
|
|
|
|
if(totalCost>p.cash||totalCost<50)return null;
|
|
|
|
if(totalCost>p.cash||totalCost<BUNDLE_MIN_NOTIONAL)return null;
|
|
|
|
p.cash=+(p.cash-totalCost).toFixed(2);p.positions.push(...positions);
|
|
|
|
p.cash=+(p.cash-totalCost).toFixed(2);p.positions.push(...positions);
|
|
|
|
p.history.push({date:logDay(),action:"OPEN",question:s.question,side:bundleSide,
|
|
|
|
p.history.push({date:logDay(),action:"OPEN",question:s.question,side:bundleSide,
|
|
|
|
detail:`${decision?decision.mode+" mode — ":""}Opened complete ${legs.length}-leg ${bundleSide} bundle for ${fmtUSD(totalCost)} · ${units} bundle units · modeled settlement profit ${fmtUSD(units*Number(s.bundle_net_profit_per_unit))} after estimated costs · live prices required`});
|
|
|
|
detail:`${decision?decision.mode+" mode — ":""}Opened complete ${legs.length}-leg ${bundleSide} bundle for ${fmtUSD(totalCost)} · ${units} bundle units · modeled settlement profit ${fmtUSD(units*Number(s.bundle_net_profit_per_unit))} after estimated costs · live prices required`});
|
|
|
@@ -3951,7 +3970,7 @@ function openPositions(p,cfg,rankedSugs,focus,decision,avoidMarketIds,peerStats=
|
|
|
|
if(s.quality==="bundle-arb"){
|
|
|
|
if(s.quality==="bundle-arb"){
|
|
|
|
const bundleStake=boundedStakeForRisk(eq,Math.min(eq*Math.min(d.maxFrac,0.04),investable),cfg,s);
|
|
|
|
const bundleStake=boundedStakeForRisk(eq,Math.min(eq*Math.min(d.maxFrac,0.04),investable),cfg,s);
|
|
|
|
const bundle=openNegativeRiskBundle(p,cfg,s,bundleStake,decision);
|
|
|
|
const bundle=openNegativeRiskBundle(p,cfg,s,bundleStake,decision);
|
|
|
|
if(!bundle)continue;
|
|
|
|
if(!bundle){reject("bundle_execution");continue;}
|
|
|
|
cycleBudgetRemaining=Math.max(0,cycleBudgetRemaining-bundle.cost);
|
|
|
|
cycleBudgetRemaining=Math.max(0,cycleBudgetRemaining-bundle.cost);
|
|
|
|
opened++;openedIds.push(String(s.bundle_id||s.market_id));
|
|
|
|
opened++;openedIds.push(String(s.bundle_id||s.market_id));
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
@@ -6149,6 +6168,7 @@ window.PMA_ENGINE_DIAGNOSTICS=Object.freeze({
|
|
|
|
peerEvidenceSizeMultiplier,
|
|
|
|
peerEvidenceSizeMultiplier,
|
|
|
|
tradeLossBudgetPct,
|
|
|
|
tradeLossBudgetPct,
|
|
|
|
boundedStakeForRisk,
|
|
|
|
boundedStakeForRisk,
|
|
|
|
|
|
|
|
bundleMinimumExecutionUnits,
|
|
|
|
sportsFavoritePilotSuggestion,
|
|
|
|
sportsFavoritePilotSuggestion,
|
|
|
|
sportsContestKey,
|
|
|
|
sportsContestKey,
|
|
|
|
sportsContestNoSuggestions,
|
|
|
|
sportsContestNoSuggestions,
|
|
|
@@ -6844,6 +6864,20 @@ function runEngineSelfTest(){
|
|
|
|
Object.assign({},bundleSuggestion,{depth_verified:false,verification_status:"top-of-book-estimate"}),100,null);
|
|
|
|
Object.assign({},bundleSuggestion,{depth_verified:false,verification_status:"top-of-book-estimate"}),100,null);
|
|
|
|
const depthCappedBundleBook=defaultPortfolio(),depthCappedBundle=Object.assign({},bundleSuggestion,{execution_units:50});
|
|
|
|
const depthCappedBundleBook=defaultPortfolio(),depthCappedBundle=Object.assign({},bundleSuggestion,{execution_units:50});
|
|
|
|
openNegativeRiskBundle(depthCappedBundleBook,AGENTS.find(a=>a.id==="value"),depthCappedBundle,400,null);
|
|
|
|
openNegativeRiskBundle(depthCappedBundleBook,AGENTS.find(a=>a.id==="value"),depthCappedBundle,400,null);
|
|
|
|
|
|
|
|
const repricedBoundaryUnits=bundleMinimumExecutionUnits(0.996041,50.04);
|
|
|
|
|
|
|
|
const repricedBoundaryCandidate=Object.assign({},dominanceSuggestion,{market_id:"repriced-boundary",bundle_id:"repriced-boundary",
|
|
|
|
|
|
|
|
bundle_cost_per_unit:0.996041,bundle_net_profit_per_unit:0.003959,execution_units:repricedBoundaryUnits,
|
|
|
|
|
|
|
|
bundle_legs:[
|
|
|
|
|
|
|
|
{market_id:"repriced-boundary-a",question:"Boundary A",side:"YES",token_id:"boundary-a",entry_price:0.990693,current_price:0.9895},
|
|
|
|
|
|
|
|
{market_id:"repriced-boundary-b",question:"Boundary B",side:"NO",token_id:"boundary-b",entry_price:0.005348,current_price:0.006},
|
|
|
|
|
|
|
|
]});
|
|
|
|
|
|
|
|
const repricedBoundaryBook=defaultPortfolio();
|
|
|
|
|
|
|
|
const repricedBoundaryOpen=openNegativeRiskBundle(repricedBoundaryBook,AGENTS.find(a=>a.id==="value"),repricedBoundaryCandidate,400,null);
|
|
|
|
|
|
|
|
const undersizedBoundaryCandidate=Object.assign({},repricedBoundaryCandidate,{execution_units:50.04});
|
|
|
|
|
|
|
|
const undersizedBoundaryBook=defaultPortfolio();
|
|
|
|
|
|
|
|
openPositions(undersizedBoundaryBook,AGENTS.find(a=>a.id==="value"),[undersizedBoundaryCandidate],"All",{
|
|
|
|
|
|
|
|
minConv:0,maxNew:1,maxFrac:0.04,reserve:0.10,targetExposure:0.60,learning:buildAdaptiveProfile(undersizedBoundaryBook),marketLearning:{samples:0,pending:0,buckets:{}},
|
|
|
|
|
|
|
|
},new Set(),{});
|
|
|
|
const dominanceBook=defaultPortfolio(),offlineDominanceSuggestion=prepareCycleSuggestions([dominanceSuggestion],"offline-cache",true)[0];
|
|
|
|
const dominanceBook=defaultPortfolio(),offlineDominanceSuggestion=prepareCycleSuggestions([dominanceSuggestion],"offline-cache",true)[0];
|
|
|
|
openPositions(dominanceBook,AGENTS.find(a=>a.id==="value"),[dominanceSuggestion],"All",{
|
|
|
|
openPositions(dominanceBook,AGENTS.find(a=>a.id==="value"),[dominanceSuggestion],"All",{
|
|
|
|
minConv:0,maxNew:1,maxFrac:0.04,reserve:0.10,targetExposure:0.60,learning:buildAdaptiveProfile(dominanceBook),marketLearning:{samples:0,pending:0,buckets:{}},
|
|
|
|
minConv:0,maxNew:1,maxFrac:0.04,reserve:0.10,targetExposure:0.60,learning:buildAdaptiveProfile(dominanceBook),marketLearning:{samples:0,pending:0,buckets:{}},
|
|
|
@@ -7292,6 +7326,11 @@ function runEngineSelfTest(){
|
|
|
|
&&zeroFeeBundleSuggestion.bundle_cost_per_unit===0.95&&zeroFeeBundleSuggestion.bundle_net_profit_per_unit===0.05),
|
|
|
|
&&zeroFeeBundleSuggestion.bundle_cost_per_unit===0.95&&zeroFeeBundleSuggestion.bundle_net_profit_per_unit===0.05),
|
|
|
|
appliesPublishedFeeCurve:bundleFeePerShare({rate:0.07,exponent:1,takerOnly:true},0.5)===0.0175,
|
|
|
|
appliesPublishedFeeCurve:bundleFeePerShare({rate:0.07,exponent:1,takerOnly:true},0.5)===0.0175,
|
|
|
|
depthVwapConsumesMultipleAskLevels:depthVwapFixture===0.396,
|
|
|
|
depthVwapConsumesMultipleAskLevels:depthVwapFixture===0.396,
|
|
|
|
|
|
|
|
liveRepricingRoundsUpToMinimumNotional:repricedBoundaryUnits===50.21&&repricedBoundaryUnits*0.996041>=BUNDLE_MIN_NOTIONAL+0.009,
|
|
|
|
|
|
|
|
repricedMinimumNotionalOpensAtomically:Boolean(repricedBoundaryOpen&&repricedBoundaryBook.positions.length===2
|
|
|
|
|
|
|
|
&&repricedBoundaryOpen.cost>=BUNDLE_MIN_NOTIONAL),
|
|
|
|
|
|
|
|
undersizedAtomicFailureIsReported:undersizedBoundaryBook.positions.length===0
|
|
|
|
|
|
|
|
&&undersizedBoundaryBook.lastDecision.rejectionCounts.bundle_execution===1,
|
|
|
|
blocksUnverifiedBundleEntry:unverifiedBundleOpen===null&&unverifiedBundleBook.positions.length===0&&unverifiedBundleBook.cash===STARTING_BALANCE,
|
|
|
|
blocksUnverifiedBundleEntry:unverifiedBundleOpen===null&&unverifiedBundleBook.positions.length===0&&unverifiedBundleBook.cash===STARTING_BALANCE,
|
|
|
|
capsOpenedUnitsToVerifiedDepth:depthCappedBundleBook.positions.length===3
|
|
|
|
capsOpenedUnitsToVerifiedDepth:depthCappedBundleBook.positions.length===3
|
|
|
|
&&depthCappedBundleBook.positions.every(position=>position.shares===50),
|
|
|
|
&&depthCappedBundleBook.positions.every(position=>position.shares===50),
|
|
|
|