diff --git a/live/portfolio.json b/live/portfolio.json index 449d9c2b..ce525939 100644 --- a/live/portfolio.json +++ b/live/portfolio.json @@ -1 +1 @@ -{"started":1780815391.287603,"updated":1783407391.288466,"days":30,"bank":1000.0,"stake":417.05,"stake_pct":0.04,"class_pct":{"volume":0.04,"whale":0.12},"event_cap":0,"hwm":11394.41,"dd_threshold":0.8,"capped_count":0,"max_entry":0.95,"fee_rate":0.03,"slip":0.005,"lag_est_s":90,"fees_paid":680.28,"equity":10463.97,"liquid":10092.36,"invested":371.61,"reserve":0.0,"realized":9426.23,"pnl":9463.97,"unreal":37.74,"resolved_count":372,"wins":230,"losses":54,"refunds":88,"open_count":1,"missed_count":255,"wallets":[{"name":"Kruto2027","wallet":"0xe8ca3f758c93f44f3ec210542ab78afb7c0bcccb","bets":24,"won":18,"lost":5,"ref":0,"class":"volume","invested":371.61,"realized":1233.33,"conv_thr":108},{"name":"fortuneking","wallet":"0x86c878cde72660ec52f5e6f0f0438b76de8fc867","bets":46,"won":31,"lost":15,"ref":0,"class":"volume","invested":0.0,"realized":-368.9,"conv_thr":892},{"name":"LSB1","wallet":"0x41558102a796ba971c7567cad41c307e59f8fa41","bets":107,"won":99,"lost":8,"ref":0,"class":"volume","invested":0.0,"realized":3786.31,"conv_thr":200},{"name":"imwalkinghere","wallet":"0xd96750bf8d941a8186e592b0ae6e096da66aa266","bets":100,"won":76,"lost":24,"ref":0,"class":"volume","invested":0.0,"realized":3863.04,"conv_thr":98},{"name":"iohihoo","wallet":"0xfc81760d44a21acc9fd4b749a5bf9a9b2eeae072","bets":17,"won":5,"lost":2,"ref":10,"class":"volume","invested":0.0,"realized":-196.37,"conv_thr":55},{"name":"Stavenson","wallet":"0xf5fe759cece500f58a431ef8dacea321f6e3e23d","bets":4,"won":0,"lost":0,"ref":4,"class":"volume","invested":0.0,"realized":161.75,"conv_thr":5130},{"name":"0x4bFb-whale","wallet":"0x73afc8160c17830c0c7281a7bf570c871455b880","bets":18,"won":0,"lost":0,"ref":18,"class":"volume","invested":0.0,"realized":319.83,"conv_thr":1089},{"name":"ArbTrader","wallet":"0x72e1597864456eda62878413cf3e60c332e4a45d","bets":57,"won":1,"lost":0,"ref":56,"class":"volume","invested":0.0,"realized":627.25,"conv_thr":97}],"current":[{"title":"Map 3 Total Rounds: Over/Under 19.5","name":"Kruto2027","outcome":"Over","stake":329.16,"val":371.61,"pnl":37.74,"end":"2026-07-07"}],"resolved":[{"title":"Wimbledon WTA: Antonia Ruzic vs Emma Raducanu","name":"Stavenson","won":false,"status":"refund","stake":320.69,"pnl":18.85,"date":1783310400},{"title":"Wimbledon ATP: Mattia Bellucci vs Zachary Svajda","name":"0x4bFb-whale","won":false,"status":"refund","stake":304.26,"pnl":0.03,"date":1783310400},{"title":"Mattia Bellucci vs. Zachary Svajda: Total Sets O/U 4.5","name":"0x4bFb-whale","won":false,"status":"refund","stake":304.26,"pnl":0.14,"date":1783310400},{"title":"Wimbledon ATP: Luca Van Assche vs Marton Fucsovics","name":"fortuneking","won":true,"status":"won","stake":317.17,"pnl":86.63,"date":1783310400},{"title":"Wimbledon ATP: Camilo Ugo Carabelli vs Daniel Merida Aguilar","name":"fortuneking","won":false,"status":"lost","stake":310.66,"pnl":-315.3,"date":1783310400},{"title":"Wimbledon ATP: Taylor Fritz vs Jack Draper","name":"Stavenson","won":false,"status":"refund","stake":310.66,"pnl":27.26,"date":1783310400},{"title":"ITF Nivelles: Eric Vanshelboim vs Niklas Schell","name":"ArbTrader","won":false,"status":"refund","stake":310.66,"pnl":34.13,"date":1783310400},{"title":"ITF Nivelles: Kimmer Coppejans vs Louis Wessels","name":"ArbTrader","won":false,"status":"refund","stake":310.66,"pnl":110.59,"date":1783310400},{"title":"Wimbledon ATP: Alejandro Davidovich Fokina vs Juan Manuel Cerundolo","name":"fortuneking","won":true,"status":"won","stake":310.66,"pnl":31.91,"date":1783310400},{"title":"Quito: Mwendwa Mbithi vs Matias Soto","name":"fortuneking","won":false,"status":"lost","stake":355.79,"pnl":-360.68,"date":1783310400},{"title":"Wimbledon ATP: Vit Kopriva vs Jan Choinski","name":"fortuneking","won":false,"status":"lost","stake":369.99,"pnl":-377.85,"date":1783310400},{"title":"Sonego vs. Etcheverry: Match O/U 40.5","name":"Kruto2027","won":true,"status":"won","stake":165.69,"pnl":54.76,"date":1783310400},{"title":"England to score first vs. Mexico?","name":"LSB1","won":true,"status":"won","stake":431.08,"pnl":123.19,"date":1783310400},{"title":"Mexico vs. England: Both Teams to Score in First Half","name":"LSB1","won":true,"status":"won","stake":431.08,"pnl":135.41,"date":1783310400},{"title":"BK Hacken vs. Djurgardens IF: O/U 5.5","name":"LSB1","won":true,"status":"won","stake":413.84,"pnl":80.22,"date":1783310400},{"title":"ITF Rome: Amelia Honer vs Ayana Akli","name":"fortuneking","won":false,"status":"lost","stake":304.26,"pnl":-307.98,"date":1783224000},{"title":"IFK Goteborg vs. AIK: 1st Half O/U 0.5","name":"LSB1","won":true,"status":"won","stake":201.22,"pnl":18.28,"date":1783224000},{"title":"Will US Yacoub El Mansour win on 2026-07-05?","name":"LSB1","won":true,"status":"won","stake":425.66,"pnl":70.8,"date":1783224000},{"title":"Exact Score: Brazil 0 - 0 Norway?","name":"LSB1","won":true,"status":"won","stake":428.49,"pnl":64.6,"date":1783224000},{"title":"Washington Spirit vs. Houston Dash: 2nd Half O/U 1.5","name":"Kruto2027","won":true,"status":"won","stake":126.02,"pnl":200.09,"date":1783137600},{"title":"Washington Spirit vs. Houston Dash: Washington Spirit 2nd Half O/U 0.5","name":"Kruto2027","won":true,"status":"won","stake":160.65,"pnl":191.93,"date":1783137600},{"title":"Exact Score: Daejeon Hana Citizen FC 0 - 1 Bucheon FC 1995?","name":"LSB1","won":true,"status":"won","stake":431.44,"pnl":41.24,"date":1783137600},{"title":"Degerfors IF vs. Malmo FF: O/U 0.5","name":"LSB1","won":true,"status":"won","stake":433.09,"pnl":26.18,"date":1783137600},{"title":"Exact Score: Canada 0 - 2 Morocco?","name":"LSB1","won":true,"status":"won","stake":434.13,"pnl":77.89,"date":1783137600},{"title":"ITF Taipei: Priska Madelyn Nugroho vs Dayeon Back","name":"fortuneking","won":true,"status":"won","stake":303.61,"pnl":175.93,"date":1783051200},{"title":"Lexus Eastbourne Open: Zizou Bergs vs Toby Samuel","name":"fortuneking","won":false,"status":"lost","stake":303.61,"pnl":-306.04,"date":1783051200},{"title":"Exact Score: Australia 1 - 0 Egypt?","name":"LSB1","won":true,"status":"won","stake":432.23,"pnl":29.84,"date":1783051200},{"title":"Argentina vs. Cabo Verde: Will the Match Go to a Penalty Shootout?","name":"LSB1","won":false,"status":"lost","stake":433.43,"pnl":-441.77,"date":1783051200},{"title":"United States leading at halftime?","name":"LSB1","won":true,"status":"won","stake":418.66,"pnl":500.19,"date":1782964800},{"title":"Bitcoin Up or Down - July 2, 1:10AM-1:15AM ET","name":"imwalkinghere","won":true,"status":"won","stake":237.67,"pnl":110.08,"date":1782964800},{"title":"Counter-Strike: Atreides vs Subtop De France (BO3) - CCT Europe Challengers Series Playoffs","name":"ArbTrader","won":false,"status":"refund","stake":443.07,"pnl":0.05,"date":1782964800},{"title":"Will COD Mekn\u00e8s win on 2026-07-02?","name":"LSB1","won":true,"status":"won","stake":443.07,"pnl":179.78,"date":1782964800},{"title":"Portugal to score first vs. Croatia?","name":"LSB1","won":true,"status":"won","stake":450.26,"pnl":57.34,"date":1782964800},{"title":"Exact Score: Portugal 1 - 1 Croatia?","name":"LSB1","won":true,"status":"won","stake":452.56,"pnl":67.34,"date":1782964800},{"title":"Exact Score: Portugal 1 - 2 Croatia?","name":"LSB1","won":true,"status":"won","stake":284.98,"pnl":13.12,"date":1782964800},{"title":"Exact Score: Portugal 2 - 1 Croatia?","name":"LSB1","won":false,"status":"lost","stake":455.78,"pnl":-458.48,"date":1782964800},{"title":"Bitcoin Up or Down - June 30, 7:55PM-8:00PM ET","name":"imwalkinghere","won":true,"status":"won","stake":300.0,"pnl":213.63,"date":1782878400},{"title":"Ecuador to score first vs. Mexico?","name":"LSB1","won":true,"status":"won","stake":383.83,"pnl":48.84,"date":1782878400},{"title":"Juli\u00e1n Qui\u00f1ones: 1+ goals","name":"LSB1","won":true,"status":"won","stake":345.87,"pnl":122.74,"date":1782878400},{"title":"Exact Score: Mexico 1 - 1 Ecuador?","name":"LSB1","won":true,"status":"won","stake":383.83,"pnl":63.81,"date":1782878400},{"title":"England vs. DR Congo: DR Congo 1st Half O/U 0.5","name":"LSB1","won":true,"status":"won","stake":273.14,"pnl":50.92,"date":1782878400},{"title":"England vs. DR Congo: DR Congo O/U 0.5","name":"LSB1","won":true,"status":"won","stake":403.83,"pnl":207.07,"date":1782878400},{"title":"England to score first vs. DR Congo?","name":"LSB1","won":true,"status":"won","stake":412.11,"pnl":81.83,"date":1782878400},{"title":"England vs. DR Congo: Will the Match Go to Extra Time?","name":"LSB1","won":true,"status":"won","stake":280.74,"pnl":63.85,"date":1782878400},{"title":"Bitcoin Up or Down - July 1, 6:50PM-6:55PM ET","name":"imwalkinghere","won":true,"status":"won","stake":110.9,"pnl":17.98,"date":1782878400},{"title":"US-Iran nuclear deal by June 30?","name":"iohihoo","won":false,"status":"lost","stake":63.4,"pnl":-64.69,"date":1782792000},{"title":"Lexus Eastbourne Open (Doubles): Cash/Glasspool vs Cerundolo/Carabelli","name":"ArbTrader","won":true,"status":"won","stake":267.76,"pnl":417.41,"date":1782792000},{"title":"ITF Tarvisio: Luisa Meyer Auf Der Heide vs Emily Seibold","name":"ArbTrader","won":false,"status":"refund","stake":292.31,"pnl":0.03,"date":1782792000},{"title":"Piracicaba (Doubles): Casanova/Taverna vs Aboian/Ambrogi","name":"ArbTrader","won":false,"status":"refund","stake":147.96,"pnl":0.02,"date":1782792000},{"title":"Wimbledon, Qualification WTA: Guiomar Maristany vs Jazmin Ortenzi","name":"0x4bFb-whale","won":false,"status":"refund","stake":292.31,"pnl":0.03,"date":1782792000},{"title":"ITF Palma Del Rio: Polina Isakova vs Anna Kubareva","name":"fortuneking","won":true,"status":"won","stake":298.19,"pnl":42.45,"date":1782792000},{"title":"Will Tesla deliver between 450000 and 475000 vehicles in Q2 2026","name":"iohihoo","won":true,"status":"won","stake":90.0,"pnl":6.37,"date":1782792000},{"title":"Will Tesla deliver 475000 or more vehicles in Q2 2026","name":"iohihoo","won":false,"status":"lost","stake":180.0,"pnl":-180.48,"date":1782792000},{"title":"Will Claude Mythos 5 be restored for US customers by June 30?","name":"iohihoo","won":true,"status":"won","stake":128.35,"pnl":22.74,"date":1782792000},{"title":"Aleksandar Vu\u010di\u0107 out as Serbian President by June 30, 2026?","name":"iohihoo","won":true,"status":"won","stake":90.0,"pnl":10.55,"date":1782792000},{"title":"Bitcoin Up or Down - June 29, 7:55PM-8:00PM ET","name":"imwalkinghere","won":true,"status":"won","stake":231.5,"pnl":119.34,"date":1782792000},{"title":"Will Morocco win on 2026-06-29?","name":"imwalkinghere","won":false,"status":"lost","stake":355.79,"pnl":-363.79,"date":1782792000},{"title":"Bitcoin Up or Down - June 29, 10:30PM-10:35PM ET","name":"imwalkinghere","won":true,"status":"won","stake":138.35,"pnl":74.09,"date":1782792000},{"title":"Bitcoin Up or Down - June 29, 10:40PM-10:45PM ET","name":"imwalkinghere","won":true,"status":"won","stake":155.34,"pnl":116.26,"date":1782792000},{"title":"Netherlands vs. Morocco: Both Teams to Score in Second Half","name":"LSB1","won":true,"status":"won","stake":355.79,"pnl":91.37,"date":1782792000}],"missed":[{"title":"Set Handicap: Bellucci (-2.5) vs Svajda (+2.5)","name":"0x4bFb-whale","won":false,"status":"refund","stake":304.26,"capped":false,"pnl":0.32,"date":1783310400},{"title":"Bellucci vs. Svajda: Set 1 Games O/U 8.5","name":"0x4bFb-whale","won":false,"status":"refund","stake":304.26,"capped":false,"pnl":0.04,"date":1783310400},{"title":"Bellucci vs. Svajda: Set 1 Games O/U 10.5","name":"0x4bFb-whale","won":false,"status":"refund","stake":304.26,"capped":false,"pnl":0.03,"date":1783310400},{"title":"ITF Palma Del Rio: Elena Micic vs Ayla Aksu","name":"fortuneking","won":false,"status":"lost","stake":318.88,"capped":false,"pnl":-320.69,"date":1783137600},{"title":"Bad Homburg Open: Xinyu Wang vs Elina Svitolina","name":"0x4bFb-whale","won":false,"status":"refund","stake":293.8,"capped":false,"pnl":11.78,"date":1782964800},{"title":"Wang vs. Svitolina: Set 1 Games O/U 10.5","name":"0x4bFb-whale","won":false,"status":"refund","stake":293.8,"capped":false,"pnl":0.03,"date":1782964800},{"title":"ITF Zagreb: Dorian Tremblay vs Javier Barranco Cosano","name":"fortuneking","won":true,"status":"won","stake":289.08,"capped":false,"pnl":36.78,"date":1782964800},{"title":"Mallorca Championships: Luciano Darderi vs Nuno Borges","name":"fortuneking","won":true,"status":"won","stake":289.08,"capped":false,"pnl":23.5,"date":1782964800},{"title":"ITF Palma Del Rio: Ayla Aksu vs Celia Cervino Ruiz","name":"fortuneking","won":true,"status":"won","stake":289.08,"capped":false,"pnl":87.35,"date":1782964800},{"title":"Lexus Eastbourne Open: Taylor Fritz vs Jan Choinski","name":"0x4bFb-whale","won":false,"status":"refund","stake":292.31,"capped":false,"pnl":113.48,"date":1782878400},{"title":"Oskar Grzegorzewski vs. Marcel Kamrowski: Total Sets O/U 2.5","name":"ArbTrader","won":false,"status":"refund","stake":298.19,"capped":false,"pnl":0.03,"date":1782878400},{"title":"Grzegorzewski vs. Kamrowski: Match O/U 22.5","name":"ArbTrader","won":false,"status":"refund","stake":124.9,"capped":false,"pnl":0.01,"date":1782878400},{"title":"Set Handicap: Kamrowski (-1.5) vs Grzegorzewski (+1.5)","name":"ArbTrader","won":false,"status":"refund","stake":298.19,"capped":false,"pnl":26.27,"date":1782878400},{"title":"ITF Rzeszow: Oskar Grzegorzewski vs Marcel Kamrowski","name":"ArbTrader","won":false,"status":"refund","stake":298.19,"capped":false,"pnl":0.54,"date":1782878400},{"title":"Set 1 Winner: Grzegorzewski vs Kamrowski","name":"ArbTrader","won":false,"status":"refund","stake":298.19,"capped":false,"pnl":0.03,"date":1782878400},{"title":"Grzegorzewski vs. Kamrowski: Match O/U 23.5","name":"ArbTrader","won":false,"status":"refund","stake":298.19,"capped":false,"pnl":0.03,"date":1782878400},{"title":"Grzegorzewski vs. Kamrowski: Set 1 Games O/U 10.5","name":"ArbTrader","won":false,"status":"refund","stake":298.19,"capped":false,"pnl":0.03,"date":1782878400},{"title":"Grzegorzewski vs. Kamrowski: Set 1 Games O/U 8.5","name":"ArbTrader","won":false,"status":"refund","stake":199.22,"capped":false,"pnl":0.02,"date":1782878400},{"title":"Kuan-Yi Lee vs. Aoran Wang: Total Sets O/U 2.5","name":"ArbTrader","won":false,"status":"refund","stake":298.19,"capped":false,"pnl":0.03,"date":1782878400},{"title":"ITF Wuning: Kuan-Yi Lee vs Aoran Wang","name":"ArbTrader","won":false,"status":"refund","stake":298.19,"capped":false,"pnl":1.26,"date":1782878400},{"title":"Set Handicap: Lee (-1.5) vs Wang (+1.5)","name":"ArbTrader","won":false,"status":"refund","stake":298.19,"capped":false,"pnl":0.26,"date":1782878400},{"title":"Lee vs. Wang: Match O/U 23.5","name":"ArbTrader","won":false,"status":"refund","stake":298.19,"capped":false,"pnl":0.03,"date":1782878400},{"title":"Set Handicap: Hussey (-1.5) vs Fonseca (+1.5)","name":"ArbTrader","won":false,"status":"refund","stake":293.8,"capped":false,"pnl":0.03,"date":1782878400},{"title":"ITF Maanshan: Xi Luo vs Jiayu Xu","name":"ArbTrader","won":false,"status":"lost","stake":282.69,"capped":false,"pnl":-290.74,"date":1782878400},{"title":"Lexus Eastbourne Open: Zeynep Sonmez vs Sara Bejlek","name":"0x4bFb-whale","won":false,"status":"refund","stake":293.8,"capped":false,"pnl":33.61,"date":1782878400},{"title":"Set Handicap: Sonmez (-1.5) vs Bejlek (+1.5)","name":"iohihoo","won":false,"status":"refund","stake":124.23,"capped":false,"pnl":-3.8,"date":1782878400},{"title":"Zeynep Sonmez vs. Sara Bejlek: Total Sets O/U 2.5","name":"iohihoo","won":false,"status":"refund","stake":159.65,"capped":false,"pnl":-3.62,"date":1782878400},{"title":"Set 1 Winner: Sonmez vs Bejlek","name":"iohihoo","won":false,"status":"refund","stake":127.28,"capped":false,"pnl":-2.53,"date":1782878400},{"title":"Sonmez vs. Bejlek: Set 1 Games O/U 10.5","name":"iohihoo","won":false,"status":"refund","stake":112.49,"capped":false,"pnl":-2.84,"date":1782878400},{"title":"Fritz vs. Choinski: Match O/U 23.5","name":"0x4bFb-whale","won":false,"status":"refund","stake":293.8,"capped":false,"pnl":6.09,"date":1782878400},{"title":"Fritz vs. Choinski: Match O/U 21.5","name":"0x4bFb-whale","won":false,"status":"refund","stake":293.8,"capped":false,"pnl":4.07,"date":1782878400},{"title":"ITF Rome: Jaeda Daniel vs Jo-Yee Chan","name":"fortuneking","won":false,"status":"lost","stake":293.8,"capped":false,"pnl":-298.93,"date":1782878400},{"title":"Lexus Eastbourne Open (Doubles): Jurak/Ruzic vs Errani/Paolini","name":"ArbTrader","won":false,"status":"refund","stake":292.31,"capped":false,"pnl":0.03,"date":1782792000},{"title":"ITF Tarvisio: Gabriela Ce vs Pia Lovric","name":"fortuneking","won":true,"status":"won","stake":295.81,"capped":false,"pnl":168.37,"date":1782792000},{"title":"ITF Palma Del Rio: Tiphanie Lemaitre vs Kristina Mladenovic","name":"fortuneking","won":true,"status":"won","stake":293.8,"capped":false,"pnl":48.84,"date":1782792000},{"title":"Piracicaba: Luis Felipe Miguel vs Thiago Seyboth Wild","name":"fortuneking","won":true,"status":"won","stake":289.08,"capped":false,"pnl":44.21,"date":1782792000},{"title":"Will Tesla deliver between 400000 and 425000 vehicles in Q2 2026","name":"iohihoo","won":false,"status":"lost","stake":54.69,"capped":false,"pnl":-55.26,"date":1782792000},{"title":"Lexus Eastbourne Open: Sara Bejlek vs Laura Siegemund","name":"fortuneking","won":false,"status":"lost","stake":292.31,"capped":false,"pnl":-295.25,"date":1782705600},{"title":"Piracicaba: Santiago De La Fuente vs Santiago Rodriguez Taverna","name":"0x4bFb-whale","won":false,"status":"refund","stake":292.31,"capped":false,"pnl":21.88,"date":1782705600},{"title":"Fuente vs. Taverna: Set 1 Games O/U 10.5","name":"0x4bFb-whale","won":false,"status":"refund","stake":292.31,"capped":false,"pnl":10.57,"date":1782705600},{"title":"Austria to score first vs. Algeria?","name":"LSB1","won":true,"status":"won","stake":219.1,"capped":false,"pnl":36.65,"date":1782619200},{"title":"Algeria vs. Austria: Both Teams to Score in First Half","name":"LSB1","won":true,"status":"won","stake":318.88,"capped":false,"pnl":156.37,"date":1782619200},{"title":"Exact Score: Jordan 0 - 3 Argentina?","name":"LSB1","won":true,"status":"won","stake":318.88,"capped":false,"pnl":26.3,"date":1782619200},{"title":"Will Austria win on 2026-06-27?","name":"LSB1","won":false,"status":"lost","stake":318.88,"capped":false,"pnl":-322.01,"date":1782619200},{"title":"Austria to win the second half?","name":"LSB1","won":true,"status":"won","stake":318.88,"capped":false,"pnl":342.47,"date":1782619200},{"title":"Algeria vs. Austria: Austria O/U 2.5","name":"LSB1","won":true,"status":"won","stake":269.85,"capped":false,"pnl":62.47,"date":1782619200},{"title":"Will AC Goianiense win on 2026-06-28?","name":"LSB1","won":true,"status":"won","stake":304.26,"capped":false,"pnl":34.94,"date":1782619200},{"title":"Canada to win the second half?","name":"LSB1","won":true,"status":"won","stake":304.26,"capped":false,"pnl":274.56,"date":1782619200},{"title":"Uruguay vs. Spain: O/U 11.5 Total Corners","name":"fortuneking","won":true,"status":"won","stake":303.61,"capped":false,"pnl":362.73,"date":1782532800},{"title":"Will Crici\u00fama EC win on 2026-06-27?","name":"LSB1","won":true,"status":"won","stake":258.1,"capped":false,"pnl":36.12,"date":1782532800},{"title":"Panama vs. England: O/U 10.5 Total Corners","name":"fortuneking","won":true,"status":"won","stake":318.88,"capped":false,"pnl":310.95,"date":1782532800},{"title":"Croatia vs. Ghana: Both Teams to Score in Second Half","name":"LSB1","won":true,"status":"won","stake":318.88,"capped":false,"pnl":53.01,"date":1782532800},{"title":"Will Croatia win on 2026-06-27?","name":"0x4bFb-whale","won":true,"status":"won","stake":318.88,"capped":false,"pnl":44.62,"date":1782532800},{"title":"Bitcoin Up or Down - June 27, 7:15PM-7:20PM ET","name":"imwalkinghere","won":true,"status":"won","stake":122.42,"capped":false,"pnl":57.48,"date":1782532800},{"title":"DR Congo to score first vs. Uzbekistan?","name":"LSB1","won":true,"status":"won","stake":284.8,"capped":false,"pnl":39.78,"date":1782532800},{"title":"DR Congo vs. Uzbekistan: Both Teams to Score in First Half","name":"LSB1","won":false,"status":"lost","stake":318.88,"capped":false,"pnl":-319.89,"date":1782532800},{"title":"Exact Score: Colombia 0 - 0 Portugal?","name":"LSB1","won":false,"status":"lost","stake":318.88,"capped":false,"pnl":-320.54,"date":1782532800},{"title":"Colombia vs. Portugal: Colombia O/U 0.5","name":"LSB1","won":false,"status":"lost","stake":318.88,"capped":false,"pnl":-322.11,"date":1782532800},{"title":"Yoane Wissa: 2+ goals","name":"LSB1","won":true,"status":"won","stake":318.88,"capped":false,"pnl":53.87,"date":1782532800},{"title":"Counter-Strike: Vasco Esports vs Isurus (BO3) - Thunderpick World Championship South American Series #1 Group A","name":"ArbTrader","won":false,"status":"refund","stake":289.08,"capped":false,"pnl":0.03,"date":1782446400}],"missed_pnl":2698.96} \ No newline at end of file +{"started":1780816086.146482,"updated":1783408086.1476119,"days":30,"bank":1000.0,"stake":507.67,"stake_pct":0.04,"class_pct":{"volume":0.04,"whale":0.12},"event_cap":0,"hwm":12691.86,"dd_threshold":0.8,"capped_count":0,"max_entry":0.95,"fee_rate":0.03,"slip":0.005,"lag_est_s":90,"fees_paid":858.77,"equity":12729.6,"liquid":12357.99,"invested":371.61,"reserve":0.0,"realized":11691.86,"pnl":11729.6,"unreal":37.74,"resolved_count":396,"wins":226,"losses":55,"refunds":84,"sold":31,"open_count":1,"missed_count":253,"wallets":[{"name":"Kruto2027","wallet":"0xe8ca3f758c93f44f3ec210542ab78afb7c0bcccb","bets":24,"won":16,"lost":5,"ref":0,"sold":2,"class":"volume","invested":371.61,"realized":1088.64,"conv_thr":108},{"name":"fortuneking","wallet":"0x86c878cde72660ec52f5e6f0f0438b76de8fc867","bets":51,"won":31,"lost":16,"ref":0,"sold":4,"class":"volume","invested":0.0,"realized":-189.15,"conv_thr":892},{"name":"LSB1","wallet":"0x41558102a796ba971c7567cad41c307e59f8fa41","bets":116,"won":96,"lost":8,"ref":0,"sold":12,"class":"volume","invested":0.0,"realized":5384.73,"conv_thr":200},{"name":"imwalkinghere","wallet":"0xd96750bf8d941a8186e592b0ae6e096da66aa266","bets":101,"won":77,"lost":24,"ref":0,"sold":0,"class":"volume","invested":0.0,"realized":4320.41,"conv_thr":98},{"name":"iohihoo","wallet":"0xfc81760d44a21acc9fd4b749a5bf9a9b2eeae072","bets":19,"won":5,"lost":2,"ref":10,"sold":2,"class":"volume","invested":0.0,"realized":-82.87,"conv_thr":55},{"name":"Stavenson","wallet":"0xf5fe759cece500f58a431ef8dacea321f6e3e23d","bets":4,"won":0,"lost":0,"ref":1,"sold":3,"class":"volume","invested":0.0,"realized":145.95,"conv_thr":5103},{"name":"0x4bFb-whale","wallet":"0x73afc8160c17830c0c7281a7bf570c871455b880","bets":19,"won":0,"lost":0,"ref":17,"sold":2,"class":"volume","invested":0.0,"realized":430.62,"conv_thr":1089},{"name":"ArbTrader","wallet":"0x72e1597864456eda62878413cf3e60c332e4a45d","bets":63,"won":1,"lost":0,"ref":56,"sold":6,"class":"volume","invested":0.0,"realized":593.54,"conv_thr":98}],"current":[{"title":"Map 3 Total Rounds: Over/Under 19.5","name":"Kruto2027","outcome":"Over","stake":329.16,"val":371.61,"pnl":37.74,"end":"2026-07-07"}],"resolved":[{"title":"Exact Score: Any Other Score?","name":"LSB1","won":null,"status":"sold","stake":459.49,"pnl":502.5,"date":1783390478},{"title":"United States to score first vs. Belgium?","name":"LSB1","won":null,"status":"sold","stake":459.49,"pnl":58.17,"date":1783390477},{"title":"United States vs. Belgium: United States 1st Half O/U 0.5","name":"LSB1","won":null,"status":"sold","stake":217.48,"pnl":74.3,"date":1783390471},{"title":"United States vs. Belgium: 1st Half O/U 2.5","name":"LSB1","won":null,"status":"sold","stake":264.43,"pnl":50.35,"date":1783390471},{"title":"Will Belgium win on 2026-07-06?","name":"LSB1","won":null,"status":"sold","stake":459.49,"pnl":231.79,"date":1783390468},{"title":"Belgium leading at halftime?","name":"LSB1","won":null,"status":"sold","stake":224.25,"pnl":63.09,"date":1783390447},{"title":"United States vs. Belgium: Team to Advance","name":"LSB1","won":null,"status":"sold","stake":459.49,"pnl":168.0,"date":1783390348},{"title":"Exact Score: United States 2 - 1 Belgium?","name":"LSB1","won":null,"status":"sold","stake":459.49,"pnl":23.13,"date":1783390280},{"title":"Exact Score: United States 1 - 2 Belgium?","name":"LSB1","won":null,"status":"sold","stake":459.49,"pnl":33.36,"date":1783390258},{"title":"Portugal vs. Spain: Will the Match Go to Extra Time?","name":"LSB1","won":null,"status":"sold","stake":445.24,"pnl":356.14,"date":1783372988},{"title":"Wimbledon ATP: Luca Van Assche vs Marton Fucsovics","name":"fortuneking","won":true,"status":"won","stake":321.8,"pnl":87.9,"date":1783310400},{"title":"Wimbledon ATP: Camilo Ugo Carabelli vs Daniel Merida Aguilar","name":"fortuneking","won":false,"status":"lost","stake":315.05,"pnl":-319.76,"date":1783310400},{"title":"ITF Nivelles: Eric Vanshelboim vs Niklas Schell","name":"ArbTrader","won":false,"status":"refund","stake":314.79,"pnl":34.59,"date":1783310400},{"title":"ITF Nivelles: Kimmer Coppejans vs Louis Wessels","name":"ArbTrader","won":false,"status":"refund","stake":314.79,"pnl":112.06,"date":1783310400},{"title":"Wimbledon ATP: Alejandro Davidovich Fokina vs Juan Manuel Cerundolo","name":"fortuneking","won":true,"status":"won","stake":315.62,"pnl":32.42,"date":1783310400},{"title":"Quito: Mwendwa Mbithi vs Matias Soto","name":"fortuneking","won":false,"status":"lost","stake":361.4,"pnl":-366.36,"date":1783310400},{"title":"Wimbledon ATP: Vit Kopriva vs Jan Choinski","name":"fortuneking","won":false,"status":"lost","stake":385.99,"pnl":-394.19,"date":1783310400},{"title":"BK Hacken vs. Djurgardens IF: O/U 5.5","name":"LSB1","won":true,"status":"won","stake":441.81,"pnl":85.65,"date":1783310400},{"title":"England to score first vs. Mexico?","name":"LSB1","won":null,"status":"sold","stake":463.53,"pnl":128.76,"date":1783308220},{"title":"Mexico vs. England: Both Teams to Score in First Half","name":"LSB1","won":null,"status":"sold","stake":463.53,"pnl":141.83,"date":1783307888},{"title":"ITF Rome: Amelia Honer vs Ayana Akli","name":"fortuneking","won":false,"status":"lost","stake":325.18,"pnl":-329.15,"date":1783224000},{"title":"IFK Goteborg vs. AIK: 1st Half O/U 0.5","name":"LSB1","won":true,"status":"won","stake":201.22,"pnl":18.28,"date":1783224000},{"title":"Will US Yacoub El Mansour win on 2026-07-05?","name":"LSB1","won":true,"status":"won","stake":457.7,"pnl":76.13,"date":1783224000},{"title":"Exact Score: Brazil 0 - 0 Norway?","name":"LSB1","won":true,"status":"won","stake":460.75,"pnl":69.47,"date":1783224000},{"title":"Washington Spirit vs. Houston Dash: 2nd Half O/U 1.5","name":"Kruto2027","won":true,"status":"won","stake":126.02,"pnl":200.09,"date":1783137600},{"title":"Exact Score: Daejeon Hana Citizen FC 0 - 1 Bucheon FC 1995?","name":"LSB1","won":true,"status":"won","stake":463.89,"pnl":44.34,"date":1783137600},{"title":"Degerfors IF vs. Malmo FF: O/U 0.5","name":"LSB1","won":true,"status":"won","stake":465.66,"pnl":28.15,"date":1783137600},{"title":"Exact Score: Canada 0 - 2 Morocco?","name":"LSB1","won":true,"status":"won","stake":466.79,"pnl":83.74,"date":1783137600},{"title":"Washington Spirit vs. Houston Dash: Washington Spirit 2nd Half O/U 0.5","name":"Kruto2027","won":null,"status":"sold","stake":160.65,"pnl":41.47,"date":1783120436},{"title":"Wimbledon ATP (Doubles): Krawietz/Puetz vs Bergs/Blockx","name":"iohihoo","won":null,"status":"sold","stake":112.97,"pnl":-4.62,"date":1783106237},{"title":"ITF Taipei: Priska Madelyn Nugroho vs Dayeon Back","name":"fortuneking","won":true,"status":"won","stake":323.92,"pnl":187.69,"date":1783051200},{"title":"Lexus Eastbourne Open: Zizou Bergs vs Toby Samuel","name":"fortuneking","won":false,"status":"lost","stake":323.92,"pnl":-326.51,"date":1783051200},{"title":"Exact Score: Australia 1 - 0 Egypt?","name":"LSB1","won":true,"status":"won","stake":471.62,"pnl":32.56,"date":1783051200},{"title":"Argentina vs. Cabo Verde: Will the Match Go to a Penalty Shootout?","name":"LSB1","won":false,"status":"lost","stake":454.18,"pnl":-462.92,"date":1783051200},{"title":"ITF Elvas: Elena Micic vs Han Shi","name":"fortuneking","won":null,"status":"sold","stake":503.42,"pnl":-512.81,"date":1783025933},{"title":"ITF Skopje: Nikola Kolyachev vs Vladyslav Orlov","name":"fortuneking","won":null,"status":"sold","stake":467.06,"pnl":207.72,"date":1783020142},{"title":"ITF Ajaccio: Robin Catry vs Clement Lemire","name":"fortuneking","won":null,"status":"sold","stake":467.06,"pnl":310.06,"date":1783010944},{"title":"Cary: Rei Sakamoto vs Timo Legout","name":"fortuneking","won":null,"status":"sold","stake":467.06,"pnl":397.84,"date":1783004962},{"title":"Set Handicap: Liutarevich/Reyes (-1.5) vs Bonzi/Rinderknech (+1.5)","name":"ArbTrader","won":null,"status":"sold","stake":467.72,"pnl":-9.45,"date":1782995543},{"title":"Wimbledon ATP (Doubles): Liutarevich/Reyes vs Bonzi/Rinderknech","name":"iohihoo","won":null,"status":"sold","stake":150.0,"pnl":-7.1,"date":1782995543},{"title":"Vujic vs. Piatti: Match O/U 21.5","name":"ArbTrader","won":null,"status":"sold","stake":459.82,"pnl":-9.29,"date":1782982349},{"title":"Set Handicap: Piatti (-1.5) vs Vujic (+1.5)","name":"ArbTrader","won":null,"status":"sold","stake":288.95,"pnl":-5.84,"date":1782981905},{"title":"Set 1 Winner: Vujic vs Piatti","name":"ArbTrader","won":null,"status":"sold","stake":110.2,"pnl":-2.23,"date":1782981905},{"title":"Vujic vs. Piatti: Set 1 Games O/U 10.5","name":"ArbTrader","won":null,"status":"sold","stake":170.64,"pnl":-3.45,"date":1782981905},{"title":"ITF Hillcrest: Stefan Vujic vs Rocco Piatti","name":"ArbTrader","won":null,"status":"sold","stake":267.42,"pnl":-5.4,"date":1782981679},{"title":"United States leading at halftime?","name":"LSB1","won":true,"status":"won","stake":443.19,"pnl":529.49,"date":1782964800},{"title":"Bitcoin Up or Down - July 2, 1:10AM-1:15AM ET","name":"imwalkinghere","won":true,"status":"won","stake":237.67,"pnl":110.08,"date":1782964800},{"title":"Counter-Strike: Atreides vs Subtop De France (BO3) - CCT Europe Challengers Series Playoffs","name":"ArbTrader","won":false,"status":"refund","stake":467.06,"pnl":0.05,"date":1782964800},{"title":"Will COD Mekn\u00e8s win on 2026-07-02?","name":"LSB1","won":true,"status":"won","stake":495.38,"pnl":201.0,"date":1782964800},{"title":"Portugal to score first vs. Croatia?","name":"LSB1","won":true,"status":"won","stake":491.22,"pnl":62.55,"date":1782964800},{"title":"Exact Score: Portugal 1 - 1 Croatia?","name":"LSB1","won":true,"status":"won","stake":493.72,"pnl":73.46,"date":1782964800},{"title":"Exact Score: Portugal 1 - 2 Croatia?","name":"LSB1","won":true,"status":"won","stake":284.98,"pnl":13.12,"date":1782964800},{"title":"Exact Score: Portugal 2 - 1 Croatia?","name":"LSB1","won":false,"status":"lost","stake":497.18,"pnl":-500.13,"date":1782964800},{"title":"Lexus Eastbourne Open: Taylor Fritz vs Jan Choinski","name":"0x4bFb-whale","won":false,"status":"refund","stake":315.01,"pnl":122.3,"date":1782878400},{"title":"Bitcoin Up or Down - June 30, 7:55PM-8:00PM ET","name":"imwalkinghere","won":true,"status":"won","stake":300.0,"pnl":213.63,"date":1782878400},{"title":"Ecuador to score first vs. Mexico?","name":"LSB1","won":true,"status":"won","stake":402.57,"pnl":51.22,"date":1782878400},{"title":"Juli\u00e1n Qui\u00f1ones: 1+ goals","name":"LSB1","won":true,"status":"won","stake":345.87,"pnl":122.74,"date":1782878400},{"title":"Exact Score: Mexico 1 - 1 Ecuador?","name":"LSB1","won":true,"status":"won","stake":402.57,"pnl":66.93,"date":1782878400},{"title":"England vs. DR Congo: DR Congo 1st Half O/U 0.5","name":"LSB1","won":true,"status":"won","stake":273.14,"pnl":50.92,"date":1782878400},{"title":"England vs. DR Congo: DR Congo O/U 0.5","name":"LSB1","won":true,"status":"won","stake":427.68,"pnl":219.29,"date":1782878400}],"missed":[{"title":"Set Handicap: Bellucci (-2.5) vs Svajda (+2.5)","name":"0x4bFb-whale","won":null,"status":"sold","stake":325.18,"capped":false,"pnl":-6.27,"date":1782733573},{"title":"Bellucci vs. Svajda: Set 1 Games O/U 8.5","name":"0x4bFb-whale","won":null,"status":"sold","stake":325.18,"capped":false,"pnl":-6.56,"date":1782741739},{"title":"Bellucci vs. Svajda: Set 1 Games O/U 10.5","name":"0x4bFb-whale","won":false,"status":"refund","stake":325.18,"capped":false,"pnl":0.03,"date":1783310400},{"title":"ITF Palma Del Rio: Elena Micic vs Ayla Aksu","name":"fortuneking","won":false,"status":"lost","stake":339.76,"capped":false,"pnl":-341.69,"date":1783137600},{"title":"Bad Homburg Open: Xinyu Wang vs Elina Svitolina","name":"0x4bFb-whale","won":false,"status":"refund","stake":314.11,"capped":false,"pnl":12.6,"date":1782964800},{"title":"Wang vs. Svitolina: Set 1 Games O/U 10.5","name":"0x4bFb-whale","won":false,"status":"refund","stake":314.11,"capped":false,"pnl":0.03,"date":1782964800},{"title":"ITF Zagreb: Dorian Tremblay vs Javier Barranco Cosano","name":"fortuneking","won":true,"status":"won","stake":309.39,"capped":false,"pnl":39.37,"date":1782964800},{"title":"Mallorca Championships: Luciano Darderi vs Nuno Borges","name":"fortuneking","won":true,"status":"won","stake":309.39,"capped":false,"pnl":25.15,"date":1782964800},{"title":"ITF Palma Del Rio: Ayla Aksu vs Celia Cervino Ruiz","name":"fortuneking","won":true,"status":"won","stake":309.39,"capped":false,"pnl":93.49,"date":1782964800},{"title":"Oskar Grzegorzewski vs. Marcel Kamrowski: Total Sets O/U 2.5","name":"ArbTrader","won":false,"status":"refund","stake":318.5,"capped":false,"pnl":0.03,"date":1782878400},{"title":"Grzegorzewski vs. Kamrowski: Match O/U 22.5","name":"ArbTrader","won":false,"status":"refund","stake":124.9,"capped":false,"pnl":0.01,"date":1782878400},{"title":"ITF Rzeszow: Oskar Grzegorzewski vs Marcel Kamrowski","name":"ArbTrader","won":false,"status":"refund","stake":318.5,"capped":false,"pnl":0.58,"date":1782878400},{"title":"Set Handicap: Kamrowski (-1.5) vs Grzegorzewski (+1.5)","name":"ArbTrader","won":false,"status":"refund","stake":318.5,"capped":false,"pnl":28.06,"date":1782878400},{"title":"Set 1 Winner: Grzegorzewski vs Kamrowski","name":"ArbTrader","won":false,"status":"refund","stake":318.5,"capped":false,"pnl":0.03,"date":1782878400},{"title":"Grzegorzewski vs. Kamrowski: Match O/U 23.5","name":"ArbTrader","won":false,"status":"refund","stake":318.5,"capped":false,"pnl":0.03,"date":1782878400},{"title":"Grzegorzewski vs. Kamrowski: Set 1 Games O/U 10.5","name":"ArbTrader","won":false,"status":"refund","stake":318.5,"capped":false,"pnl":0.03,"date":1782878400},{"title":"Grzegorzewski vs. Kamrowski: Set 1 Games O/U 8.5","name":"ArbTrader","won":false,"status":"refund","stake":199.22,"capped":false,"pnl":0.02,"date":1782878400},{"title":"Kuan-Yi Lee vs. Aoran Wang: Total Sets O/U 2.5","name":"ArbTrader","won":false,"status":"refund","stake":318.5,"capped":false,"pnl":0.03,"date":1782878400},{"title":"ITF Wuning: Kuan-Yi Lee vs Aoran Wang","name":"ArbTrader","won":false,"status":"refund","stake":318.5,"capped":false,"pnl":1.34,"date":1782878400},{"title":"Set Handicap: Lee (-1.5) vs Wang (+1.5)","name":"ArbTrader","won":false,"status":"refund","stake":318.5,"capped":false,"pnl":0.28,"date":1782878400},{"title":"Lee vs. Wang: Match O/U 23.5","name":"ArbTrader","won":false,"status":"refund","stake":318.5,"capped":false,"pnl":0.03,"date":1782878400},{"title":"Set Handicap: Hussey (-1.5) vs Fonseca (+1.5)","name":"ArbTrader","won":false,"status":"refund","stake":314.11,"capped":false,"pnl":0.03,"date":1782878400},{"title":"ITF Maanshan: Xi Luo vs Jiayu Xu","name":"ArbTrader","won":false,"status":"lost","stake":282.69,"capped":false,"pnl":-290.74,"date":1782878400},{"title":"Lexus Eastbourne Open: Zeynep Sonmez vs Sara Bejlek","name":"0x4bFb-whale","won":false,"status":"refund","stake":314.11,"capped":false,"pnl":35.94,"date":1782878400},{"title":"Set Handicap: Sonmez (-1.5) vs Bejlek (+1.5)","name":"iohihoo","won":null,"status":"sold","stake":124.23,"capped":false,"pnl":-6.24,"date":1782310436},{"title":"Zeynep Sonmez vs. Sara Bejlek: Total Sets O/U 2.5","name":"iohihoo","won":null,"status":"sold","stake":159.65,"capped":false,"pnl":-6.78,"date":1782311540},{"title":"Set 1 Winner: Sonmez vs Bejlek","name":"iohihoo","won":null,"status":"sold","stake":127.28,"capped":false,"pnl":-5.07,"date":1782328228},{"title":"Sonmez vs. Bejlek: Set 1 Games O/U 10.5","name":"iohihoo","won":null,"status":"sold","stake":112.49,"capped":false,"pnl":-5.07,"date":1782310591},{"title":"Fritz vs. Choinski: Match O/U 21.5","name":"0x4bFb-whale","won":false,"status":"refund","stake":314.11,"capped":false,"pnl":4.35,"date":1782878400},{"title":"Fritz vs. Choinski: Match O/U 23.5","name":"0x4bFb-whale","won":false,"status":"refund","stake":314.11,"capped":false,"pnl":6.51,"date":1782878400},{"title":"ITF Rome: Jaeda Daniel vs Jo-Yee Chan","name":"fortuneking","won":false,"status":"lost","stake":314.11,"capped":false,"pnl":-319.6,"date":1782878400},{"title":"Lexus Eastbourne Open (Doubles): Jurak/Ruzic vs Errani/Paolini","name":"ArbTrader","won":false,"status":"refund","stake":315.01,"capped":false,"pnl":0.03,"date":1782792000},{"title":"ITF Palma Del Rio: Polina Isakova vs Anna Kubareva","name":"fortuneking","won":true,"status":"won","stake":318.5,"capped":false,"pnl":45.35,"date":1782792000},{"title":"ITF Palma Del Rio: Tiphanie Lemaitre vs Kristina Mladenovic","name":"fortuneking","won":true,"status":"won","stake":314.11,"capped":false,"pnl":52.22,"date":1782792000},{"title":"Piracicaba: Luis Felipe Miguel vs Thiago Seyboth Wild","name":"fortuneking","won":true,"status":"won","stake":309.39,"capped":false,"pnl":47.32,"date":1782792000},{"title":"Will Tesla deliver 475000 or more vehicles in Q2 2026","name":"iohihoo","won":false,"status":"lost","stake":180.0,"capped":false,"pnl":-180.48,"date":1782792000},{"title":"Piracicaba: Santiago De La Fuente vs Santiago Rodriguez Taverna","name":"0x4bFb-whale","won":false,"status":"refund","stake":315.01,"capped":false,"pnl":23.57,"date":1782705600},{"title":"Fuente vs. Taverna: Set 1 Games O/U 10.5","name":"0x4bFb-whale","won":false,"status":"refund","stake":315.01,"capped":false,"pnl":11.39,"date":1782705600},{"title":"Austria to score first vs. Algeria?","name":"LSB1","won":true,"status":"won","stake":219.1,"capped":false,"pnl":36.65,"date":1782619200},{"title":"Algeria vs. Austria: Both Teams to Score in First Half","name":"LSB1","won":true,"status":"won","stake":339.76,"capped":false,"pnl":166.61,"date":1782619200},{"title":"Exact Score: Jordan 0 - 3 Argentina?","name":"LSB1","won":true,"status":"won","stake":339.76,"capped":false,"pnl":28.02,"date":1782619200},{"title":"Will Austria win on 2026-06-27?","name":"LSB1","won":false,"status":"lost","stake":339.76,"capped":false,"pnl":-343.09,"date":1782619200},{"title":"Austria to win the second half?","name":"LSB1","won":true,"status":"won","stake":339.76,"capped":false,"pnl":364.89,"date":1782619200},{"title":"Algeria vs. Austria: Austria O/U 2.5","name":"LSB1","won":true,"status":"won","stake":269.85,"capped":false,"pnl":62.47,"date":1782619200},{"title":"Will AC Goianiense win on 2026-06-28?","name":"LSB1","won":true,"status":"won","stake":325.18,"capped":false,"pnl":37.34,"date":1782619200},{"title":"Canada to win the second half?","name":"LSB1","won":true,"status":"won","stake":325.18,"capped":false,"pnl":293.44,"date":1782619200},{"title":"Uruguay vs. Spain: O/U 11.5 Total Corners","name":"fortuneking","won":true,"status":"won","stake":323.92,"capped":false,"pnl":387.0,"date":1782532800},{"title":"Will Crici\u00fama EC win on 2026-06-27?","name":"LSB1","won":true,"status":"won","stake":258.1,"capped":false,"pnl":36.12,"date":1782532800},{"title":"Panama vs. England: O/U 10.5 Total Corners","name":"fortuneking","won":true,"status":"won","stake":339.76,"capped":false,"pnl":331.31,"date":1782532800},{"title":"Croatia vs. Ghana: Both Teams to Score in Second Half","name":"LSB1","won":true,"status":"won","stake":339.76,"capped":false,"pnl":56.48,"date":1782532800},{"title":"Will Croatia win on 2026-06-27?","name":"0x4bFb-whale","won":true,"status":"won","stake":339.76,"capped":false,"pnl":47.55,"date":1782532800},{"title":"Bitcoin Up or Down - June 27, 7:15PM-7:20PM ET","name":"imwalkinghere","won":true,"status":"won","stake":122.42,"capped":false,"pnl":57.48,"date":1782532800},{"title":"DR Congo to score first vs. Uzbekistan?","name":"LSB1","won":true,"status":"won","stake":284.8,"capped":false,"pnl":39.78,"date":1782532800},{"title":"DR Congo vs. Uzbekistan: Both Teams to Score in First Half","name":"LSB1","won":false,"status":"lost","stake":339.76,"capped":false,"pnl":-340.84,"date":1782532800},{"title":"Exact Score: Colombia 0 - 0 Portugal?","name":"LSB1","won":false,"status":"lost","stake":339.76,"capped":false,"pnl":-341.52,"date":1782532800},{"title":"Colombia vs. Portugal: Colombia O/U 0.5","name":"LSB1","won":false,"status":"lost","stake":339.76,"capped":false,"pnl":-343.2,"date":1782532800},{"title":"Yoane Wissa: 2+ goals","name":"LSB1","won":true,"status":"won","stake":339.76,"capped":false,"pnl":57.4,"date":1782532800},{"title":"Counter-Strike: Vasco Esports vs Isurus (BO3) - Thunderpick World Championship South American Series #1 Group A","name":"ArbTrader","won":false,"status":"refund","stake":309.39,"capped":false,"pnl":0.03,"date":1782446400},{"title":"Paraguay vs. Australia: Australia O/U 2.5 Corners","name":"Kruto2027","won":true,"status":"won","stake":214.59,"capped":false,"pnl":203.98,"date":1782446400},{"title":"T\u00fcrkiye vs. United States: T\u00fcrkiye 1st Half O/U 1.5","name":"LSB1","won":true,"status":"won","stake":309.39,"capped":false,"pnl":51.43,"date":1782446400}],"missed_pnl":2171.68} \ No newline at end of file diff --git a/live/portfolio.py b/live/portfolio.py index 80e4612c..dd5cf14f 100644 --- a/live/portfolio.py +++ b/live/portfolio.py @@ -10,8 +10,14 @@ RECYCLES correctly (cash frees at the true resolution moment). Output -> portfol which the dashboard reads in one request. Model: a $1,000 account that mirrors each followed wallet's CONVICTION bets (top-20% -stake), held to resolution (the cache has no sell events, which is the right model for -the hold-to-resolution wallets we follow). Sizing is DYNAMIC — each bet stakes PCT of +stake). Exits MIRROR the signal, like the live bot (2026-07-07): when the wallet +fully closed a position pre-resolution, the replay sells there too — close time from +/closed-positions, exit price reconstructed as avgPrice + realizedPnl/totalBought, +exit taker fee + slippage haircut paid, status SOLD. Bets they held to resolution +settle at the chain-truth payout (1/0/0.5 — refunds are scratches, not losses). +Complete in-window round trips on still-unresolved markets are replayed as +entry+exit (the old hold-to-resolution model missed them entirely). Sizing is +DYNAMIC — each bet stakes PCT of current equity (Kelly-style compounding), halved in a >20% drawdown, capped at EVENT_CAP concurrent bets per real-world event — and entries pay the Polymarket taker fee plus a lag-slippage price haircut (FEE_RATE / SLIP / LAG_EST_S), so the book @@ -189,16 +195,46 @@ def window_bets(): thr = cache.conv_cutoff(pre if pre else [size for *_, size in best.values()]) _WALLET_THR[w["wallet"]] = thr + # the wallet's fully-closed positions: close time + reconstructed exit + # price. The live bot MIRRORS exits, so the replay must too — a bet the + # signal sold pre-resolution exits the book right there (status SOLD), + # not at resolution (the old hold-to-resolution ceiling). + closed = closed_positions(w["wallet"]) for cond, (asset, won, p, res_t, size) in best.items(): if size < thr or p > MAX_ENTRY: continue et = ent.get(cond) if not et or et < START: # only in-window entries continue + b = {"wallet": w["wallet"], "name": w["name"], "cond": cond, + "asset": asset, "cls": w.get("class", "volume"), + "their": size, "entry_t": et, "p": p, "won": won, + "res_t": res_t or 0} + cx = closed.get(asset) + if cx and res_t and cx["ts"] < res_t - 300: # sold BEFORE resolution + b["exit_t"], b["exit_p"] = cx["ts"], cx["exit_p"] + out.append(b) + # complete round trips the cache can't see: entered AND fully exited + # in-window on a market that never resolved (or hasn't yet) — the live + # bot would have copied both legs, so the replay does too + for asset, cx in closed.items(): + cond = cx["cond"] + if (cond in best or not cond or cx["ts"] < START + or (cx["iv"] or 0) < thr or cx["p"] > MAX_ENTRY): + continue + et = ent.get(cond) + if not et or et < START: + continue + if payouts.truth(cond) is not None: + continue # resolved on-chain: their close may be a redeem, + # not a sell — the cache row will cover it + best[cond] = None # one per market, same as everywhere out.append({"wallet": w["wallet"], "name": w["name"], "cond": cond, "asset": asset, "cls": w.get("class", "volume"), - "their": size, "entry_t": et, "p": p, "won": won, - "res_t": res_t or 0}) + "their": cx["iv"], "entry_t": et, "p": cx["p"], + "won": None, "res_t": 0, + "exit_t": cx["ts"], "exit_p": cx["exit_p"], + "title": cx["title"]}) # chain-truth payouts for the replayed markets: refunds pay 0.5/share, and # a cache `won` mark can be wrong on operator-resolved markets — the # replay must settle at what a redeem actually pays (see payouts.py) @@ -208,6 +244,36 @@ def window_bets(): return out +def closed_positions(wallet, max_rows=4000): + """{asset: {ts, exit_p, p, iv, cond, title, outcome}} for the wallet's + FULLY-CLOSED positions with an in-window close time. `ts` is the close + (sell/redeem) timestamp — the same field the cache stores as sell-time. + Exit price is reconstructed from realized P&L over shares bought: + exit_p = avgPrice + realizedPnl / totalBought + (exact for a full single-price exit, share-weighted otherwise). Beyond + max_rows of history the wallet's older exits fall back to hold-to- + resolution — a data-horizon ceiling, counted honest by construction.""" + out = {} + for off in range(0, max_rows, 500): + page = sm.get_json("/closed-positions", + {"user": wallet, "limit": 500, "offset": off, + "sortBy": "TIMESTAMP", "sortDirection": "DESC"}) or [] + for r in page: + ts = r.get("timestamp") or 0 + tb = r.get("totalBought") or 0 + avg = r.get("avgPrice") or 0 + if not (r.get("asset") and ts and tb and avg): + continue + exit_p = max(0.001, min(0.999, avg + (r.get("realizedPnl") or 0) / tb)) + out.setdefault(r["asset"], { + "ts": ts, "exit_p": exit_p, "p": max(0.001, min(0.999, avg)), + "iv": r.get("initialValue") or avg * tb, "cond": r.get("conditionId"), + "title": r.get("title") or "", "outcome": r.get("outcome") or ""}) + if len(page) < 500 or (page and (page[-1].get("timestamp") or 0) < START): + break + return out + + def open_bets(): """Currently-held conviction positions (live /positions pull, small) for the 'current bets' panel — the cache only has resolved bets.""" @@ -285,7 +351,8 @@ def main(): reserve = 0.0 held = [] # (free_t, cost, payoff) cost = stake + entry fee; payoff paid at free_t perW = {w["wallet"]: {"name": w["name"], "wallet": w["wallet"], "bets": 0, - "won": 0, "lost": 0, "ref": 0, "class": w.get("class", "volume"), + "won": 0, "lost": 0, "ref": 0, "sold": 0, + "class": w.get("class", "volume"), "invested": 0.0, "realized": 0.0} for w in WALLETS} resolved, current, missed = [], [], [] @@ -309,13 +376,18 @@ def main(): for ft, cost, payoff, rec in held: if ft and ft <= upto and rec["kind"] == "res": cash += payoff; realized += payoff - cost; perW[rec["wallet"]]["realized"] += payoff - cost - wp = rec.get("wp") - won = rec["won"] if wp is None else wp > 0.5 - # refunds are scratches, not losses — count them apart - perW[rec["wallet"]]["won" if won else "ref" if wp == 0.5 else "lost"] += 1 - rec["won"] = won # truth-adjusted for the feed - if wp == 0.5: - rec["refund"] = True + if rec.get("sold"): + # mirrored exit: neither won nor lost — its truth is the price + perW[rec["wallet"]]["sold"] = perW[rec["wallet"]].get("sold", 0) + 1 + rec["won"] = None + else: + wp = rec.get("wp") + won = rec["won"] if wp is None else wp > 0.5 + # refunds are scratches, not losses — count them apart + perW[rec["wallet"]]["won" if won else "ref" if wp == 0.5 else "lost"] += 1 + rec["won"] = won # truth-adjusted for the feed + if wp == 0.5: + rec["refund"] = True rec["pnl"] = payoff - cost resolved.append(rec) else: @@ -339,12 +411,22 @@ def main(): cash -= cost; fees_paid += fee; perW[b["wallet"]]["bets"] += 1 shares = stake / p_eff # lag-adjusted entry price if b["kind"] == "res": - # chain-truth payout (1/0/0.5) when known, else the cache mark - wp = b.get("wp") - if wp is None: - wp = 1.0 if b["won"] else 0.0 - payoff = shares * wp # redeem is fee-free - held.append((b["res_t"] or now, cost, payoff, b)) + if b.get("exit_t"): + # the signal SOLD pre-resolution -> mirror the exit, like the + # live bot: their exit price with the slippage haircut against + # us, minus the taker fee (sells pay it; redeems don't) + xp = max(0.001, b["exit_p"] * (1 - SLIP)) + fee_out = shares * FEE_RATE * xp * (1 - xp) + fees_paid += fee_out + b["sold"] = True + held.append((b["exit_t"], cost, shares * xp - fee_out, b)) + else: + # held to resolution: chain-truth payout (1/0/0.5) when + # known, else the cache mark; redeem is fee-free + wp = b.get("wp") + if wp is None: + wp = 1.0 if b["won"] else 0.0 + held.append((b["res_t"] or now, cost, shares * wp, b)) else: # currently open -> mark to market, no free yet held.append((None, cost, 0.0, b)) b["val"] = shares * b["cur"] @@ -362,9 +444,11 @@ def main(): current.append(rec) # enrich resolved + missed with titles, keep most-recent 60 - resolved.sort(key=lambda r: r.get("res_t") or 0, reverse=True) + resolved.sort(key=lambda r: r.get("exit_t") or r.get("res_t") or 0, reverse=True) for r in resolved[:60]: - m = market_meta(r["cond"]); r["title"] = m["title"] + m = market_meta(r["cond"]) + if m["title"]: # round-trip recs already carry a title + r["title"] = m["title"] # hypothetical P&L had we been able to afford it — same fee + lag model as the # placed bets: resolved bets at their outcome, still-open bets marked to the # current price. Missed bets can be kind=="open" (no "won"/"res_t" keys) — @@ -373,11 +457,15 @@ def main(): def hypo_pnl(m): stake = m.get("stake") or STAKE_MIN p_eff, fee, cost = entry_model(m["p"], stake) + shares = stake / p_eff + if m.get("exit_t"): # would have mirrored their exit + xp = max(0.001, m["exit_p"] * (1 - SLIP)) + return shares * xp - shares * FEE_RATE * xp * (1 - xp) - cost if "won" in m: wp = m.get("wp") if wp is None: wp = 1.0 if m["won"] else 0.0 - return (stake / p_eff) * wp - cost + return shares * wp - cost return stake * (m.get("cur", p_eff) / p_eff) - cost missed.sort(key=lambda m: m.get("res_t") or 0, reverse=True) @@ -386,6 +474,7 @@ def main(): m["pnl"] = hypo_pnl(m) wins = sum(1 for r in resolved if r.get("won")) refunds = sum(1 for r in resolved if r.get("refund")) + solds = sum(1 for r in resolved if r.get("sold")) # per-wallet conviction threshold (cache p80) so the dashboard can filter LIVE open # positions the same way; 1e12 = "no sized bets" (nothing qualifies) conv_thr = {} @@ -410,11 +499,12 @@ def main(): "realized": round(realized, 2), "pnl": round(equity - BANK, 2), "unreal": round(invested - open_cost, 2), "resolved_count": len(resolved), "wins": wins, - "losses": len(resolved) - wins - refunds, "refunds": refunds, + "losses": len(resolved) - wins - refunds - solds, + "refunds": refunds, "sold": solds, "open_count": len(current), "missed_count": len(missed), "wallets": [{"name": v["name"], "wallet": v["wallet"], "bets": v["bets"], "won": v["won"], "lost": v["lost"], "ref": v.get("ref", 0), - "class": v.get("class", "volume"), + "sold": v.get("sold", 0), "class": v.get("class", "volume"), "invested": round(v["invested"], 2), "realized": round(v["realized"], 2), "conv_thr": conv_thr.get(v["wallet"], 1e12)} for v in perW.values()], @@ -423,23 +513,25 @@ def main(): "end": c.get("end")} for c in sorted(current, key=lambda c: c["entry_t"])], # status mirrors the live bot's vocabulary: won / lost / refund (50/50 # scratch — pays $0.50/share, so "not a win" can still be P&L-positive - # below 50¢ entries). No "sold" here BY DESIGN: this replay models - # hold-to-resolution, so it never exits early — only the live bot, - # which mirrors real exits, can show SOLD. + # below 50¢ entries) / sold (the signal exited pre-resolution and the + # replay mirrored it, exit fee + slip paid — same as the live bot). "resolved": [{"title": r.get("title", ""), "name": r["name"], "won": r["won"], - "status": ("refund" if r.get("refund") + "status": ("sold" if r.get("sold") + else "refund" if r.get("refund") else "won" if r["won"] else "lost"), - "stake": r.get("stake"), "pnl": round(r["pnl"], 2), "date": r.get("res_t")} + "stake": r.get("stake"), "pnl": round(r["pnl"], 2), + "date": r.get("exit_t") or r.get("res_t")} for r in resolved[:60]], "missed": [{"title": m.get("title", ""), "name": m["name"], - "won": (None if "won" not in m + "won": (None if "won" not in m or m.get("exit_t") else (m["won"] if m.get("wp") is None else m["wp"] > 0.5)), - "status": (None if "won" not in m + "status": ("sold" if m.get("exit_t") + else None if "won" not in m else "refund" if m.get("wp") == 0.5 else "won" if (m["won"] if m.get("wp") is None else m["wp"] > 0.5) else "lost"), "stake": m.get("stake"), "capped": bool(m.get("capped")), - "pnl": round(m["pnl"], 2), "date": m.get("res_t")} + "pnl": round(m["pnl"], 2), "date": m.get("exit_t") or m.get("res_t")} for m in missed[:60]], "missed_pnl": round(sum(hypo_pnl(m) for m in missed), 2), } @@ -448,7 +540,7 @@ def main(): save_slug_cache() print(f"portfolio[{DAYS}d rolling]: equity ${equity:,.0f} ({(equity-BANK)/BANK*100:+.0f}%) | banked ${reserve:,.0f} " f"| realized ${realized:+,.0f} | fees ${fees_paid:,.0f} | next stake ${cur_stake():,.0f} " - f"| {len(resolved)} resolved ({wins}W/{len(resolved)-wins-refunds}L/{refunds}R) | {len(current)} open " + f"| {len(resolved)} resolved ({wins}W/{len(resolved)-wins-refunds-solds}L/{refunds}R/{solds}S) | {len(current)} open " f"| {len(missed)} missed ({capped} event-capped) | -> {os.path.basename(OUT)}", flush=True)