Плюсы и минусы запрета компиляции в MetaEditor Mql4/Mql5 кода сгенерированного нейросетями - страница 7

 
Vitaly Muzichenko #:

Вполне нормальные и обычные имена переменных, и по ним определить невозможно.

Форматирование сделала "причёска" , по форматированию также не отличить.

Если-бы Я выложил этот код и в шапке был указан автор, то не было-бы и мыслей об ИИ.

--

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

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

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

 
Igor Zakharev #:

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

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

Ну вот-же, чем отличаются имена?

Я повторю: "Если-бы Я не сказал что это ИИ, при этом в шапке кода был указан автор - по коду вообще не было-бы понятно, кто его написал".

И опять-же: Я в код не добавил ни единой точки, вообще к нему не касался и он работает на 100% ПРАВИЛЬНО. Ваши доводы - скептицизм.

P.S. Обычный индикатор МАКД, Я попросил разукрасить гистограмму, времени от запроса до рабочего кода в терминале = 2 минуты.

Сколько вам понадобится времени на добавление буферов и создание условий, тоже 2 минуты?

Ещё полгода назад ИИ не умели этого делать, но сегодня это прекрасный инструмент

 
Igor Zakharev #:

Раз только одну, с ходу быстро цитирую две связанных строки:

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

Вся структура - очевидно ИИ. Прямо на глаз видно. ИИ видно по форматированию текста и названию переменных и по многому другому.

Время затраченное на поиск этих строк: примерно 10 секунд

Если у модераторов есть гугл аналитика или я.метрика и аналитика - то по поведенческим(запись сеанса - где вино как мышкой водишь) не дадут соврать что это так. 10/15 секунд я потратил до того как начал печатать этот пост и после того как прочитал текст и начал смотреть код. Быстрого взгляда достаточно что бы увидеть ИИ стиль.

P. S. Я не убеждаю в своей точке зрения, просто её высказываю. Не считают что ИИ стиль тяжело идентифицировать. Его заметно как говорится на уровне "Вырви глаз". При этом я тоже активно пользуюсь ИИ.

Да 100% , если бюджет и время позволяют и ТЗ нормальное. Я о том же, что советники которые генерируют ИИ - подходят только для самого начального уровня(ну там для школы/студентов для обучения). Там возможно неопредленное поведение во многих ситуациях. ИИ об этом подумать даже не способен при генерации кода по промпту. ИИ хорош ТЗ составить и всё.

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

По поводу определения массива внутри функции - подход логичный в том плане, что неправильно было бы выносить используемый локально объект на глобальный уровень, как предлагаете Вы. Я бы посоветовал ИИ добавить слово static перед локальным массивом, и всё.

В общем, не вижу смысла запрещать/помечать ИИ в кодах и продуктах.

Вот мне ИИ сгенерил рабочий код (выкладывал на форуме в другой ветке). Единственное, что я добавил - обход пары багов МQL5.

