Riy777 commited on
Commit
0bf918d
·
1 Parent(s): 3bcda1c

Create patterns.py

Browse files
Files changed (1) hide show
  1. ml_engine/patterns.py +294 -0
ml_engine/patterns.py ADDED
@@ -0,0 +1,294 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ml_engine/patterns.py
2
+ import pandas as pd
3
+ import numpy as np
4
+
5
+ class ChartPatternAnalyzer:
6
+ def __init__(self):
7
+ self.pattern_cache = {}
8
+
9
+ async def detect_chart_patterns(self, ohlcv_data):
10
+ """اكتشاف الأنماط البيانية لجميع الأطر الزمنية"""
11
+ patterns = {
12
+ 'pattern_detected': 'no_clear_pattern',
13
+ 'pattern_confidence': 0,
14
+ 'predicted_direction': 'neutral',
15
+ 'timeframe_analysis': {},
16
+ 'all_patterns': []
17
+ }
18
+
19
+ try:
20
+ for timeframe, candles in ohlcv_data.items():
21
+ if candles and len(candles) >= 20:
22
+ dataframe = self._create_dataframe(candles)
23
+ timeframe_pattern = await self._analyze_timeframe_patterns(dataframe, timeframe)
24
+ patterns['timeframe_analysis'][timeframe] = timeframe_pattern
25
+ patterns['all_patterns'].append(timeframe_pattern)
26
+
27
+ if timeframe_pattern['confidence'] > patterns['pattern_confidence']:
28
+ patterns.update({
29
+ 'pattern_detected': timeframe_pattern['pattern'],
30
+ 'pattern_confidence': timeframe_pattern['confidence'],
31
+ 'predicted_direction': timeframe_pattern['direction']
32
+ })
33
+
34
+ return patterns
35
+
36
+ except Exception as e:
37
+ print(f"❌ خطأ في اكتشاف الأنماط: {e}")
38
+ return patterns
39
+
40
+ def _create_dataframe(self, candles):
41
+ """إنشاء DataFrame من بيانات الشموع"""
42
+ try:
43
+ df = pd.DataFrame(candles, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
44
+ df[['open', 'high', 'low', 'close', 'volume']] = df[['open', 'high', 'low', 'close', 'volume']].astype(float)
45
+ return df
46
+ except Exception as e:
47
+ print(f"❌ خطأ في إنشاء DataFrame: {e}")
48
+ return pd.DataFrame()
49
+
50
+ async def _analyze_timeframe_patterns(self, dataframe, timeframe):
51
+ """تحليل الأنماط لإطار زمني محدد"""
52
+ pattern_info = {
53
+ 'pattern': 'no_clear_pattern',
54
+ 'confidence': 0,
55
+ 'direction': 'neutral',
56
+ 'timeframe': timeframe,
57
+ 'details': {}
58
+ }
59
+
60
+ try:
61
+ if dataframe is None or dataframe.empty or len(dataframe) < 20:
62
+ return pattern_info
63
+
64
+ closes = dataframe['close'].values
65
+ highs = dataframe['high'].values
66
+ lows = dataframe['low'].values
67
+ current_price = closes[-1]
68
+
69
+ patterns_detected = []
70
+
71
+ double_pattern = self._detect_double_pattern(highs, lows, closes)
72
+ if double_pattern['detected']:
73
+ patterns_detected.append(double_pattern)
74
+
75
+ breakout_pattern = self._detect_breakout_pattern(highs, lows, closes)
76
+ if breakout_pattern['detected']:
77
+ patterns_detected.append(breakout_pattern)
78
+
79
+ trend_pattern = self._detect_trend_pattern(dataframe)
80
+ if trend_pattern['detected']:
81
+ patterns_detected.append(trend_pattern)
82
+
83
+ support_resistance_pattern = self._detect_support_resistance(highs, lows, closes)
84
+ if support_resistance_pattern['detected']:
85
+ patterns_detected.append(support_resistance_pattern)
86
+
87
+ if patterns_detected:
88
+ best_pattern = max(patterns_detected, key=lambda x: x['confidence'])
89
+ pattern_info.update({
90
+ 'pattern': best_pattern['pattern'],
91
+ 'confidence': best_pattern['confidence'],
92
+ 'direction': best_pattern.get('direction', 'neutral'),
93
+ 'details': best_pattern.get('details', {})
94
+ })
95
+
96
+ return pattern_info
97
+
98
+ except Exception as e:
99
+ print(f"❌ خطأ في تحليل الأنماط للإطار {timeframe}: {e}")
100
+ return pattern_info
101
+
102
+ def _detect_double_pattern(self, highs, lows, closes):
103
+ """كشف نمط القمة المزدوجة أو القاع المزدوج"""
104
+ try:
105
+ if len(highs) < 15:
106
+ return {'detected': False}
107
+
108
+ recent_highs = highs[-15:]
109
+ recent_lows = lows[-15:]
110
+
111
+ high_indices = np.argsort(recent_highs)[-2:]
112
+ high_indices.sort()
113
+
114
+ low_indices = np.argsort(recent_lows)[:2]
115
+ low_indices.sort()
116
+
117
+ double_top = False
118
+ double_bottom = False
119
+
120
+ if len(high_indices) == 2:
121
+ high1 = recent_highs[high_indices[0]]
122
+ high2 = recent_highs[high_indices[1]]
123
+ time_diff = high_indices[1] - high_indices[0]
124
+
125
+ if (abs(high1 - high2) / high1 < 0.02 and
126
+ time_diff >= 3 and time_diff <= 10 and
127
+ closes[-1] < min(high1, high2)):
128
+ double_top = True
129
+
130
+ if len(low_indices) == 2:
131
+ low1 = recent_lows[low_indices[0]]
132
+ low2 = recent_lows[low_indices[1]]
133
+ time_diff = low_indices[1] - low_indices[0]
134
+
135
+ if (abs(low1 - low2) / low1 < 0.02 and
136
+ time_diff >= 3 and time_diff <= 10 and
137
+ closes[-1] > max(low1, low2)):
138
+ double_bottom = True
139
+
140
+ if double_top:
141
+ return {
142
+ 'detected': True,
143
+ 'pattern': 'Double Top',
144
+ 'confidence': 0.75,
145
+ 'direction': 'down',
146
+ 'details': {
147
+ 'resistance_level': np.mean([high1, high2]),
148
+ 'breakdown_level': min(lows[-5:])
149
+ }
150
+ }
151
+ elif double_bottom:
152
+ return {
153
+ 'detected': True,
154
+ 'pattern': 'Double Bottom',
155
+ 'confidence': 0.75,
156
+ 'direction': 'up',
157
+ 'details': {
158
+ 'support_level': np.mean([low1, low2]),
159
+ 'breakout_level': max(highs[-5:])
160
+ }
161
+ }
162
+
163
+ return {'detected': False}
164
+
165
+ except Exception as e:
166
+ return {'detected': False}
167
+
168
+ def _detect_breakout_pattern(self, highs, lows, closes):
169
+ """كشف نمط الاختراق"""
170
+ try:
171
+ if len(highs) < 25:
172
+ return {'detected': False}
173
+
174
+ current_price = closes[-1]
175
+
176
+ resistance = np.max(highs[-25:-5])
177
+ support = np.min(lows[-25:-5])
178
+
179
+ if current_price > resistance * 1.01:
180
+ return {
181
+ 'detected': True,
182
+ 'pattern': 'Breakout Up',
183
+ 'confidence': 0.8,
184
+ 'direction': 'up',
185
+ 'details': {
186
+ 'breakout_level': resistance,
187
+ 'target_level': resistance * 1.05
188
+ }
189
+ }
190
+ elif current_price < support * 0.99:
191
+ return {
192
+ 'detected': True,
193
+ 'pattern': 'Breakout Down',
194
+ 'confidence': 0.8,
195
+ 'direction': 'down',
196
+ 'details': {
197
+ 'breakdown_level': support,
198
+ 'target_level': support * 0.95
199
+ }
200
+ }
201
+
202
+ return {'detected': False}
203
+
204
+ except Exception as e:
205
+ return {'detected': False}
206
+
207
+ def _detect_trend_pattern(self, dataframe):
208
+ """كشف نمط الاتجاه"""
209
+ try:
210
+ if dataframe is None or dataframe.empty or len(dataframe) < 20:
211
+ return {'detected': False}
212
+
213
+ closes = dataframe['close'].values
214
+
215
+ ma_short = np.mean(closes[-5:])
216
+ ma_medium = np.mean(closes[-13:])
217
+ ma_long = np.mean(closes[-21:])
218
+
219
+ if ma_short > ma_medium > ma_long and closes[-1] > ma_short:
220
+ trend_strength = (ma_short - ma_long) / ma_long
221
+ confidence = min(0.3 + trend_strength * 10, 0.8)
222
+ return {
223
+ 'detected': True,
224
+ 'pattern': 'Uptrend',
225
+ 'confidence': confidence,
226
+ 'direction': 'up',
227
+ 'details': {
228
+ 'trend_strength': trend_strength,
229
+ 'support_level': ma_medium
230
+ }
231
+ }
232
+ elif ma_short < ma_medium < ma_long and closes[-1] < ma_short:
233
+ trend_strength = (ma_long - ma_short) / ma_long
234
+ confidence = min(0.3 + trend_strength * 10, 0.8)
235
+ return {
236
+ 'detected': True,
237
+ 'pattern': 'Downtrend',
238
+ 'confidence': confidence,
239
+ 'direction': 'down',
240
+ 'details': {
241
+ 'trend_strength': trend_strength,
242
+ 'resistance_level': ma_medium
243
+ }
244
+ }
245
+
246
+ return {'detected': False}
247
+
248
+ except Exception as e:
249
+ return {'detected': False}
250
+
251
+ def _detect_support_resistance(self, highs, lows, closes):
252
+ """كشف مستويات الدعم والمقاومة"""
253
+ try:
254
+ if len(highs) < 20:
255
+ return {'detected': False}
256
+
257
+ current_price = closes[-1]
258
+
259
+ resistance_level = np.max(highs[-20:])
260
+ support_level = np.min(lows[-20:])
261
+
262
+ position = (current_price - support_level) / (resistance_level - support_level)
263
+
264
+ if position < 0.2:
265
+ return {
266
+ 'detected': True,
267
+ 'pattern': 'Near Support',
268
+ 'confidence': 0.6,
269
+ 'direction': 'up',
270
+ 'details': {
271
+ 'support_level': support_level,
272
+ 'resistance_level': resistance_level,
273
+ 'position': position
274
+ }
275
+ }
276
+ elif position > 0.8:
277
+ return {
278
+ 'detected': True,
279
+ 'pattern': 'Near Resistance',
280
+ 'confidence': 0.6,
281
+ 'direction': 'down',
282
+ 'details': {
283
+ 'support_level': support_level,
284
+ 'resistance_level': resistance_level,
285
+ 'position': position
286
+ }
287
+ }
288
+
289
+ return {'detected': False}
290
+
291
+ except Exception as e:
292
+ return {'detected': False}
293
+
294
+ print("✅ ML Module: Chart Pattern Analyzer loaded")