{"id":483585,"date":"2026-06-14T17:27:27","date_gmt":"2026-06-14T17:27:27","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=483585"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=483585","title":{"rendered":"\u0414\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442: \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043c\u0443\u043b\u044c\u0442\u0438\u0444\u0430\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043d\u0430 TA-Lib"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<blockquote>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u043d\u0430\u0447\u0430\u043b \u0442\u043e\u0440\u0433\u043e\u0432\u0430\u0442\u044c \u043a\u0440\u0438\u043f\u0442\u043e\u0439, \u043c\u0435\u043d\u044f \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u043b\u043e \u043e\u0434\u043d\u043e: \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0434\u0430\u044e\u0442 \u00abBUY\u00bb \u0438\u043b\u0438 \u00abSELL\u00bb \u0431\u0435\u0437 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439. \u0422\u0440\u0438 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u044c \u2014 \u0432\u043e\u0442 \u0442\u0435\u0431\u0435 \u0441\u0438\u0433\u043d\u0430\u043b. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u0435\u0441\u043e\u0432, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0437\u0430 \u0446\u0438\u0444\u0440\u043e\u0439.<\/p>\n<\/blockquote>\n<p>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044e \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Ta-Lib: <a href=\"https:\/\/hummingbot.ru\/indikatory-ta-lib\/\" rel=\"noopener noreferrer nofollow\">TA-Lib Python: \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430<\/a><\/p>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0430\u0447\u0435. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0439\u0434\u0451\u0442 \u0440\u0435\u0447\u044c \u2014 \u044d\u0442\u043e \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Windows, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u043e\u0439\u043d\u044b\u043c \u043a\u043b\u0438\u043a\u043e\u043c, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c\u0443 API Binance \u0438 \u0432\u044b\u0434\u0430\u0451\u0442 \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 Score \u043f\u043e \u0448\u0435\u0441\u0442\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432, \u0431\u044d\u043a\u0442\u0435\u0441\u0442 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 100 \u0431\u0430\u0440\u0430\u0445, \u0443\u0440\u043e\u0432\u043d\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438\/\u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e \u0444\u0440\u0430\u043a\u0442\u0430\u043b\u0430\u043c \u0438 ATR-\u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0440\u0438\u0441\u043a\u0430. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0432\u0441\u0451 \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u2014 \u0441 \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c\u0438 \u0438 \u043a\u043e\u0434\u043e\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eab\/4d3\/950\/eab4d39509a6f3ea8949ee063e9d33d9.png\" alt=\"\u0414\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\" title=\"\u0414\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\" width=\"1906\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/eab\/4d3\/950\/eab4d39509a6f3ea8949ee063e9d33d9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eab\/4d3\/950\/eab4d39509a6f3ea8949ee063e9d33d9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442<\/figcaption><\/div>\n<\/figure>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0438\u0433\u043d\u0430\u043b<\/h3>\n<p>\u041f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>Binance REST API     \u2193get_binance_data() \u2014 500 \u0441\u0432\u0435\u0447\u0435\u0439 OHLCV     \u2193calculate_all_indicators() \u2014 17+ \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 TA-Lib     \u2193detect_patterns() \u2014 58 \u0441\u0432\u0435\u0447\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432     \u2193generate_professional_signals() \u2014 \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 Score \u043f\u043e 6 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c     \u2193Flask API \u2192 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u2192 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 + \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0430\u043d\u0435\u043b\u044c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0441 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430\u00a0<code>api.binance.com\/api\/v3\/klines<\/code>\u00a0\u2014 \u043e\u043d \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 300\u2013500 \u0441\u0432\u0435\u0447\u0435\u0439, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0432 pandas DataFrame \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 float64 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435.<\/p>\n<h3>\u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b: \u0447\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438 \u043a\u0430\u043a<\/h3>\n<p>\u0412\u0441\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437\u00a0<strong>TA-Lib<\/strong>\u00a0\u2014 C-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 Python-\u043e\u0431\u0432\u044f\u0437\u043a\u043e\u0439. \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043d\u0430 500 \u0441\u0432\u0435\u0447\u0430\u0445 \u2014 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<h4>\u0421\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0435 \u0441\u0440\u0435\u0434\u043d\u0438\u0435<\/h4>\n<pre><code class=\"python\">indicators['SMA_7']   = talib.SMA(close, timeperiod=7)indicators['SMA_25']  = talib.SMA(close, timeperiod=25)indicators['SMA_50']  = talib.SMA(close, timeperiod=50)indicators['SMA_100'] = talib.SMA(close, timeperiod=100)indicators['SMA_200'] = talib.SMA(close, timeperiod=200)indicators['EMA_12']  = talib.EMA(close, timeperiod=12)indicators['EMA_26']  = talib.EMA(close, timeperiod=26)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6e3\/c02\/602\/6e3c02602ca85a0eb5e91e67b3db16f4.png\" alt=\"\u0421\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0435 \u0441\u0440\u0435\u0434\u043d\u0438\u0435\" title=\"\u0421\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0435 \u0441\u0440\u0435\u0434\u043d\u0438\u0435\" width=\"612\" height=\"334\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/6e3\/c02\/602\/6e3c02602ca85a0eb5e91e67b3db16f4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6e3\/c02\/602\/6e3c02602ca85a0eb5e91e67b3db16f4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0435 \u0441\u0440\u0435\u0434\u043d\u0438\u0435<\/figcaption><\/div>\n<\/figure>\n<p><strong>SMA<\/strong>\u00a0\u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0430\u044f \u0441\u0440\u0435\u0434\u043d\u044f\u044f, \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0446\u0435\u043d \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0437\u0430 N \u0431\u0430\u0440\u043e\u0432:<\/p>\n<pre><code>SMA(n) = (C\u2081 + C\u2082 + ... + C\u2099) \/ n<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>EMA<\/strong>\u00a0\u2014 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f, \u043f\u0440\u0438\u0434\u0430\u0451\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0432\u0435\u0441 \u0441\u0432\u0435\u0436\u0438\u043c \u0446\u0435\u043d\u0430\u043c:<\/p>\n<pre><code>EMA(t) = C(t) \u00d7 k + EMA(t-1) \u00d7 (1 - k),   \u0433\u0434\u0435 k = 2 \/ (n + 1)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f EMA(12): k = 2\/13 \u2248 0.154. \u0414\u043b\u044f EMA(26): k = 2\/27 \u2248 0.074. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 EMA(12) \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0446\u0435\u043d\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<h4>MACD<\/h4>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/90c\/7fc\/8b9\/90c7fc8b9e2297baa23d31f2a1f9a009.png\" alt=\"MACD\" title=\"MACD\" width=\"1904\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/90c\/7fc\/8b9\/90c7fc8b9e2297baa23d31f2a1f9a009.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/90c\/7fc\/8b9\/90c7fc8b9e2297baa23d31f2a1f9a009.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>MACD<\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"python\">macd, signal, hist = talib.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>MACD \u2014 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0445 EMA:<\/p>\n<pre><code>MACD = EMA(12) - EMA(26)Signal = EMA(9) \u043e\u0442 MACDHistogram = MACD - Signal<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0413\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u041a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 \u0432 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u043e\u043d\u0435 \u2014 \u0438\u043c\u043f\u0443\u043b\u044c\u0441 \u0443\u0441\u0438\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0430\u0434\u0430\u0442\u044c, \u043e\u0441\u0442\u0430\u0432\u0430\u044f\u0441\u044c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u2014 \u0438\u043c\u043f\u0443\u043b\u044c\u0441 \u0441\u043b\u0430\u0431\u0435\u0435\u0442, \u0445\u043e\u0442\u044f \u0442\u0440\u0435\u043d\u0434 \u0435\u0449\u0451 \u0432\u0432\u0435\u0440\u0445. \u042d\u0442\u043e \u0440\u0430\u043d\u043d\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442\u0430.<\/p>\n<h4>RSI<\/h4>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c24\/733\/45a\/c2473345a50918da47850052d6bdb3a5.png\" alt=\"RSI\" title=\"RSI\" width=\"1903\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c24\/733\/45a\/c2473345a50918da47850052d6bdb3a5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c24\/733\/45a\/c2473345a50918da47850052d6bdb3a5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>RSI<\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"python\">indicators['RSI'] = talib.RSI(close, timeperiod=14)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>RSI \u0423\u0430\u0439\u043b\u0434\u0435\u0440\u0430 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439:<\/p>\n<pre><code>RS = Avg(Up closes, 14) \/ Avg(Down closes, 14)RSI = 100 - 100 \/ (1 + RS)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d 0\u2013100. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 30\/70. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435: &lt; 25 \u2014 \u00ab\u0433\u043b\u0443\u0431\u043e\u043a\u043e \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0434\u0430\u043d\u00bb (\u0432\u0435\u0441 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 1.0), &lt; 30 \u2014 \u00ab\u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0434\u0430\u043d\u00bb (0.7), &lt; 40 \u2014 \u00ab\u0431\u043b\u0438\u0437\u043a\u043e \u043a \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u0438\u00bb (0.2). \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0437\u043e\u043d\u044b.<\/p>\n<h4>Stochastic<\/h4>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/58c\/eb0\/34b\/58ceb034bc4d163004c6836b0aa24b87.png\" alt=\"Stochastic\" title=\"Stochastic\" width=\"1904\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/58c\/eb0\/34b\/58ceb034bc4d163004c6836b0aa24b87.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/58c\/eb0\/34b\/58ceb034bc4d163004c6836b0aa24b87.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Stochastic<\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"python\">stoch_k, stoch_d = talib.STOCH(    high, low, close,    fastk_period=14, slowk_period=3,    slowk_matype=0, slowd_period=3, slowd_matype=0)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u043a \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0446\u0435\u043d\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0441 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u043c \u0446\u0435\u043d \u0437\u0430 \u043f\u0435\u0440\u0438\u043e\u0434:<\/p>\n<pre><code>%K = (Close - Lowest Low\u2081\u2084) \/ (Highest High\u2081\u2084 - Lowest Low\u2081\u2084) \u00d7 100%D = SMA(3) \u043e\u0442 %K<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0438, \u043d\u043e \u0438 \u043d\u0430 \u043a\u0440\u043e\u0441\u0441\u043e\u0432\u0435\u0440 %K\/%D \u0432 \u0437\u043e\u043d\u0430\u0445 \u043f\u0435\u0440\u0435\u043a\u0443\u043f\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438\/\u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u2014 \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0430\u043a\u0442 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432 \u0437\u043e\u043d\u0443.<\/p>\n<h4>Bollinger Bands<\/h4>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/336\/cdf\/a6f\/336cdfa6fb1cd3ec9476ad4f36d22b74.png\" alt=\"Bollinger Bands\" title=\"Bollinger Bands\" width=\"1906\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/336\/cdf\/a6f\/336cdfa6fb1cd3ec9476ad4f36d22b74.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/336\/cdf\/a6f\/336cdfa6fb1cd3ec9476ad4f36d22b74.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Bollinger Bands<\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"python\">bb_upper, bb_middle, bb_lower = talib.BBANDS(    close, timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u043e\u0441\u044b \u0411\u043e\u043b\u043b\u0438\u043d\u0434\u0436\u0435\u0440\u0430:<\/p>\n<pre><code>Middle = SMA(20)Upper  = SMA(20) + 2 \u00d7 \u03c3(20)Lower  = SMA(20) - 2 \u00d7 \u03c3(20)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0433\u0434\u0435 \u03c3(20) \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0446\u0435\u043d \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0437\u0430 20 \u0431\u0430\u0440\u043e\u0432. \u041f\u0440\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 ~95% \u0446\u0435\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u043b\u043e\u0441. \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0446\u0435\u043d\u0430 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043f\u043e\u043b\u043e\u0441\u044b \u2014 \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044e \u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0443 \u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u2014\u00a0<strong>%B<\/strong>\u00a0(Percent Bandwidth):<\/p>\n<pre><code>%B = (Close - Lower) \/ (Upper - Lower)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>%B = 0 \u2014 \u0446\u0435\u043d\u0430 \u043d\u0430 \u043d\u0438\u0436\u043d\u0435\u0439 \u043f\u043e\u043b\u043e\u0441\u0435, %B = 1 \u2014 \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u0439, &lt; 0 \u0438\u043b\u0438 &gt; 1 \u2014 \u0437\u0430 \u043f\u043e\u043b\u043e\u0441\u043e\u0439.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u2014\u00a0<strong>BB Width<\/strong>, \u0448\u0438\u0440\u0438\u043d\u0430 \u043f\u043e\u043b\u043e\u0441:<\/p>\n<pre><code>BBW = (Upper - Lower) \/ Middle \u00d7 100<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 BBW \u0432 \u043d\u0438\u0436\u043d\u0438\u0445 10% \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u2014\u00a0<strong>BB Squeeze<\/strong>: \u0432\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0436\u0430\u0442\u0430 \u0434\u043e \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430, \u0440\u044b\u043d\u043e\u043a \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442 \u044d\u043d\u0435\u0440\u0433\u0438\u044e \u0434\u043b\u044f \u0441\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h4>ADX \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435<\/h4>\n<pre><code class=\"python\">indicators['ADX']      = talib.ADX(high, low, close, timeperiod=14)indicators['PLUS_DI']  = talib.PLUS_DI(high, low, close, timeperiod=14)indicators['MINUS_DI'] = talib.MINUS_DI(high, low, close, timeperiod=14)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0423\u0430\u0439\u043b\u0434\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0441\u0438\u043b\u044b \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u043d\u0434\u0430:<\/p>\n<pre><code>+DM = max(High - PrevHigh, 0), \u0435\u0441\u043b\u0438 &gt; |Low - PrevLow|, \u0438\u043d\u0430\u0447\u0435 0-DM = max(PrevLow - Low, 0),   \u0435\u0441\u043b\u0438 &gt; |High - PrevHigh|, \u0438\u043d\u0430\u0447\u0435 0TR  = max(High - Low, |High - PrevClose|, |Low - PrevClose|)+DI = 100 \u00d7 EMA(14, +DM) \/ EMA(14, TR)-DI = 100 \u00d7 EMA(14, -DM) \/ EMA(14, TR)DX  = 100 \u00d7 |+DI - -DI| \/ (+DI + -DI)ADX = EMA(14, DX)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<div class=\"floating-image\">\n<figure class=\"float \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c71\/e0b\/86f\/c71e0b86fe93e2e4cddb3679608fd839.png\" alt=\"\u0422\u0440\u0435\u043d\u0434\u043e\u0432\u044b\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b\" title=\"\u0422\u0440\u0435\u043d\u0434\u043e\u0432\u044b\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b\" width=\"319\" height=\"273\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c71\/e0b\/86f\/c71e0b86fe93e2e4cddb3679608fd839.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c71\/e0b\/86f\/c71e0b86fe93e2e4cddb3679608fd839.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u0440\u0435\u043d\u0434\u043e\u0432\u044b\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b<\/figcaption><\/div>\n<\/figure>\n<p>ADX \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u00a0<strong>\u0441\u0438\u043b\u0443<\/strong>\u00a0\u0442\u0440\u0435\u043d\u0434\u0430, \u043d\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435. ADX &gt; 25 \u2014 \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u0442\u0440\u0435\u043d\u0434, &gt; 40 \u2014 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u044b\u0439. \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u0451\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 +DI \u0438 -DI: +DI &gt; -DI \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0442\u0440\u0435\u043d\u0434.<\/p>\n<\/div>\n<p>\u0412 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 ADX \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u043e\u044f\u043a\u043e: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 +DI\/-DI, \u0438 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430\u00a0<strong>Confidence<\/strong>\u00a0(\u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430).<\/p>\n<h4>ATR<\/h4>\n<pre><code class=\"python\">indicators['ATR'] = talib.ATR(high, low, close, timeperiod=14)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>True Range \u2014 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0442\u0440\u0451\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<pre><code>TR = max(High - Low, |High - PrevClose|, |Low - PrevClose|)ATR = EMA(14, TR)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<div class=\"floating-image\">\n<figure class=\"float \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b54\/99b\/b9e\/b5499bb9e45de26b23c3f0398eda5d19.png\" alt=\"\u0412\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c\" title=\"\u0412\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c\" width=\"322\" height=\"237\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b54\/99b\/b9e\/b5499bb9e45de26b23c3f0398eda5d19.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b54\/99b\/b9e\/b5499bb9e45de26b23c3f0398eda5d19.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/figcaption><\/div>\n<\/figure>\n<p>ATR \u2014 \u043c\u0435\u0440\u0430 \u0432\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0445 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445 \u0446\u0435\u043d\u044b. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0432 \u0442\u0440\u0451\u0445 \u043c\u0435\u0441\u0442\u0430\u0445: \u043a\u0430\u043a \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0440\u0438\u0441\u043a-\u043c\u0435\u0442\u0440\u0438\u043a (\u0441\u0442\u043e\u043f\/\u0442\u0435\u0439\u043a), \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0432\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 20-\u0431\u0430\u0440\u043e\u0432\u044b\u043c \u0441\u0440\u0435\u0434\u043d\u0438\u043c ATR) \u0438 \u043a\u0430\u043a \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438.<\/p>\n<\/div>\n<h4>OBV<\/h4>\n<pre><code class=\"python\">indicators['OBV'] = talib.OBV(close, volume)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<div class=\"floating-image\">\n<figure class=\"float \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3d2\/7f4\/d36\/3d27f4d36b8a6092c5d8de825978d531.png\" alt=\"OBV\" title=\"OBV\" width=\"322\" height=\"101\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3d2\/7f4\/d36\/3d27f4d36b8a6092c5d8de825978d531.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3d2\/7f4\/d36\/3d27f4d36b8a6092c5d8de825978d531.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>OBV<\/figcaption><\/div>\n<\/figure>\n<p>On-Balance Volume \u2014 \u043d\u0430\u043a\u043e\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043a\u0443\u043f\u043e\u043a\/\u043f\u0440\u043e\u0434\u0430\u0436:<\/p>\n<\/div>\n<pre><code>OBV(t) = OBV(t-1) + Volume(t),  \u0435\u0441\u043b\u0438 Close &gt; PrevCloseOBV(t) = OBV(t-1) - Volume(t),  \u0435\u0441\u043b\u0438 Close &lt; PrevCloseOBV(t) = OBV(t-1),              \u0435\u0441\u043b\u0438 Close = PrevClose<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043c\u044b\u0441\u043b \u0432 \u0434\u0438\u0432\u0435\u0440\u0433\u0435\u043d\u0446\u0438\u0438: \u0435\u0441\u043b\u0438 OBV \u0440\u0430\u0441\u0442\u0451\u0442, \u0430 \u0446\u0435\u043d\u0430 \u043f\u0430\u0434\u0430\u0435\u0442 \u2014 \u0443\u043c\u043d\u044b\u0435 \u0434\u0435\u043d\u044c\u0433\u0438 \u043f\u043e\u043a\u0443\u043f\u0430\u044e\u0442 \u043d\u0430 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0438. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043d\u0430\u043a\u043b\u043e\u043d OBV \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 10 \u0431\u0430\u0440\u043e\u0432 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0441 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0446\u0435\u043d\u044b.<\/p>\n<h4>CCI, Williams %R, MFI<\/h4>\n<pre><code class=\"python\">indicators['CCI']   = talib.CCI(high, low, close, timeperiod=20)indicators['WILLR'] = talib.WILLR(high, low, close, timeperiod=14)indicators['MFI']   = talib.MFI(high, low, close, volume, timeperiod=14)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>CCI<\/strong>\u00a0\u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0439 \u0446\u0435\u043d\u044b \u043e\u0442 \u0435\u0451 \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u043d\u0435\u0439:<\/p>\n<pre><code>TP  = (High + Low + Close) \/ 3CCI = (TP - SMA(TP, 20)) \/ (0.015 \u00d7 MeanDeviation)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u043e\u043d\u044b \u00b1100 \u2014 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u0438, \u00b1150 \u2014 \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0430\u043b\u044c\u043d\u044b\u0435.<\/p>\n<p><strong>Williams %R<\/strong>\u00a0\u2014 \u043f\u0435\u0440\u0435\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0439 \u0441\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u043a:<\/p>\n<pre><code>%R = (Highest High\u2081\u2084 - Close) \/ (Highest High\u2081\u2084 - Lowest Low\u2081\u2084) \u00d7 (-100)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043e\u0442 0 \u0434\u043e -100. &lt; -80 \u2014 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u044c, &gt; -20 \u2014 \u043f\u0435\u0440\u0435\u043a\u0443\u043f\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p><strong>MFI<\/strong>\u00a0(Money Flow Index) \u2014 RSI, \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u043e\u0431\u044a\u0451\u043c\u0443:<\/p>\n<pre><code>TP = (High + Low + Close) \/ 3Money Flow = TP \u00d7 VolumePositive MF = \u0441\u0443\u043c\u043c\u0430 Money Flow \u0437\u0430 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 TP &gt; PrevTPNegative MF = \u0441\u0443\u043c\u043c\u0430 Money Flow \u0437\u0430 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 TP &lt; PrevTPMFI = 100 - 100 \/ (1 + Positive MF \/ Negative MF)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<div class=\"floating-image\">\n<figure class=\"float \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c51\/59a\/f5b\/c5159af5b49823df29c00527ec7ebbd4.png\" alt=\"\u041e\u0441\u0446\u0438\u043b\u043b\u044f\u0442\u043e\u0440\u044b\" title=\"\u041e\u0441\u0446\u0438\u043b\u043b\u044f\u0442\u043e\u0440\u044b\" width=\"321\" height=\"279\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c51\/59a\/f5b\/c5159af5b49823df29c00527ec7ebbd4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c51\/59a\/f5b\/c5159af5b49823df29c00527ec7ebbd4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u0441\u0446\u0438\u043b\u043b\u044f\u0442\u043e\u0440\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 RSI: \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u044a\u0451\u043c. MFI &lt; 20 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0435\u043d\u044c\u0433\u0438 \u0443\u0445\u043e\u0434\u044f\u0442 \u0441 \u0440\u044b\u043d\u043a\u0430 \u043f\u0440\u0438 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0451\u043c\u0430 \u2014 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u043e\u0432 \u043e\u0441\u043b\u0430\u0431\u0435\u0432\u0430\u0435\u0442.<\/p>\n<\/div>\n<h4>Parabolic SAR<\/h4>\n<pre><code class=\"python\">indicators['SAR'] = talib.SAR(high, low, acceleration=0.02, maximum=0.2)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 SAR \u2014 \u0441\u043b\u0435\u0434\u044f\u0449\u0438\u0439 \u0441\u0442\u043e\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0446\u0435\u043d\u043e\u0439 \u043f\u0440\u0438 \u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u043c \u0442\u0440\u0435\u043d\u0434\u0435:<\/p>\n<pre><code>SAR(t) = SAR(t-1) + AF \u00d7 (EP - SAR(t-1))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0433\u0434\u0435 AF (Acceleration Factor) \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 0.02 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 0.02 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043d\u043e\u0432\u043e\u043c \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0443\u043c\u0435, \u043d\u043e \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 0.20. EP \u2014 \u043a\u0440\u0430\u0439\u043d\u044f\u044f \u0442\u043e\u0447\u043a\u0430 (Extreme Point): \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043f\u0440\u0438 \u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u043c \u0442\u0440\u0435\u043d\u0434\u0435, \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u0440\u0438 \u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u043c.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0446\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 SAR \u2014 \u0442\u0440\u0435\u043d\u0434 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043c\u0435\u043d\u0438\u0432\u0448\u0438\u043c\u0441\u044f.<\/p>\n<h3>58 \u0441\u0432\u0435\u0447\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432<\/h3>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 TA-Lib \u0432\u0438\u0434\u0430\u00a0<code>talib.CDL*(open, high, low, close)<\/code>. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: +100 (\u0431\u044b\u0447\u0438\u0439), -100 (\u043c\u0435\u0434\u0432\u0435\u0436\u0438\u0439), 0 (\u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d). \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 -200 \u0434\u043e +200 \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u043b\u044b.<\/p>\n<div class=\"floating-image\">\n<figure class=\"float \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3f1\/ba3\/818\/3f1ba3818a839706776f79bbe27915f2.png\" alt=\"\u0421\u0432\u0435\u0447\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b\" title=\"\u0421\u0432\u0435\u0447\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b\" width=\"321\" height=\"301\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3f1\/ba3\/818\/3f1ba3818a839706776f79bbe27915f2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3f1\/ba3\/818\/3f1ba3818a839706776f79bbe27915f2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0432\u0435\u0447\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435\u00a0<strong>5 \u0441\u0432\u0435\u0447\u0435\u0439<\/strong>\u00a0\u2014 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u0441\u0432\u0435\u0447\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 (\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0437\u0432\u0435\u0437\u0434\u0430, \u0442\u0440\u0438 \u0431\u0435\u043b\u044b\u0445 \u0441\u043e\u043b\u0434\u0430\u0442\u0430), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0431\u0430\u0440\u0430\u0445.<\/p>\n<\/div>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043b\u043e\u0433\u0438\u043a\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f (\u0432\u043d\u0443\u0442\u0440\u0438 TA-Lib):<\/p>\n<p><strong>\u041c\u043e\u043b\u043e\u0442 (Hammer):<\/strong>\u00a0\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u0442\u0435\u043b\u043e \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u043d\u0438\u0436\u043d\u044f\u044f \u0442\u0435\u043d\u044c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 2\u00d7 \u0442\u0435\u043b\u0430, \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0442\u0435\u043d\u044c. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0442\u0440\u0435\u043d\u0434\u0430.<\/p>\n<p><strong>\u041f\u043e\u0433\u043b\u043e\u0449\u0435\u043d\u0438\u0435 (Engulfing):<\/strong>\u00a0\u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0432\u0435\u0447\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0433\u043b\u043e\u0449\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u043f\u0435\u0440\u0432\u043e\u0439. \u041f\u0440\u0438 \u0431\u044b\u0447\u044c\u0435\u043c \u043f\u043e\u0433\u043b\u043e\u0449\u0435\u043d\u0438\u0438: \u043f\u0435\u0440\u0432\u0430\u044f \u043a\u0440\u0430\u0441\u043d\u0430\u044f, \u0432\u0442\u043e\u0440\u0430\u044f \u0437\u0435\u043b\u0451\u043d\u0430\u044f \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e \u0442\u0435\u043b\u0443.<\/p>\n<p><strong>\u0422\u0440\u0438 \u0431\u0435\u043b\u044b\u0445 \u0441\u043e\u043b\u0434\u0430\u0442\u0430:<\/strong>\u00a0\u0442\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0437\u0435\u043b\u0451\u043d\u044b\u0445 \u0441\u0432\u0435\u0447\u0438, \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0448\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.<\/p>\n<p>\u0412 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0432\u0435\u0441 \u043e\u0442 0.3 \u0434\u043e 1.0. \u0412\u0435\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u043a\u043b\u0430\u0434 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u00ab\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b\u00bb (8% \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e Score).<\/p>\n<h3>\u041c\u0443\u043b\u044c\u0442\u0438\u0444\u0430\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432<\/h3>\n<div class=\"floating-image\">\n<figure class=\"float \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/83c\/ad4\/ec3\/83cad4ec3fec21ee07eff2c9276164c5.png\" alt=\"\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b\" title=\"\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b\" width=\"321\" height=\"301\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/83c\/ad4\/ec3\/83cad4ec3fec21ee07eff2c9276164c5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/83c\/ad4\/ec3\/83cad4ec3fec21ee07eff2c9276164c5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u043e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041b\u043e\u0433\u0438\u043a\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432\u00a0<code>signal_<\/code><a href=\"http:\/\/engine.py\" rel=\"noopener noreferrer nofollow\"><code>engine.py<\/code><\/a>\u00a0(775 \u0441\u0442\u0440\u043e\u043a).<\/p>\n<\/div>\n<h4>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u0435\u0441\u043e\u0432<\/h4>\n<pre><code class=\"python\">CATEGORY_WEIGHTS = {    'trend':      0.28,    'momentum':   0.22,    'macd':       0.18,    'volatility': 0.14,    'volume':     0.10,    'patterns':   0.08,}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0443\u043c\u043c\u0430 \u0432\u0435\u0441\u043e\u0432 = 1.0. \u041a\u0430\u0436\u0434\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0<code>cat_score<\/code>\u00a0\u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [-1, +1].<\/p>\n<h4>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 Score<\/h4>\n<pre><code class=\"python\">total_score = sum(cat_scores.get(cat, 0) * w for cat, w in CATEGORY_WEIGHTS.items())<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430:\u00a0<code>Score = 0.28\u00d7trend + 0.22\u00d7momentum + 0.18\u00d7macd + 0.14\u00d7volatility + 0.10\u00d7volume + 0.08\u00d7patterns<\/code><\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [-1, +1]:<\/p>\n<pre><code>Score \u2265 +0.45  \u2192  STRONG BUYScore \u2265 +0.20  \u2192  BUY\u22120.20 &lt; Score &lt; +0.20  \u2192  NEUTRALScore \u2264 \u22120.20  \u2192  SELLScore \u2264 \u22120.45  \u2192  STRONG SELL<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041a\u0430\u043a \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f cat_score \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438<\/h4>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0432\u0435\u0441. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u00ab\u0422\u0440\u0435\u043d\u0434\u00bb:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0421\u043e\u0431\u044b\u0442\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u0435\u0441 \u0441\u0438\u0433\u043d\u0430\u043b\u0430<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Golden Cross SMA 50\/200<\/p>\n<\/td>\n<td>\n<p align=\"left\">+1.0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Death Cross SMA 50\/200<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u22121.0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Golden Cross EMA 12\/26<\/p>\n<\/td>\n<td>\n<p align=\"left\">+0.8<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Death Cross EMA 12\/26<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u22120.8<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SMA 50 &gt; SMA 200 (\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e)<\/p>\n<\/td>\n<td>\n<p align=\"left\">+0.4<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SAR \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442 \u0432\u0432\u0435\u0440\u0445<\/p>\n<\/td>\n<td>\n<p align=\"left\">+0.6<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SAR \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442 \u0432\u043d\u0438\u0437<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u22120.6<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0426\u0435\u043d\u0430 \u0432\u044b\u0448\u0435 SAR<\/p>\n<\/td>\n<td>\n<p align=\"left\">+0.2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ADX \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 (+DI &gt; -DI)<\/p>\n<\/td>\n<td>\n<p align=\"left\">+0.4<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0426\u0435\u043d\u0430 &gt;5% \u0432\u044b\u0448\u0435 SMA 50<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u22120.3 (\u043f\u0435\u0440\u0435\u043a\u0443\u043f)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><code>cat_score<\/code>\u00a0\u043d\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0430 3 (\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0432\u0435\u0441\u043e\u0432 \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438) \u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u0434\u043e [-1, +1]:<\/p>\n<pre><code class=\"python\">cat_scores['trend'] = max(-1.0, min(1.0, trend_score \/ 3))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0414\u0438\u0432\u0435\u0440\u0433\u0435\u043d\u0446\u0438\u0438<\/h4>\n<div class=\"floating-image\">\n<figure class=\"float \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bf9\/f99\/c00\/bf9f99c009a30bb557fdb4ae91f9df34.png\" width=\"321\" height=\"403\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bf9\/f99\/c00\/bf9f99c009a30bb557fdb4ae91f9df34.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bf9\/f99\/c00\/bf9f99c009a30bb557fdb4ae91f9df34.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u0438\u0432\u0435\u0440\u0433\u0435\u043d\u0446\u0438\u0438 \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0441\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442\u0430. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0437\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0438\u043e\u0434:<\/p>\n<\/div>\n<pre><code class=\"python\"># RSI \u0434\u0438\u0432\u0435\u0440\u0433\u0435\u043d\u0446\u0438\u044fprice_chg = (close[-1] - close[-5]) \/ close[-5] * 100rsi_chg   = rsi_val - _safe(rsi, -5)if price_chg &lt; -2 and rsi_chg &gt; 2:    # \u0411\u044b\u0447\u044c\u044f: \u0446\u0435\u043d\u0430 \u043f\u0430\u0434\u0430\u0435\u0442, RSI \u0440\u0430\u0441\u0442\u0451\u0442 \u2192 \u0432\u0435\u0441 0.8  # MACD \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u0438\u0432\u0435\u0440\u0433\u0435\u043d\u0446\u0438\u044fprice_chg = (close[-1] - close[-10]) \/ close[-10] * 100mh_chg    = float(macd_hist[-1]) - float(macd_hist[-10])if price_chg &lt; -3 and mh_chg &gt; 0:    # \u0411\u044b\u0447\u044c\u044f: \u0446\u0435\u043d\u0430 \u043f\u0430\u0434\u0430\u0435\u0442, \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 \u2192 \u0432\u0435\u0441 0.9<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435: \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0438\u0432\u0435\u0440\u0433\u0435\u043d\u0446\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0438\u0441\u043a\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0443\u043c\u043e\u0432. \u041d\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0437\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0438\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440.<\/p>\n<h4>\u0423\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c (Confidence)<\/h4>\n<pre><code class=\"python\">adx_conf     = min(1.0, adx_val \/ 50)signal_count = \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0438\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432confidence = min(1.0, adx_conf * 0.5 + min(signal_count, 10) \/ 10 * 0.5)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Confidence = \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0434\u0432\u0443\u0445 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445:<\/p>\n<ul>\n<li>\n<p>ADX-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430: \u0447\u0435\u043c \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0442\u0440\u0435\u043d\u0434, \u0442\u0435\u043c \u0432\u044b\u0448\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c (ADX 50+ \u2192 100%)<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u044c: \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u0442\u0435\u043c \u0432\u044b\u0448\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c (10+ \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u2192 100%)<\/p>\n<\/li>\n<\/ul>\n<h3>\u0423\u0440\u043e\u0432\u043d\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u044f: \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0444\u0440\u0430\u043a\u0442\u0430\u043b\u043e\u0432<\/h3>\n<pre><code class=\"python\">def _find_support_resistance(high, low, close, n_levels=4, window=5):    for i in range(window, len(highs) - window):        if highs[i] == max(highs[i-window:i+window+1]):            fractal_highs.append(float(highs[i]))        if lows[i] == min(lows[i-window:i+window+1]):            fractal_lows.append(float(lows[i]))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0428\u0430\u0433 1: \u0424\u0440\u0430\u043a\u0442\u0430\u043b\u044b.<\/strong>\u00a0\u0422\u043e\u0447\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0440\u0430\u043a\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u043e\u043c, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u044b\u0448\u0435 \u0432\u0441\u0435\u0445 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u0432 \u043e\u043a\u043d\u0435 \u00b15 \u0431\u0430\u0440\u043e\u0432. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u043e\u0432. \u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0411\u0438\u043b\u043b\u0430 \u0412\u0438\u043b\u044c\u044f\u043c\u0441\u0430.<\/p>\n<p><strong>\u0428\u0430\u0433 2: \u041a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f.<\/strong>\u00a0\u0411\u043b\u0438\u0437\u043a\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 \u0441\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d:<\/p>\n<pre><code class=\"python\">def cluster(levels, radius_pct=0.5):    levels = sorted(levels)    clusters = []    group = [levels[0]]    for v in levels[1:]:        if abs(v - group[-1]) \/ group[-1] * 100 &lt;= radius_pct:            group.append(v)  # \u0443\u0440\u043e\u0432\u043d\u0438 \u0432 \u0440\u0430\u0434\u0438\u0443\u0441\u0435 0.5% \u2014 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0442\u0435\u0440        else:            clusters.append(np.mean(group))  # \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430            group = [v]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0440\u043e\u0433 0.5%: \u0435\u0441\u043b\u0438 \u0434\u0432\u0430 \u0443\u0440\u043e\u0432\u043d\u044f \u043e\u0442\u0441\u0442\u043e\u044f\u0442 \u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 0.5% \u2014 \u043e\u043d\u0438 \u0441\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d (\u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435). \u042d\u0442\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u00ab\u043a\u0430\u0448\u0443\u00bb \u0438\u0437 \u0431\u043b\u0438\u0437\u043a\u0438\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0438 \u0434\u0430\u0451\u0442 \u0447\u0438\u0441\u0442\u044b\u0435 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0435 \u0437\u043e\u043d\u044b.<\/p>\n<p><strong>\u0428\u0430\u0433 3: \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f.<\/strong>\u00a0\u0418\u0437 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f 4 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 (\u043d\u0438\u0436\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0446\u0435\u043d\u044b, \u0441 \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u043c 0.2%) \u0438 4 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u044f (\u0432\u044b\u0448\u0435 \u0446\u0435\u043d\u044b).<\/p>\n<h3>\u0411\u044d\u043a\u0442\u0435\u0441\u0442: \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c<\/h3>\n<pre><code class=\"python\">def _backtest_rule(signal_series, close, forward=3, lookback=100):    for i in range(start, end):        s = sig[i]        if s == 0:            continue        entry = close[i]        exit_ = close[i + forward]  # \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 3 \u0431\u0430\u0440\u0430        ret   = (exit_ - entry) \/ entry * 100 * s        returns.append(ret)        if ret &gt; 0:            wins += 1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c, \u0433\u0434\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441\u0438\u0433\u043d\u0430\u043b, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0447\u0435\u0440\u0435\u0437 3 \u0431\u0430\u0440\u0430. \u0415\u0441\u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u043b \u0431\u044b\u043b \u043d\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0443 (<code>s = +1<\/code>) \u0438 \u0446\u0435\u043d\u0430 \u0432\u044b\u0440\u043e\u0441\u043b\u0430 \u2014 \u0441\u0434\u0435\u043b\u043a\u0430 \u043f\u0440\u0438\u0431\u044b\u043b\u044c\u043d\u0430\u044f.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0434\u0435\u043b\u043e\u043a, win rate (%), \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u0441\u0434\u0435\u043b\u043a\u0438 (%).<\/p>\n<p>\u0412\u0430\u0436\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: \u0431\u044d\u043a\u0442\u0435\u0441\u0442 \u043d\u0430 \u0442\u0435\u0445 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u2014 \u044d\u0442\u043e\u00a0<strong>in-sample \u0442\u0435\u0441\u0442<\/strong>. \u041e\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043d\u0430 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438. \u041d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e\u043c \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.<\/p>\n<h3>\u0420\u0438\u0441\u043a-\u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/h3>\n<pre><code class=\"python\">atr_stop_long = round(price - 2 * atrv, 6)   # \u0441\u0442\u043e\u043f-\u043b\u043e\u0441\u0441atr_tp_long   = round(price + 3 * atrv, 6)   # \u0442\u0435\u0439\u043a-\u043f\u0440\u043e\u0444\u0438\u0442rr = 3.0                                       # R\/R = 1:3<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<div class=\"floating-image\">\n<figure class=\"float \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f98\/d99\/492\/f98d99492519e529e83e83aad75a3e44.png\" alt=\"\u0420\u0438\u0441\u043a-\u043c\u0435\u0442\u0440\u0438\u043a\u0438\" title=\"\u0420\u0438\u0441\u043a-\u043c\u0435\u0442\u0440\u0438\u043a\u0438\" width=\"322\" height=\"275\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f98\/d99\/492\/f98d99492519e529e83e83aad75a3e44.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f98\/d99\/492\/f98d99492519e529e83e83aad75a3e44.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u043a-\u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<p><strong>ATR-\u0441\u0442\u043e\u043f<\/strong>\u00a0\u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0442\u043e\u043f\u0430. \u041b\u043e\u0433\u0438\u043a\u0430: \u0441\u0442\u043e\u043f \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 2\u00d7ATR \u043e\u0442 \u0446\u0435\u043d\u044b \u0432\u0445\u043e\u0434\u0430. ATR \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u0440\u0435\u0434\u043d\u044e\u044e \u0432\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043b\u0435\u0431\u0430\u043d\u0438\u044f \u0446\u0435\u043d\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0431\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u043f.<\/p>\n<\/div>\n<p><strong>\u0412\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0430 20 \u0431\u0430\u0440\u043e\u0432:<\/strong><\/p>\n<pre><code class=\"python\">returns20 = np.diff(np.log(close[-21:]))vol20     = float(np.std(returns20)) * 100<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043b\u043e\u0433-\u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u0435\u0439 \u00d7 100. \u042d\u0442\u043e \u00ab\u043e\u0434\u043d\u043e\u0431\u0430\u0440\u043e\u0432\u0430\u044f \u0432\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u00bb \u0432 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430\u0445. \u0414\u043b\u044f \u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u221a252 \u0434\u0430\u0451\u0442 \u0433\u043e\u0434\u043e\u0432\u0443\u044e \u0432\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0434\u043d\u043e\u0431\u0430\u0440\u043e\u0432\u0430\u044f \u2014 \u043e\u043d\u0430 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0440\u0438\u0441\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438.<\/p>\n<p><strong>Max Drawdown \u0437\u0430 50 \u0431\u0430\u0440\u043e\u0432:<\/strong><\/p>\n<pre><code class=\"python\">peak = np.maximum.accumulate(close[-50:])dd   = (close[-50:] - peak) \/ peak * 100max_drawdown = float(np.min(dd))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043e\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0438\u043a\u0430 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 50 \u0431\u0430\u0440\u0430\u0445. \u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u0435\u0442 \u0440\u0438\u0441\u043a \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438.<\/p>\n<h3>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u044f\u0442 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f<\/h3>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 Flask, \u0430 \u043d\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f?<\/strong><\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0441 \u0437\u0443\u043c\u043e\u043c, \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043e\u0439 \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u2014 \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043b\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a (Chart.js). \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043d\u0430 tkinter \u0438\u043b\u0438 PyQt \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u0431\u044b \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u0434\u0430 \u0438 \u0434\u0430\u043b\u043e \u0445\u0443\u0434\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e. Flask \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 5000, \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<p><strong>\u0417\u0443\u043c \u0438 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 \u043d\u0430 canvas-\u0433\u0440\u0430\u0444\u0438\u043a\u0430\u0445<\/strong><\/p>\n<p>\u041f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 (\u0441\u0432\u0435\u0447\u043d\u043e\u0439, BB, RSI, MACD, Stochastic, \u043e\u0431\u044a\u0451\u043c) \u0440\u0438\u0441\u0443\u044e\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u00a0<code>&lt;canvas&gt;<\/code>\u00a0\u0431\u0435\u0437 Chart.js. \u0414\u043b\u044f \u043d\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0437\u0443\u043c \u0438 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 \u0447\u0435\u0440\u0435\u0437\u00a0<code>modalViewport<\/code>:<\/p>\n<pre><code class=\"javascript\">function handleModalWheel(e) {    const zoomFactor = e.deltaY &gt; 0 ? 1.15 : (1 \/ 1.15);    let newRange = Math.round(range * zoomFactor);    const ratio = (e.clientX - rect.left) \/ rect.width;    const centerIdx = view.start + range * ratio;    \/\/ \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0441 \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430    let newStart = Math.round(centerIdx - newRange * ratio);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043b\u0435\u0441\u043e \u043c\u044b\u0448\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430. \u041f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c. \u041a\u043d\u043e\u043f\u043a\u0430 \u00ab\u0421\u0431\u0440\u043e\u0441\u00bb \u2014\u00a0<code>modalViewport = null<\/code>.<\/p>\n<p><strong>\u0421\u0431\u043e\u0440\u043a\u0430 \u0432 .exe<\/strong><\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a standalone-\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 PyInstaller (<code>--onefile --collect-all talib<\/code>). \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 Python-\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0438 \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443. \u0414\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b Flask \u0441 templates \u0432\u043d\u0443\u0442\u0440\u0438 .exe \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f\u00a0<code>sys._MEIPASS<\/code>:<\/p>\n<pre><code class=\"python\">if getattr(sys, 'frozen', False):    BASE_DIR = sys._MEIPASSelse:    BASE_DIR = os.path.dirname(os.path.abspath(__file__))app = Flask(__name__, template_folder=os.path.join(BASE_DIR, 'templates'))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0427\u0442\u043e \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0438 \u043f\u043e\u0447\u0435\u043c\u0443<\/h3>\n<p><strong>\u041d\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/strong>\u00a0WebSocket-\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u0442\u0438\u043a\u0435\u0440 Binance \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u0430, \u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443: \u043d\u0443\u0436\u0435\u043d \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c, \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432. \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u2014 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435.<\/p>\n<p><strong>\u041d\u0435\u0442 \u0441\u043a\u0440\u0438\u043d\u0435\u0440\u0430.<\/strong>\u00a0\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 50 \u043c\u043e\u043d\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0439\u043c\u0451\u0442 ~2 \u043c\u0438\u043d\u0443\u0442\u044b (4 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043d\u0430 \u0442\u0438\u043a\u0435\u0440: \u0437\u0430\u043f\u0440\u043e\u0441 \u043a API + \u0440\u0430\u0441\u0447\u0451\u0442). \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0443\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 rate limit Binance. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u043e, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u043c\u0438.<\/p>\n<p><strong>\u041d\u0435\u0442 \u043a\u044d\u0448\u0430.<\/strong>\u00a0\u041a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u00ab\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb \u2014 \u043d\u043e\u0432\u044b\u0439 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a Binance. \u0414\u043b\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u0440\u0438 \u0447\u0430\u0441\u0442\u043e\u043c \u043d\u0430\u0436\u0430\u0442\u0438\u0438 Binance \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c 429 (Too Many Requests).<\/p>\n<p><strong>\u0414\u0438\u0432\u0435\u0440\u0433\u0435\u043d\u0446\u0438\u0438 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u044b.<\/strong>\u00a0\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u0438\u0432\u0435\u0440\u0433\u0435\u043d\u0446\u0438\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0443\u043c\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043f\u0438\u043a\u043e\u0432\u044b\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0<code>scipy.signal.argrelmax<\/code>). \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043b\u0430\u0433\u043e\u043c (5 \u0438 10 \u0431\u0430\u0440\u043e\u0432). \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0432 \u0431\u043e\u043a\u043e\u0432\u043e\u043c \u0440\u044b\u043d\u043a\u0435.<\/p>\n<p><strong>AROON \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 Score.<\/strong>\u00a0\u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432, \u043d\u043e \u0432\u00a0<code>signal_<\/code><a href=\"http:\/\/engine.py\" rel=\"noopener noreferrer nofollow\"><code>engine.py<\/code><\/a>\u00a0\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u0440\u0430\u0433\u043c\u0430\u0442\u0438\u0447\u043d\u0430\u044f: AROON \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u0440\u0435\u043d\u0434\u0430, \u043d\u043e \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0430\u0439\u043c\u0444\u0440\u0435\u0439\u043c\u0430.<\/p>\n<h3>\u0418\u0442\u043e\u0433\u043e<\/h3>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 TA-Lib \u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0441 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439\u043d\u044b\u043c\u0438 \u0432\u0435\u0441\u0430\u043c\u0438. \u0412\u0442\u043e\u0440\u043e\u0435 \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f. \u0412\u043c\u0435\u0441\u0442\u043e \u00ab\u0442\u0440\u0438 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u044c\u00bb \u2014 \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 Score \u043e\u0442 -1 \u0434\u043e +1, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432.<\/p>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0443\u0445\u043e\u0434\u044f\u0442, \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u0432\u0435\u0447\u0435\u0439 \u0441 Binance.<\/p>\n<p>\u041a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Python, \u0441\u043e\u0431\u0440\u0430\u043d \u0432 .exe \u0434\u043b\u044f Windows. <\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1047376\/\">https:\/\/habr.com\/ru\/articles\/1047376\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u043d\u0430\u0447\u0430\u043b \u0442\u043e\u0440\u0433\u043e\u0432\u0430\u0442\u044c \u043a\u0440\u0438\u043f\u0442\u043e\u0439, \u043c\u0435\u043d\u044f \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u043b\u043e \u043e\u0434\u043d\u043e: \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0434\u0430\u044e\u0442 \u00abBUY\u00bb \u0438\u043b\u0438 \u00abSELL\u00bb \u0431\u0435\u0437 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439. \u0422\u0440\u0438 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u044c \u2014 \u0432\u043e\u0442 \u0442\u0435\u0431\u0435 \u0441\u0438\u0433\u043d\u0430\u043b. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u0435\u0441\u043e\u0432, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0437\u0430 \u0446\u0438\u0444\u0440\u043e\u0439.\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044e \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Ta-Lib: TA-Lib Python: \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430\u042f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0430\u0447\u0435. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0439\u0434\u0451\u0442 \u0440\u0435\u0447\u044c \u2014 \u044d\u0442\u043e \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Windows, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u043e\u0439\u043d\u044b\u043c \u043a\u043b\u0438\u043a\u043e\u043c, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c\u0443 API Binance \u0438 \u0432\u044b\u0434\u0430\u0451\u0442 \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 Score \u043f\u043e \u0448\u0435\u0441\u0442\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432, \u0431\u044d\u043a\u0442\u0435\u0441\u0442 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 100 \u0431\u0430\u0440\u0430\u0445, \u0443\u0440\u043e\u0432\u043d\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438\/\u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e \u0444\u0440\u0430\u043a\u0442\u0430\u043b\u0430\u043c \u0438 ATR-\u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0440\u0438\u0441\u043a\u0430. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0432\u0441\u0451 \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u2014 \u0441 \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c\u0438 \u0438 \u043a\u043e\u0434\u043e\u043c.\u0414\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u041f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:Binance REST API     \u2193get_binance_data() \u2014 500 \u0441\u0432\u0435\u0447\u0435\u0439 OHLCV     \u2193calculate_all_indicators() \u2014 17+ \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 TA-Lib     \u2193detect_patterns() \u2014 58 \u0441\u0432\u0435\u0447\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432     \u2193generate_professional_signals() \u2014 \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 Score \u043f\u043e 6 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c     \u2193Flask API \u2192 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u2192 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 + \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0430\u043d\u0435\u043b\u044c\u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0441 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430\u00a0api.binance.com\/api\/v3\/klines\u00a0\u2014 \u043e\u043d \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 300\u2013500 \u0441\u0432\u0435\u0447\u0435\u0439, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0432 pandas DataFrame \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 float64 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435.\u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b: \u0447\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438 \u043a\u0430\u043a\u0412\u0441\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437\u00a0TA-Lib\u00a0\u2014 C-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 Python-\u043e\u0431\u0432\u044f\u0437\u043a\u043e\u0439. \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043d\u0430 500 \u0441\u0432\u0435\u0447\u0430\u0445 \u2014 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.\u0421\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0435 \u0441\u0440\u0435\u0434\u043d\u0438\u0435indicators[&#8216;SMA_7&#8217;]   = talib.SMA(close, timeperiod=7)indicators[&#8216;SMA_25&#8217;]  = talib.SMA(close, timeperiod=25)indicators[&#8216;SMA_50&#8217;]  = talib.SMA(close, timeperiod=50)indicators[&#8216;SMA_100&#8217;] = talib.SMA(close, timeperiod=100)indicators[&#8216;SMA_200&#8217;] = talib.SMA(close, timeperiod=200)indicators[&#8216;EMA_12&#8217;]  = talib.EMA(close, timeperiod=12)indicators[&#8216;EMA_26&#8217;]  = talib.EMA(close, timeperiod=26)\u0421\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0435 \u0441\u0440\u0435\u0434\u043d\u0438\u0435SMA\u00a0\u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0430\u044f \u0441\u0440\u0435\u0434\u043d\u044f\u044f, \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0446\u0435\u043d \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0437\u0430 N \u0431\u0430\u0440\u043e\u0432:SMA(n) = (C\u2081 + C\u2082 + &#8230; + C\u2099) \/ nEMA\u00a0\u2014 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f, \u043f\u0440\u0438\u0434\u0430\u0451\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0432\u0435\u0441 \u0441\u0432\u0435\u0436\u0438\u043c \u0446\u0435\u043d\u0430\u043c:EMA(t) = C(t) \u00d7 k + EMA(t-1) \u00d7 (1 &#8212; k),   \u0433\u0434\u0435 k = 2 \/ (n + 1)\u0414\u043b\u044f EMA(12): k = 2\/13 \u2248 0.154. \u0414\u043b\u044f EMA(26): k = 2\/27 \u2248 0.074. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 EMA(12) \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0446\u0435\u043d\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0435.MACDMACDmacd, signal, hist = talib.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)MACD \u2014 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0445 EMA:MACD = EMA(12) &#8212; EMA(26)Signal = EMA(9) \u043e\u0442 MACDHistogram = MACD &#8212; Signal\u0413\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u041a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 \u0432 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u043e\u043d\u0435 \u2014 \u0438\u043c\u043f\u0443\u043b\u044c\u0441 \u0443\u0441\u0438\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0430\u0434\u0430\u0442\u044c, \u043e\u0441\u0442\u0430\u0432\u0430\u044f\u0441\u044c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u2014 \u0438\u043c\u043f\u0443\u043b\u044c\u0441 \u0441\u043b\u0430\u0431\u0435\u0435\u0442, \u0445\u043e\u0442\u044f \u0442\u0440\u0435\u043d\u0434 \u0435\u0449\u0451 \u0432\u0432\u0435\u0440\u0445. \u042d\u0442\u043e \u0440\u0430\u043d\u043d\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442\u0430.RSIRSIindicators[&#8216;RSI&#8217;] = talib.RSI(close, timeperiod=14)RSI \u0423\u0430\u0439\u043b\u0434\u0435\u0440\u0430 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439:RS = Avg(Up closes, 14) \/ Avg(Down closes, 14)RSI = 100 &#8212; 100 \/ (1 + RS)\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d 0\u2013100. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 30\/70. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435: &lt; 25 \u2014 \u00ab\u0433\u043b\u0443\u0431\u043e\u043a\u043e \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0434\u0430\u043d\u00bb (\u0432\u0435\u0441 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 1.0), &lt; 30 \u2014 \u00ab\u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0434\u0430\u043d\u00bb (0.7), &lt; 40 \u2014 \u00ab\u0431\u043b\u0438\u0437\u043a\u043e \u043a \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u0438\u00bb (0.2). \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0437\u043e\u043d\u044b.StochasticStochasticstoch_k, stoch_d = talib.STOCH(    high, low, close,    fastk_period=14, slowk_period=3,    slowk_matype=0, slowd_period=3, slowd_matype=0)\u0421\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u043a \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0446\u0435\u043d\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0441 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u043c \u0446\u0435\u043d \u0437\u0430 \u043f\u0435\u0440\u0438\u043e\u0434:%K = (Close &#8212; Lowest Low\u2081\u2084) \/ (Highest High\u2081\u2084 &#8212; Lowest Low\u2081\u2084) \u00d7 100%D = SMA(3) \u043e\u0442 %K\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0438, \u043d\u043e \u0438 \u043d\u0430 \u043a\u0440\u043e\u0441\u0441\u043e\u0432\u0435\u0440 %K\/%D \u0432 \u0437\u043e\u043d\u0430\u0445 \u043f\u0435\u0440\u0435\u043a\u0443\u043f\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438\/\u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u2014 \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0430\u043a\u0442 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432 \u0437\u043e\u043d\u0443.Bollinger BandsBollinger Bandsbb_upper, bb_middle, bb_lower = talib.BBANDS(    close, timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)\u041f\u043e\u043b\u043e\u0441\u044b \u0411\u043e\u043b\u043b\u0438\u043d\u0434\u0436\u0435\u0440\u0430:Middle = SMA(20)Upper  = SMA(20) + 2 \u00d7 \u03c3(20)Lower  = SMA(20) &#8212; 2 \u00d7 \u03c3(20)\u0433\u0434\u0435 \u03c3(20) \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0446\u0435\u043d \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0437\u0430 20 \u0431\u0430\u0440\u043e\u0432. \u041f\u0440\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 ~95% \u0446\u0435\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u043b\u043e\u0441. \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0446\u0435\u043d\u0430 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043f\u043e\u043b\u043e\u0441\u044b \u2014 \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044e \u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0443 \u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439.\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u2014\u00a0%B\u00a0(Percent Bandwidth):%B = (Close &#8212; Lower) \/ (Upper &#8212; Lower)%B = 0 \u2014 \u0446\u0435\u043d\u0430 \u043d\u0430 \u043d\u0438\u0436\u043d\u0435\u0439 \u043f\u043e\u043b\u043e\u0441\u0435, %B = 1 \u2014 \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u0439, &lt; 0 \u0438\u043b\u0438 &gt; 1 \u2014 \u0437\u0430 \u043f\u043e\u043b\u043e\u0441\u043e\u0439.\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u2014\u00a0BB Width, \u0448\u0438\u0440\u0438\u043d\u0430 \u043f\u043e\u043b\u043e\u0441:BBW = (Upper &#8212; Lower) \/ Middle \u00d7 100\u041a\u043e\u0433\u0434\u0430 BBW \u0432 \u043d\u0438\u0436\u043d\u0438\u0445 10% \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u2014\u00a0BB Squeeze: \u0432\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0436\u0430\u0442\u0430 \u0434\u043e \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430, \u0440\u044b\u043d\u043e\u043a \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442 \u044d\u043d\u0435\u0440\u0433\u0438\u044e \u0434\u043b\u044f \u0441\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f.ADX \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435indicators[&#8216;ADX&#8217;]      = talib.ADX(high, low, close, timeperiod=14)indicators[&#8216;PLUS_DI&#8217;]  = talib.PLUS_DI(high, low, close, timeperiod=14)indicators[&#8216;MINUS_DI&#8217;] = talib.MINUS_DI(high, low, close, timeperiod=14)\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0423\u0430\u0439\u043b\u0434\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0441\u0438\u043b\u044b \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u043d\u0434\u0430:+DM = max(High &#8212; PrevHigh, 0), \u0435\u0441\u043b\u0438 &gt; |Low &#8212; PrevLow|, \u0438\u043d\u0430\u0447\u0435 0-DM = max(PrevLow &#8212; Low, 0),   \u0435\u0441\u043b\u0438 &gt; |High &#8212; PrevHigh|, \u0438\u043d\u0430\u0447\u0435 0TR  = max(High &#8212; Low, |High &#8212; PrevClose|, |Low &#8212; PrevClose|)+DI = 100 \u00d7 EMA(14, +DM) \/ EMA(14, TR)-DI = 100 \u00d7 EMA(14, -DM) \/ EMA(14, TR)DX  = 100 \u00d7 |+DI &#8212; -DI| \/ (+DI + -DI)ADX = EMA(14, DX)\u0422\u0440\u0435\u043d\u0434\u043e\u0432\u044b\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044bADX \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u00a0\u0441\u0438\u043b\u0443\u00a0\u0442\u0440\u0435\u043d\u0434\u0430, \u043d\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435. ADX &gt; 25 \u2014 \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u0442\u0440\u0435\u043d\u0434, &gt; 40 \u2014 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u044b\u0439. \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u0451\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 +DI \u0438 -DI: +DI &gt; -DI \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0442\u0440\u0435\u043d\u0434.\u0412 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 ADX \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u043e\u044f\u043a\u043e: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 +DI\/-DI, \u0438 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430\u00a0Confidence\u00a0(\u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430).ATRindicators[&#8216;ATR&#8217;] = talib.ATR(high, low, close, timeperiod=14)True Range \u2014 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0442\u0440\u0451\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:TR = max(High &#8212; Low, |High &#8212; PrevClose|, |Low &#8212; PrevClose|)ATR = EMA(14, TR)\u0412\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044cATR \u2014 \u043c\u0435\u0440\u0430 \u0432\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0445 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445 \u0446\u0435\u043d\u044b. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0432 \u0442\u0440\u0451\u0445 \u043c\u0435\u0441\u0442\u0430\u0445: \u043a\u0430\u043a \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0440\u0438\u0441\u043a-\u043c\u0435\u0442\u0440\u0438\u043a (\u0441\u0442\u043e\u043f\/\u0442\u0435\u0439\u043a), \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0432\u043e\u043b\u0430\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 20-\u0431\u0430\u0440\u043e\u0432\u044b\u043c \u0441\u0440\u0435\u0434\u043d\u0438\u043c ATR) \u0438 \u043a\u0430\u043a \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438.OBVindicators[&#8216;OBV&#8217;] = talib.OBV(close, volume)OBVOn-Balance Volume \u2014 \u043d\u0430\u043a\u043e\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043a\u0443\u043f\u043e\u043a\/\u043f\u0440\u043e\u0434\u0430\u0436:OBV(t) = OBV(t-1) + Volume(t),  \u0435\u0441\u043b\u0438 Close &gt; PrevCloseOBV(t) = OBV(t-1) &#8212; Volume(t),  \u0435\u0441\u043b\u0438 Close &lt; PrevCloseOBV(t) = OBV(t-1),              \u0435\u0441\u043b\u0438 Close = PrevClose\u0421\u043c\u044b\u0441\u043b \u0432 \u0434\u0438\u0432\u0435\u0440\u0433\u0435\u043d\u0446\u0438\u0438: \u0435\u0441\u043b\u0438 OBV \u0440\u0430\u0441\u0442\u0451\u0442, \u0430 \u0446\u0435\u043d\u0430 \u043f\u0430\u0434\u0430\u0435\u0442 \u2014 \u0443\u043c\u043d\u044b\u0435 \u0434\u0435\u043d\u044c\u0433\u0438 \u043f\u043e\u043a\u0443\u043f\u0430\u044e\u0442 \u043d\u0430 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0438. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043d\u0430\u043a\u043b\u043e\u043d OBV \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 10 \u0431\u0430\u0440\u043e\u0432 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0441 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0446\u0435\u043d\u044b.CCI, Williams %R, MFIindicators[&#8216;CCI&#8217;]   = talib.CCI(high, low, close, timeperiod=20)indicators[&#8216;WILLR&#8217;] = talib.WILLR(high, low, close, timeperiod=14)indicators[&#8216;MFI&#8217;]   = talib.MFI(high, low, close, volume, timeperiod=14)CCI\u00a0\u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0439 \u0446\u0435\u043d\u044b \u043e\u0442 \u0435\u0451 \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u043d\u0435\u0439:TP  = (High + Low + Close) \/ 3CCI = (TP &#8212; SMA(TP, 20)) \/ (0.015 \u00d7 MeanDeviation)\u0417\u043e\u043d\u044b \u00b1100 \u2014 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u0438, \u00b1150 \u2014 \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0430\u043b\u044c\u043d\u044b\u0435.Williams %R\u00a0\u2014 \u043f\u0435\u0440\u0435\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0439 \u0441\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u043a:%R = (Highest High\u2081\u2084 &#8212; Close) \/ (Highest High\u2081\u2084 &#8212; Lowest Low\u2081\u2084) \u00d7 (-100)\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043e\u0442 0 \u0434\u043e -100. &lt; -80 \u2014 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u044c, &gt; -20 \u2014 \u043f\u0435\u0440\u0435\u043a\u0443\u043f\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c.MFI\u00a0(Money Flow Index) \u2014 RSI, \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u043e\u0431\u044a\u0451\u043c\u0443:TP = (High + Low + Close) \/ 3Money Flow = TP \u00d7 VolumePositive MF = \u0441\u0443\u043c\u043c\u0430 Money Flow \u0437\u0430 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 TP &gt; PrevTPNegative MF = \u0441\u0443\u043c\u043c\u0430 Money Flow \u0437\u0430 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 TP &lt; PrevTPMFI = 100 &#8212; 100 \/ (1 + Positive MF \/ Negative MF)\u041e\u0441\u0446\u0438\u043b\u043b\u044f\u0442\u043e\u0440\u044b\u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 RSI: \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u044a\u0451\u043c. MFI &lt; 20 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0435\u043d\u044c\u0433\u0438 \u0443\u0445\u043e\u0434\u044f\u0442 \u0441 \u0440\u044b\u043d\u043a\u0430 \u043f\u0440\u0438 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0451\u043c\u0430 \u2014 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u043e\u0432 \u043e\u0441\u043b\u0430\u0431\u0435\u0432\u0430\u0435\u0442.Parabolic SARindicators[&#8216;SAR&#8217;] = talib.SAR(high, low, acceleration=0.02, maximum=0.2)\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 SAR \u2014 \u0441\u043b\u0435\u0434\u044f\u0449\u0438\u0439 \u0441\u0442\u043e\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0446\u0435\u043d\u043e\u0439 \u043f\u0440\u0438 \u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u043c \u0442\u0440\u0435\u043d\u0434\u0435:SAR(t) = SAR(t-1) + AF \u00d7 (EP &#8212; SAR(t-1))\u0433\u0434\u0435 AF (Acceleration Factor) \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 0.02 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 0.02 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043d\u043e\u0432\u043e\u043c \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0443\u043c\u0435, \u043d\u043e \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 0.20. EP \u2014 \u043a\u0440\u0430\u0439\u043d\u044f\u044f \u0442\u043e\u0447\u043a\u0430 (Extreme Point): \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043f\u0440\u0438 \u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u043c \u0442\u0440\u0435\u043d\u0434\u0435, \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u0440\u0438 \u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u043c.\u041a\u043e\u0433\u0434\u0430 \u0446\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 SAR \u2014 \u0442\u0440\u0435\u043d\u0434 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043c\u0435\u043d\u0438\u0432\u0448\u0438\u043c\u0441\u044f.58 \u0441\u0432\u0435\u0447\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 TA-Lib \u0432\u0438\u0434\u0430\u00a0talib.CDL*(open, high, low, close). \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: +100 (\u0431\u044b\u0447\u0438\u0439), -100 (\u043c\u0435\u0434\u0432\u0435\u0436\u0438\u0439), 0 (\u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d). \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 -200 \u0434\u043e +200 \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u043b\u044b.\u0421\u0432\u0435\u0447\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435\u00a05 \u0441\u0432\u0435\u0447\u0435\u0439\u00a0\u2014 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u0441\u0432\u0435\u0447\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 (\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0437\u0432\u0435\u0437\u0434\u0430, \u0442\u0440\u0438 \u0431\u0435\u043b\u044b\u0445 \u0441\u043e\u043b\u0434\u0430\u0442\u0430), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0431\u0430\u0440\u0430\u0445.\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043b\u043e\u0433\u0438\u043a\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f (\u0432\u043d\u0443\u0442\u0440\u0438 TA-Lib):\u041c\u043e\u043b\u043e\u0442 (Hammer):\u00a0\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u0442\u0435\u043b\u043e \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u043d\u0438\u0436\u043d\u044f\u044f \u0442\u0435\u043d\u044c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 2\u00d7 \u0442\u0435\u043b\u0430, \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0442\u0435\u043d\u044c. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0442\u0440\u0435\u043d\u0434\u0430.\u041f\u043e\u0433\u043b\u043e\u0449\u0435\u043d\u0438\u0435 (Engulfing):\u00a0\u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0432\u0435\u0447\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0433\u043b\u043e\u0449\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u043f\u0435\u0440\u0432\u043e\u0439. \u041f\u0440\u0438 \u0431\u044b\u0447\u044c\u0435\u043c \u043f\u043e\u0433\u043b\u043e\u0449\u0435\u043d\u0438\u0438: \u043f\u0435\u0440\u0432\u0430\u044f \u043a\u0440\u0430\u0441\u043d\u0430\u044f, \u0432\u0442\u043e\u0440\u0430\u044f \u0437\u0435\u043b\u0451\u043d\u0430\u044f \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e \u0442\u0435\u043b\u0443.\u0422\u0440\u0438 \u0431\u0435\u043b\u044b\u0445 \u0441\u043e\u043b\u0434\u0430\u0442\u0430:\u00a0\u0442\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0437\u0435\u043b\u0451\u043d\u044b\u0445 \u0441\u0432\u0435\u0447\u0438, \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0448\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.\u0412 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0432\u0435\u0441 \u043e\u0442 0.3 \u0434\u043e 1.0. \u0412\u0435\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u043a\u043b\u0430\u0434 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u00ab\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b\u00bb (8% \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e Score).\u041c\u0443\u043b\u044c\u0442\u0438\u0444\u0430\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b\u042d\u0442\u043e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041b\u043e\u0433\u0438\u043a\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432\u00a0signal_engine.py\u00a0(775 \u0441\u0442\u0440\u043e\u043a).\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u0435\u0441\u043e\u0432CATEGORY_WEIGHTS = {    &#8216;trend&#8217;:      0.28,    &#8216;momentum&#8217;:   0.22,    &#8216;macd&#8217;:       0.18,    &#8216;volatility&#8217;: 0.14,    &#8216;volume&#8217;:     0.10,    &#8216;patterns&#8217;:   0.08,}\u0421\u0443\u043c\u043c\u0430 \u0432\u0435\u0441\u043e\u0432 = 1.0. \u041a\u0430\u0436\u0434\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0cat_score\u00a0\u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [-1, +1].\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 Scoretotal_score = sum(cat_scores.get(cat, 0) * w for cat, w in CATEGORY_WEIGHTS.items())\u042d\u0442\u043e \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430:\u00a0Score = 0.28\u00d7trend + 0.22\u00d7momentum + 0.18\u00d7macd + 0.14\u00d7volatility + 0.10\u00d7volume + 0.08\u00d7patterns\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [-1, +1]:Score \u2265 +0.45  \u2192  STRONG BUYScore \u2265 +0.20  \u2192  BUY\u22120.20 &lt; Score &lt; +0.20  \u2192  NEUTRALScore \u2264 \u22120.20  \u2192  SELLScore \u2264 \u22120.45  \u2192  STRONG SELL\u041a\u0430\u043a \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f cat_score \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438\u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0432\u0435\u0441. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u00ab\u0422\u0440\u0435\u043d\u0434\u00bb:\u0421\u043e\u0431\u044b\u0442\u0438\u0435\u0412\u0435\u0441 \u0441\u0438\u0433\u043d\u0430\u043b\u0430Golden Cross SMA 50\/200+1.0Death Cross SMA 50\/200\u22121.0Golden Cross EMA 12\/26+0.8Death Cross EMA 12\/26\u22120.8SMA 50 &gt; SMA 200 (\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e)+0.4SAR \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442 \u0432\u0432\u0435\u0440\u0445+0.6SAR \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442 \u0432\u043d\u0438\u0437\u22120.6\u0426\u0435\u043d\u0430 \u0432\u044b\u0448\u0435&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-483585","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483585","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=483585"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483585\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=483585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=483585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=483585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}