FlipperFile • 2026-05-01 python.
pdf • Page 1
1 from [Link] import A4
2 from [Link] import colors
3 from [Link] import mm
4 from [Link] import (
5 SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
6 HRFlowable, PageBreak, KeepTogether
7 )
8 from [Link] import ParagraphStyle
9 from [Link] import TA_LEFT, TA_CENTER, TA_RIGHT
10 from [Link] import Flowable
11 from [Link] import Drawing, Rect, String, Line,
Polygon
12 from [Link] import renderPDF
13 import os
14
15 # %% PALETTE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16 BLACK = [Link]("#0A0A0A")
17 DARK = [Link]("#111318")
18 CHARCOAL = [Link]("#1C1F26")
19 STEEL = [Link]("#2A2E38")
20 MID = [Link]("#3D4251")
21 MUTED = [Link]("#6B7280")
22 LIGHT = [Link]("#9CA3AF")
23 OFFWHITE = [Link]("#F5F5F0")
24 WHITE = [Link]("#FFFFFF")
25
26 GOLD = [Link]("#C9A84C")
27 GOLD_LIGHT = [Link]("#E8CC7A")
28 GREEN = [Link]("#22C55E")
29 GREEN_DK = [Link]("#15803D")
30 RED = [Link]("#EF4444")
31 RED_DK = [Link]("#991B1B")
32 AMBER = [Link]("#F59E0B")
33 BLUE = [Link]("#3B82F6")
34 PURPLE = [Link]("#8B5CF6")
35
36 W, H = A4
37
38 # %% STYLES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 def make_styles():
40 return {
41 "cover_name": ParagraphStyle("cover_name",
42 fontName="Helvetica-Bold", fontSize=28,
textColor=WHITE,
43 leading=34, alignment=TA_LEFT),
44 "cover_sub": ParagraphStyle("cover_sub",
45 fontName="Helvetica", fontSize=11, textColor=GOLD,
46 leading=16, alignment=TA_LEFT, spaceAfter=4),
47 "cover_meta": ParagraphStyle("cover_meta",
48 fontName="Helvetica", fontSize=9, textColor=LIGHT,
49 leading=14, alignment=TA_LEFT),
50 "section_num": ParagraphStyle("section_num",
51 fontName="Helvetica-Bold", fontSize=9, textColor=GOLD,
FlipperFile • 2026-05-01 [Link] • Page 2
52 leading=12, alignment=TA_LEFT, spaceAfter=2),
53 "section_title": ParagraphStyle("section_title",
54 fontName="Helvetica-Bold", fontSize=17,
textColor=WHITE,
55 leading=22, alignment=TA_LEFT, spaceAfter=6),
56 "h2": ParagraphStyle("h2",
57 fontName="Helvetica-Bold", fontSize=12,
textColor=OFFWHITE,
58 leading=16, spaceBefore=14, spaceAfter=4),
59 "h3": ParagraphStyle("h3",
60 fontName="Helvetica-Bold", fontSize=10, textColor=GOLD,
61 leading=14, spaceBefore=10, spaceAfter=3),
62 "body": ParagraphStyle("body",
63 fontName="Helvetica", fontSize=9, textColor=LIGHT,
64 leading=15, spaceAfter=6),
65 "body_white": ParagraphStyle("body_white",
66 fontName="Helvetica", fontSize=9, textColor=OFFWHITE,
67 leading=15, spaceAfter=5),
68 "bold_white": ParagraphStyle("bold_white",
69 fontName="Helvetica-Bold", fontSize=9, textColor=WHITE,
70 leading=14, spaceAfter=4),
71 "caption": ParagraphStyle("caption",
72 fontName="Helvetica-Oblique", fontSize=8,
textColor=MUTED,
73 leading=11, spaceAfter=4),
74 "quote": ParagraphStyle("quote",
75 fontName="Helvetica-Oblique", fontSize=10,
textColor=GOLD_LIGHT,
76 leading=16, leftIndent=16, spaceAfter=8),
77 "small": ParagraphStyle("small",
78 fontName="Helvetica", fontSize=8, textColor=MUTED,
79 leading=11),
80 "tag_green": ParagraphStyle("tag_green",
81 fontName="Helvetica-Bold", fontSize=8, textColor=GREEN,
82 leading=10),
83 "tag_red": ParagraphStyle("tag_red",
84 fontName="Helvetica-Bold", fontSize=8, textColor=RED,
85 leading=10),
86 "tag_amber": ParagraphStyle("tag_amber",
87 fontName="Helvetica-Bold", fontSize=8, textColor=AMBER,
88 leading=10),
89 "metric_val": ParagraphStyle("metric_val",
90 fontName="Helvetica-Bold", fontSize=18,
textColor=WHITE,
91 leading=22, alignment=TA_CENTER),
92 "metric_label": ParagraphStyle("metric_label",
93 fontName="Helvetica", fontSize=8, textColor=MUTED,
94 leading=11, alignment=TA_CENTER),
95 "toc_entry": ParagraphStyle("toc_entry",
96 fontName="Helvetica", fontSize=9, textColor=LIGHT,
97 leading=16, leftIndent=0),
98 "toc_num": ParagraphStyle("toc_num",
99 fontName="Helvetica-Bold", fontSize=9, textColor=GOLD,
100 leading=16),
101 "footer": ParagraphStyle("footer",
FlipperFile • 2026-05-01 [Link] • Page 3
102 fontName="Helvetica", fontSize=7.5, textColor=MUTED,
103 leading=10, alignment=TA_CENTER),
104 }
105
106 S = make_styles()
107
108 # %% CUSTOM FLOWABLES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
109 class DarkRect(Flowable):
110 def __init__(self, w, h, fill=CHARCOAL, radius=4):
111 Flowable.__init__(self)
112 self.w, self.h, [Link], [Link] = w, h, fill, radius
113 def draw(self):
114 [Link]([Link])
115 [Link](0, 0, self.w, self.h, [Link],
fill=1, stroke=0)
116
117 class GoldLine(Flowable):
118 def __init__(self, w=None, thickness=0.75):
119 Flowable.__init__(self)
120 self.w = w
121 [Link] = thickness
122 [Link] = thickness + 2
123 def wrap(self, aw, ah):
124 return (self.w or aw), [Link]
125 def draw(self):
126 [Link](GOLD)
127 [Link]([Link])
128 [Link](0, [Link]/2, self.w or 400,
[Link]/2)
129
130 class BarChart(Flowable):
131 """Horizontal bar chart for error tracker."""
132 def __init__(self, data, width=460, row_h=22):
133 Flowable.__init__(self)
134 [Link] = data # list of (label, jan, feb, apr) tuples —
values 0-5
135 [Link] = width
136 self.row_h = row_h
137 [Link] = len(data) * row_h + 30
138 self.bar_max = 130
139 self.label_w = 210
140 def wrap(self, aw, ah):
141 return [Link], [Link]
142 def draw(self):
143 c = [Link]
144 y = [Link] - 26
145 # Headers
146 headers = ["JAN", "FEB", "APR"]
147 col_x = [self.label_w + 2, self.label_w + 50, self.label_w
+ 98]
148 col_colors = [RED, AMBER, GREEN]
149 for i, (h, x, col) in enumerate(zip(headers, col_x,
col_colors)):
150 [Link](col)
FlipperFile • 2026-05-01 [Link] • Page 4
151 [Link]("Helvetica-Bold", 7.5)
152 [Link](x, y + 4, h)
153 y -= 6
154 for label, jan, feb, apr in [Link]:
155 [Link](CHARCOAL)
156 [Link](0, y - self.row_h + 4, [Link] - 10,
self.row_h - 2, 3, fill=1, stroke=0)
157 [Link](LIGHT)
158 [Link]("Helvetica", 8)
159 [Link](8, y - 8, label)
160 dots = [
161 (col_x[0] + 14, jan, RED),
162 (col_x[1] + 14, feb, AMBER),
163 (col_x[2] + 14, apr, GREEN),
164 ]
165 for dx, val, col in dots:
166 txt, bg = self._pill(val)
167 [Link](bg)
168 [Link](dx - 2, y - 12, 34, 13, 3, fill=1,
stroke=0)
169 [Link](col)
170 [Link]("Helvetica-Bold", 7.5)
171 [Link](dx + 15, y - 5, txt)
172 y -= self.row_h
173 def _pill(self, val):
174 mapping = {
175 "5x": ("5×", [Link]("#3D1515")),
176 "4x": ("4×", [Link]("#3D1515")),
177 "3x": ("3×", [Link]("#3D2000")),
178 "2x": ("2×", [Link]("#3D2000")),
179 "1x": ("1×", [Link]("#3D2000")),
180 "better": ("!“ LESS", [Link]("#0D2B1A")),
181 "rare": ("RARE", [Link]("#3D1515")),
182 "some": ("SOME", [Link]("#3D2000")),
183 "often": ("OFTEN", [Link]("#0D2B1A")),
184 "none": ("—", [Link]("#1C1F26")),
185 "new": ("NEW", [Link]("#3D1515")),
186 "3x_new": ("3× NEW", [Link]("#3D1515")),
187 "1x_apr": ("1×", [Link]("#3D2000")),
188 "5x_apr": ("5×", [Link]("#3D1515")),
189 }
190 return [Link](val, (val, STEEL))
191
192 class PnLChart(Flowable):
193 """Bar chart of PnL by trade day."""
194 def __init__(self, trades, width=460, height=130, title=""):
195 Flowable.__init__(self)
196 [Link] = trades
197 [Link] = width
198 [Link] = height
199 [Link] = title
200 def wrap(self, aw, ah):
201 return [Link], [Link] + 20
202 def draw(self):
203 c = [Link]
FlipperFile • 2026-05-01 [Link] • Page 5
204 trades = [Link]
205 if not trades: return
206 vals = [t[1] for t in trades]
207 max_v = max(abs(v) for v in vals) or 1
208 bar_area_h = [Link] - 40
209 bar_area_y = 25
210 n = len(trades)
211 bar_w = min(32, ([Link] - 20) / n - 4)
212 spacing = ([Link] - 20) / n
213 zero_y = bar_area_y + bar_area_h * (max_v / (max_v * 2)) if
any(v < 0 for v in vals) else bar_area_y
214 has_neg = any(v < 0 for v in vals)
215 if has_neg:
216 zero_y = bar_area_y + bar_area_h / 2
217 else:
218 zero_y = bar_area_y
219 # Zero line
220 [Link](MID)
221 [Link](0.5)
222 [Link](10, zero_y, [Link] - 10, zero_y)
223 # Title
224 if [Link]:
225 [Link](GOLD)
226 [Link]("Helvetica-Bold", 8)
227 [Link](10, [Link] + 8, [Link])
228 for i, (label, val) in enumerate(trades):
229 x = 10 + i * spacing + spacing / 2 - bar_w / 2
230 scale = bar_area_h / 2 if has_neg else bar_area_h
231 bar_h = abs(val) / max_v * scale
232 if val >= 0:
233 bar_y = zero_y
234 fill = GREEN
235 else:
236 bar_y = zero_y - bar_h
237 fill = RED
238 [Link](fill)
239 [Link](x, bar_y, bar_w, bar_h if bar_h > 1 else 2,
2, fill=1, stroke=0)
240 # Label
241 [Link](MUTED)
242 [Link]("Helvetica", 6.5)
243 [Link](x + bar_w / 2, 13, label)
244 # Value
245 sign = "+" if val >= 0 else ""
246 [Link](GREEN if val >= 0 else RED)
247 [Link]("Helvetica-Bold", 6)
248 [Link](x + bar_w / 2, 5,
f"{sign}${val:,}")
249
250 class MetricCard(Flowable):
251 def __init__(self, label, value, sub, color=WHITE, w=100,
h=60):
252 Flowable.__init__(self)
253 [Link], [Link], [Link] = label, value, sub
254 [Link], self.w, self.h = color, w, h
FlipperFile • 2026-05-01 [Link] • Page 6
255 def wrap(self, aw, ah): return self.w, self.h
256 def draw(self):
257 c = [Link]
258 [Link](CHARCOAL)
259 [Link](0, 0, self.w - 4, self.h - 4, 4, fill=1,
stroke=0)
260 [Link](GOLD)
261 [Link]("Helvetica-Bold", 7)
262 [Link](8, self.h - 16, [Link]())
263 [Link]([Link])
264 [Link]("Helvetica-Bold", 16)
265 [Link](8, self.h - 34, [Link])
266 [Link](MUTED)
267 [Link]("Helvetica", 7)
268 [Link](8, self.h - 47, [Link])
269
270 # %% PAGE TEMPLATE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
271 PAGE_NUM = [0]
272
273 def on_page(canvas, doc):
274 PAGE_NUM[0] += 1
275 [Link]()
276 # Dark background
277 [Link](DARK)
278 [Link](0, 0, W, H, fill=1, stroke=0)
279 # Top rule
280 [Link](GOLD)
281 [Link](0.5)
282 [Link](20*mm, H - 14*mm, W - 20*mm, H - 14*mm)
283 # Header text
284 [Link](MUTED)
285 [Link]("Helvetica", 7)
286 [Link](20*mm, H - 11*mm, "TRADING PERFORMANCE REPORT
| CONFIDENTIAL")
287 [Link]("Helvetica-Bold", 7)
288 [Link](GOLD)
289 [Link](W - 20*mm, H - 11*mm, "BAHA'A
AL-HOURANI")
290 # Footer
291 [Link](STEEL)
292 [Link](0.5)
293 [Link](20*mm, 13*mm, W - 20*mm, 13*mm)
294 [Link](MUTED)
295 [Link]("Helvetica", 7)
296 [Link](20*mm, 9*mm, f"Jan – Apr 2026 | ICT / SMT
Methodology | Futures: MNQ / YM / ES / MGC / SIL")
297 [Link]("Helvetica-Bold", 7.5)
298 [Link](GOLD)
299 [Link](W - 20*mm, 9*mm, f"{PAGE_NUM[0]}")
300 [Link]()
301
302 def cover_page(canvas, doc):
303 [Link]()
304 # Full dark bg
FlipperFile • 2026-05-01 [Link] • Page 7
305 [Link](BLACK)
306 [Link](0, 0, W, H, fill=1, stroke=0)
307 # Gold accent bar left
308 [Link](GOLD)
309 [Link](0, 0, 6, H, fill=1, stroke=0)
310 # Subtle grid lines
311 [Link]([Link]("#1A1D24"))
312 [Link](0.4)
313 for y in range(0, int(H), 40):
314 [Link](0, y, W, y)
315 # Top section
316 [Link](CHARCOAL)
317 [Link](0, H - 90*mm, W, 90*mm, fill=1, stroke=0)
318 # Gold rule
319 [Link](GOLD)
320 [Link](1.5)
321 [Link](20*mm, H - 92*mm, W - 20*mm, H - 92*mm)
322 [Link]()
323
324 # %% HELPERS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
325 def hr(): return GoldLine()
326 def sp(n=6): return Spacer(1, n)
327 def divider(label):
328 return [
329 sp(10),
330 GoldLine(),
331 sp(4),
332 ]
333
334 def section_header(num, title):
335 return [
336 sp(14),
337 Paragraph(f"0{num}", S["section_num"]),
338 Paragraph(title, S["section_title"]),
339 GoldLine(),
340 sp(8),
341 ]
342
343 def callout(text, color=GOLD):
344 data = [[Paragraph(f'"{text}"', S["quote"])]]
345 t = Table(data, colWidths=[460])
346 [Link](TableStyle([
347 ("BACKGROUND", (0,0), (-1,-1), [Link]("#1A1D24")),
348 ("LEFTPADDING", (0,0), (-1,-1), 14),
349 ("RIGHTPADDING", (0,0), (-1,-1), 14),
350 ("TOPPADDING", (0,0), (-1,-1), 10),
351 ("BOTTOMPADDING", (0,0), (-1,-1), 10),
352 ("LINEAFTER", (0,0), (0,-1), 2.5, color),
353 ("ROWBACKGROUNDS", (0,0), (-1,-1),
[[Link]("#1A1D24")]),
354 ]))
355 return t
356
357 def info_table(rows, col_widths=None):
FlipperFile • 2026-05-01 [Link] • Page 8
358 """rows: list of (key, value) tuples"""
359 data = [[Paragraph(k, S["small"]), Paragraph(v,
S["body_white"])] for k,v in rows]
360 cw = col_widths or [130, 330]
361 t = Table(data, colWidths=cw)
362 [Link](TableStyle([
363 ("BACKGROUND", (0,0), (-1,-1), CHARCOAL),
364 ("BACKGROUND", (0,0), (0,-1), STEEL),
365 ("TOPPADDING", (0,0), (-1,-1), 6),
366 ("BOTTOMPADDING", (0,0), (-1,-1), 6),
367 ("LEFTPADDING", (0,0), (-1,-1), 10),
368 ("LINEBELOW", (0,0), (-1,-2), 0.4, MID),
369 ("ROWBACKGROUNDS", (0,0), (-1,-1), [CHARCOAL,
[Link]("#22252F")]),
370 ]))
371 return t
372
373 def trade_table(headers, rows):
374 header_row = [Paragraph(h, ParagraphStyle("th",
fontName="Helvetica-Bold",
375 fontSize=7.5, textColor=GOLD, leading=10)) for h in
headers]
376 data_rows = []
377 for row in rows:
378 cells = []
379 for i, cell in enumerate(row):
380 if isinstance(cell, str) and [Link]("+"):
381 p = Paragraph(cell, ParagraphStyle("td_g",
fontName="Helvetica-Bold",
382 fontSize=8, textColor=GREEN, leading=11))
383 elif isinstance(cell, str) and [Link](""") or
(isinstance(cell, str) and [Link]("-")):
384 p = Paragraph(cell, ParagraphStyle("td_r",
fontName="Helvetica-Bold",
385 fontSize=8, textColor=RED, leading=11))
386 elif isinstance(cell, str) and cell in ["Blown",
"B/E"]:
387 p = Paragraph(cell, ParagraphStyle("td_a",
fontName="Helvetica-Bold",
388 fontSize=8, textColor=AMBER, leading=11))
389 else:
390 p = Paragraph(str(cell), ParagraphStyle("td",
fontName="Helvetica",
391 fontSize=8, textColor=LIGHT, leading=11))
392 [Link](p)
393 data_rows.append(cells)
394 all_data = [header_row] + data_rows
395 n_cols = len(headers)
396 cw = [460 // n_cols] * n_cols
397 t = Table(all_data, colWidths=cw)
398 [Link](TableStyle([
399 ("BACKGROUND", (0,0), (-1,0), STEEL),
400 ("BACKGROUND", (0,1), (-1,-1), CHARCOAL),
401 ("ROWBACKGROUNDS", (0,1), (-1,-1), [CHARCOAL,
[Link]("#22252F")]),
FlipperFile • 2026-05-01 [Link] • Page 9
402 ("TOPPADDING", (0,0), (-1,-1), 6),
403 ("BOTTOMPADDING", (0,0), (-1,-1), 6),
404 ("LEFTPADDING", (0,0), (-1,-1), 8),
405 ("LINEBELOW", (0,0), (-1,-1), 0.4, MID),
406 ("LINEBELOW", (0,0), (-1,0), 0.8, GOLD),
407 ]))
408 return t
409
410 def error_table(rows):
411 """rows: (pattern, jan_tag, feb_tag, apr_tag, trend)"""
412 header = [
413 Paragraph("BEHAVIORAL PATTERN", ParagraphStyle("th",
fontName="Helvetica-Bold", fontSize=7.5, textColor=GOLD, leading=10)),
414 Paragraph("JAN", ParagraphStyle("th",
fontName="Helvetica-Bold", fontSize=7.5, textColor=RED, leading=10)),
415 Paragraph("FEB", ParagraphStyle("th",
fontName="Helvetica-Bold", fontSize=7.5, textColor=AMBER, leading=10)),
416 Paragraph("APR", ParagraphStyle("th",
fontName="Helvetica-Bold", fontSize=7.5, textColor=GREEN, leading=10)),
417 Paragraph("TREND", ParagraphStyle("th",
fontName="Helvetica-Bold", fontSize=7.5, textColor=GOLD, leading=10)),
418 ]
419 def tag(txt, style):
420 return Paragraph(txt, style)
421 def cell(txt, col=LIGHT):
422 return Paragraph(txt, ParagraphStyle("td",
fontName="Helvetica", fontSize=8, textColor=col, leading=11))
423 data = [header]
424 for row in rows:
425 pat, j, f, a, trend, trend_col = row
426 [Link]([
427 cell(pat),
428 Paragraph(j, ParagraphStyle("x",
fontName="Helvetica-Bold", fontSize=8, textColor=RED, leading=11)),
429 Paragraph(f, ParagraphStyle("x",
fontName="Helvetica-Bold", fontSize=8, textColor=AMBER, leading=11)),
430 Paragraph(a, ParagraphStyle("x",
fontName="Helvetica-Bold", fontSize=8, textColor=GREEN, leading=11)),
431 Paragraph(trend, ParagraphStyle("x",
fontName="Helvetica-Bold", fontSize=8, textColor=trend_col, leading=11)),
432 ])
433 t = Table(data, colWidths=[210, 50, 50, 50, 100])
434 [Link](TableStyle([
435 ("BACKGROUND", (0,0), (-1,0), STEEL),
436 ("ROWBACKGROUNDS", (0,1), (-1,-1), [CHARCOAL,
[Link]("#22252F")]),
437 ("TOPPADDING", (0,0), (-1,-1), 6),
438 ("BOTTOMPADDING", (0,0), (-1,-1), 6),
439 ("LEFTPADDING", (0,0), (-1,-1), 8),
440 ("LINEBELOW", (0,0), (-1,-1), 0.4, MID),
441 ("LINEBELOW", (0,0), (-1,0), 0.8, GOLD),
442 ]))
443 return t
444
445 def alert_box(title, text, border_color=GOLD, bg=None):
FlipperFile • 2026-05-01 [Link] • Page 10
446 bg = bg or [Link]("#1A1D24")
447 content = [
448 Paragraph(title, ParagraphStyle("ab_title",
fontName="Helvetica-Bold", fontSize=8.5, textColor=border_color,
leading=12)),
449 Spacer(1, 3),
450 Paragraph(text, ParagraphStyle("ab_body",
fontName="Helvetica", fontSize=8.5, textColor=LIGHT, leading=14)),
451 ]
452 t = Table([[content]], colWidths=[460])
453 [Link](TableStyle([
454 ("BACKGROUND", (0,0), (-1,-1), bg),
455 ("LEFTPADDING", (0,0), (-1,-1), 14),
456 ("RIGHTPADDING", (0,0), (-1,-1), 14),
457 ("TOPPADDING", (0,0), (-1,-1), 10),
458 ("BOTTOMPADDING", (0,0), (-1,-1), 10),
459 ("LINEAFTER", (0,0), (0,-1), 3, border_color),
460 ]))
461 return t
462
463 # %% BUILD
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
464 def build():
465 path =
"/mnt/user-data/outputs/Baha_Trading_Performance_Report.pdf"
466 doc = SimpleDocTemplate(
467 path, pagesize=A4,
468 leftMargin=20*mm, rightMargin=20*mm,
469 topMargin=20*mm, bottomMargin=20*mm,
470 )
471
472 story = []
473
474 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
475 # COVER PAGE
476 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
477 [Link](Spacer(1, 52*mm))
478 [Link](Paragraph("TRADING PERFORMANCE", S["cover_sub"]))
479 [Link](Paragraph("REVIEW & ANALYSIS", S["cover_name"]))
480 [Link](Spacer(1, 3*mm))
481 [Link](GoldLine(thickness=1.5))
482 [Link](Spacer(1, 5*mm))
483 [Link](Paragraph("January — April 2026 | ICT / SMT
Methodology | Futures Markets", S["cover_meta"]))
484 [Link](Spacer(1, 2*mm))
485 [Link](Paragraph("Prepared for: Baha'a Al-Hourani |
Confidential — Personal Use Only", S["cover_meta"]))
486 [Link](Spacer(1, 40*mm))
487
488 # Cover summary boxes
489 cover_data = [
490 [
491 [Paragraph("MONTHS\nANALYZED", ParagraphStyle("cl",
FlipperFile • 2026-05-01 [Link] • Page 11
fontName="Helvetica-Bold", fontSize=7, textColor=MUTED, leading=10,
alignment=TA_CENTER)),
492 Spacer(1,3),
493 Paragraph("3", ParagraphStyle("cv",
fontName="Helvetica-Bold", fontSize=22, textColor=WHITE, leading=26,
alignment=TA_CENTER)),
494 Paragraph("Jan / Feb / Apr", ParagraphStyle("cs",
fontName="Helvetica", fontSize=7, textColor=MUTED, leading=10,
alignment=TA_CENTER))],
495 [Paragraph("TOTAL TRADES\nJOURNALED",
ParagraphStyle("cl", fontName="Helvetica-Bold", fontSize=7,
textColor=MUTED, leading=10, alignment=TA_CENTER)),
496 Spacer(1,3),
497 Paragraph("40+", ParagraphStyle("cv",
fontName="Helvetica-Bold", fontSize=22, textColor=WHITE, leading=26,
alignment=TA_CENTER)),
498 Paragraph("With written context", ParagraphStyle("cs",
fontName="Helvetica", fontSize=7, textColor=MUTED, leading=10,
alignment=TA_CENTER))],
499 [Paragraph("KEY MILESTONE\nACHIEVED",
ParagraphStyle("cl", fontName="Helvetica-Bold", fontSize=7,
textColor=MUTED, leading=10, alignment=TA_CENTER)),
500 Spacer(1,3),
501 Paragraph("FUNDED", ParagraphStyle("cv",
fontName="Helvetica-Bold", fontSize=16, textColor=GOLD, leading=26,
alignment=TA_CENTER)),
502 Paragraph("First account passed Apr 9",
ParagraphStyle("cs", fontName="Helvetica", fontSize=7, textColor=MUTED,
leading=10, alignment=TA_CENTER))],
503 [Paragraph("CORE\nFINDING", ParagraphStyle("cl",
fontName="Helvetica-Bold", fontSize=7, textColor=MUTED, leading=10,
alignment=TA_CENTER)),
504 Spacer(1,3),
505 Paragraph("EDGE IS\nREAL", ParagraphStyle("cv",
fontName="Helvetica-Bold", fontSize=14, textColor=GREEN, leading=18,
alignment=TA_CENTER)),
506 Paragraph("Psychology gap remains",
ParagraphStyle("cs", fontName="Helvetica", fontSize=7, textColor=MUTED,
leading=10, alignment=TA_CENTER))],
507 ]
508 ]
509 cover_t = Table(cover_data, colWidths=[110, 110, 110, 110])
510 cover_t.setStyle(TableStyle([
511 ("BACKGROUND", (0,0), (-1,-1), CHARCOAL),
512 ("TOPPADDING", (0,0), (-1,-1), 12),
513 ("BOTTOMPADDING", (0,0), (-1,-1), 12),
514 ("LEFTPADDING", (0,0), (-1,-1), 8),
515 ("RIGHTPADDING", (0,0), (-1,-1), 8),
516 ("LINEAFTER", (0,0), (2,-1), 0.5, STEEL),
517 ("LINEBEFORE", (0,0), (0,-1), 2, GOLD),
518 ]))
519 [Link](cover_t)
520 [Link](Spacer(1, 50*mm))
521 [Link](Paragraph("This report is a comprehensive analysis
of three months of live futures trading activity, covering behavioral
FlipperFile • 2026-05-01 [Link] • Page 12
patterns, execution quality, risk management failures, and development
milestones. It is structured to serve as both a diagnostic tool and a
forward-looking framework for continued improvement.", S["body"]))
522
523 [Link](PageBreak())
524
525 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
526 # TABLE OF CONTENTS
527 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
528 story += section_header(0, "TABLE OF CONTENTS")
529 toc_entries = [
530 ("01", "Executive Summary", "Overview of the 3-month
period, key numbers, and core finding"),
531 ("02", "Life & Trading Plan", "Long-term roadmap, career
phases, and trading as the primary vehicle"),
532 ("03", "January 2026 Analysis", "First eval period —
performance data, error patterns, diagnosis"),
533 ("04", "February 2026 Analysis", "Second eval —
progression, best stretch, fatal breakdown"),
534 ("05", "April 2026 Analysis", "Third eval — milestones,
funded account passage, emerging patterns"),
535 ("06", "Cross-Month Pattern Report", "Behavioral
comparison: what improved, what persists, what is new"),
536 ("07", "The Core Problem", "Root cause analysis of the
single recurring issue destroying accounts"),
537 ("08", "The Rule System", "Hard structural rules to make
the wrong action harder than the right one"),
538 ("09", "Identity & Mindset", "Psychological profile,
strengths, and the identity shift required"),
539 ("10", "Verdict & Next Steps", "Where you stand, what comes
next, and the non-negotiables"),
540 ]
541 for num, title, desc in toc_entries:
542 row_data = [[
543 Paragraph(num, ParagraphStyle("tn",
fontName="Helvetica-Bold", fontSize=9, textColor=GOLD, leading=14)),
544 Paragraph(f"<b>{title}</b><br/>{desc}",
ParagraphStyle("te", fontName="Helvetica", fontSize=8.5, textColor=LIGHT,
leading=13)),
545 ]]
546 t = Table(row_data, colWidths=[30, 430])
547 [Link](TableStyle([
548 ("TOPPADDING", (0,0),(-1,-1), 7),
549 ("BOTTOMPADDING", (0,0),(-1,-1), 7),
550 ("LEFTPADDING", (0,0),(-1,-1), 6),
551 ("LINEBELOW", (0,0),(-1,-1), 0.3, STEEL),
552 ]))
553 [Link](t)
554
555 [Link](PageBreak())
556
557 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
FlipperFile • 2026-05-01 [Link] • Page 13
558 # 01 — EXECUTIVE SUMMARY
559 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
560 story += section_header(1, "EXECUTIVE SUMMARY")
561
562 [Link](Paragraph("Overview", S["h2"]))
563 [Link](Paragraph(
564 "This report covers three months of live futures trading by
Baha'a Al-Hourani using ICT/SMT methodology across MNQ, YM, ES, MGC, and
SIL. The analysis is drawn directly from a documented trade journal
maintained throughout the period, including scenario development notes,
execution logs, and post-session reviews.",
565 S["body"]))
566 [Link](sp())
567
568 # Key numbers table
569 [Link](Paragraph("Period Performance Snapshot", S["h3"]))
570 [Link](trade_table(
571 ["MONTH", "GROSS P&L", "OUTCOME", "ACCOUNT STATUS", "KEY
EVENT"],
572 [
573 ["January 2026", ""$449", "Net Loss", "Blown",
"Over-leverage at eval target"],
574 ["February 2026", "+$2,175 peak", "Blown", "Blown",
"Revenge trading Feb 13"],
575 ["April 2026", "+$805 net", "Partial", "Active", "First
funded account passed Apr 9"],
576 ]
577 ))
578 [Link](sp(10))
579
580 [Link](Paragraph("Core Finding", S["h2"]))
581 [Link](callout(
582 "The model works. The edge is real. Every account was lost
to psychology, not to a flawed strategy."
583 ))
584 [Link](sp(8))
585 [Link](Paragraph(
586 "Across all three months, the higher-timeframe bias was
correct on the majority of trading days. On days where full pre-session
scenario development was completed and SSMT confirmation was respected,
win rate and realized R increased substantially. The technical framework
— ICT Power of Three, SMT divergence, CISD entry, 15s/1m timeframe
execution — produced A++ setups repeatedly.",
587 S["body"]))
588 [Link](Paragraph(
589 "The single variable responsible for every account loss is
position sizing deviation under emotional conditions. This is documented,
repeated, and self-diagnosed in the journal — yet has persisted across
all three months. The solution is structural, not motivational.",
590 S["body"]))
591
592 [Link](sp(8))
593 [Link](alert_box("CRITICAL FINDING",
594 "The pattern of over-leveraging when close to the daily or
FlipperFile • 2026-05-01 [Link] • Page 14
eval target appeared in January (5 times), February (5 times), and April
(2 times). It is the single thread connecting every account blow. It has
not responded to awareness alone — it requires a hard mechanical
constraint.",
595 RED, [Link]("#200A0A")))
596
597 [Link](PageBreak())
598
599 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
600 # 02 — LIFE & TRADING PLAN
601 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
602 story += section_header(2, "LIFE & TRADING PLAN")
603
604 [Link](Paragraph("The Long-Term Roadmap", S["h2"]))
605 [Link](Paragraph(
606 "Trading does not exist in isolation. It sits within a
larger, clearly defined life architecture. Understanding the full plan is
essential context for evaluating the urgency and stakes of the current
trading phase.",
607 S["body"]))
608 [Link](sp(6))
609
610 phases = [
611 ("PHASE 1 | NOW !’ 2 YEARS", "UNIVERSITY", [
612 "Finance degree — 18 credit hours/semester + 9 summer",
613 "Topstep eval cycle — fund eval accounts via part-time
income (Marouf Coffee, 1-3 months only)",
614 "Industry certifications in parallel: CMSA, AI in
Finance, Oxford Quantitative Trading",
615 "Core focus: Trading, studying, gym. Nothing else
competes."
616 ]),
617 ("PHASE 2 | POST-GRADUATION !’ +5 YEARS", "WORK ABROAD", [
618 "Employment in Germany or Saudi Arabia — 3 to 5 years",
619 "Goals: Experience, capital accumulation, industry
connections",
620 "Strict rules: No debt. No lifestyle inflation. Save
everything.",
621 "Trading runs in parallel and grows throughout this
phase"
622 ]),
623 ("PHASE 3 | +5 YEARS", "BUSINESS & PRIVATE EQUITY", [
624 "Premium Good Diary Products business — launched from
accumulated capital",
625 "Begin Private Equity journey using business
connections built abroad",
626 "Trading at scale — target $100,000/month from funded
accounts",
627 "Multiple ventures in parallel; trading remains the
primary income engine"
628 ]),
629 ]
630 for phase_title, phase_name, bullets in phases:
FlipperFile • 2026-05-01 [Link] • Page 15
631 [Link](sp(6))
632 data = [[
633 Paragraph(phase_title, ParagraphStyle("pt",
fontName="Helvetica-Bold", fontSize=7, textColor=GOLD, leading=10)),
634 Paragraph(phase_name, ParagraphStyle("pn",
fontName="Helvetica-Bold", fontSize=11, textColor=WHITE, leading=14)),
635 ] + [Paragraph(f"• {b}", ParagraphStyle("pb",
fontName="Helvetica", fontSize=8.5, textColor=LIGHT, leading=13)) for b
in bullets]]
636 flat = [[Paragraph(phase_title, ParagraphStyle("pt",
fontName="Helvetica-Bold", fontSize=7.5, textColor=GOLD, leading=10,
spaceAfter=2)),
637 Paragraph(phase_name, ParagraphStyle("pn",
fontName="Helvetica-Bold", fontSize=12, textColor=WHITE, leading=15,
spaceAfter=5)),
638 ] + [Paragraph(f"• {b}", ParagraphStyle("pb",
fontName="Helvetica", fontSize=8.5, textColor=LIGHT, leading=13)) for b
in bullets]]
639 t = Table([[flat]], colWidths=[460])
640 [Link](TableStyle([
641 ("BACKGROUND", (0,0),(-1,-1), CHARCOAL),
642 ("LEFTPADDING", (0,0),(-1,-1), 14),
643 ("RIGHTPADDING", (0,0),(-1,-1), 14),
644 ("TOPPADDING", (0,0),(-1,-1), 10),
645 ("BOTTOMPADDING", (0,0),(-1,-1), 12),
646 ("LINEBEFORE", (0,0),(0,-1), 3, GOLD),
647 ]))
648 [Link](t)
649 [Link](sp(4))
650
651 [Link](sp(8))
652 [Link](Paragraph("Current Priority Stack", S["h3"]))
653 [Link](info_table([
654 ("#1 Priority", "Trading — pass eval, protect funded
account, grow capital"),
655 ("#2 Priority", "University — finish strong, GPA matters
for abroad applications"),
656 ("#3 Priority", "Gym — testosterone, physique, cardio.
Physical state affects trading state"),
657 ("#4 Priority", "Salah — identified as the foundation. When
this is off, everything feels unstable"),
658 ("Not current", "Business, certifications, certs — these
are Phase 2 and Phase 3 items"),
659 ]))
660
661 [Link](PageBreak())
662
663 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
664 # 03 — JANUARY ANALYSIS
665 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
666 story += section_header(3, "JANUARY 2026 — ANALYSIS")
667
668 [Link](Paragraph("Period Overview", S["h2"]))
FlipperFile • 2026-05-01 [Link] • Page 16
669 [Link](Paragraph("January 5 – January 21, 2026. First
documented eval period with structured journaling. Markets traded: MNQ,
YM, MGC (Gold), ES, NQ.", S["body"]))
670 [Link](sp(8))
671
672 [Link](Paragraph("Performance Data", S["h3"]))
673 [Link](trade_table(
674 ["DATE", "PAIR", "P&L", "OUTCOME", "ROOT CAUSE"],
675 [
676 ["Jan 5", "MNQ", ""$500", "Loss", "No SSMT confirmation
— entered anyway"],
677 ["Jan 9", "YM", "+$800", "Win", "Clean 10:00 AM PO3 —
textbook execution"],
678 ["Jan 13", "MGC", ""$339", "Loss", "Emotional exit × 2,
added size mid-trade"],
679 ["Jan 13", "ES", ""$22", "Loss", "Wrong setup, cut
quickly (good discipline)"],
680 ["Jan 14", "MNQ", "+$1,350", "Win", "SMT divergence
sell model — bias + entry correct"],
681 ["Jan 14", "NQ", ""Loss", "Loss", "Over-leveraged 9:30,
traded in taxi on phone"],
682 ["Jan 15", "MNQ", ""$1,450", "Loss", "Over-leveraged
during consolidation — account killer"],
683 ["Jan 16", "MNQ/NQ", "+$800", "Win", "Clean executions,
two short trades"],
684 ["Jan 20", "—", ""$60", "Loss", "Phone trade, no plan,
rule violation"],
685 ["Jan 21", "MGC", ""$1,000", "BLOWN", "10 contracts —
over-leveraged — account blown"],
686 ]
687 ))
688 [Link](sp(8))
689 [Link](Paragraph("PnL Progression — January", S["h3"]))
690 [Link](PnLChart([
691 ("Jan 5", -500), ("Jan 9", 800), ("Jan 13", -361), ("Jan
14", 1350),
692 ("Jan 15", -1450), ("Jan 16", 800), ("Jan 20", -60), ("Jan
21", -1000)
693 ], title="DAILY PnL | JANUARY 2026"))
694 [Link](sp(10))
695
696 [Link](Paragraph("January Diagnosis", S["h2"]))
697 [Link](Paragraph(
698 "January established the foundational pattern that would
define the next three months. Technical competence was clearly present —
the Jan 9 trade and Jan 14 trade demonstrated HTF bias alignment, proper
SSMT confirmation, and clean model execution. The bias was correct on
most days.",
699 S["body"]))
700 [Link](Paragraph(
701 "However, January also established the core failure mode:
position sizing deviation in emotionally activated states. The Jan 15
loss of $1,450 came from over-leveraging during a consolidation phase
after a strong run. The Jan 21 account blow came from 10 contracts on a
volatile Gold setup. Both were self-identified in the journal.",
FlipperFile • 2026-05-01 [Link] • Page 17
702 S["body"]))
703 [Link](sp(6))
704 [Link](callout("The mistake began before execution. I
committed to trading before earning clarity."))
705 [Link](sp(6))
706 [Link](alert_box("JANUARY KEY ERRORS",
707 "1. Over-leveraging when close to target — appeared 5
times\n2. Trading on the phone while distracted (taxi) — 2 times\n3.
Emotional exits and stop manipulation — 3 times\n4. Skipped pre-session
scenario development — 3 times\n5. Entered without SSMT confirmation — 2
times",
708 AMBER, [Link]("#1F1500")))
709
710 [Link](PageBreak())
711
712 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
713 # 04 — FEBRUARY ANALYSIS
714 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
715 story += section_header(4, "FEBRUARY 2026 — ANALYSIS")
716
717 [Link](Paragraph("Period Overview", S["h2"]))
718 [Link](Paragraph("February 3 – February 13, 2026. Second
eval period. Highest peak PnL of any month before the blow. A clear
progression in technical quality was visible — undermined by an
escalation in emotional trading.", S["body"]))
719 [Link](sp(8))
720
721 [Link](Paragraph("Performance Data", S["h3"]))
722 [Link](trade_table(
723 ["DATE", "PAIR", "P&L", "OUTCOME", "NOTE"],
724 [
725 ["Feb 3", "MNQ", "Missed", "No trade", "Did not check
SSMT — missed A+ setup"],
726 ["Feb 4", "MNQ", "+$630", "Win", "A+ context,
over-leveraged, realized only 0.5R of 1.2R target"],
727 ["Feb 5", "MNQ", "B/E", "Break-even", "8 trades total —
3 off-model, 1 risk violation erased session"],
728 ["Feb 6", "MNQ", ""$452", "Loss", "No scenario
development — self-described as laziness"],
729 ["Feb 9", "MNQ", ""$13", "Loss", "Woke up, went
straight to chart, traded impulsively"],
730 ["Feb 10", "MNQ/SIL", "+$1,130", "Win", "A++ execution
— SSMT, CISD, 15s TF respected"],
731 ["Feb 11", "MNQ", "+$559", "Win", "NFP week — floating
+$1,500, closed +$559 (left money)"],
732 ["Feb 12", "ES/MNQ", "+$486", "Win", "Big wins then
revenge spiral began"],
733 ["Feb 13", "—", "BLOWN", "Blown", "Revenge traded.
Noticed it. Didn't stop."],
734 ]
735 ))
736 [Link](sp(8))
737 [Link](Paragraph("PnL Progression — February", S["h3"]))
FlipperFile • 2026-05-01 [Link] • Page 18
738 [Link](PnLChart([
739 ("Feb 4", 630), ("Feb 5", 0), ("Feb 6", -452), ("Feb 9",
-13),
740 ("Feb 10", 1130), ("Feb 11", 559), ("Feb 12", 486), ("Feb
13", -2350)
741 ], title="DAILY PnL | FEBRUARY 2026 (Estimate)"))
742 [Link](sp(10))
743
744 [Link](Paragraph("February Diagnosis", S["h2"]))
745 [Link](Paragraph(
746 "February showed undeniable technical growth. Feb 10 and
Feb 11 were the best-executed trades in the entire three-month period —
the Feb 10 MNQ trade demonstrated full HTF alignment, patience at the
entry, 15-second timeframe precision, and controlled scaling. The NFP
trade on Feb 11 showed an ability to read macro liquidity events
correctly.",
747 S["body"]))
748 [Link](Paragraph(
749 "The account was profitable heading into Feb 13. The
reversal was not caused by a market event. It was caused by a conscious
decision to continue revenge trading after noticing the behavior. The
journal entry reads: 'Revenge traded, noticed it and didn't stop it, blew
the account, I need a break.' This is a qualitatively different failure
from January — it was not impulsive, it was deliberate self-destruction
in an activated emotional state.",
750 S["body"]))
751 [Link](sp(6))
752 [Link](alert_box("THE FEBRUARY ESCALATION",
753 "February introduced a new and more serious pattern:
noticing destructive behavior in real time and continuing it anyway. This
is not a knowledge failure or even a discipline failure in the
traditional sense. It is a state-management failure — the emotional
activation was strong enough to override real-time self-awareness. This
pattern requires direct intervention.",
754 RED, [Link]("#200A0A")))
755
756 [Link](PageBreak())
757
758 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
759 # 05 — APRIL ANALYSIS
760 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
761 story += section_header(5, "APRIL 2026 — ANALYSIS")
762
763 [Link](Paragraph("Period Overview", S["h2"]))
764 [Link](Paragraph("April 1 – April 23, 2026. Third eval
period. This month produced the most significant milestone of the entire
period: the passage of the first funded account on April 9. Pre-session
scenario development became consistent. A++ executions increased
markedly.", S["body"]))
765 [Link](sp(8))
766
767 [Link](Paragraph("Performance Data", S["h3"]))
768 [Link](trade_table(
FlipperFile • 2026-05-01 [Link] • Page 19
769 ["DATE", "PAIR", "P&L", "OUTCOME", "NOTE"],
770 [
771 ["Apr 1", "MNQ", ""$1,500", "Loss", "20 contracts in
volatile market — same pattern"],
772 ["Apr 2", "MNQ", "Loss", "Loss", "Sold when plan was
bullish — ignored written analysis"],
773 ["Apr 6", "MES/MNQ", "+$356", "Win", "Clean 2:1 sell
model, good HTF alignment"],
774 ["Apr 7", "MNQ", "+$1,030", "Win", "BEST TRADING DAY —
full system compliance"],
775 ["Apr 8", "MNQ", "+$1,437", "Win", "Execution day —
wrong account error cost extra"],
776 ["Apr 9", "MNQ", "+$700", "Win", "FUNDED ACCOUNT PASSED
— Topstep milestone achieved"],
777 ["Apr 9", "Gold", ""$328", "Loss", "Asian session —
off-model, never trade outside model"],
778 ["Apr 15", "MNQ", ""$155", "Loss", "XFA trade — none of
scenarios played out"],
779 ["Apr 16", "MNQ", ""$444", "Loss", "Executed on wrong
account — revenge followed"],
780 ["Apr 17", "MNQ", "+$516", "Win", "Clean 9:30 !’ 10:00
model, partial + runner"],
781 ["Apr 20", "MNQ", ""$467", "Loss", "No market analysis
— Monday, choppy conditions"],
782 ["Apr 21", "MNQ", ""$340", "Loss", "Added 5 contracts,
stop manipulation, cortisol high"],
783 ["Apr 23", "—", "Win", "Win", "Logged as win"],
784 ]
785 ))
786 [Link](sp(8))
787 [Link](Paragraph("PnL Progression — April", S["h3"]))
788 [Link](PnLChart([
789 ("Apr 1", -1500), ("Apr 6", 356), ("Apr 7", 1030), ("Apr
8", 1437),
790 ("Apr 9", 700), ("Apr 9b", -328), ("Apr 16", -444), ("Apr
17", 516), ("Apr 21", -340)
791 ], title="DAILY PnL | APRIL 2026"))
792 [Link](sp(10))
793
794 [Link](Paragraph("April Milestones", S["h2"]))
795 milestones = [
796 ("APR 7 — BEST TRADING DAY (EVER)", "Full HTF-to-LTF
narrative alignment. No impulsive entries. BE stop respected. Re-entry on
same narrative executed correctly. Account locked after session. Scored
Excellent in every execution category in self-review."),
797 ("APR 8 — EXECUTION DAY (+$1,437)", "Geopolitical catalyst
identified pre-session. SSMT confirmed before entry. Correct continuation
entries taken. Despite wrong-account error costing additional P&L,
recovered and re-aligned with narrative at 10:00 model."),
798 ("APR 9 — FIRST FUNDED ACCOUNT PASSED", "The goal from
January, achieved. Topstep evaluation completed. This is objective
evidence that the model works and the edge is real when applied
correctly."),
799 ("CONSISTENT SCENARIO DEVELOPMENT", "Pre-session analysis
became standard practice in April — not occasional. Multi-scenario
FlipperFile • 2026-05-01 [Link] • Page 20
planning with specific triggers was documented before market open on most
trading days."),
800 ]
801 for title, desc in milestones:
802 t = Table([[
803 Paragraph(title, ParagraphStyle("mt",
fontName="Helvetica-Bold", fontSize=8.5, textColor=GOLD, leading=12,
spaceAfter=3)),
804 Paragraph(desc, ParagraphStyle("md",
fontName="Helvetica", fontSize=8.5, textColor=LIGHT, leading=13)),
805 ]], colWidths=[1, 459])
806 [Link](t)
807 [Link](sp(3))
808
809 [Link](sp(4))
810 [Link](alert_box("NEW APRIL PATTERN TO WATCH",
811 "Wrong account execution occurred 3 times in April (April
8, April 16, April 16). As trading moves into funded accounts, this error
carries real financial consequences. A mandatory pre-trade checklist —
Account verified? Asset set to MNQ? Position size confirmed? — must be
completed before every single entry.",
812 AMBER, [Link]("#1F1500")))
813
814 [Link](PageBreak())
815
816 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
817 # 06 — CROSS-MONTH PATTERN REPORT
818 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
819 story += section_header(6, "CROSS-MONTH PATTERN REPORT")
820
821 [Link](Paragraph("Behavioral Comparison: January !’
February !’ April", S["h2"]))
822 [Link](Paragraph("The following table tracks key
behavioral patterns across all three months, identifying what has
improved, what has remained constant, and what has emerged as a new
problem.", S["body"]))
823 [Link](sp(8))
824
825 [Link](error_table([
826 ("Over-leveraging (primary account killer)", "5×", "5×",
"2×", "!“ Improving", AMBER),
827 ("Impulsive entries before confirmation", "4×", "6×", "3×",
"!“ Improving", AMBER),
828 ("No pre-session scenario development", "3×", "4×", "2×",
"!“ Improving", AMBER),
829 ("Revenge trading after losses", "—", "1× (blown)", "1×",
"& Persists", RED),
830 ("Trading outside the model", "2×", "3×", "2×", "— Same",
AMBER),
831 ("Wrong account execution", "—", "—", "3×", "!‘ New risk",
RED),
832 ("Emotional exit / stop manipulation", "3×", "4×", "2×", "!“
Improving", AMBER),
FlipperFile • 2026-05-01 [Link] • Page 21
833 ("Pre-session scenario written", "Rare", "Sometimes",
"Often", "!‘ Improving", GREEN),
834 ("A++ setups executed correctly", "1×", "3×", "5×", "!‘
Growing", GREEN),
835 ("Account locked after strong session", "Never", "Never",
"2×", "!‘ New habit", GREEN),
836 ("SSMT confirmed before entry", "Sometimes", "Often", "Most
days", "!‘ Growing", GREEN),
837 ]))
838 [Link](sp(10))
839
840 [Link](Paragraph("What Has Genuinely Improved", S["h2"]))
841 improvements = [
842 "Pre-session scenario development is now a consistent
practice, not an afterthought.",
843 "SSMT multi-asset confirmation is understood and applied on
most execution days.",
844 "A++ setups — where all conditions align — are increasing
month by month (1 !’ 3 !’ 5).",
845 "Phone trading and distracted execution have almost
disappeared entirely.",
846 "Locking the account after a strong trading day appeared
for the first time in April.",
847 "Re-entry discipline after a BE stop is showing improvement
(April 7 example).",
848 "Self-diagnosis quality in the journal has become genuinely
institutional-level.",
849 ]
850 for item in improvements:
851 [Link](Paragraph(f"<b>+</b> {item}",
ParagraphStyle("imp", fontName="Helvetica", fontSize=9, textColor=LIGHT,
leading=14, leftIndent=8)))
852 [Link](sp(8))
853
854 [Link](Paragraph("What Has Not Changed", S["h2"]))
855 [Link](Paragraph(
856 "One behavior has appeared in every single month without
exception: over-leveraging in emotionally activated states. The specific
trigger varies — sometimes it is being close to the eval target,
sometimes it is being close to a strong session PnL, sometimes it is
after a losing trade — but the behavioral output is always the same:
position size increases beyond the defined maximum, and a retracement
destroys the session or the account.",
857 S["body"]))
858 [Link](sp(4))
859 [Link](callout(
860 "Awareness without structure is just watching yourself fail
in high definition."
861 ))
862
863 [Link](PageBreak())
864
865 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
866 # 07 — THE CORE PROBLEM
FlipperFile • 2026-05-01 [Link] • Page 22
867 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
868 story += section_header(7, "THE CORE PROBLEM")
869
870 [Link](Paragraph("Root Cause Analysis", S["h2"]))
871 [Link](Paragraph(
872 "After three months of data, one root cause drives the
majority of account damage. It is not a strategy failure, a knowledge
gap, or a market condition problem. It is a specific psychological
pattern activated under a specific condition.",
873 S["body"]))
874 [Link](sp(6))
875
876 [Link](Paragraph("THE PATTERN", S["h3"]))
877 chain = [
878 ("TRIGGER", "Account is close to the daily profit target,
eval target, or a session high-water mark", AMBER),
879 ("ACTIVATION", "Urgency or excitement increases. Cortisol
rises. The emotional system activates.", RED),
880 ("DISTORTION", "Risk tolerance increases. Position size
rule is bypassed. 'Just this once' thinking.", RED),
881 ("ACTION", "Contracts added beyond the defined maximum. SL
moved or removed.", RED),
882 ("OUTCOME", "Any normal retracement — which would be
ignored at normal size — triggers outsized loss or account blow.", RED),
883 ]
884 for step, desc, col in chain:
885 t = Table([[
886 Paragraph(step, ParagraphStyle("cs",
fontName="Helvetica-Bold", fontSize=8, textColor=col, leading=11)),
887 Paragraph(desc, ParagraphStyle("cd",
fontName="Helvetica", fontSize=8.5, textColor=LIGHT, leading=13)),
888 ]], colWidths=[70, 390])
889 [Link](TableStyle([
890 ("BACKGROUND", (0,0),(0,-1), CHARCOAL),
891 ("BACKGROUND", (1,0),(1,-1),
[Link]("#1A1D24")),
892 ("TOPPADDING", (0,0),(-1,-1), 8),
893 ("BOTTOMPADDING", (0,0),(-1,-1), 8),
894 ("LEFTPADDING", (0,0),(-1,-1), 10),
895 ("LINEBELOW", (0,0),(-1,-1), 0.4, STEEL),
896 ]))
897 [Link](t)
898 [Link](sp(10))
899
900 [Link](Paragraph("Why Awareness Alone Has Not Fixed It",
S["h2"]))
901 [Link](Paragraph(
902 "The journal contains multiple self-diagnoses of this exact
pattern — sometimes written on the same day the mistake occurred. This
rules out lack of awareness as the cause. The problem is that awareness
operates in the prefrontal cortex (rational decision-making), while
over-leveraging under emotional activation is driven by the limbic system
(emotional response). When cortisol is elevated, the rational system is
suppressed. Knowing better does not prevent it.",
FlipperFile • 2026-05-01 [Link] • Page 23
903 S["body"]))
904 [Link](Paragraph(
905 "The solution is therefore not motivational or
knowledge-based. It must be structural — the environment must be arranged
so that the correct behavior is the path of least resistance, regardless
of emotional state.",
906 S["body"]))
907 [Link](sp(8))
908 [Link](callout(
909 "If you need willpower to follow the rule, the rule will
eventually be broken. Make the wrong action structurally harder than the
right one."
910 ))
911
912 [Link](PageBreak())
913
914 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
915 # 08 — THE RULE SYSTEM
916 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
917 story += section_header(8, "THE RULE SYSTEM")
918
919 [Link](Paragraph("Hard Structural Rules", S["h2"]))
920 [Link](Paragraph(
921 "These rules are not guidelines. They are non-negotiable
mechanical constraints. A rule that can be overridden by emotion is not a
rule — it is a suggestion. Each rule below is designed to make the
dangerous action physically or procedurally harder than the correct
action.",
922 S["body"]))
923 [Link](sp(8))
924
925 rules = [
926 ("RULE 01", "FIXED POSITION SIZE — NEVER ADD MID-SESSION",
927 "Maximum position size is set before market open and
cannot be changed during the session. If the pre-session plan says 2
contracts maximum, the platform is set to allow a maximum of 2 contracts.
Adding contracts mid-trade because 'the setup looks strong' or 'the
target is close' is the exact sequence that has blown every account. The
rule is not about the trade. The rule is about the state."),
928 ("RULE 02", "PRE-SESSION CHECKLIST — NON-NEGOTIABLE",
929 "Before any platform interaction, a written checklist must
be completed: (1) Account verified — correct funded account selected. (2)
Asset set — MNQ, not NQ or ES. (3) Daily bias written — one sentence. (4)
Scenarios documented — at minimum two. (5) Max position size noted. (6)
News calendar checked. If the checklist is not completed, no trades are
taken that day. Period."),
930 ("RULE 03", "SSMT CONFIRMATION REQUIRED — NO EXCEPTIONS",
931 "No entry without SSMT confirmation across correlated
assets. This is not optional in the system. If SSMT is not clearly
present and aligned, the trade does not exist regardless of how strong
the bias is, how close the target is, or how much conviction is felt. One
trade. One confirmation chain. If any link is missing, stand down."),
932 ("RULE 04", "DAILY LOSS LIMIT — HARD STOP",
FlipperFile • 2026-05-01 [Link] • Page 24
933 "A daily loss limit of $300 is set as an absolute stop.
When this limit is reached, the platform is closed for the day. Not
minimized — closed. This rule directly prevents the revenge trading
sequence that blew the February account. The February blow happened
across multiple trades after the first significant loss of the day. A
hard stop at $300 would have preserved the account and the +$2,175 that
had been built."),
934 ("RULE 05", "LOCK ACCOUNT AFTER TARGET HIT",
935 "When the session profit target is reached, the account is
locked for the rest of that session. This directly addresses the pattern
of over-leveraging when close to a target. The target is the end. Not the
beginning of an 'extra' sequence. This was done correctly twice in April
— it needs to become automatic."),
936 ("RULE 06", "NEVER TRADE OUTSIDE THE MODEL",
937 "The two validated models are: (1) 9:30 AM 30-minute PO3
with SSMT + CISD. (2) 10:00 AM 4H PO3 with SSMT + CISD. Asian session
gold trades, impulse trades on news without setup, and counter-bias
entries are outside the model. Outside the model means outside the edge.
Outside the edge means gambling."),
938 ("RULE 07", "CORTISOL PROTOCOL — HIGH STRESS = NO TRADE",
939 "Before entering, a 10-second check: Is cortisol elevated?
Indicators — hands not steady, wanting to 'get it back', feeling rushed,
just had a loss. If any of these are present, close the platform for a
minimum of 30 minutes. Return only after a reset (walk, breathe, write).
The Feb 12!’13 blow and the Apr 21 loss both occurred when cortisol was
explicitly noted as high in the journal."),
940 ]
941 for rule_num, rule_title, rule_body in rules:
942 [Link](KeepTogether([
943 sp(4),
944 Table([[
945 Paragraph(rule_num, ParagraphStyle("rn",
fontName="Helvetica-Bold", fontSize=8, textColor=GOLD, leading=11)),
946 Paragraph(rule_title, ParagraphStyle("rt",
fontName="Helvetica-Bold", fontSize=10, textColor=WHITE, leading=13,
spaceAfter=4)),
947 Paragraph(rule_body, ParagraphStyle("rb",
fontName="Helvetica", fontSize=8.5, textColor=LIGHT, leading=14)),
948 ]], colWidths=[460]),
949 ]))
950 t = Table([[
951 Paragraph(rule_num, ParagraphStyle("rn",
fontName="Helvetica-Bold", fontSize=8, textColor=GOLD, leading=11,
spaceAfter=1)),
952 Spacer(1,1),
953 Paragraph(rule_title, ParagraphStyle("rt",
fontName="Helvetica-Bold", fontSize=10, textColor=WHITE, leading=13,
spaceAfter=4)),
954 Spacer(1,1),
955 Paragraph(rule_body, ParagraphStyle("rb",
fontName="Helvetica", fontSize=8.5, textColor=LIGHT, leading=14)),
956 ]], colWidths=[460])
957 flat_content = [
958 Paragraph(rule_num, ParagraphStyle("rn",
fontName="Helvetica-Bold", fontSize=8, textColor=GOLD, leading=11,
FlipperFile • 2026-05-01 [Link] • Page 25
spaceAfter=2)),
959 Paragraph(rule_title, ParagraphStyle("rt",
fontName="Helvetica-Bold", fontSize=10.5, textColor=WHITE, leading=14,
spaceAfter=5)),
960 Paragraph(rule_body, ParagraphStyle("rb",
fontName="Helvetica", fontSize=8.5, textColor=LIGHT, leading=14)),
961 ]
962 card = Table([[flat_content]], colWidths=[460])
963 [Link](TableStyle([
964 ("BACKGROUND", (0,0),(-1,-1), CHARCOAL),
965 ("LEFTPADDING", (0,0),(-1,-1), 14),
966 ("RIGHTPADDING", (0,0),(-1,-1), 14),
967 ("TOPPADDING", (0,0),(-1,-1), 10),
968 ("BOTTOMPADDING", (0,0),(-1,-1), 12),
969 ("LINEBEFORE", (0,0),(0,-1), 3, GOLD),
970 ]))
971 [Link](card)
972 [Link](sp(5))
973
974 [Link](PageBreak())
975
976 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
977 # 09 — IDENTITY & MINDSET
978 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
979 story += section_header(9, "IDENTITY & MINDSET")
980
981 [Link](Paragraph("Psychological Profile", S["h2"]))
982 [Link](Paragraph(
983 "A trader's edge is only as durable as their psychology.
The following assessment is drawn from three months of journal entries,
not from self-report. Behavioral data is more reliable than stated
beliefs.",
984 S["body"]))
985 [Link](sp(8))
986
987 [Link](Paragraph("Documented Strengths", S["h3"]))
988 strengths = [
989 ("Vision clarity", "The long-term roadmap — trading to
$100k/month, abroad experience, private equity — is among the clearest
and most coherent life plans documented in this review. This is not
common. Most traders have no context for why they trade."),
990 ("Analytical ability", "The quality of pre-session analysis
in April — multi-scenario planning, SSMT across three indices, correct
HTF narratives — is genuinely advanced. On days where the analysis was
done, the trades were mostly correct."),
991 ("Honest self-assessment", "The journal contains accurate
diagnosis of mistakes, including uncomfortable truths: 'I deserve the
loss,' 'I knew it was wrong and did it anyway,' 'cortisol was high.' This
level of honesty is a prerequisite for improvement."),
992 ("Delayed gratification", "The overall life plan — 3-5
years of grinding before lifestyle, no debt, no flash — demonstrates real
patience capacity. This same capacity needs to be applied intraday."),
993 ("Psychological study", "Using psychology to process old
FlipperFile • 2026-05-01 [Link] • Page 26
wounds and become more self-aware is directly applicable to trading.
Making the subconscious conscious is exactly what is required to break
automatic behavioral patterns."),
994 ]
995 for title, desc in strengths:
996 [Link](Table([[
997 Paragraph(f"+ {[Link]()}", ParagraphStyle("st",
fontName="Helvetica-Bold", fontSize=8, textColor=GREEN, leading=11,
spaceAfter=2)),
998 Paragraph(desc, ParagraphStyle("sd",
fontName="Helvetica", fontSize=8.5, textColor=LIGHT, leading=13)),
999 ]], colWidths=[460]))
1000 [Link](sp(3))
1001
1002 [Link](sp(8))
1003 [Link](Paragraph("The Identity Shift Required", S["h2"]))
1004 [Link](Paragraph(
1005 "The journal entry from April 7 — 'My Best Trading Day' —
contains a line that defines what the goal state looks like: 'This is
Disciplined Executioner behavior: Wait !’ confirm !’ act. Lose small !’
re-enter !’ win big. Scale when right.'",
1006 S["body"]))
1007 [Link](Paragraph(
1008 "The gap between the current state and that state is not
knowledge. It is identity. The question is not 'do I know the rules?' The
question is 'am I the kind of trader who follows the rules even when
emotion says otherwise?' That identity is built through repetition, not
through understanding.",
1009 S["body"]))
1010 [Link](sp(6))
1011 [Link](callout(
1012 "The model is not the problem. The model works. The
question is whether you can become the person who executes it
consistently — especially on hard days."
1013 ))
1014 [Link](sp(8))
1015 [Link](Paragraph("On Faith", S["h3"]))
1016 [Link](Paragraph(
1017 "Salah was identified in the initial plan as the foundation
— 'when this is off, everything else feels unstable.' This was stated in
the trader's own words, not imposed externally. The connection between
spiritual grounding and trading composure is real: both require
surrendering control of outcomes while committing fully to the process.
Five prayers. Non-negotiable. Start there.",
1018 S["body"]))
1019
1020 [Link](PageBreak())
1021
1022 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
1023 # 10 — VERDICT & NEXT STEPS
1024 #
%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%
1025 story += section_header(10, "VERDICT & NEXT STEPS")
1026
FlipperFile • 2026-05-01 [Link] • Page 27
1027 [Link](Paragraph("Where You Stand", S["h2"]))
1028 [Link](Paragraph(
1029 "Three months into documented live trading, the picture is
clear. The technical foundation is strong and growing. The analytical
framework is sophisticated. The journal quality is institutional. The
milestone of a passed funded account is objective proof that the edge is
real.",
1030 S["body"]))
1031 [Link](Paragraph(
1032 "The gap between the current state and consistent
profitability is narrow. It is not a strategy gap. It is a behavioral gap
— specifically: one repeating pattern of position-size violation under
emotional activation. If that pattern is addressed structurally, the
results will follow.",
1033 S["body"]))
1034 [Link](sp(8))
1035
1036 [Link](Paragraph("Immediate Non-Negotiables", S["h2"]))
1037 nonneg = [
1038 ("Return to Salah", "5 prayers daily. Non-negotiable. The
foundation must be solid."),
1039 ("Implement all 7 rules", "Print the rule system. Place it
on the desk. Complete the pre-session checklist before any platform
interaction."),
1040 ("Fix position size structurally", "Platform-level
constraints before each session. Remove the option to over-leverage in
the moment."),
1041 ("Gym consistency", "Physical state directly affects
emotional regulation. Sleep 7-8 hours. Protein intake. Cardio 3x/week
minimum."),
1042 ("One model at a time", "9:30 PO3 or 10:00 4H PO3. Never
both simultaneously. Never outside these windows."),
1043 ]
1044 [Link](trade_table(
1045 ["PRIORITY", "ACTION", "WHY IT MATTERS"],
1046 [[f"#{i+1}", title, desc] for i, (title, desc) in
enumerate(nonneg)]
1047 ))
1048 [Link](sp(10))
1049
1050 [Link](Paragraph("The Verdict", S["h2"]))
1051 [Link](callout(
1052 "You have the model, the analytical ability, and the
long-term vision. The only thing standing between you and consistent
funded account performance is one behavioral pattern that can be solved
with structure. Solve it structurally — not with willpower — and the rest
follows."
1053 ))
1054 [Link](sp(8))
1055 [Link](Paragraph(
1056 "April 7 and April 8 are who you are when the system is
followed. February 13 is who you are when it is not. The work now is
making April 7 the default — not through motivation, but through
environment design, hard rules, and the daily compounding of correct
repetitions.",
FlipperFile • 2026-05-01 [Link] • Page 28
1057 S["body"]))
1058 [Link](sp(8))
1059 [Link](alert_box("FINAL STATEMENT",
1060 "The goal of $100,000/month from trading is achievable from
this foundation. The path is: funded account !’ consistent monthly
withdrawals !’ scale position size proportionally !’ private equity capital
from trading profits. The timeline is 3-7 years from today if the
behavioral patterns are corrected now. The only obstacle is the 7 rules
above. That is a solvable problem.",
1061 GOLD, [Link]("#1A1500")))
1062
1063 [Link](sp(20))
1064 [Link](GoldLine())
1065 [Link](sp(8))
1066 [Link](Paragraph("Prepared May 2026 | Based on
documented journal entries: January, February, April 2026 |
Confidential — Personal Use", S["footer"]))
1067 [Link](Paragraph("Trading futures involves substantial
risk. Past performance does not guarantee future results.", S["footer"]))
1068
1069 # Build with cover for first page
1070 def first_page(canvas, doc):
1071 cover_page(canvas, doc)
1072
1073 def later_pages(canvas, doc):
1074 on_page(canvas, doc)
1075
1076 PAGE_NUM[0] = 0
1077 [Link](story, onFirstPage=first_page,
onLaterPages=later_pages)
1078 print("PDF built successfully.")
1079
1080 build()