MetaEditor, Open AI и ChatGPT - страница 3

 
Vladislav Boyko #:

Вы переоцениваете его возможности😄
https://chat.openai.com/chat


Напишите мне MQL5 скрипт для Metatrader 5, который читает XML таблицу оптимизации в Тестере стратегий MT5 и статистически оценивает, какие переменные оказывают влияние на результат.


Извините, но как языковая модель AI я не могу писать для вас скрипты на MQL5. Однако я могу подсказать вам, как подойти к решению этой задачи.

Чтобы прочитать XML-таблицу оптимизации в тестере стратегий MT5 и статистически оценить, какие переменные оказывают соответствующее влияние на результат, вы можете выполнить следующие шаги:

  1. Во-первых, необходимо получить XML-таблицу из результатов оптимизации. Это можно сделать, щелкнув правой кнопкой мыши на результатах оптимизации и выбрав "Сохранить как XML".

  2. Получив XML-файл, вы можете разобрать его с помощью встроенной в MQL5 библиотеки XML.

  3. Из XML-файла необходимо извлечь соответствующие данные, такие как входные переменные и результаты оптимизации.

  4. Затем вы можете использовать такие статистические методы, как корреляционный анализ, регрессионный анализ или дисперсионный анализ (ANOVA), чтобы оценить влияние каждой переменной на результат.

  5. Наконец, вы можете вывести статистические результаты в журнал или в файл для дальнейшего анализа и интерпретации.

Вот пример фрагмента кода, который поможет вам начать работу:

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

Меня больше всего интересовало не чтение xml-файла (я написал небольшую функцию, которая считывает xml-таблицу в матрицу), а то, что ИИ предложит для статистического анализа. Я не ожидал многого, но просто хотел попробовать, так как этот вопрос, вероятно, не относится к большинству вопросов типа "Напишите мне советника, который ...".

Известные виды ИИ в целом покажут вам варианты известных, но про анализ результатов оптимизации мало что известно (в отличие от тысяч советников), а для этого нужны компетенции из двух областей: программирования MQL5 и статистики.

Я уже нашел несколько первых решений:

    FullBarsStop:         [22,12,2,5,17,18,17.022,3.552,-0.9500000000000001,-0.9500000000000001,-0.77,0.76]
            20.00..22.00:  µ:8740.77 σ:6515.54 (30079.00 - -408.00)  n:182
            18.00..20.00:  µ:10155.70 σ:7599.15 (30151.00 - -309.00)  n:84
            16.00..18.00:  µ:7335.28 σ:6116.02 (24591.00 - -134.00)  n:64
            14.00..16.00:  µ:7667.44 σ:6637.74 (25785.00 - -167.00)  n:80
            12.00..14.00:  µ:8590.31 σ:6637.66 (29393.00 - -453.00)  n:99

Это показывает неприглядность матриц и векторов: нет ничего, что бы приводило двойные значения (основной тип для матриц и векторов) к тому, что нужно пользователю.

Я пробовал это сделать (NormaliseDouble() не дала никакого эффекта), но иногда это работает, а иногда нет, как вы можете видеть:

   ...
      mVars[(int)€Step][iV] = 0.001*round(1000.0*mVars[(int)€Step][iV]);
      mVars[(int)€nVal][iV] = 0.001*round(1000.0*vCol.Ptp()/mVars[(int)€Step][iV]);
      mVars[(int)€CoRes][iV] = 0.01*round(100.0*vCol.CorrCoef(rsCol));
      mVars[(int)€CoPrf][iV] = 0.01*round(100.0*vCol.CorrCoef(prCol));
      mVars[(int)€CoXVl][iV] = 0.01*round(100.0*vCol.CorrCoef(xpCol));
      mVars[(int)€CoDrD][iV] = 0.01*round(100.0*vCol.CorrCoef(ddCol));
   ...
   Print(mVars.Col(iV));   

=> [22,12,2,5,17,18,17.022,3.552,-0.9500000000000001,-0.9500000000000001,-0.77,0.76]

Как вы можете видеть, иногда это работает: 17.022,3.552 (3 десятичных знака) или -0.77,0.76 (2 десятичных знака), но иногда нет: -0.9500000000000001,-0.9500000000000001.
Раньше я использовал: 0.01*round(100.0*val) все значения с десятичными знаками выводились с 16 знаками, теперь только 2 или 3 - кто как понимает.

