English 中文 Español Deutsch 日本語 Português
preview
Анализ настроений в Twitter с помощью сокетов

Анализ настроений в Twitter с помощью сокетов

MetaTrader 5Интеграция | 22 апреля 2025, 09:44
121 1
Javier Santiago Gaston De Iriarte Cabrera
Javier Santiago Gaston De Iriarte Cabrera

Введение

В этой статье представлен сложный торговый бот, использующий для принятия своих торговых решений анализ настроений в реальном времени на базе платформ социальных сетей. Благодаря интеграции MetaTrader 5 с движком анализа настроений на Python, этот бот представляет собой передовое сочетание финансовой математики и обработки естественного языка.

Архитектура бота построена на основе клиент-серверной модели с использованием сокетной связи для преодоления разрыва между торговыми возможностями MetaTrader 5 и мощностью обработки данных языка Python. По сути, система анализирует настроения в Twitter, связанные с конкретными финансовыми инструментами, преобразуя мнения, циркулирующие в социальных сетях, в действенные торговые сигналы.

Такой инновационный подход не только демонстрирует потенциал междисциплинарных технологий в финансах, но и подчеркивает растущую значимость альтернативных источников данных в современных торговых стратегиях. По мере углубления в функциональность и структуру кода этого бота рассмотрим, как он обрабатывает данные социальных сетей, управляет сетевыми коммуникациями и совершает сделки на основе оценок настроений.

Следующий анализ даст представление о компонентах бота, рассматривая как его советник для MetaTrader 5, написанный на языке MQL5, так и его серверный аналог на языке Python. Мы изучим тонкости их взаимодействия, методологию анализа настроений и реализованную торговую логику. Эта работа откроет важные перспективы трейдерам, разработчикам и исследователям, интересующимся пересечением аналитики социальных сетей и алготрейдинга.


Разбор

Разберем код как для советника MetaTrader 5, так и для сервера Python, с объяснением их основных компонентов и функциональных возможностей.


Советник MetaTrader 5 (MQL5)

1. Инициализация и входные данные:

   Сначала в советнике определяются входные параметры для торгового символа, учетные данные API платформы Twitter и торговые параметры, такие как стоп-лосс и тейк-профит. Кроме того, он включает в себя библиотеки, необходимые для исполнения сделок и управления позициями.

//+------------------------------------------------------------------+
//|                               Twitter_Sentiment_with_soquets.mq5 |
//|       Copyright 2024, Javier Santiago Gaston de Iriarte Cabrera. |
//|                      https://www.mql5.com/en/users/jsgaston/news |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Javier Santiago Gaston de Iriarte Cabrera."
#property link      "https://www.mql5.com/en/users/jsgaston/news"
#property version   "1.001"
#property description "This EA sends data to a Python server and receives sentiment analysis"

input group                "---- Symbol to work with ----"
input string symbol1 = "BTCUSD";                                       // Symbol

input group                "---- Passwords ----"
input string twitter_api_key = "TwitterApiKey";                        // Twitter API key
input string twitter_api_secret = "TwitterApiSecret";                  // Twitter API secret
input string twitter_access_token = "TwitterAccessToken";              // Twitter Access Token
input string twitter_access_token_secret = "TwitterAccessTokenSecret"; // Twitter Access Token Secret
input string twitter_bearer_token = "TwitterBearerToken";              // Twitter Bearer Token
input string client_id = "TwitterClientID";                            // Twitter Client ID
input string client_secret = "TwitterClientSecret";                    // Twitter Client Secret

input group                "---- Stops ----"
input bool   InpUseStops   = false;    // Use stops in trading
input int    InpTakeProfit = 1000;      // TakeProfit level
input int    InpStopLoss   = 500;      // StopLoss level
input double InpLot = 0.1;             // Lot size

#include <Trade\Trade.mqh> // Instatiate Trades Execution Library
#include <Trade\OrderInfo.mqh> // Instatiate Library for Orders Information
#include <Trade\PositionInfo.mqh> // Library for all position features and information

// Create a trade object
CTrade trade;

// Last request time
datetime lastRequestTime = 0;
int requestInterval = 30 * 60; // 30 minutes in seconds

