Библиотеки: Библиотека JSON для LLM - страница 2

 
Jonathan Pereira #:

Если вы хотите отправить Pull Request с этими оптимизациями (или другими, которые вы можете найти), я буду более чем счастлив рассмотреть и объединить их. Всегда приятно сотрудничать с человеком, который глубоко разбирается в технических тонкостях.

Спасибо. Я не программист, поэтому до сих пор не разобрался с Git'ом. Если у меня будут какие-то предложения или замечания, я оставлю их в комментариях.
 
Jonathan Pereira #:

В настоящее время мой "реальный" объем работы состоит из LLM API Responses (OpenAI/Anthropic), которые представляют собой глубоко вложенные JSON-структуры, отражающие контекст разговора и вызов функций, а не просто большие плоские массивы данных о тиках.

Расскажите, пожалуйста, как вы используете эти данные в MetaTrader?
 
fxsaber #:

Это из-за MQL5 такое большое отставание в производительности по сравнению с другими реализациями?

Да, безусловно.

1. Отсутствие интринсиков SIMD:
Библиотеки типа simdjson достигают скорости 4 ГБ/с, обрабатывая 32 или 64 байта за цикл процессора с помощью инструкций AVX-512. В MQL5 нет возможности использовать SIMD-векторы. Моя реализация "SWAR" - это программная имитация SIMD (сканирование 8 байт за раз с помощью ulong ), которая умна, но на порядки медленнее аппаратного SIMD.

2. Проверка границ и безопасность:
MQL5 заставляет проверять границы массива при каждом доступе. В C++ вы можете использовать необработанные указатели, чтобы перемещаться по памяти со скоростью пропускной способности оперативной памяти. В MQL5 каждый буфер[i] несет на себе накладные расходы ВМ по проверке того, что i находится в пределах границ.

3. Модель памяти:
MQL5 не позволяет использовать пользовательские аллокаторы или арифметику указателей. fast_json достигает 300 МБ/с, борясь с языком - используя один большой массив, чтобы обойти GC. Для управляемого языка 300 МБ/с - это очень высокий результат (сравнимый со многими парсерами Java/C# до появления Span<T>).

Так что да, потолок - это среда выполнения. Чтобы работать быстрее, MetaQuotes должен дать нам void* и встроенные Asm/Intrinsics.

 
fxsaber #:

Спасибо. Я не программист, поэтому до сих пор не разобрался с Git'ом.

Справедливо. Если вы "не программист" с таким уровнем понимания оптимизаций компилятора и конвейеров процессора, то я просто искушенный тостер. 😂🤣

Я буду следить за комментариями здесь. Ваше понимание ценно, независимо от ярлыка. Спасибо!

 
fxsaber #:

Расскажите, пожалуйста, как вы используете эти данные в MetaTrader?

Парсер JSON на самом деле является подкомпонентом более крупного проекта: AI-Toolkit - нативного MQL5-фреймворка, который я разработал для интеграции больших языковых моделей непосредственно в терминал, без Python, DLL и мостов.

Вот упрощенная версия того, как автономный агент работает внутри эксперта:

#include "ai-toolkit/AIToolkit.mqh"

input string InpApiKey   = "sk-...";     // Ваш ключ API OpenAI
input string InpModel    = "gpt-4o"; // Модель LLM
input string InpQuestion = "What is my account balance and the current EURUSD price?";

CAgentExecutor *g_agent = NULL;

int OnInit() {
   // 1. Настройте LLM-провайдера (OpenAI, Anthropic или Local через Ollama)
   COpenAIProvider *llm = new COpenAIProvider(InpApiKey, InpModel);
   llm.SetTemperature(0.1);

   // 2. Построение автономного агента с помощью торгового инструментария
   CAgentExecutor *agent = new CAgentExecutor(llm, new CTradingToolkit());

   agent.SetSystemPrompt(new CPromptTemplate(
       "You are a helpful trading assistant. Use tools to query real data."));
   agent.SetVerbose(true);

   // 3. Выполнить - Агент рассуждает, вызывает инструменты и возвращает ответ.
   string answer = agent.Invoke(InpQuestion);

   Print("=== FINAL ANSWER ===");
   Print(answer);

   return INIT_SUCCEEDED;
}


Именно для этого и был создан fast_json: высокоскоростная сериализация/десериализация в этом узком цикле между терминалом и LLM API.

Я планирую выпустить полный AI-Toolkit с открытым исходным кодом в ближайшее время.

 
Jonathan Pereira #:

Так что да, потолок - это среда выполнения.

Спасибо за подробный ответ. Теперь я понимаю лучше.
 
Jonathan Pereira #:

В ближайшее время я планирую выпустить полный AI-Toolkit с открытым исходным кодом.

Мне все еще трудно понять, как ИИ может помочь в торговле. За исключением таких случаев.
AI-assisted "invention" of Significance Weighted Expectancy Ratio (SWER)
AI-assisted "invention" of Significance Weighted Expectancy Ratio (SWER)
  • 2026.02.17
  • www.mql5.com
AI agents are widely used nowadays for writing programs and solving technical problems. AI generates code for many programming languages and answers non-trivial questions pretty well. Chatting with a
 
fxsaber #:
Если у меня появятся предложения или замечания, я оставлю их в комментариях.
  double FastAtof(int ptr, int n_len) {
    // Повторное использование надежной логики из v1
    double val = 0.0;
    double sign = 1.0;
    int i = 0;
    if (buffer[ptr] == '-') {
      sign = -1.0;
      i++;
    }
    
    long val1 = 0;
    
    for (; i < n_len; i++) {
      uchar c = buffer[ptr + i];
// if (c == '.' || c == 'e' || c == 'E')
      if ((c == '.') || (c > '9'))
        break;
// val = val * 10.0 + (c - '0');
      val1 = val1 * 10 + (c - '0');
    }
    if (i < n_len && buffer[ptr + i] == '.') {
      i++;
// double frac = 0.1;
      const int j = i;
      long val2 = 0;
      for (; i < n_len; i++) {
        uchar c = buffer[ptr + i];
// if (c == 'e' || c == 'E')
        if (c > '9')
          break;
// val += (c - '0') * frac;
// frac *= 0.1;
          val2 = val2 * 10 + (c - '0');
      }
      
      static const double Exp10[] = {1 e-0, 1 e-1, 1 e-2, 1 e-3, 1 e-4, 1 e-5, 1 e-6, 1 e-7, 1 e-8,
                                     1 e-9, 1 e-10, 1 e-11, 1 e-12, 1 e-13, 1 e-14, 1 e-15, 1 e-16};
      
      val = val1 + val2 * Exp10[i - j];
    }
    else
      val = val1;
// if (i < n_len && (buffer[ptr + i] == 'e' || buffer[ptr + i] == 'E')) {
    if (i < n_len && (buffer[ptr + i] > '9') {
 

Разве это не излишество?

  //-- Аксессоры
  int GetType(int idx) { return (int)((tape[idx] >> 56) & 0xFF); }
Или дело в знаке числа?
 
    case J_ARR: {
      PutChar('[', out, pos, cap);
      int count = GetCount(idx);
      int cur = idx + 1;
      for (int i = 0; i < count; i++) {
        if (i > 0)
          PutChar(',', out, pos, cap);
        WriteNode(cur, out, pos, cap);
        cur += GetStep(cur);
      }
      PutChar(']', out, pos, cap);

Вы можете удалить условие из цикла.