matrix CopyMultipleSymbolRates(const string &symbols[], 
                               const ENUM_TIMEFRAMES period, 
                               const datetime start_time, 
                               const datetime stop_time, 
                               const ulong flags = COPY_RATES_OHLC)
{
   int sym_count = ArraySize(symbols);
   bool transpose_result = ((flags & COPY_RATES_VERTICAL) == 0);
   ulong vertical_flags = flags | COPY_RATES_VERTICAL;

   struct SymbolData 
   {
      matrix m;
      datetime times[];
      int rows;
      int cols;
      vector initial_row;
   };

   SymbolData data[];
   ArrayResize(data, sym_count);
   
   // 1. Collect all timestamps in the single array
   datetime global_timeline[];
   int total_cols = 0;

   for(int i = 0; i < sym_count; i++) 
   {
      if(data[i].m.CopyRates(symbols[i], period, vertical_flags, start_time, stop_time)) 
      {
         // bug workaround
         if(data[i].m.Rows() < data[i].m.Cols())
            data[i].m = data[i].m.Transpose();
         CopyTime(symbols[i], period, start_time, stop_time, data[i].times);
         data[i].rows = (int)data[i].m.Rows();
         data[i].cols = (int)data[i].m.Cols();
         total_cols += data[i].cols;

         // Add all timestamps into the single array
         int prev_size = ArraySize(global_timeline);
         ArrayResize(global_timeline, prev_size + data[i].rows);
         ArrayCopy(global_timeline, data[i].times, prev_size);
      }
   }

   if(total_cols == 0) return matrix::Zeros(0, 0);

   // 2. Prepare the ordered array of unique timestamps
   ArraySort(global_timeline);
   int unique_count = 0;
   if(ArraySize(global_timeline) > 0) 
   {
      unique_count = 1;
      for(int i = 1; i < ArraySize(global_timeline); i++) 
      {
         if(global_timeline[i] != global_timeline[i - 1]) 
            global_timeline[unique_count++] = global_timeline[i];
      }
      ArrayResize(global_timeline, unique_count);
   }

   // 3. Fill the marix (single pass by rows)
   matrix res_matrix;
   res_matrix.Init(unique_count, total_cols);

   int col_offset = 0;
   for(int i = 0; i < sym_count; i++) 
   {
      if(data[i].rows > 0 && data[i].times[0] > global_timeline[0])
      {
         // Additional request for 1 bar right before start_time
         matrix prev;
         if(prev.CopyRates(symbols[i], period, vertical_flags, start_time, 1))
         {
            data[i].initial_row = prev.Row(0); 
         }
         if(prev.Row(0).Size() == 0) // bug workaround (fixed in latest builds)
         {
            res_matrix.Resize(0, 0);
            return res_matrix;
         }
      }

      int current_cursor = 0;
      for(int r = 0; r < unique_count; r++) 
      {
         datetime current_tick = global_timeline[r];
         
         // Move symbol's cursor, if its time is less then current global position
         while(current_cursor < data[i].rows && data[i].times[current_cursor] < current_tick)
            current_cursor++;

         int target_row = -1;
         if(current_cursor < data[i].rows && data[i].times[current_cursor] == current_tick) 
         {
            target_row = current_cursor;
         }
         else if(current_cursor > 0) 
         {
            target_row = current_cursor - 1; // Forward Fill
         }

         // Fill the data in columns for this symbol
         for(int c = 0; c < data[i].cols; c++) 
         {
            res_matrix[r][col_offset + c] = (target_row != -1) 
                                           ? data[i].m[target_row][c] 
                                           : data[i].initial_row[c];
         }
      }
      col_offset += data[i].cols;
   }
   
   return transpose_result ? res_matrix.Transpose() : res_matrix;
}

/*
#define DAYLONG (60 * 60 * 24)

void OnStart()
{
   string symbols[] = {"EURUSD.c", "UK100", "XAUUSD.c"};
   matrix x = CopyMultipleSymbolRates(symbols, _Period, TimeCurrent() / DAYLONG * DAYLONG - 1 * DAYLONG, TimeCurrent(), COPY_RATES_TIME | COPY_RATES_OHLC | COPY_RATES_VOLUME_TICK);
   Print(x);
}
*/
 
Vitaly Muzichenko #:

Ну вот-же, чем отличаются имена?

Я повторю: "Если-бы Я не сказал что это ИИ, при этом в шапке кода был указан автор - по коду вообще не было-бы понятно, кто его написал".

И опять-же: Я в код не добавил ни единой точки, вообще к нему не касался и он работает на 100% ПРАВИЛЬНО. Ваши доводы - скептицизм.

P.S. Обычный индикатор МАКД, Я попросил разукрасить гистограмму, времени от запроса до рабочего кода в терминале = 2 минуты.

Сколько вам понадобится времени на добавление буферов и создание условий, тоже 2 минуты?

Ещё полгода назад ИИ не умели этого делать, но сегодня это прекрасный инструмент

Тут относительно временных затрат выяснять думаю нечего, я согласен, что ИИ как хэлпер это удобно и быстро. Человек руками конечно всё дольше будет делать.

Не пропагандирую полный отказ от ИИ в стиле луддитов :) , интересны лишь видения будущего в контексте приближающейся регуляции ИИ.

Stanislav Korotky #:

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

По поводу определения массива внутри функции - подход логичный в том плане, что неправильно было бы выносить используемый локально объект на глобальный уровень, как предлагаете Вы. Я бы посоветовал ИИ добавить слово static перед локальным массивом, и всё.

В общем, не вижу смысла запрещать/помечать ИИ в кодах и продуктах.

Вот мне ИИ сгенерил рабочий код (выкладывал на форуме в другой ветке). Единственное, что я добавил - обход пары багов МQL5.

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

