Spaces:
Configuration error
Configuration error
Upload 7 files
Browse files- README.md +1 -29
- __init__.py +0 -0
- config.py +16 -0
- demo_executor.py +15 -0
- risk.py +14 -0
- sample_prices.csv +301 -0
- technical.py +12 -0
README.md
CHANGED
|
@@ -1,29 +1 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
این نسخهی اولیهی سایت (Streamlit) بهعنوان «اتاق فرمان» پروژه است.
|
| 4 |
-
|
| 5 |
-
## امکانات الان
|
| 6 |
-
- داشبورد ساده با نمایش Project ID و درصد پیشرفت
|
| 7 |
-
- بارگذاری/نمایش گزارشها (TXT/PDF)
|
| 8 |
-
- تولید سیگنال نمونه با میانگین متحرک روی دادهی نمونه
|
| 9 |
-
- نوار وضعیت و تایمر شمارش معکوس فاز ۱
|
| 10 |
-
|
| 11 |
-
## چطور رایگان دیپلوی کنیم (Streamlit Cloud)
|
| 12 |
-
1. یک اکانت رایگان بساز: https://streamlit.io/cloud
|
| 13 |
-
2. این پوشه را به یک ریپازیتوری جدید روی GitHub آپلود کن (از موبایل هم میشود).
|
| 14 |
-
3. در Streamlit Cloud یک اپ جدید بساز و ریپازیتوری را انتخاب کن.
|
| 15 |
-
4. فایل اصلی را `app.py` بگذار. بقیه کارها خودکار است.
|
| 16 |
-
|
| 17 |
-
### HuggingFace Spaces (اختیاری)
|
| 18 |
-
1. اکانت رایگان در https://huggingface.co
|
| 19 |
-
2. یک Space از نوع **Streamlit** بساز.
|
| 20 |
-
3. کل پوشه را آپلود کن. تمام.
|
| 21 |
-
|
| 22 |
-
## تنظیمات
|
| 23 |
-
- Project ID: `Ali_5_17` در `supertrader/config.py` ثبت شده.
|
| 24 |
-
- برای اتصال دمو در آینده، کلیدهای دمو را در همین فایل (یا بهصورت Secret در پلتفرم) اضافه میکنیم.
|
| 25 |
-
|
| 26 |
-
## نیازمندیها
|
| 27 |
-
```
|
| 28 |
-
pip install -r requirements.txt
|
| 29 |
-
```
|
|
|
|
| 1 |
+
گزارشهای تولیدی اینجا قرار میگیرند.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__init__.py
ADDED
|
File without changes
|
config.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
# تنظیمات پایه پروژه
|
| 3 |
+
|
| 4 |
+
PROJECT_ID = "Ali_5_17"
|
| 5 |
+
|
| 6 |
+
# درصد پیشرفت فاز ۱ (قابل ویرایش در هر زمان)
|
| 7 |
+
PHASE1_PROGRESS = 40
|
| 8 |
+
|
| 9 |
+
# تاریخ تقریبی پایان فاز ۱ (قابل تغییر)
|
| 10 |
+
PHASE1_DEADLINE = "2025-09-12"
|
| 11 |
+
|
| 12 |
+
# پرچمهای فیچر
|
| 13 |
+
FEATURES = {
|
| 14 |
+
"demo_mode_planned": True, # در فاز ۲ اجرا میشود
|
| 15 |
+
"auto_reports": True
|
| 16 |
+
}
|
demo_executor.py
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
# این فایل بعداً برای اتصال به حساب دمو (MT4/MT5 یا Testnet) تکمیل میشود.
|
| 3 |
+
# فعلاً فقط اسکلت کار را نگه میداریم.
|
| 4 |
+
class DemoExecutor:
|
| 5 |
+
def __init__(self):
|
| 6 |
+
self.enabled = False
|
| 7 |
+
|
| 8 |
+
def enable(self):
|
| 9 |
+
self.enabled = True
|
| 10 |
+
|
| 11 |
+
def place_order(self, symbol: str, side: str, size: float, price: float = None):
|
| 12 |
+
if not self.enabled:
|
| 13 |
+
return { "ok": False, "msg": "demo executor disabled" }
|
| 14 |
+
# در نسخه دمو، فقط لاگ میکنیم
|
| 15 |
+
return { "ok": True, "msg": f"Placed demo order: {side} {size} {symbol} @ {price}" }
|
risk.py
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
def position_size(balance: float, risk_pct: float, stop_pips: float, pip_value: float = 10.0):
|
| 3 |
+
"""
|
| 4 |
+
محاسبه حجم پوزیشن ساده بر اساس ریسک درصدی.
|
| 5 |
+
balance: موجودی
|
| 6 |
+
risk_pct: درصد ریسک (مثلاً 1 = یک درصد)
|
| 7 |
+
stop_pips: فاصله استاپلاس
|
| 8 |
+
pip_value: ارزش هر پیپ (برای نمونه)
|
| 9 |
+
"""
|
| 10 |
+
risk_amount = balance * (risk_pct / 100.0)
|
| 11 |
+
if stop_pips <= 0:
|
| 12 |
+
return 0.0
|
| 13 |
+
units = risk_amount / (stop_pips * pip_value)
|
| 14 |
+
return max(units, 0.0)
|
sample_prices.csv
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
close
|
| 2 |
+
101.62434536366324
|
| 3 |
+
101.01258895001317
|
| 4 |
+
100.4844171977497
|
| 5 |
+
99.41144857559354
|
| 6 |
+
100.27685620491822
|
| 7 |
+
97.97531750803793
|
| 8 |
+
99.72012927225441
|
| 9 |
+
98.95892237135931
|
| 10 |
+
99.27796146741642
|
| 11 |
+
99.028591091939
|
| 12 |
+
100.49069902898398
|
| 13 |
+
98.43055831948632
|
| 14 |
+
98.10814111547282
|
| 15 |
+
97.7240867608044
|
| 16 |
+
98.85785620313983
|
| 17 |
+
97.75796493582581
|
| 18 |
+
97.58553672827537
|
| 19 |
+
96.707678310354
|
| 20 |
+
96.74989205706959
|
| 21 |
+
97.33270727078542
|
| 22 |
+
96.23208809357249
|
| 23 |
+
97.37681180341211
|
| 24 |
+
98.2784025240049
|
| 25 |
+
98.78089686290677
|
| 26 |
+
99.68175281217118
|
| 27 |
+
98.99802495299684
|
| 28 |
+
98.8751347274782
|
| 29 |
+
97.93936529321913
|
| 30 |
+
97.67147721359312
|
| 31 |
+
98.20183268033131
|
| 32 |
+
97.51017192860598
|
| 33 |
+
97.11341840175001
|
| 34 |
+
96.42624570163042
|
| 35 |
+
95.5810400601317
|
| 36 |
+
94.90979392929488
|
| 37 |
+
94.89712933037598
|
| 38 |
+
93.7798189817407
|
| 39 |
+
94.01423467955779
|
| 40 |
+
95.67403685666766
|
| 41 |
+
96.41608101724499
|
| 42 |
+
96.22424546488338
|
| 43 |
+
95.33661650079854
|
| 44 |
+
94.58945820704771
|
| 45 |
+
96.28191280807545
|
| 46 |
+
96.33272056285148
|
| 47 |
+
95.69572491628213
|
| 48 |
+
95.8866404009496
|
| 49 |
+
97.98689553742844
|
| 50 |
+
98.10705448991007
|
| 51 |
+
98.72425759961749
|
| 52 |
+
99.02442791957331
|
| 53 |
+
98.67217807307979
|
| 54 |
+
97.52965987505766
|
| 55 |
+
97.18031715264478
|
| 56 |
+
96.97142291927
|
| 57 |
+
97.5580461104522
|
| 58 |
+
98.3970295243267
|
| 59 |
+
99.32813160563026
|
| 60 |
+
99.61371893088452
|
| 61 |
+
100.49886009515525
|
| 62 |
+
99.7444621541586
|
| 63 |
+
100.99733030939188
|
| 64 |
+
101.5102601298099
|
| 65 |
+
101.21216729470717
|
| 66 |
+
101.70068544124467
|
| 67 |
+
101.62511372822361
|
| 68 |
+
102.75674311567504
|
| 69 |
+
104.27655993209724
|
| 70 |
+
106.4621353386304
|
| 71 |
+
105.06563900314227
|
| 72 |
+
103.62152519771267
|
| 73 |
+
103.11705933476622
|
| 74 |
+
103.27709640421405
|
| 75 |
+
104.15326532533028
|
| 76 |
+
104.46890027257189
|
| 77 |
+
102.44669905674789
|
| 78 |
+
102.1404950441195
|
| 79 |
+
102.96846968672676
|
| 80 |
+
103.19856442209114
|
| 81 |
+
103.96057560240317
|
| 82 |
+
103.7382474597928
|
| 83 |
+
103.5374893908628
|
| 84 |
+
103.72405078185109
|
| 85 |
+
104.13410242905935
|
| 86 |
+
104.33240214918612
|
| 87 |
+
104.45141079499358
|
| 88 |
+
103.78074850870455
|
| 89 |
+
104.15831229502547
|
| 90 |
+
104.2801335660169
|
| 91 |
+
105.40961747392882
|
| 92 |
+
106.60853535383033
|
| 93 |
+
106.79369177131427
|
| 94 |
+
106.41840682122415
|
| 95 |
+
105.77967641376993
|
| 96 |
+
106.20317076783405
|
| 97 |
+
106.28051083618261
|
| 98 |
+
105.93665716061153
|
| 99 |
+
105.98025401744579
|
| 100 |
+
105.36025317349765
|
| 101 |
+
106.05828520756987
|
| 102 |
+
105.61115664278387
|
| 103 |
+
106.83566434758937
|
| 104 |
+
107.23915598938017
|
| 105 |
+
107.83273451261724
|
| 106 |
+
106.7378226668762
|
| 107 |
+
106.90720509993486
|
| 108 |
+
107.64776155103114
|
| 109 |
+
106.6940609492232
|
| 110 |
+
106.42784244321957
|
| 111 |
+
106.46045698991294
|
| 112 |
+
105.08733966966618
|
| 113 |
+
105.40249906170847
|
| 114 |
+
106.2486597092935
|
| 115 |
+
105.38914376846152
|
| 116 |
+
105.73968974712562
|
| 117 |
+
104.4274063358882
|
| 118 |
+
104.38871082662214
|
| 119 |
+
102.77293847191885
|
| 120 |
+
103.89435618015452
|
| 121 |
+
104.30325671809135
|
| 122 |
+
104.27863976221556
|
| 123 |
+
103.50347814304641
|
| 124 |
+
104.77723407320518
|
| 125 |
+
106.74433582245992
|
| 126 |
+
104.88635395801316
|
| 127 |
+
106.12251798846599
|
| 128 |
+
107.75016874161489
|
| 129 |
+
108.08818043818937
|
| 130 |
+
106.88891240585419
|
| 131 |
+
107.7522577233982
|
| 132 |
+
107.57133742132005
|
| 133 |
+
106.9674167935268
|
| 134 |
+
105.73735865785983
|
| 135 |
+
106.28789615383604
|
| 136 |
+
107.08070301975539
|
| 137 |
+
106.4571722900756
|
| 138 |
+
106.97774862714897
|
| 139 |
+
105.83340723752583
|
| 140 |
+
106.63526826939717
|
| 141 |
+
106.68183556782132
|
| 142 |
+
106.49526579591397
|
| 143 |
+
106.39351992338483
|
| 144 |
+
107.26240608039069
|
| 145 |
+
108.0128177202557
|
| 146 |
+
108.54228304460841
|
| 147 |
+
108.6799842546058
|
| 148 |
+
108.7578053825185
|
| 149 |
+
109.37618564451702
|
| 150 |
+
109.60868020369577
|
| 151 |
+
110.29123161056025
|
| 152 |
+
109.98111483704218
|
| 153 |
+
107.54627707293506
|
| 154 |
+
108.58510167479447
|
| 155 |
+
110.77208132176872
|
| 156 |
+
111.21344576533731
|
| 157 |
+
111.11329053205381
|
| 158 |
+
110.97684578815777
|
| 159 |
+
110.85779160038297
|
| 160 |
+
110.87520100868296
|
| 161 |
+
109.75318227993608
|
| 162 |
+
109.23608782201585
|
| 163 |
+
108.23906099436559
|
| 164 |
+
108.48786015575337
|
| 165 |
+
108.1912190033825
|
| 166 |
+
108.68643032736045
|
| 167 |
+
108.51172716761795
|
| 168 |
+
109.4980623554392
|
| 169 |
+
109.71159625677464
|
| 170 |
+
111.90229598574437
|
| 171 |
+
110.00593506285328
|
| 172 |
+
109.35901837459838
|
| 173 |
+
110.26050526624708
|
| 174 |
+
112.78883097305348
|
| 175 |
+
112.54019619533801
|
| 176 |
+
112.58386518851641
|
| 177 |
+
112.3575509460028
|
| 178 |
+
113.68900805859039
|
| 179 |
+
113.40170019511437
|
| 180 |
+
114.08177003499247
|
| 181 |
+
113.76196843609381
|
| 182 |
+
112.48940968084781
|
| 183 |
+
112.80295740131125
|
| 184 |
+
113.30614221474657
|
| 185 |
+
114.59936809727884
|
| 186 |
+
114.48892107086152
|
| 187 |
+
113.87155900714916
|
| 188 |
+
114.43432010376819
|
| 189 |
+
114.67505719600591
|
| 190 |
+
114.95572227312856
|
| 191 |
+
114.88260956938127
|
| 192 |
+
116.04294813937504
|
| 193 |
+
116.41244085575077
|
| 194 |
+
118.31709956409175
|
| 195 |
+
119.42815626265225
|
| 196 |
+
120.08720605875246
|
| 197 |
+
118.4597677181362
|
| 198 |
+
119.06208699843184
|
| 199 |
+
119.4823692020789
|
| 200 |
+
120.29332087488245
|
| 201 |
+
121.3377629695897
|
| 202 |
+
120.93688477780077
|
| 203 |
+
121.76089039625118
|
| 204 |
+
121.1985849652321
|
| 205 |
+
123.15346304024112
|
| 206 |
+
121.82151137372388
|
| 207 |
+
120.0608228133251
|
| 208 |
+
118.410101547501
|
| 209 |
+
117.51954596333795
|
| 210 |
+
116.40043056477822
|
| 211 |
+
118.35650946848186
|
| 212 |
+
118.03000997040368
|
| 213 |
+
116.68733418102624
|
| 214 |
+
117.80171715780602
|
| 215 |
+
117.21519321898444
|
| 216 |
+
115.97833984244303
|
| 217 |
+
116.85417877009235
|
| 218 |
+
117.47754094667037
|
| 219 |
+
117.04258426371514
|
| 220 |
+
118.45012426395638
|
| 221 |
+
118.5792258436671
|
| 222 |
+
120.1961754425244
|
| 223 |
+
120.6989163245243
|
| 224 |
+
122.25772186514416
|
| 225 |
+
122.3671245615696
|
| 226 |
+
121.14738016459056
|
| 227 |
+
123.59674881365196
|
| 228 |
+
123.05097464566938
|
| 229 |
+
122.85213678278049
|
| 230 |
+
122.15173827785924
|
| 231 |
+
121.94834382889468
|
| 232 |
+
122.19101326997648
|
| 233 |
+
122.39284344885047
|
| 234 |
+
123.05386373644917
|
| 235 |
+
124.84602194542474
|
| 236 |
+
124.72555737363624
|
| 237 |
+
123.4924366381898
|
| 238 |
+
122.31011851168017
|
| 239 |
+
121.64436399348105
|
| 240 |
+
119.97016818586211
|
| 241 |
+
120.79519801030109
|
| 242 |
+
120.29698444667002
|
| 243 |
+
119.98599946836717
|
| 244 |
+
119.98410798552916
|
| 245 |
+
118.58748756093372
|
| 246 |
+
117.7261712001577
|
| 247 |
+
118.40088272584566
|
| 248 |
+
119.01942185663195
|
| 249 |
+
118.57624992593131
|
| 250 |
+
120.38678484005678
|
| 251 |
+
119.08105791749904
|
| 252 |
+
118.73607070734406
|
| 253 |
+
118.50523096420858
|
| 254 |
+
115.71214596406205
|
| 255 |
+
117.64967477767811
|
| 256 |
+
118.01600679221818
|
| 257 |
+
116.9714174103104
|
| 258 |
+
119.02259085316783
|
| 259 |
+
119.60825285334022
|
| 260 |
+
120.03777899336218
|
| 261 |
+
119.43078059516213
|
| 262 |
+
119.53700331919735
|
| 263 |
+
118.011323002968
|
| 264 |
+
118.80634909739284
|
| 265 |
+
118.43191077854962
|
| 266 |
+
118.56595897510424
|
| 267 |
+
119.76801383730395
|
| 268 |
+
120.052761948153
|
| 269 |
+
120.31522939361628
|
| 270 |
+
120.59172869843846
|
| 271 |
+
119.85845709454314
|
| 272 |
+
120.69446181397741
|
| 273 |
+
122.2378209247819
|
| 274 |
+
122.99662658487983
|
| 275 |
+
123.88153539934471
|
| 276 |
+
123.00425388042652
|
| 277 |
+
122.1364666575536
|
| 278 |
+
120.69559063326176
|
| 279 |
+
121.9278437040902
|
| 280 |
+
121.67366383648282
|
| 281 |
+
123.0735077789638
|
| 282 |
+
122.291596096277
|
| 283 |
+
121.85408711344843
|
| 284 |
+
121.94951220063967
|
| 285 |
+
122.87096226929918
|
| 286 |
+
122.9317124650987
|
| 287 |
+
123.14283722010641
|
| 288 |
+
123.15936478741203
|
| 289 |
+
123.336552507688
|
| 290 |
+
122.22008248980325
|
| 291 |
+
122.30100959077652
|
| 292 |
+
122.11443059726506
|
| 293 |
+
122.0576061163792
|
| 294 |
+
122.54994267231586
|
| 295 |
+
121.86926453130697
|
| 296 |
+
121.78475650390234
|
| 297 |
+
121.48739462112883
|
| 298 |
+
121.9046966261037
|
| 299 |
+
122.68946727711929
|
| 300 |
+
121.7340420147456
|
| 301 |
+
122.3199524458482
|
technical.py
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import numpy as np
|
| 4 |
+
|
| 5 |
+
def sma_signal(df: pd.DataFrame, fast: int = 10, slow: int = 20):
|
| 6 |
+
df = df.copy()
|
| 7 |
+
df['sma_fast'] = df['close'].rolling(fast).mean()
|
| 8 |
+
df['sma_slow'] = df['close'].rolling(slow).mean()
|
| 9 |
+
df['signal'] = 0
|
| 10 |
+
df.loc[df['sma_fast'] > df['sma_slow'], 'signal'] = 1
|
| 11 |
+
df.loc[df['sma_fast'] < df['sma_slow'], 'signal'] = -1
|
| 12 |
+
return df[['close','sma_fast','sma_slow','signal']].dropna()
|