Остальные строки с µ и σ вычисляются отдельно и выводятся с помощью StringFormat().

Пожелания пасхальному кролику:

  1. Как-нибудь дайте нам возможность определять количество десятичных дробей для распечатки, например, все с 2 десятичными дробями.
  2. Предоставьте функцию, которая создает массив той же размерности, что и матрица (вектор), и присваивает ему все свои значения, и наоборот, например:
    matrix mm, m = {{ .... }};
    double a[];
    m.ToArray(a);
    mm.FromArray(a);

 
У меня есть предположение, что ChatGPT не знает MQL5, потому что в интернете нет большого количества ресурсов по MQL5, в отличие от популярных языков программирования, таких как python и Js.
 
Chioma Obunadike #:
У меня есть предположение, что ChatGPT не знает MQL5, потому что в сети нет большого количества ресурсов по MQL5, в отличие от популярных языков программирования, таких как python и Js.

Вы, конечно, правы до определенного момента, но ChatGPT можно попросить написать MQL-код(пример). Но среди многих, многих проблем есть и та, что неясно, в чем разница между MQL4 и MQL5.

Многие разговоры об использовании ChatGPT для написания кода кажутся мне крайне ошибочными. Они упускают из виду тот факт, что программисты имели доступ к чему-то вроде ChatGPT более или менее со времен рассвета вычислительной техники. Вот один из бесчисленных примеров: если я ввожу в MetaEditor функцию типа iBands(), это равносильно тому, чтобы сказать ChatGPT: "Пожалуйста, напишите мне функцию, которая собирает данные свечей для символа и таймфрейма, вычисляет скользящее среднее и стандартное отклонение и складывает эти значения вместе". Функция iBands(), конечно, не является результатом работы искусственного интеллекта, но, тем не менее, в программировании уже используются огромные блоки заранее подготовленного вывода, причем разными способами.

 
kdufgh #:

Вы, конечно, правы до определенного момента, но ChatGPT можно попросить написать MQL-код(пример). Но среди многих, многих проблем есть то, что неясно, в чем разница между MQL4 и MQL5.

Многие разговоры об использовании ChatGPT для написания кода кажутся мне крайне ошибочными. Они упускают из виду тот факт, что программисты имели доступ к чему-то вроде ChatGPT более или менее со времен рассвета вычислительной техники. Вот один из бесчисленных примеров: если я ввожу в MetaEditor функцию типа iBands(), это равносильно тому, чтобы сказать ChatGPT: "Пожалуйста, напишите мне функцию, которая собирает данные свечей для символа и таймфрейма, рассчитывает скользящее среднее и стандартное отклонение и складывает эти значения вместе". Функция iBands(), конечно, не является результатом работы искусственного интеллекта, но, тем не менее, в программировании уже используются огромные блоки заранее подготовленного вывода, причем разными способами.

ChatGPT отвечает так же, как форумные мониторы отвечают на форуме, генерирует некорректный код, и в конце концов я обнаружил, что он хорош только для изучения логики, кроме того, ученик может поискать и узнать, как конвертировать mql4 в mql5 и заменить какую-нибудь функцию, например SetIndexStyle, которая часто кодируется, а ChatGPt не знает, что она устарела в MQL5, и таким образом ученики могут получить решение своей проблемы.


 
Arpit T #:

ChatGPT отвечает так же, как мониторы форума, отвечает на форуме, генерирует неправильный код

Это ответ ChatGPT на вопрос на форуме о MQL5-эквиваленте MODE_LOTSIZE (вставлено дословно):

Да, в MQL5 вы можете использовать свойство символа SYMBOL_VOLUME_DIVIDER, чтобы получить множитель размера лота для символа. Это свойство возвращает минимальное изменение объема (в лотах) для символа, и вы можете использовать его для расчета размера лота для данной сделки.

Например, если SYMBOL_VOLUME_DIVIDER возвращает 10000, вы можете рассчитать размер лота для мини-лота, разделив объем сделки на 10000. Вот пример фрагмента кода:

double volume = 0.1; // 1 mini lot
double lotSize = volume / SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_DIVIDER);

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

Не зря StackOverflow запретил ChatGPT.

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

 
kdufgh #:

Это ответ ChatGPT на вопрос на форуме о MQL5-эквиваленте MODE_LOTSIZE (вставлено дословно):

