Discussing the article: "Angular Analysis of Price Movements: A Hybrid Model for Predicting Financial Markets"
3 publications in a row, I am amazed, "fools have similar thoughts" :-)
we do approximately the same thing, simultaneously and independently.
similar squabbles with corners, but only the horse before the cart (the only thing predicted is personal balance, quotes do not care):
I will not screenshot about Gan, but in my opinion - everything is not bad there and there angle=typical volatility of natural cycles.
intuitively, by personal experience and having what is at hand, Gan deduced what he deduced. but more objective than MACD :-)
One more question, if you can answer.
When uploading the results to ONNX and implementing the EA, a problem arose. When transferring data with dimension {1,31} to the first classification model there are no problems, I get the values
2025.04.22 19:47:28.268 test_gann (ORDIUSDT,M5) directionUpDn = 1 directionStrength=0.44935011863708496
But when passing the same data to the second model, I keep getting the following error: ONNX: parameter is empty, inspect code '° :àh½5E' (705:10). None of the passed parameters is 0.
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 0, input_matrix[0][i] = -12.92599868774414
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 1, input_matrix[0][i] = -12.92599868774414
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 2, input_matrix[0][i] = -42.55295181274414
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 3, input_matrix[0][i] = 72.71257781982422
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 4, input_matrix[0][i] = 74.29901123046875
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 5, input_matrix[0][i] = -61.42539596557617
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 6, input_matrix[0][i] = 56.164878845214844
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 7, input_matrix[0][i] = -80.11347198486328
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 8, input_matrix[0][i] = 79.91580200195312
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 9, input_matrix[0][i] = -48.93017578125
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 10, input_matrix[0][i] = 80.48663330078125
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 11, input_matrix[0][i] = -79.71015930175781
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 12, input_matrix[0][i] = -45.92404556274414
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 13, input_matrix[0][i] = -82.36412048339844
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 14, input_matrix[0][i] = -56.164878845214844
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 15, input_matrix[0][i] = -10.630552291870117
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 16, input_matrix[0][i] = 62.323272705078125
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 17, input_matrix[0][i] = 13.0
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 18, input_matrix[0][i] = 10.0
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 19, input_matrix[0][i] = -12.92599868774414
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 20, input_matrix[0][i] = -61.48434829711914
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 21, input_matrix[0][i] = -36.735313415527344
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 22, input_matrix[0][i] = -23.80649185180664
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 23, input_matrix[0][i] = 0.3333333432674408
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 24, input_matrix[0][i] = 6.955999851226807
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 25, input_matrix[0][i] = 0.029581977054476738
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 26, input_matrix[0][i] = -0.5281187295913696
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 27, input_matrix[0][i] = 0.4025301933288574
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 28, input_matrix[0][i] = 420.0
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 29, input_matrix[0][i] = 641.6666870117188
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) i = 30, input_matrix[0][i] = 0.6545454263687134
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) ONNX: parameter is empty, inspect code '° :àh½5E' (705:10)
2025.04.22 19:39:38.482 test_gann (ORDIUSDT,M5) Execution error: 5805
Maybe you can help me with the error (the vastness of the Internet did not help)
Published article Angular analysis of price movements: a hybrid model for forecasting financial markets:
Author: Yevgeniy Koshtenko
Metrics for bar back = 60, forward = 30
Train Accuracy: 0.9200 | Test Accuracy: 0.8713 | GAP: 0.0486
Train F1-score: 0.9187 | Test F1-score: 0.8682 | GAP: 0.0505
At short distances CatBoost does not do any good, the model is overtrained
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use

Check out the new article: Angular Analysis of Price Movements: A Hybrid Model for Predicting Financial Markets.
Thousands of candles are born every day on charts of currency pairs, stocks and futures. They compose patterns, form trends, and create resistances and supports. But behind these familiar pictures lies a mathematical entity that we rarely notice, namely angles between successive price points.
Take a look at the regular EURUSD chart. What can you see? Lines and bars? Now imagine that each segment between two consecutive points forms a certain angle with the horizontal axis. This angle has an exact mathematical value. A positive angle means an upward movement, and a negative angle means a downward movement. The larger the angle, the steeper the price movement.
Sounds simple? But this simplicity hides an amazing depth. Because angles are not equal to each other. They form their own pattern, their own melody. And this melody, as it turns out, contains keys to the future market movement.
Author: Yevgeniy Koshtenko