2. Функция OnInit():

   - Проверяет, включены ли push-уведомления.

   - Инициирует связь с сервером Python во время инициализации.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!TerminalInfoInteger(TERMINAL_NOTIFICATIONS_ENABLED))
     {
      Print("Push notifications are not enabled. Please enable them in terminal settings.");
      return INIT_FAILED;
     }

   // Call the function to communicate with the Python server during initialization
   string data = StringFormat("%s,%s,%s,%s,%s,%s,%s,%s", symbol1, twitter_api_key, twitter_api_secret, twitter_access_token, twitter_access_token_secret, twitter_bearer_token, client_id, client_secret);
   string result = CommunicateWithPython(data);
   Print("Result received from Python server during initialization: ", result);

   return(INIT_SUCCEEDED);
  }

3. Функция OnTick():

   - Реализует 30-минутный интервал между запросами к серверу Python.

   - Формирует и отправляет данные на сервер Python с помощью функции CommunicateWithPython().

   - Обрабатывает полученные данные о настроениях и совершает сделки на основе их оценки.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   // Check if 30 minutes have passed since the last request
   if(TimeCurrent() - lastRequestTime < requestInterval)
     {
      return; // Exit if the interval has not passed
     }

   // Update the last request time
   lastRequestTime = TimeCurrent();

   // Call the function to communicate with the Python server
   string data = StringFormat("%s,%s,%s,%s,%s,%s,%s,%s", symbol1, twitter_api_key, twitter_api_secret, twitter_access_token, twitter_access_token_secret, twitter_bearer_token, client_id, client_secret);
   string result = CommunicateWithPython(data);
   
   if(result == "")
     {
      Print("No data received from Python");
      return;
     }
   
   // Process the sentiment value
   Print("Raw result: ", result);  // Debug line
   string sentiment_values[];
   int num_elements = StringSplit(result, ',', sentiment_values);
   Print("Number of elements: ", num_elements);  // Debug line

   if(num_elements > 0)
     {
      double tweet_sentiment = StringToDouble(sentiment_values[0]);
      Print("Twitter sentiment: ", tweet_sentiment);  // Debug line
      double price = SymbolInfoDouble(symbol1, SYMBOL_BID);
      double take_profit = InpTakeProfit * _Point;
      double stop_loss = InpStopLoss * _Point;
      
      if(tweet_sentiment > 0)
        {
         // Buy if sentiment is positive
         if(PositionSelect(symbol1))
           {
            Print("Position already open. Skipping buy.");
           }
         else
           {
            if(trade.Buy(InpLot, symbol1, price, price - stop_loss, price + take_profit))
              Print("Buying ", InpLot, " lots of ", symbol1);
            else
              Print("Failed to place buy order. Error: ", GetLastError());
           }
        }
      else if(tweet_sentiment < 0)
        {
         // Sell if sentiment is negative
         if(PositionSelect(symbol1))
           {
            Print("Position already open. Skipping sell.");
           }
         else
           {
            if(trade.Sell(InpLot, symbol1, price, price + stop_loss, price - take_profit))
              Print("Selling ", InpLot, " lots of ", symbol1);
            else
              Print("Failed to place sell order. Error: ", GetLastError());
           }
        }
     }
   else if(StringFind(result, "ERROR,") == 0)
     {
      Print("Error received from Python server: ", result);
     }
   else
     {
      Print("Unexpected response format: ", result);
     }
  }

4. Сокетная связь:

   - Функция InitSocket() создает сокет и подключается к серверу Python.

   -Функция CommunicateWithPython() обрабатывает данные, отправляемые на сервер Python, и ответы, полученные от него.

//+------------------------------------------------------------------+
//| Initialize socket                                                |
//+------------------------------------------------------------------+
int InitSocket()
  {
   int socket_handle = SocketCreate();
   if(socket_handle < 0)
     {
      Print("Error creating socket");
      return -1;
     }

   Print("Socket created successfully.");

   // Connect to Python server
   bool isConnected = SocketConnect(socket_handle, "127.0.0.1", 65432, 5000);
   if(!isConnected)
     {
      int error = GetLastError();
      Print("Error connecting to Python server. Error code: ", error);
      SocketClose(socket_handle);
      return -1;
     }

   Print("Connection to Python server established.");
   return socket_handle;
  }