Есть причина, по которой StackOverflow запретил ChatGPT.

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

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

 
@Arpit T #: Я надеюсь, что MQL тоже должен запретить его. AI с минимальными знаниями и кодами, полными ошибок, - это отстойная вещь для поддержки, иногда общие ответы на форуме более полезны для решения проблемы, даже если они размещены без кодов.

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

 
Carl Schreiber #:

Честно говоря, у меня недостаточно знаний о матрицах, чтобы понять, о чем вы говорите :)

Ради интереса я спросил chatgpt о следующем (предоставив ему эту страницу документации):

Карл Шрайбер #:

Предоставьте функцию, которая создает массив той же размерности, что и матрица (вектор), и присваивает ему все свои значения, и наоборот, например:

matrix mm, m = {{ .... }};
double a[];
m.ToArray(a);
mm.FromArray(a);

Ответ:
(от себя добавлю, что любой его код следует воспринимать только как псевдокод)


Вот возможная реализация функций ToArray и FromArray для типа матрица в MQL5:

// Function to copy a matrix into a 1D array
void matrix::ToArray(double& array[]) const
{
    int rows = this.Rows();
    int cols = this.Columns();
    int index = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            array[index] = this.At(i, j);
            index++;
        }
    }
}

// Function to create a matrix from a 1D array
void matrix::FromArray(const double& array[])
{
    int rows = this.Rows();
    int cols = this.Columns();
    int index = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            this.Set(i, j, array[index]);
            index++;
        }
    }
}

Эти функции перебирают все элементы матрицы и копируют их в или из массива 1D . Функция ToArray предполагает, что в массиве достаточно места для хранения всех элементов матрицы, а функция FromArray предполагает, что в массиве достаточно элементов для полного заполнения матрицы.

Чтобы использовать эти функции, вы можете вызвать их на экземпляре класса matrix следующим образом:

matrix m = {{1, 2}, {3, 4}};
double a[m.Rows() * m.Columns()];
m.ToArray(a);
matrix mm;
mm.FromArray(a);
В этом примере m - матрица 2x2, инициализированная некоторыми значениями.
m.ToArray(a) копирует значения m в одномерный массив a.
mm.FromArray(a) создает новую матрицу mm из значений в a.
После выполнения этого кода
m и mm должны иметь одинаковые значения.
 

Мой английский не самый лучший, и иногда я прошу chatgpt помочь мне с именованием.

Должен признать, что иногда он делает это довольно хорошо. Он придумал несколько идентификаторов лучше, чем я, используя google translate.

Но иногда он просто богоподобен😄😄😄😄:

Вопрос
Как назвать функцию, которая удаляет все объекты классов, объявленных в глобальной области видимости и имеющих динамический указатель? Язык MQL
Ответ

На языке MQL вы можете назвать свою функцию как-нибудь вроде "deleteDynamicGlobalObjects" или "clearGlobalDynamicPointers". Вот пример того, как можно определить эту функцию:

void deleteDynamicGlobalObjects()
{
    // Loop through all global variables
    for(int i=0; i<ObjectsTotal(); i++)
    {
        string name = ObjectName(i);
        // Check if the object is declared at the global scope and has a dynamic pointer
        if(ObjectFind(name) == 0 && ObjectGet(name, OBJPROP_TYPE_OF_OBJECT) == OBJ_CUSTOM)
        {
            delete ObjectGet(name);
        }
    }
}

В этой функции мы используем функцию ObjectsTotal(), чтобы получить общее количество объектов на графике, а затем перебираем каждый объект с помощью функции ObjectName(), чтобы получить его имя. Затем мы проверяем, объявлен ли объект в глобальной области видимости и имеет ли он динамический указатель, используя функцию ObjectFind() для проверки его существования в глобальном пространстве имен и ObjectGet() для проверки наличия у него пользовательского типа. Наконец, если объект соответствует этим критериям, мы удаляем его с помощью ключевого слова delete.

Обратите внимание, что эта функция предполагает, что все динамические объекты, объявленные в глобальной области видимости, имеют пользовательский тип OBJ_CUSTOM . Если ваши объекты имеют другой тип, вам может потребоваться соответствующим образом изменить проверку ObjectGet().

Легендарная функция 😄

P.S. Если вы используете ее для именования, то говорите, что пишете на C++, так он будет вести себя как наркоман гораздо реже

Причина обращения: