From 2750ec443e1a47eb49d6d7b59e70f0f096a2869d Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 29 Dec 2025 13:31:35 +0000 Subject: [PATCH] Using Kraken as Market provider --- config/__pycache__/settings.cpython-311.pyc | Bin 5561 -> 4528 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1642 -> 1501 bytes config/settings.py | 35 +-- config/urls.py | 2 - core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 1122 bytes core/templates/core/index.html | 235 +++++++++--------- core/views.py | 36 +-- db.sqlite3 | Bin 0 -> 40960 bytes requirements.txt | 2 +- signals/__pycache__/engine.cpython-311.pyc | Bin 6667 -> 7581 bytes signals/engine.py | 28 ++- trading/__init__.py | 0 trading/__pycache__/__init__.cpython-311.pyc | Bin 160 -> 0 bytes trading/__pycache__/admin.cpython-311.pyc | Bin 1960 -> 0 bytes trading/__pycache__/apps.cpython-311.pyc | Bin 719 -> 0 bytes trading/__pycache__/models.cpython-311.pyc | Bin 3712 -> 0 bytes trading/__pycache__/signals.cpython-311.pyc | Bin 1329 -> 0 bytes trading/admin.py | 26 -- trading/apps.py | 9 - trading/migrations/0001_initial.py | 59 ----- trading/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-311.pyc | Bin 3396 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 171 -> 0 bytes trading/models.py | 50 ---- trading/signals.py | 16 -- trading/tests.py | 3 - trading/views.py | 3 - 27 files changed, 171 insertions(+), 333 deletions(-) create mode 100644 db.sqlite3 delete mode 100644 trading/__init__.py delete mode 100644 trading/__pycache__/__init__.cpython-311.pyc delete mode 100644 trading/__pycache__/admin.cpython-311.pyc delete mode 100644 trading/__pycache__/apps.cpython-311.pyc delete mode 100644 trading/__pycache__/models.cpython-311.pyc delete mode 100644 trading/__pycache__/signals.cpython-311.pyc delete mode 100644 trading/admin.py delete mode 100644 trading/apps.py delete mode 100644 trading/migrations/0001_initial.py delete mode 100644 trading/migrations/__init__.py delete mode 100644 trading/migrations/__pycache__/0001_initial.cpython-311.pyc delete mode 100644 trading/migrations/__pycache__/__init__.cpython-311.pyc delete mode 100644 trading/models.py delete mode 100644 trading/signals.py delete mode 100644 trading/tests.py delete mode 100644 trading/views.py diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 6cfabd5f4759435e4d859fd87f3b87f875b124c5..0cbcb9c2c431828adb0ac9de63d8da8abea579d7 100644 GIT binary patch delta 797 zcmZ9J&ubGw6vtzY8tP~Hicrc)X!XQZNTSKa(n)H-Q zB6t?c9_*oqfKU%!)Eq?o1H6eMLdYrLKQJJOM`vmR%|3YF_nkMNnRzgu3hy%6H;N)7 z7S~_jYOHGr{o;#hxF_a!^nLax?!r7o>p}y=!ilSnNd#hK9^#O&ypZhp5Q5YR+a*y* zlLc5LF$j`4%LHUdk}*r1At~mTxnp%@QnS3)MUobfCGMZi!(WCR7^eb4Z&|YFvLuTR zBoFdAgcBJ?EIFtG6lbYZ%&ukmKghC!FM%@4lNAA}Gqag?UrgiGqd!-}ImhV>P(J#5 z<$>X7UxYQsrFppY0y(IPm7k^hh3S~*E3DgJUCD6KGFk#`kQ`hlB@pi*WAlUbO2jUE z?1|c8Z-KdO?`OLq-?zWWCHt=LU?U3qyUqH6347+=?!(7c6WV6`*^|bhwbqeYbK(tQ zfn*`5#yJ3BJdoWgMQ#Pw*A3-l^mO@WiT0ujpku1&zD6mB`zkH zRW4;FBdPtAz0<1L$HB5pSciW>duQ+?Si@Z@Bv3S!o=Vj@l{Kc)lW7Qr!$3* zRO$~v+DPS)LzDxp#HE#0RaNip6-$m3xl&ZAe_*9b?X@#&yV#qEk>;8AdFOebd3Q$p zgYTEn^mk6D1K{z;(j%011Mn9i?P2U-@^}5m=~t9L2jI|43Q=(Qxg|$&9_ZzU;0PS0 zfxtXzYXQ8jm8dal%)lE2E91~{N&|3)XLFb;CZMl-A5OxX_?)TdRzz{ba2onCn}z`c zg9e5Wm9ubO80JP`gd2tLao6!2gHi5=V23km9{}7qj&7-a6##HBOHz3KfUG%&n=myo z2j{z+;Cv>OS9CnW@E;Ex1qCJ!1+xUceEh0s{O>U z%nJNa3o|Q~ph>X`@0vV9@ZLATq`EJJx>Ya2?HA}=VeFK`uY+fE#K9>J&e{}kkwGCS z(Qu6mzz19uGHDQqS3k0R%Oq^78$RI+xneY1EGQD%kMdAN1@(P%wyYeeUQ?2k2n9ts zED5sq#yWiMnn@rEvdrfM?H_A|>eVJ~zs{&jCJB#?qauPZFFfTXAsWLRd!j6_pkhHw z*u37Bi`*&OY&pNOJ*EQ|ZN(npL+^4nTKr1Ml%!%7mlP#AN={VgOyd8~ct=5dPs`a$ z6;G=W?nn3e?B_xO;=T^$FY*m*d@YlVZLS-^ZhAds1lzH6+6Xqb(mTz}R%)kVnVY+{ z*sx{~cu5wNhPA9bUKaP~1J*|Gdh+8$a=l?Oyex*1jktWWm5Mhi7Q@G~jZLI6{K8TY zgSuh*9OG6?yevO0N-*;!pGVNR&*-i!NHK*xbXgJ7NJM#FLdxM@Q&E)EyO%pvF03|D z0f}Ytp-{*v2NwqSE;qQSe^3;~Vqv@0>qGJzjg3 zI6>bJ*4*K`yQAc@8arEOXPYIEnC#WqaGeeR*?;BuP-ke|z<`6r4G>`ZjRyR{K5))* eco#QiGst!)dDKZ#O>)IKLZ1VVK2=?0Rq8*#&)VSt diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 69b1eb0b27104ed4371f7c805457ccc731a4f44f..34e26a2e9ae5d00bfc39740fa9b494b8f503866c 100644 GIT binary patch delta 384 zcmZutJxc>Y5S{(Hz1#;u5WD!%1S}K_|A38!o!BknA(=B6?s9O!!Zd1U8@5o=3My#l zZ%Grd5*r&2Y%QF<7%LyV;mw;jyUTt=uOU9faR7w9yZzGz3Gn8cIrOji`X+G$2nLWL z&sfe4&xH}p^&*qGGOE@x^Kxx80}iP`MU|sB8n0-9+BKuw<%=#ieyVzn`7Pyk>eEbP zgWUQtZi2xu1b7bbIlvQfhG7gq+jXAOl$e2ZG}r&{U~~YE>nwgbV%OY$ineXZ-K}`4 zlLU)Sl1xMF9rwG%=2@8yN_hmBp7km^OnRz#>mMJb{#Dxx4R;!r0SaS(zKYA;Gc(n4AX3sOfB2g?=w z2RbM?_(v2(O2Em@N%0SO7aOSH$9>0pkN3R~?%s?KvvX@%SrBEf?Ra|_;9Zimv;p{D zMgZ5qzy^kx5};7A6(q45s3Ep-NNkdD9ArXj(*%=13w2vZpnywQ##Q`elg#vuLGn1< zC;)e&e=D(4apUgAq?s^XGM4RLmO83!y41H)bF|`0i_Q$8=2DfJZIOO&{S9u5DKVY+ zg*%_R1umrc{~4Cs1=;iY$2oMaXecIC7J7C5pw4RTOoA8rtGZPgiK*kTM$K{J9P_L7 zqsBt5QEx@wL8OWuu`v*jqo5gyw}yxe%ffpYW%xEO6{ys4(`&ggmTn&66JtV%;vb-y zMf?kojZQzo)bQ!U45wtXP`q00t@k#barp(8`&i=@vZPU*SI&%2lb@1(TofrkcV=a+ diff --git a/config/settings.py b/config/settings.py index 5c208b3..88b957d 100644 --- a/config/settings.py +++ b/config/settings.py @@ -49,11 +49,7 @@ CSRF_COOKIE_SAMESITE = "None" # Application definition INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', 'django.contrib.sessions', - 'django.contrib.messages', 'django.contrib.staticfiles', 'core', 'signals', @@ -64,8 +60,6 @@ MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', # Disable X-Frame-Options middleware to allow Flatlogic preview iframes. # 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] @@ -82,8 +76,6 @@ TEMPLATES = [ 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', # IMPORTANT: do not remove – injects PROJECT_DESCRIPTION/PROJECT_IMAGE_URL and cache-busting timestamp 'core.context_processors.project_context', ], @@ -99,36 +91,15 @@ WSGI_APPLICATION = 'config.wsgi.application' DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': os.getenv('DB_NAME', ''), - 'USER': os.getenv('DB_USER', ''), - 'PASSWORD': os.getenv('DB_PASS', ''), - 'HOST': os.getenv('DB_HOST', '127.0.0.1'), - 'PORT': os.getenv('DB_PORT', '3306'), - 'OPTIONS': { - 'charset': 'utf8mb4', - }, - }, + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } } # Password validation # https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] # Internationalization diff --git a/config/urls.py b/config/urls.py index c19926c..ad15eb0 100644 --- a/config/urls.py +++ b/config/urls.py @@ -14,13 +14,11 @@ Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ -from django.contrib import admin from django.urls import include, path from django.conf import settings from django.conf.urls.static import static urlpatterns = [ - path("admin/", admin.site.urls), path("", include("core.urls")), path("api/", include("signals.urls")), ] diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 6867ddf286a519cf1754ac97038f9f1e4605fbf2..278871626bb41e8a9c3920da179d42e7d6b6e236 100644 GIT binary patch literal 1122 zcmZWo&2QsG6n~Sk9Vf*b(o!fNrIuQWO$CYALs?Y_)TN;us@+vTq-{A=Zag?Hi5{*cB{QkUR-4#7jP!6r4RlWjsIPSsL%x=j(&uV7oTm31hnf5}e@ zB-A+bY{n7g9Of}@3APisj%U>>H5<0(&gIvoz(tcrTApoMg$yb)4|iBN4e8jN!V zGYT{1c7-*B>w8@G26<`DzG$*Qa1CvqktD*nyrN;c;(LO%MIg6i>rC_Fos#TXskz(q zM6<-&tkM)dFSUIBdC;&btQ2Rm@3K}tOIy$l~bMs)yD7OqWx^Xa!cU++A+ zchosGZk!o6o*FlQGj5(5i)Y5-!N-xJs55`&&7+r3^ViSv*B@vPv}eDMy%YgaXRg#B z|K_8252p{O<^J$_h7wWa$ytY2J<^}5%b`q08oXu>#-|3;#VD=hvc9T>W9M{i;cRT7uPg+UnCvgP58>DB(iDA?QI{s@lL-~^?SdM*g$k1I!@|TuH%hUh$T{~CE!96oTjQ1oHkCdQ%ZHHPf-Q6#oP5Eq{V!1Q7#*Ku^61OfEk4%~~s}guETzy!YnKoA>c! z|CpMZL_mL+PRlpL2>m0JfI>sz+l$SscSs^=|k4VB6wxYJ2mwh>6 zP1s6a0Xh0B%Et_88>QrbMYzqB#N#E*3Oks3CUHQODRvA@K~k7$;|6iCE(zZu#bJlk z(8(RJK1WUTVt6pV9fEo^GQIeJgpqaJXHRNMhV;}glZK3tBN^en5Q~o7QAND#(>piA zMx+^HvEUS;@pC3}9#TaPq;a2SxGAxj;0&RP639l>kPjiNqhJ8&1AY_l`WecBvKL`< zK_mp-GGfihA=Gg+ss)BI*;w21yRNY^)~upqm`+Labc(T~)l62_EK-D_XmFxoXUC+( zv9ZH61GA!Od6`C{=(;tt(Wqy1VsquT>;5P-9=l@|nMF#b-iU4DnzqgA7Upvgw;tSE z&pj%9yS|;<+IaYA=m{Nfc9(G8LP76tKq2MQk+Efgahls~zxB^Y15iq2p ze1hU%s@P+67IZo#*hj*3LMINxyUY_2H9@DJWy{3I+3Mq}!>U=li}flaG+QI|spl4T zob~hDF>%eyxOE;8-gFVJ3n+TO18bo->ila}J65%hy4+QlU#ly}>PkmVchz)jqo<`_ z{(P+6Xlpn2)BEXH3$5?^ljojY`z`Y<)5;BG^zo;?`Q?6crISo|lj(kPxtsi=lf2$d zUhiF8=v}zfU%GryZ>QE?g*r>Q?ozJ5xODJS`|4MJebZUI)m^+bn2pWI0|cyf_w9L< zIJbYby>RVisS{uA##h^s)e}e(07x&wM(2TX`E06G0Q9V<>X{|ul?i3g0?%(HPYlgf z1`zb;;Me{qqL;+gPk@~&H*I26ExbmrfGYk1-V @@ -8,11 +8,15 @@ {% endblock %} {% block content %} +
+ +
+ + + +
+
+
-
-

Analyzing your requirements and generating your app…

-
- Loading… -
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

+ +
+

{{ active_symbol }}

+

{{ signal }}

-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/core/views.py b/core/views.py index c9aed12..b7c5e23 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,25 @@ -import os -import platform - -from django import get_version as django_version from django.shortcuts import render -from django.utils import timezone - +from signals.engine import generate_signal def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() + """ + Renders the home page with a trading signal for the active symbol. + """ + # 1. ACTIVE SYMBOL STATE: Get symbol from URL parameter, default to BTC/USDT + symbol = request.GET.get('symbol', 'BTC/USDT').upper() + + try: + # 3. BACKEND INTEGRATION: Generate signal for the active symbol + signal = generate_signal(symbol) + except Exception as e: + signal = f'Error: {e}' + + # A list of symbols for the dropdown selector + available_symbols = ['BTC/USDT', 'ETH/USDT', 'XRP/USDT', 'LTC/USDT', 'ADA/USDT', 'SOL/USDT', 'DOGE/USDT'] context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), + 'active_symbol': symbol, + 'signal': signal, + 'available_symbols': available_symbols, } return render(request, "core/index.html", context) diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..4df9b4e4a08bb157d5c18b044765a74c40ceedbe GIT binary patch literal 40960 zcmeI)Z*S5-90%}re_+gP^MQs3#^lmyT%+5d8z@^$L{}3cD~_>59yK?(;VHDU?c99G z^r?@10lpi3W_%OIXTAcjr5#iTCMKFlzRh4Db#XbB~cj+v!k`tV@?A zS(Y9UB1zJWc+87Ov?Rm}e_gc5(Tg#^XQb7Jys-F5N~IiW>Bi!hg|Cb67w%vBKK~=- z%zqry5>*g@00bZa0SG`~Vg$}s=aT8IE%~kM(StT~dCQ`0*KF9-V?UD(t38w*5`2!H`Nusa7hM%k^-jzOC-05^1_6OWbO*Q}4;|VOQHt7UvO^2Q|?GtOb-B{7?mDyx^ zPnElcAQzi2sMWGfm$@#tEt8!dafbyRHfgSr*Yf%G_$G;vxMXbW&xjJQys*7OD#ouH z`jHqomZEm^(?N!x^)fuZ+jwav9^`nXzvE~yFWH-Z)@=-A-Qb+!XK*-p5k#sGkDc}> z1W`NK&Ee@p-I__HE9$5-J>EGp8!yj_H;6g^P2%ZPB7OU|T<;}$Z@O^VtK(p5jTfh5 zqYtN+Xxn8=oN0GNN$u9z{}fB*y_009U<00Izz z00hD>_`~%-QUL-GfB*y_009U<00Izz00bZ~(E_;tf1<;S!9f555P$##AOHafKmY;| zfB*yn0bKth5g-5o2tWV=5P$##AOHafKmY=hFM#X+$&WEc2muH{00Izz00bZa0SG_< g0uaFW{~-q;009U<00Izz00bZa0SG_<0+TQB6A^Y;;Q#;t literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt index c494051..2c24186 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ Django==5.2.7 -mysqlclient==2.2.7 python-dotenv==1.1.1 ccxt +pandas diff --git a/signals/__pycache__/engine.cpython-311.pyc b/signals/__pycache__/engine.cpython-311.pyc index 5cec9057b4e83ebb1a65b030d41605fe2b5e2e70..af028bd9cd3c4040d4b7b4f0b25ef80dce5b0c9d 100644 GIT binary patch delta 2051 zcma)6OKcNI7@qOI{I-b`vk`erN&+}QC?pgJ)NPzcLy1Vi1{$?#y76v;gR`5CH-x%2 zNqZ?39D?>%iip~ZQk6riNEJtjR4MAAa%d#bN=QgOwc=nERYLUAnO)lop|8>Ix8MAa zZ~uR0G#5Lr9`t|Z^SJ>Td(R(Fx&4>@ipN7{40#_vf|t*?iZYZPG9$AxC-br(J3kZh zj0@x(#vmKMd^^;_svmC#I+ZAm37Tw;W`L(5$T177ag41tZh3?5JeT8ee>s0P$K~L4 z2LRuY*B*IR?OvzHm3>67A=9R?9OonJvpAB_o{Fm5=HXb<0B}8Jb#{_ zfivJ7GX!Q}MPZgi$UaNLf0bFEHUw0*k`gG(0Wje#^Bg-4_uCAUg+Y%of zu!yr~@U>pbB0|<#Qb=T-B?-bx8j0Dgv!p_dB^km>I*F{SER@LBc5BmV8L66%#uPny z8p)C_p)n1kEQ=`m(HPby(Ge`2QPfWK6h^W_{Qb#MEse5mcAhq^%1Bd7F-TH3Qb9B+ zO--fLaU`9UQfX;4t+W}3;ek_h+fB!0CIU@%T21K@x5*}x=X8@lWBtSQScQyer_;%^ zrYk1N_U}w)T+vNm@44h@NgY>uG1jo@B2#5bPid<0Ev$!5<0shgqB~>NH$n<9Ia|g@ zi&5ke+han-bjV{Fy5R^R<4@Q#+eA1mEpv*TusQG`5W4iiC;3bHx&9&#Y8viW*FW>r zG!_HSD!vE^%)MT$_HysQhe7dPu=#GVdEw-Zp_Smi)!@Dh+y(B*15e;mvCD)!BD^F%MS zaW&LZ1dzn6#RuWW0!rQLBS4;IpZzT;Vu4dHpN=%MA);4pA|jrSY}_GjA3a$O6*1is%A>tycKhr2o) zciJK49f4RAx5U)O>bRvkj`F53u`eBl) za?`T(W6N^O?PIr(6;7O-1CN369Uq2Uj1Rp>qdQ5=*U)67(G1>2c!u5x2qS`cH-YRX za!y8ctf+F^p|qBi(wQhB(&VTtMYkFWAr9M(8$##yMiOi~(^5ts!P-oQURB7}FI_tIWA zS*iQ~G4)+5tCRYz)Pt1Kd*s(`6evqXINU|eF$%9xc$Gpog&qRW_mxrf=_x!we7hGX ze1niIhu>Yh__M#jw9qRJZzj-(n<=Hcg6Yq2go54sf499cglb-<3D36uKf11DuIt)u z{1&Qvi*{@>u@gfk8}A($FxgXGhZ7NgP2ZKZFa@lo)8zj7x1~^29lwuH64lN{sd}F7 z@$cbQxW}sfIBg(GAx^?5AP;l%&d12G@|u--%jj_OY_|9+9}G&O?)$Je^jeIB8t0-4>{a P{vxPA)L5$RWoh(ZYh3b4 delta 1229 zcma)*-%C?b9Ki3d{ob6knmQd_&6!sV#HslUqfp5bW2lJ;t?TY}TWoi7?zI$_`p`?{ zLv|h`l7dR|rS=c_5FtHTM8yH42nyeVy;%>P?_Ek}zrO5#_@3{tbH3+%ce~?yQ_%yD z$H`EMv__Ioor^`P%R*N?{qoP4#o0P8%i#|;|Ke-k9B>Gl^8}65%El;^>wQxfjW4>N7G?MK)BZCs~M9 zpGl8rQib{xW`tdxjwNI*t`f_S3d)2IM;Af1a9rqWgu{bLKTk2wYu)lt{%rB(7i zv(#GUn*2Pp7Fvz0M%IVV%`+%K?VoQ}_tD>z;@CiL$@7tQ9ij$Q4Y1?Kj&KEnjnQGio^A1lSM-^9fdQOo2det@tcUuLGV! z-M7w%?2uML(TjqhihxQ$6`;`jzuR8+iw8oGu)FR5=z1sfm#!T+TT(Fwy%YZA@F)=m zd;0r{Fmj@ANV5La_s(4q8_J|oNiF`jt57uq&7c8VwJMh{xdCr{HBiSkHpAIZ16lxQ z0R0q_fMDLup)haI%$01&hu@cXl*6nMZ(P+>ME_S&JsH>J6dI-02Ha9{s~?_IvLg?K zStn&pk#$r|7r!fNrWMA@oC2u5W$#R9l&O^3g~o6&SnIX0MPHa56yc#@j{wo%0Y@|t A?f?J) diff --git a/signals/engine.py b/signals/engine.py index 87e665a..b7ef68d 100644 --- a/signals/engine.py +++ b/signals/engine.py @@ -3,8 +3,32 @@ import ccxt import pandas as pd def get_ohlcv(symbol, timeframe): - exchange = ccxt.binance() - ohlcv = exchange.fetch_ohlcv(symbol, timeframe) + exchange = ccxt.kraken() + # Symbol mapping for Kraken + symbol_map = { + 'BTC/USDT': 'BTC/USD', + 'ETH/USDT': 'ETH/USD', + 'XRP/USDT': 'XRP/USD', + 'LTC/USDT': 'LTC/USD', + 'ADA/USDT': 'ADA/USD', + 'SOL/USDT': 'SOL/USD', + 'DOGE/USDT': 'DOGE/USD', + } + + try: + # First, try the original symbol + ohlcv = exchange.fetch_ohlcv(symbol, timeframe) + except ccxt.BadSymbol: + # If the symbol is not found, try the mapped symbol + mapped_symbol = symbol_map.get(symbol) + if mapped_symbol: + try: + ohlcv = exchange.fetch_ohlcv(mapped_symbol, timeframe) + except ccxt.ExchangeError as e: + raise Exception(f"Could not fetch data for {symbol} or {mapped_symbol} from Kraken: {e})") + else: + raise Exception(f"Symbol {symbol} not found on Kraken and no mapping available.") + df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms') return df diff --git a/trading/__init__.py b/trading/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/trading/__pycache__/__init__.cpython-311.pyc b/trading/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 6094d67b6e3783a2d01a6679390d3779a2ba83c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmZ3^%ge<81RKo)GePuY5CH>>P{wCAAY(d13PUi1CZpdP{uRQ@6CH}=FRWT zvwyBuD}YTbf9d{F0Qg-BdDG6BvmXe+AvoX=4}4-0BKd+>@D)=@dBszG&D4-r9nCBH zC9~w~rtX)`vR^SP1PZVUPH_*M5+z$>`3A=dzzL45nd7OIj#g!=T+mg~Zz8umGIDPC zO|@f;^8`oM2#ol=lFtvnsYa{EcMRCpD3~WzmUoqRELjTZiZ-X z9pyuyU=jz+0#!`aA*SXO%%Y>1B}c_bG%-1}{-=TG2K2Tl<@>1-Zr-ZvLbt5I_Nirw zie>p7C-NjeZdvyt+sibpgxd)XmDCfJwjEf=(2$C$`;@JBIL%hr@gjyNC~a(~@?$uY zQNMh)p?i+Cr?(CKJ=$Rr#>l+-n4~{0g7Fh3fA|K-(Y)o3alZ#3}5RO>G|@ z5VMHTslxau;$g>^0H&#Hwexjw6;N?V`RqQDhvX1;3w$EXlY?`|I8Jb6Z4JU9?@)T5 zw_O;$;73DtxedTB*)5FPt-)i`!Z20O<)P4cv_l!Ip@*2>q@m@e$;KBC?VwG$wB*#= z5G6+MMR=)%(pldUWy@-NHs_YbWlZz)^IdiW8TJN}@7}xsLF2NOWwG;jko?(&#JDy9 zQm#Fnn*DM4r{(?6pBmE-ts|#rEcK10C&tRDvGU98uM0h+)i+wP-pVre8hY1DOs>S_ zcYsYwBCmibWe4GDK%#mcZku|ZWz`8=KpQSmU&+Fj0Hi2LXMP6>MwLH_F&|GXbXNze zqTL|_xC+ezmfN)IlVZZzvV+Y|qumKY=B_iDJMrr1WW$cayN&c>Gl{XNU8YY9i!=F6 z7sYcymK@V1DN7>%1fseY;#Yw>Sutm2l4f1yE>>eD3K-qQ8$p@SbB^YLg;pc#+$1eW5_p1`~DfAxW?l9>Vgn>^C`H`Y;#6TmqV$ojQf7gO49Id$8Dt#TXWU f8=Aj;sr9WM)cR11p*Fn6Cq1~?hnsQUQ(XT7id@1z diff --git a/trading/__pycache__/apps.cpython-311.pyc b/trading/__pycache__/apps.cpython-311.pyc deleted file mode 100644 index b12213842b1a0e8f873aa238abe86a9a5e4b5cf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmZuuO=}cE5Urk%bmS-&HNQ2M zAsVM3K{5?v7BdD8?1OYpK)Q;3cLC0DHZ69fcL0I^m$m_`ZtoSvi#!{p$*{dqFRa}x zx6n8R1u>I=Z&~b0C-$U!0N&YHT zT2{9v&F$fp1SvTtkx5Yi;hJ35jNk*}O4E}gd1PW*n)NxGz21roT<&+qy7 zd(ZFL-_P&8{wm8M4vt4-pB5hZIPOoZG!Jj1@a#7z+~G7%<8`jc=Xf5=9^F$EastnJ zxbvJQe8*`b;aA0G<9hwqWml>2vMN}q5_(f;gaDe zIDjPY_=+Ws=w&F0i)BLdje)UCYoZ2J?{I|6@fw%&Xnaoaa70{f`Z?l*n!njp^K1(p z(+sfqU@Jl-g67@!bwq_Um|{-S0x-a!BjI>Hp{3=5PLe{>k1iU1xOaLe8) ztynN9cJKJt8ZA6duw*DOH)0YeOo^_VL{kj4NS@%Qb^8&VP*J_1=)|~ct~mbuN~w@1 zWyi0PWwoN4c^)F02YxjCJsSaYhr7kCHa*;GEAB@S19&`5*N@y!LWaBVN#7I(-X2H_ zj#z@_Kh6H*j-L`5f14lBx66;;PULoK$LnZ2Z3T9}_zQXei{NX=#_ zz8gngFi5rpX0AYVjiT%we`+d|nwpuVhp-k*t*F%X_ClQ=0dt?DuVeWz8oP%faimsz~srBB><7G=) ztVxTuv{;?l6?yObyWD=`J|3Uk1^|u#k7qxFIS2qIdH8q_T0+PHvo9k8SwPtK-UDGg zXo({S#6k?Jm>u`PK4_FVE*E58mWS}B=G*q)Ykvly0>Ff|AOI6`e3`;kL)958!t~;2 zjxb$WM{Y8+^YdVdu4C=W)P*cqwO~GZ4Z6M0(+FIi;9Qd)R;E!XXF-%<6@;f4rLPrL z)7oG_^cf6ipwJFO1A*3?=z@ed!_hcCPjG@}p-9T6T3mB{<@MrHNrx+&2TeePON1*7 zRLaeWJISWBk7CRq7+2aOR&*N9yV+kpcS}3jhmDdIm}Xx&os=oIqJ3zP3MZ1ea6UaX z-=<{xCc586^B%^8=Jb+kGTl0%e92fYXvD}9N1lPal7%_Al70sp;6UkdG<&MXF;X-= z@GE}{rcKoeUo{P)j`VL_w&i16aZ4Vq$-}lhT%D`S$K0E-owOyVYI4e!Q*b+Wd^2Ik zj@M#?c5JZvQN3qy(`WY#?hINz3U4d&=&@2dZ0GZK=CM`%=4C6E$%kJz*Au$&DQyJw)2QU3-YK7_r#{ z={aytG0g|G#Wg?B7I3^-NWzf0sRYgGTWE&CWDzl=qU(-#Nmq?)ZPXw!jGBMHgfw_z zIg}!|t~R?eBD0}25jh3H`?CL-6&-`@e-tiw2F4m}9O_`h&FZ1K5+wlT$7G$QbUJ_o zz;yl+ChtSlk%(c^b!CmhI_iYTje_Zx={S0$u6Gal2#aXd86b?et_)4!1JU%uulzfh zJ%;L1A13|2AF^AQx4*Qcb2aIlEuDkapovc#Q}Gjx^F=0g~fQWv$;2D@` z5E1Q01pNTI=tO}@JOpbQH5Cn31t&lZ%`F8#$}FVa#lufY8Mc;X`pTtZ2Kz>H8prt! zn13Sk*bpuUL$%l`J9Y}B8$Gdc-Hx89MThL@Q1!z)EG^4+q`wv!up{upW1kSk|&JXBCh{HWZ`7bcL0?+exuFq;e>)cyb`?)KIc-Z0XH=8HFAAXAWpYJ&j zhk0BUyW5S+x4(GGe9vEw=nL@x^M122cY7ZDAIJV15r+djyvY4#8BU F{{{u)9?1Xz diff --git a/trading/__pycache__/signals.cpython-311.pyc b/trading/__pycache__/signals.cpython-311.pyc deleted file mode 100644 index 072687e7569c7e5a07e06b42f21c32638ee0d47b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1329 zcmah}&r2IY6rS1L>`oGYRw%K>TBDaxNKi^orBJZf&>}sUi)?nMx-r=eGaF;UgOnb6 z>eXHfo@_<`iT(wR5-=xPpD%t|;9l_Dn8fE;qFFaRAGUb(_8Uk17*xasqpCK&pe<4WIjEgl%rfgR|ZO;fB( ziRE|<<9eyE;njGdQEs??qrkVh)$l!0XnJB()=i5Sd|}#-yIzpax@%TtzWzR#ilVJy z4r}#@2yqW0>M-R~P`l*980!+6SUP7@ZT9etWlvf5J8QA*30rKl#a1j`6+j{K3hoi> zHXoQ|$RbvFk0gPY3WCD1Kj0?z;5yt35o`0rkGl^Ll|h{rh*+S*X9L`R;&#;7{##vE z!>TmNwz^81RNxno(*vVVOQ2ylMP(XU_P8v1{;O?A`eFotVieJ8SS>MzjtNi_GlbfR zNmzqP3@}V}2K>m2v_S2WuBIlII&7lNGG}b&l+B#5**2SP#nL-Z-*2bqLy~XQ{|W;Y z3TxBr_2fAG&WGt4^0n}CLj5sLK^JqWAY)fdciqd|<$TSvIW$MVNd&$i7>|z~=p^6T z5Xf%upzpOj*B4GXZ#Mjm{&j(*2YM7MG1@&7cN_OC3 TL`mI&Y6t~&1C2eQJABL^FsUpX diff --git a/trading/admin.py b/trading/admin.py deleted file mode 100644 index b676649..0000000 --- a/trading/admin.py +++ /dev/null @@ -1,26 +0,0 @@ -from django.contrib import admin -from django.contrib.auth.admin import UserAdmin -from django.contrib.auth.models import User -from .models import UserProfile, Signal, Trade, Backtest - -class UserProfileInline(admin.StackedInline): - model = UserProfile - can_delete = False - verbose_name_plural = 'Profile' - fk_name = 'user' - -class CustomUserAdmin(UserAdmin): - inlines = (UserProfileInline, ) - - def get_inline_instances(self, request, obj=None): - if not obj: - return list() - return super(CustomUserAdmin, self).get_inline_instances(request, obj) - - -admin.site.unregister(User) -admin.site.register(User, CustomUserAdmin) - -admin.site.register(Signal) -admin.site.register(Trade) -admin.site.register(Backtest) \ No newline at end of file diff --git a/trading/apps.py b/trading/apps.py deleted file mode 100644 index abf4355..0000000 --- a/trading/apps.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.apps import AppConfig - - -class TradingConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'trading' - - def ready(self): - import trading.signals diff --git a/trading/migrations/0001_initial.py b/trading/migrations/0001_initial.py deleted file mode 100644 index f4687d2..0000000 --- a/trading/migrations/0001_initial.py +++ /dev/null @@ -1,59 +0,0 @@ -# Generated by Django 5.2.7 on 2025-12-28 13:55 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Signal', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('symbol', models.CharField(max_length=20)), - ('signal', models.CharField(choices=[('BUY', 'Buy'), ('SELL', 'Sell'), ('WAIT', 'Wait')], max_length=4)), - ('confidence', models.FloatField()), - ('timestamp', models.DateTimeField(auto_now_add=True)), - ], - ), - migrations.CreateModel( - name='Backtest', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('start_date', models.DateTimeField()), - ('end_date', models.DateTimeField()), - ('results', models.JSONField()), - ('timestamp', models.DateTimeField(auto_now_add=True)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='Trade', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('symbol', models.CharField(max_length=20)), - ('entry_price', models.FloatField()), - ('exit_price', models.FloatField(blank=True, null=True)), - ('entry_timestamp', models.DateTimeField()), - ('exit_timestamp', models.DateTimeField(blank=True, null=True)), - ('signal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='trading.signal')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='UserProfile', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('role', models.CharField(choices=[('Free', 'Free'), ('Pro', 'Pro'), ('Admin', 'Admin')], default='Free', max_length=10)), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)), - ], - ), - ] diff --git a/trading/migrations/__init__.py b/trading/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/trading/migrations/__pycache__/0001_initial.cpython-311.pyc b/trading/migrations/__pycache__/0001_initial.cpython-311.pyc deleted file mode 100644 index 827589f54dde0bf3dcd5a7bcd8d4069653151698..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3396 zcmcH*OKcm*b$3ZFKcZyPk*!FSNI6mx({}WYEWs^`$~Gn2ktI2j-I_tMSaC+w%FA75 zcBxMeg%3USm|Jx;dQe+f2On}UiW~y;lH(AVgD|H6J^4n%I^~o%yIjh&VpuNF{k(lM z?=$Z=Z}uOZoe2r9|6ILi{2Q?Uia~Hin#ikVK>j8n3CX5Zl;NwGN+nbb$zm>KhAWX` zq@os8SyH5V35EY6p$Lv_Mgv9rAxU})uYVPzNM4ch>I*Sk%*#CHVAnOQvXfVMqGFVZ z?i#k`aJ6D1Y&xZ;ocBpL2d};l3!AWKPfJHn8zCr zW{`q}bYiokH6tS#g;C@{-G_Ca!s}n_3W|E1$zTS>4&wW5`hh3W&Qq39$KPd?Jm}n4 zKpVU*ZCxH`XE3u5$kSjTfu=Jay(^eP@IclJHJ`=EWj6ZUk! zgMQAVp9$RGfT}dDCjt?{T#%;6y|R+Ual6;#cJV5L1*r8Oi@!hGOr?Q0_f4 zH0Z^pwNGIWUVuIL5gIxeZtq91%lwKv*Q%paR~-7dt>!*?Q*$}=rbp#)@jUtz`rkz! zzZ>+rRj#fWWlJ}?VxT#$+`gF)^Q2yLZLLJG?qb9{s>G=1WLJBHcX`~w#L!LS8_bhi zn5@|j)-1h(x$5jz)@<{I*b>lL6BT_&GqF{6H-O}=kPktZ4PC$g5I}7g@bF4uVF4gE zO)>hz?Cn*6y5YVMT@R+Br48FCVTXv`%M&HrS~n23N|?u8qkT`*@ef+Zun<<$^vqb4L8A@Q(Yi z>@u;}4HNS)u}$m+Dm+IpCS!geLO>_uJ|3Ax6~iJEF!IPRL}SW_NFRK76ybFpyzwIz zt@>(#`mvxU2{uJay^N7hU}`bn!(*B^)-;~bG&uNbCI&pIXR;-iT<)7D)d@4N|SuR_Y3Tz6KM76UGuU?{IIpf**ssas{6 zD`<_!ybQu&&Z9SGS8mMSEbz`H3$NM$nv!-EH_!WjNw2^Z>F4XC8+HYc*4Ap4TN}kY zxCDlg(QTVNa;ka>k2X^`di<*}IyN>ot~H}GQr#uu*TVxbK%6xQ%H!7kQ`gzY^9@ys zU;Jx=#XkLKj9vVFJvPf?vyG6_tv+68B&2vw(6Wc=-k;LvXwRi@w^+}m=iwiRX;GsV zp*>E$$6-AVO}W5BGnef*=Ct-n%X%` z576A$-WJP^)pHXpH$hXAhv|Nro!DDv*@+**G+U@=3oKipskugn+TGQN#N&yV5`ZHC z8r{dHW=>%$EH^2Zo2=)iSZ<1@t{$c{bYOh%0UH>v4@|OwNt*inFx^M{uk6jS{wwwV z5!OFKQ=@M+>oDCzdoS&sXT6u6J^1b+n<}uWMK<+-epO;$IkeZU_qwdtrKwt@Gb$WN z2nPTh3D7uy?7)YoaNw=6&eFm0Cn_5puMbYLLEnp3aG$w94Ab0vJvYyC^E7qqF#Qo7 zo_R9IhG*)-*VwS1t_yT%`pH!`H2oa?*iDBP>qCodXpyFtyi8sZDZcV->$_bxJ z+4LXjpDHwC)iV~$STtq7MdY(>fG#|3lkfb@~ zmI9x?+saE19(fRE(svZk!q0@%XV2B|<80;@o4Lnk9@34k>DHftb6Z~WgqJek5oGqyTKZqe&O1 ziQlv0EeWr^d40*>$6pA&p7OhZ{T%zP-yVNQ?!i#});lhMMo5-r*w*p|Dh>M2VSv0g ebCF8F@-);*S#3xs!M6#P8h$AVN54Y#toj9nF=8eF diff --git a/trading/migrations/__pycache__/__init__.cpython-311.pyc b/trading/migrations/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 20b9a48d1d5be7602e232f707c23120470f54f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmZ3^%ge<81RKo)GePuY5CH>>P{wCAAY(d13PUi1CZpd&r pyk0@&FAkgB{FKt1RJ$Tppm87zi}``X2WCb_#t#fIqKFwN1_1sDDdhkF diff --git a/trading/models.py b/trading/models.py deleted file mode 100644 index e6a9f0c..0000000 --- a/trading/models.py +++ /dev/null @@ -1,50 +0,0 @@ -from django.db import models -from django.contrib.auth.models import User - -class UserProfile(models.Model): - USER_ROLE_CHOICES = ( - ('Free', 'Free'), - ('Pro', 'Pro'), - ('Admin', 'Admin'), - ) - user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') - role = models.CharField(max_length=10, choices=USER_ROLE_CHOICES, default='Free') - - def __str__(self): - return f'{self.user.username} - {self.role}' - -class Signal(models.Model): - SIGNAL_CHOICES = ( - ('BUY', 'Buy'), - ('SELL', 'Sell'), - ('WAIT', 'Wait'), - ) - symbol = models.CharField(max_length=20) - signal = models.CharField(max_length=4, choices=SIGNAL_CHOICES) - confidence = models.FloatField() - timestamp = models.DateTimeField(auto_now_add=True) - - def __str__(self): - return f'{self.timestamp} - {self.symbol} - {self.signal}' - -class Trade(models.Model): - user = models.ForeignKey(User, on_delete=models.CASCADE) - symbol = models.CharField(max_length=20) - entry_price = models.FloatField() - exit_price = models.FloatField(null=True, blank=True) - entry_timestamp = models.DateTimeField() - exit_timestamp = models.DateTimeField(null=True, blank=True) - signal = models.ForeignKey(Signal, on_delete=models.CASCADE) - - def __str__(self): - return f'{self.user.username} - {self.symbol}' - -class Backtest(models.Model): - user = models.ForeignKey(User, on_delete=models.CASCADE) - start_date = models.DateTimeField() - end_date = models.DateTimeField() - results = models.JSONField() - timestamp = models.DateTimeField(auto_now_add=True) - - def __str__(self): - return f'{self.user.username} - {self.timestamp}' \ No newline at end of file diff --git a/trading/signals.py b/trading/signals.py deleted file mode 100644 index f4951ff..0000000 --- a/trading/signals.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.db.models.signals import post_save -from django.dispatch import receiver -from django.contrib.auth.models import User -from .models import UserProfile - -@receiver(post_save, sender=User) -def create_user_profile(sender, instance, created, **kwargs): - if created: - UserProfile.objects.create(user=instance) - -@receiver(post_save, sender=User) -def save_user_profile(sender, instance, **kwargs): - try: - instance.profile.save() - except UserProfile.DoesNotExist: - UserProfile.objects.create(user=instance) diff --git a/trading/tests.py b/trading/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/trading/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/trading/views.py b/trading/views.py deleted file mode 100644 index 91ea44a..0000000 --- a/trading/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here.