//+------------------------------------------------------------------+
//| Function to send and receive data                                |
//+------------------------------------------------------------------+
string CommunicateWithPython(string data)
  {
   int socket_handle = InitSocket();
   if(socket_handle < 0)
      return "";

   // Ensure data is encoded in UTF-8
   uchar send_buffer[];
   StringToCharArray(data, send_buffer);
   int bytesSent = SocketSend(socket_handle, send_buffer, ArraySize(send_buffer));
   if(bytesSent < 0)
     {
      Print("Error sending data!");
      SocketClose(socket_handle);
      return "";
     }

   Print("Data sent: ", bytesSent);

   uint timeout = 5000; // 5 seconds timeout

   uchar rsp[];
   string result;
   uint timeout_check = GetTickCount() + timeout;
   do
     {
      uint len = SocketIsReadable(socket_handle);
      if(len)
        {
         int rsp_len;
         rsp_len = SocketRead(socket_handle, rsp, len, timeout);
         if(rsp_len > 0)
           {
            result += CharArrayToString(rsp, 0, rsp_len);
           }
        }
     }
   while(GetTickCount() < timeout_check && !IsStopped());
   SocketClose(socket_handle);

   if(result == "")
     {
      Print("No data received from Python");
      return "";
     }
   
   Print("Data received from Python: ", result);
   return result;
  }

//+------------------------------------------------------------------+
//| Helper function to convert uchar array to string                 |
//+------------------------------------------------------------------+
string CharArrayToString(const uchar &arr[], int start, int length)
  {
   string result;
   char temp[];
   ArrayResize(temp, length);
   ArrayCopy(temp, arr, 0, start, length);
   result = CharArrayToString(temp);
   return result;
  }
//+------------------------------------------------------------------+

5. Торговая логика:

   - При положительном настроении (> 0) пытается открыть позицию на покупку.

   - При отрицательном настроении (< 0) пытается открыть позицию на продажу.

   - Использует класс CTrade для совершения сделок.


Сервер Python:

1. Настройка сервера:

   - Функция start_server() инициализирует сокет-сервер, прослушивающи входящие соединения.

def start_server():
    """Starts the server that waits for incoming connections."""
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('127.0.0.1', 65432))
    server_socket.listen(1)
    print("Python server started and waiting for connections...")

    while True:
        client_socket, addr = server_socket.accept()
        print(f"Connection from {addr}")
        
        try:
            data = client_socket.recv(1024)
            data = data.decode('utf-8', errors='ignore')
            print(f"Received data: {data}")

            inputs = data.split(',')
            if len(inputs) != 8:
                raise ValueError("Eight inputs were expected")

            symbol, twitter_api_key, twitter_api_secret, twitter_access_token, twitter_access_token_secret, twitter_bearer_token, client_id, client_secret = inputs

            result = process_data(symbol, twitter_bearer_token)
            result_string = f"{result['tweet_sentiment']}"
            client_socket.sendall(result_string.encode('utf-8'))
            print(f"Response sent to client: {result_string}")
        except Exception as e:
            print(f"Communication error: {e}")
            error_message = f"ERROR,{str(e)}"
            client_socket.sendall(error_message.encode('utf-8'))
        finally:
            client_socket.shutdown(socket.SHUT_RDWR)
            client_socket.close()
            print("Connection closed")

2. Обработка данных:

   - При получении соединения декодирует данные и разделяет их на отдельные входы.

   - Вызывает функцию process_data() с символом и токеном на предъявителя в Twitter.

def process_data(symbol, bearer_token):
    """Processes the data obtained from news and tweets."""
    result = { "tweet_sentiment": 0}

    try:
        result["tweet_sentiment"] = analyze_tweets(bearer_token, symbol)
    except Exception as e:
        raise Exception(f"Error processing data: {e}")
    
    print(f"Data processed. Result: {result}")
    return result

3. Анализ твитов:

   - Функция analyze_tweets() использует API Twitter для извлечения последних твитов о заданном символе.

   - Использует TextBlob для проведения анализа настроений по каждому твиту.

   - Рассчитывает средний балл настроения по всем найденным твитам.

