Spaces:
Build error
Build error
visual updates + drawdown
Browse files
app.py
CHANGED
|
@@ -294,7 +294,21 @@ def get_sd_df(sd_df, sd, bot_selections, dca1, dca2, dca3, dca4, dca5, dca6, fee
|
|
| 294 |
sd_df['Net P/L Per Trade (-)'] = (sd_df['Return Per Trade (-)']-1)*sd_df['Balance used in Trade (-)']
|
| 295 |
sd_df['Cumulative P/L (-)'] = sd_df['Net P/L Per Trade (-)'].cumsum()
|
| 296 |
return sd_df
|
| 297 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 298 |
def runapp() -> None:
|
| 299 |
bot_selections = "Pure Bread"
|
| 300 |
otimeheader = 'Exit Date'
|
|
@@ -392,7 +406,7 @@ def runapp() -> None:
|
|
| 392 |
df['Net P/L Per Trade'] = (df['Return Per Trade']-1)*df['Balance used in Trade']
|
| 393 |
df['Cumulative P/L'] = df['Net P/L Per Trade'].cumsum()
|
| 394 |
|
| 395 |
-
|
| 396 |
cum_pl = df.loc[df.dropna().index[-1],'Cumulative P/L'] + principal_balance
|
| 397 |
|
| 398 |
effective_return = 100*((cum_pl - principal_balance)/principal_balance)
|
|
@@ -488,8 +502,8 @@ def runapp() -> None:
|
|
| 488 |
else:
|
| 489 |
with st.container():
|
| 490 |
for row in totals.itertuples():
|
| 491 |
-
|
| 492 |
-
|
| 493 |
with col1:
|
| 494 |
st.metric(
|
| 495 |
"Total Trades",
|
|
@@ -497,8 +511,9 @@ def runapp() -> None:
|
|
| 497 |
)
|
| 498 |
with c1:
|
| 499 |
st.metric(
|
| 500 |
-
"
|
| 501 |
-
f"{row.
|
|
|
|
| 502 |
)
|
| 503 |
with col2:
|
| 504 |
st.metric(
|
|
@@ -507,9 +522,9 @@ def runapp() -> None:
|
|
| 507 |
)
|
| 508 |
with c2:
|
| 509 |
st.metric(
|
| 510 |
-
|
| 511 |
-
f"
|
| 512 |
-
f"{
|
| 513 |
)
|
| 514 |
with col3:
|
| 515 |
st.metric(
|
|
@@ -517,14 +532,9 @@ def runapp() -> None:
|
|
| 517 |
f"{row.Losses:.0f}",
|
| 518 |
)
|
| 519 |
with c3:
|
| 520 |
-
st.metric(
|
| 521 |
-
"Rolling 7 Days",
|
| 522 |
-
"",#f"{(1+get_rolling_stats(df,otimeheader, 30))*principal_balance:.2f}",
|
| 523 |
-
f"{get_rolling_stats(df,lev, otimeheader, 7):.2f}%",
|
| 524 |
-
)
|
| 525 |
st.metric(
|
| 526 |
"Rolling 30 Days",
|
| 527 |
-
"",#f"{(1+get_rolling_stats(df,otimeheader, 30))*principal_balance:.2f}",
|
| 528 |
f"{get_rolling_stats(df,lev, otimeheader, 30):.2f}%",
|
| 529 |
)
|
| 530 |
|
|
@@ -536,13 +546,20 @@ def runapp() -> None:
|
|
| 536 |
with c4:
|
| 537 |
st.metric(
|
| 538 |
"Rolling 90 Days",
|
| 539 |
-
"",#f"{(1+get_rolling_stats(df,otimeheader,
|
| 540 |
f"{get_rolling_stats(df,lev, otimeheader, 90):.2f}%",
|
| 541 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 542 |
st.metric(
|
| 543 |
-
"
|
| 544 |
-
"",#f"{(
|
| 545 |
-
f"{
|
| 546 |
)
|
| 547 |
|
| 548 |
if bot_selections == "Pumpernickel":
|
|
|
|
| 294 |
sd_df['Net P/L Per Trade (-)'] = (sd_df['Return Per Trade (-)']-1)*sd_df['Balance used in Trade (-)']
|
| 295 |
sd_df['Cumulative P/L (-)'] = sd_df['Net P/L Per Trade (-)'].cumsum()
|
| 296 |
return sd_df
|
| 297 |
+
|
| 298 |
+
def get_account_drawdown(trades):
|
| 299 |
+
trades = trades.dropna()
|
| 300 |
+
max_draw = 0.0
|
| 301 |
+
beg = 0
|
| 302 |
+
fin = 0
|
| 303 |
+
for candidate in trades.index[:-1]:
|
| 304 |
+
future = trades[candidate+1:]
|
| 305 |
+
delta = future - trades[candidate]
|
| 306 |
+
if max_draw > delta.min():
|
| 307 |
+
max_draw = min(max_draw, delta.min())
|
| 308 |
+
beg = candidate
|
| 309 |
+
fin = delta.argmin()
|
| 310 |
+
return max_draw, (beg, fin)
|
| 311 |
+
|
| 312 |
def runapp() -> None:
|
| 313 |
bot_selections = "Pure Bread"
|
| 314 |
otimeheader = 'Exit Date'
|
|
|
|
| 406 |
df['Net P/L Per Trade'] = (df['Return Per Trade']-1)*df['Balance used in Trade']
|
| 407 |
df['Cumulative P/L'] = df['Net P/L Per Trade'].cumsum()
|
| 408 |
|
| 409 |
+
max_draw, (beg, fin) = get_account_drawdown(df['Cumulative P/L'])
|
| 410 |
cum_pl = df.loc[df.dropna().index[-1],'Cumulative P/L'] + principal_balance
|
| 411 |
|
| 412 |
effective_return = 100*((cum_pl - principal_balance)/principal_balance)
|
|
|
|
| 502 |
else:
|
| 503 |
with st.container():
|
| 504 |
for row in totals.itertuples():
|
| 505 |
+
c1, c2, c3, c4, c5 = st.columns(5)
|
| 506 |
+
col1, col2, col3, col4, col5 = st.columns(5)
|
| 507 |
with col1:
|
| 508 |
st.metric(
|
| 509 |
"Total Trades",
|
|
|
|
| 511 |
)
|
| 512 |
with c1:
|
| 513 |
st.metric(
|
| 514 |
+
"Cumulative P/L",
|
| 515 |
+
f"${row._6:.2f}",
|
| 516 |
+
f"{row._7:.2f} %",
|
| 517 |
)
|
| 518 |
with col2:
|
| 519 |
st.metric(
|
|
|
|
| 522 |
)
|
| 523 |
with c2:
|
| 524 |
st.metric(
|
| 525 |
+
"Rolling 7 Days",
|
| 526 |
+
"",#f"{(1+get_rolling_stats(df,lev, otimeheader, 7)/100)*principal_balance:.2f}",
|
| 527 |
+
f"{get_rolling_stats(df,lev, otimeheader, 7):.2f}%",
|
| 528 |
)
|
| 529 |
with col3:
|
| 530 |
st.metric(
|
|
|
|
| 532 |
f"{row.Losses:.0f}",
|
| 533 |
)
|
| 534 |
with c3:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 535 |
st.metric(
|
| 536 |
"Rolling 30 Days",
|
| 537 |
+
"",#f"{(1+get_rolling_stats(df,lev, otimeheader, 30)/100)*principal_balance:.2f}",
|
| 538 |
f"{get_rolling_stats(df,lev, otimeheader, 30):.2f}%",
|
| 539 |
)
|
| 540 |
|
|
|
|
| 546 |
with c4:
|
| 547 |
st.metric(
|
| 548 |
"Rolling 90 Days",
|
| 549 |
+
"",#f"{(1+get_rolling_stats(df,lev, otimeheader, 90)/100)*principal_balance:.2f}",
|
| 550 |
f"{get_rolling_stats(df,lev, otimeheader, 90):.2f}%",
|
| 551 |
)
|
| 552 |
+
|
| 553 |
+
with col5:
|
| 554 |
+
st.metric(
|
| 555 |
+
"Profit Factor",
|
| 556 |
+
f"{row._5:.2f}",
|
| 557 |
+
)
|
| 558 |
+
with c5:
|
| 559 |
st.metric(
|
| 560 |
+
"Max Account Drawdown",
|
| 561 |
+
"",#f"{np.round(100*max_draw/principal_balance,2)/100*principal_balance:.2f}",
|
| 562 |
+
f"{np.round(100*max_draw/principal_balance,2)}%",
|
| 563 |
)
|
| 564 |
|
| 565 |
if bot_selections == "Pumpernickel":
|