Что касается удобства и ускорения работы - споров нет. Что насчет static - на вкус и цвет как говорится. 

 
Igor Zakharev #:

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

Что касается удобства и ускорения работы - споров нет. Что насчет static - на вкус и цвет как говорится. 

Код от людей не менее сомнителен - например, я иногда заглядываю в публикации в кодобазе и там по большей части полный шлак (решает ли он по факту указанные задачи?). Законы часто инициируются и пишутся людьми, далекими от проблем, регулируемыми этими законами, увы, так что я б не рассматривал регуляцию плюсом. ИИ - это лишь инструмент, и качество продукта определяется человеком, использующим его, а не самим фактом использования ИИ. Тем более, что степень использования качественного ИИ - хрен проверишь.

Что касается "на вкус и цвет" - всё не так просто в программировании, где есть писанный свод правил, что хорошо и что плохо. Поэтому принятие решений "на вкус и цвет" подходит только в случае, когда нет уже известных рекомендаций. Вынос локальной переменной на глобальный уровень - это дурной тон (code smell), и предложенная реализация ИИ выглядит обоснованно, имхо, а если Вы знаете другой способ кроме static-а оптимизировать локальную инициализацию, то расскажите.

 
Stanislav Korotky #:


Что касается "на вкус и цвет" - всё не так просто в программировании, где есть писанный свод правил, что хорошо и что плохо. Поэтому принятие решений "на вкус и цвет" подходит только в случае, когда нет уже известных рекомендаций. Вынос локальной переменной на глобальный уровень - это дурной тон (code smell), и предложенная реализация ИИ выглядит обоснованно, имхо, а если Вы знаете другой способ кроме static-а оптимизировать локальную инициализацию, то расскажите.

Немного не понял о чем вы пишете. Я знаю что такое code smell. Static и вправду отличный вариант, но по стилю мне не нравится. Я же говорю - на вкус и цвет.

Igor Zakharev #:

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


Написал же про две строки кода в том ответе который вы обсуждаете, это не случайно. Они взаимосвязанны. Как можно ArraySetAsSeries(rates, true); исполнить в OnInit() если массив не глобальный - никак. Мы же обсуждали стиль ИИ, но в большинстве официальных примеров кода которые я видел - ArraySetAsSeries выносится в OnInit(). И тогда тут нет дурного тона, это вопрос стиля, который упрощает быстрое понимание. При отсутствии static вызов ArraySetAsSeries каждый раз при вызове функции ProcessSymbol потребляет ресурсы.

Тем более думать о дурном тоне в таких элементарных советниках или индикаторах - это нужно быть идеалистом(тем более когда с кодом имеешь дело только ты сам). Для меня себе во вред так код писать как ИИ, я привык выносить как классы, так и структуры и основные переменные отдельно и комментировать это всё(как секции кода). Так что это как вопрос, где пришить карман - справа или слева.

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

Igor Zakharev #:

Раз только одну, с ходу быстро цитирую две связанных строки:

  MqlRates rates[];
  ArraySetAsSeries(rates, true);

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

Вся структура - очевидно ИИ. Прямо на глаз видно. ИИ видно по форматированию текста и названию переменных и по многому другому.

Время затраченное на поиск этих строк: примерно 10 секунд

Если у модераторов есть гугл аналитика или я.метрика и аналитика - то по поведенческим(запись сеанса - где вино как мышкой водишь) не дадут соврать что это так. 10/15 секунд я потратил до того как начал печатать этот пост и после того как прочитал текст и начал смотреть код. Быстрого взгляда достаточно что бы увидеть ИИ стиль.

P. S. Я не убеждаю в своей точке зрения, просто её высказываю. Не считают что ИИ стиль тяжело идентифицировать. Его заметно как говорится на уровне "Вырви глаз". При этом я тоже активно пользуюсь ИИ.

Да 100% , если бюджет и время позволяют и ТЗ нормальное. Я о том же, что советники которые генерируют ИИ - подходят только для самого начального уровня(ну там для школы/студентов для обучения). Там возможно неопредленное поведение во многих ситуациях. ИИ об этом подумать даже не способен при генерации кода по промпту. ИИ хорош ТЗ составить и всё.

 

"Разбор полетов" начался вот с этой фразы:

Igor Zakharev #:

Раз только одну, с ходу быстро цитирую две связанных строки:

Я бы так никогда не сделал если бы писал код в ручную и любой кто профессионально кодит тоже...

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