def analyze_tweets(bearer_token, symbol):
    """Analyzes recent tweets related to the given symbol."""
    try:
        headers = {
            'Authorization': f'Bearer {bearer_token}',
        }
        query = f"{symbol} lang:en -is:retweet"

        # Get the current time and subtract an hour
        end_time = datetime.now(timezone.utc) - timedelta(seconds=10)  # Subtract 10 seconds from the current time
        start_time = end_time - timedelta(hours=4)

        # Convert to RFC 3339 (ISO 8601) format with second precision and 'Z' at the end
        start_time_str = start_time.strftime('%Y-%m-%dT%H:%M:%SZ')
        end_time_str = end_time.strftime('%Y-%m-%dT%H:%M:%SZ')

        search_url = f"https://api.twitter.com/2/tweets/search/recent?query={query}&max_results=100&start_time={start_time_str}&end_time={end_time_str}&sort_order=relevancy"
        
        print(f"Performing tweet search with query: {query}")
        print(f"Search URL: {search_url}")

        response = requests.get(search_url, headers=headers)
        print(f"Response status code: {response.status_code}")
        print(f"Response text: {response.text}")

        if response.status_code != 200:
            raise Exception(f"Error searching tweets: {response.status_code} - {response.text}")

        tweets = response.json().get('data', [])
        if not tweets:
            print("No tweets found")
            return 0
        
        sentiments = [TextBlob(tweet['text']).sentiment.polarity for tweet in tweets]
        if not sentiments:
            print("No sentiments found")
            return 0
        
        average_sentiment = sum(sentiments) / len(sentiments)
        return average_sentiment
    except Exception as e:
        print(f"Error: {e}")
        raise Exception(f"Error analyzing tweets: {e}")

4. Обработка ошибок:

   - Реализует блоки конструкции try-except для выявления и обработки потенциальных ошибок во время обработки данных и API-запросов.

5. Ответ:

   - Возвращает рассчитанную оценку настроений клиенту Meta Trader 5.

Ключевые моменты:

1. Интеграция в реальном времени. Система обеспечивает анализ настроений практически в реальном времени, извлекая и анализируя последние твиты каждые 30 минут.

2. Торговля на основе настроений. Советник использует для принятия торговых решений оценку настроений, открывая позиции на покупку при положительных и на продажу — при отрицательных.

3. Обработка ошибок. Советник и сервер Python реализуют обработку ошибок для управления потенциальнными проблемами с API-запросами, обработкой данных или связью.

4. Масштабируемость. Связь на основе сокетов допускает потенциальное расширение, например добавление дополнительных источников данных или более сложного анализа на сервере Python без существенных изменений советника MetaTrader 5.

5. Вопросы безопасности. Система с каждым запросом передает учетные данные API. В производственных условиях эту процедуру нужно сделать безопаснее.

6. Ограничения. Текущая реализация только отрывает новые позиции, но не управляет текущими на основе изменения настроений.

Этот бот демонстрирует интересный подход к интеграции анализа внешних данных с торговлей на MetaTrader 5. Однако перед использованием в реальной торговой среде потребуется тщательное тестирование и, возможно, доработка торговой логики.


Как действовать?

1. Вставьте адрес URL (в Инструменты -> Советник)

URL

2. Запустите сервер Python

Python server started and waiting for connections...

3. Запустите соединение с советником и дождитесь получения данных 

2024.07.24 23:29:45.087 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Socket created successfully.
2024.07.24 23:29:45.090 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Connection to Python server established.
2024.07.24 23:29:45.090 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Data sent: 380
Data processed. Result: {'tweet_sentiment': 0.20970252525252508}
Response sent to client: 0.20970252525252508
Connection closed
2024.07.24 23:29:50.082 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Data received from Python: 0.20970252525252508
2024.07.24 23:29:50.082 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Result received from Python server during initialization: 0.20970252525252508
2024.07.24 23:29:50.082 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Socket created successfully.
2024.07.24 23:29:50.084 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Connection to Python server established.
2024.07.24 23:29:50.084 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Data sent: 380
2024.07.24 23:29:55.083 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Data received from Python: 0.20970252525252508
2024.07.24 23:29:55.083 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Raw result: 0.20970252525252508
2024.07.24 23:29:55.083 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Number of elements: 1
2024.07.24 23:29:55.084 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Twitter sentiment: 0.20970252525252508
2024.07.24 23:29:55.201 Twitter_Sentiment_with_soquets_v4 (EURUSD,H1)   Buying 0.1 lots of EURUSD


Как добиться хороших результатов?

Для улучшения стратегии и анализа настроений и получения более качественных результатов рассмотрите следующие изменения:

1. Доработка анализа настроений:

   - Внедрите более продвинутые методы обработки естественного языка:

     * Используйте для более тщательного анализа настроений предварительно обученные языковые модели, такие как BERT или GPT.

     * Внедрите аспектно-ориентированный анализ настроений, чтобы сосредоточить внимание на конкретных атрибутах актива.

   - Расширьте источники данных:

     * Включите статьи о финансовых новостях, документы SEC и другие соответствующие текстовые источники.

     * Анализируйте данные из нескольких социальных сетей, не только из Twitter.

   - Внедрите анализ тенденций в настроениях:

     * Отслеживайте динамику изменения настроений, а не только абсолютные значения.

     * Используйте скользящие средние оценок настроений, чтобы сгладить краткосрочные колебания.

2. Усиление торговой логики:

   - Внедрите пороговые значения для настроений:

     * Определите конкретные уровни настроений для открытия длинных или коротких позиций.

     * Используйте разные пороговые значения для входа и выхода из сделок.

   - Объедините настроения с техническим анализом:

     * Используйте настроения как инструмент для подтверждения данных технических индикаторов.

     * Например, открывайте длинную позицию, только если настроения положительные, а цена находится выше скользящей средней.

   - Включите анализ объема:

     * Учитывайте вместе с настроениями объем постов в социальных сетях.

     * Больший объем при сильных настроениях может указывать на более надежный сигнал.

3. Определение размера позиции и управление рисками:

   - Реализуйте динамическое изменение размера позиции:

     * Отрегулируйте размер позиции в зависимости от силы сигнала настроений.

     * Учитывайте баланс счета и общую волатильность рынка при определении размера позиции.

   - Используйте настроения для уровней стоп-лосс и тейк-профит:

     * Отрегулируйте уровни стоп-лосс в зависимости от волатильности настроений.

     * Установите целевые значения тейк-профит с учетом потенциальных изменений настроения.

4. Особенности таймфреймов:

   - Анализируйте настроения на разных таймфреймах:

     * Учитывайте краткосрочные настроения для выбора времени входа или выхода.

     * Долгосрочные тенденции настроений для общего направления рынка.

   - Внедрите фильтры на основе времени:

     * Учтите время суток или день недели при анализе настроений и совершении сделок.

     * Некоторые активы могут подавать более надежные сигналы о настроениях в определенные часы работы рынка.

5. Настройка с учетом конкретного актива:

   - Настройте стратегию для разных классов активов:

     * Криптовалюты могут реагировать на настроения иначе, чем традиционные.

     * Разработайте словари или модели настроений, характерных для конкретных активов.

6. Интеграция машинного обучения:

   - Разработайте модель машинного обучения для прогнозирования движения цен:

     * Используйте в качестве характеристик наряду с традиционными рыночным данными также данные оценки настроений.

     * Внедрите обучение с подкреплением для постоянного совершенствования стратегии.

7. Тестирование на истории и оптимизация:

   - Проведите всестороннее тестирование на истории:

     * Протестируйте стратегию в разных рыночных условиях и на разных периодах времени.

     * Используйте форфардную оптимизацию во избежание переобучения.

   - Реализуйте оптимизацию параметров:

     * Используйте генетические алгоритмы или другие методы оптимизации для точной настройки параметров стратегии.

8. Проверка настроений:

   - Внедрите систему для проверки точности анализа настроений:

     * Регулярно проверяйте выборку проанализированных текстов вручную.

     * Отслеживайте корреляцию между оценками настроений и последующими движениями цен.

9. Адаптивная стратегия:

   - Разработайте систему, способную адаптироваться к изменчивым условиям рынка:

     * Отрегулируйте пороговые значения оценки настроений в зависимости от общей волатильности рынка.

     * Внедрите обнаружение режима для переключения между различными подстратегиями.

10. Упадок настроений:

    - Внедрите фактор временного спада для настроений:

      * Придавайте большее значение последним данным о настроениях.

      * Постепенно снижайте влияние более старых оценок настроений.

11. Подход «против тренда»:

    - Рассмотрите возможность реализации стратегии «против тренда» при определенных условиях:

      * Крайние настроения в одном направлении могут указывать на возможный разворот.

Помните, хотя такие изменения потенциально могут улучшить стратегию, они увеличивают и ее сложность. Крайне важно тщательно тестировать каждое изменение и понимать его влияние на систему в целом. Начинайте с более простых изменений и постепенно повышайте сложность по мере проверки каждого этапа. Кроме того, всегда имейте в виду, что прошлые результаты не гарантируют будущих, особенно в динамичном мире финансовых рынков.

А еще, чтобы получать твиты из Twitter, я использовал учетную запись платформы X для разработчиков.


Заключение

Представленный в этой статье торговый бот представляет собой значимый шаг в интеграции анализа настроений в социальных сетях с алгоритмической торговлей. Используя возможности MetaTrader 5 и Python, эта система демонстрирует свой потенциал для принятия основанных на данных решений на финансовых рынках в реальном времени.

Инновационный подход бота, который сочетает связь на основе сокетов, анализ настроений в данных Twitter и автоматическое исполнение торговых сделок, демонстрирует возможности, возникающие в результате междисциплинарной технологической интеграции. Он подчеркивает возрастающую значимость альтернативных источников данных в современных торговых стратегиях и потенциал обработки естественного языка для предоставления ценной информации при принятии финансовых решений.

Однако, как и с любой торговой системой, ее можно улучшить и усовершенствовать. Рассматриваемые способы усовершенствования стратегии – от внедрения более сложных методов анализа настроений до внедрения моделей машинного обучения – предлагают пути для будущего развития. Эти улучшения потенциально могли бы привести к получению более надежных и устойчивых торговых сигналов, более эффективному управлению рисками и повышению общей производительности.

Важно отметить, что, хотя этот бот представляет собой интересный подход к торговле на основе настроений, его следует тщательно протестировать и проверить перед использованием в реальных торговых средах Сложность финансовых рынков, возможность быстрой смены настроений и присущие алготрейдингу риски — все это требует осторожного и продуманного подхода к внедрению и оптимизации.

Поскольку такие области знания, как обработка естественных языков, машинное обучение и алгоритмическая торговля, продолжают развиваться, системы, подобные этому боту, вероятно, будут играть все более важную роль в сфере финансов. Они являются не просто новым инструментом трейдеров, но и новой парадигмой нашего понимания финансовых рынков и взаимодействия с ними.

Путь от этой первоначальной реализации до полностью оптимизированной, готовой к использованию на рынке системы — это путь непрерывного обучения, тестирования и совершенствования. Это процесс, который отражает более обширную эволюцию финансовых технологий – постоянное расширение границ, постоянных поиск новых идей и постоянное стремление принимать более обоснованные решения в непрерывно меняющейся рыночной среде.


Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/15407

Прикрепленные файлы |
Server_english.py (3.81 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (1)
Stanislav Korotky
Stanislav Korotky | 23 апр. 2025 в 16:35

Невероятно недоработанный материал, выглядит как черновик.

Ни одного упоминания об импорте, ни слова/основания об используемом анализе настроений, для которого существует множество либ, никаких результатов.

Анализ нескольких символов с помощью Python и MQL5 (Часть I): Производители интегральных схем NASDAQ Анализ нескольких символов с помощью Python и MQL5 (Часть I): Производители интегральных схем NASDAQ
В статье мы рассмотрим, как использовать ИИ для оптимизации размера позиции и количества ордеров, чтобы максимизировать доходность портфеля. Мы покажем, как алгоритмически определить оптимальный портфель и адаптировать его к вашим ожиданиям по доходности или уровню устойчивости к риску. Мы используем библиотеку SciPy и язык MQL5 для создания оптимального и диверсифицированного портфеля, используя все имеющиеся у нас данные.
От новичка к эксперту: Главное на пути к торговле на MQL5 От новичка к эксперту: Главное на пути к торговле на MQL5
Раскройте свой потенциал! Вас окружают возможности. Узнайте 3 главных секрета, с помощью которых вы начнете изучать MQL5 или перейдете на новый уровень владения этим языком. Погрузимся в обсуждение советов и рекомендаций, в равной степени полезных и начинающим, и профи.
Совместное использование PSAR, Хейкин-Аши и глубокого обучения для трейдинга Совместное использование PSAR, Хейкин-Аши и глубокого обучения для трейдинга
В настоящем проекте исследуется сочетание глубокого обучения и технического анализа для тестирования торговых стратегий на рынке Форекс. Для быстрого экспериментирования используется скрипт на Python, использующий модель ONNX наряду с традиционными индикаторами, такими как PSAR, SMA и RSI, для прогнозирования движения пары EUR/USD. Затем скрипт MetaTrader 5 переносит эту стратегию в реальную среду, используя исторические данные и технический анализ для принятия обоснованных торговых решений. Результаты тестирования на исторических данных свидетельствуют об осторожном, но последовательном подходе, направленном на управление рисками и устойчивый рост, а не на агрессивную погоню за прибылью.
От начального до среднего уровня: Массив (II) От начального до среднего уровня: Массив (II)
В этой статье мы рассмотрим, что такое динамический массив и массив статический. И есть ли разница между использованием одного или другого. Или они всегда одинаковы? Когда следует использовать один, а когда другой? А как насчет константных массивов? Для чего они существуют, и какому риску я подвергаюсь, если не инициализирую все значения в массиве? Предположим, что они будут равны нулю.