Скачать MetaTrader 5

Помогите перевести код с visual studio 8 в mt5

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
klimenkosib
192
klimenkosib  

Добрый день коллеги!
Есть задача: перевести код нейросети написанный на С++ в MQL5.

На этом куске кода у меня ступор:

MT4_EXPFUNC double __stdcall MLPP04Run(const double *inputs,const int arraysize,double *outputs,const int arraysize1,const int outputType)
  {
 int i, j, k, u;
  double *w = MLPP04Weights, *t = MLPP04Thresholds;

  /* Process inputs - apply pre-processing to each input in turn,
   * storing results in the neuron activations array.
   */

  /* Input 0: standard numeric pre-processing: linear shift and scale. */
  for ( j=0; j < 8; ++j )
  {
    if ( inputs[0+j] == -9999 )
      MLPP04Acts[0+j] = 0.48093986534718336;
    else
      MLPP04Acts[0+j] = inputs[0+j] * 1.3013784200224878 + -0.10227559030525137;
  }

  /* Input 1: standard numeric pre-processing: linear shift and scale. */
  for ( j=0; j < 8; ++j )
  {
    if ( inputs[8+j] == -9999 )
      MLPP04Acts[8+j] = 0.49145314384753758;
    else
      MLPP04Acts[8+j] = inputs[8+j] * 1.0007011302391895 + -0.00070113023918965582;
  }

  /* Input 2: standard numeric pre-processing: linear shift and scale. */
  for ( j=0; j < 8; ++j )
  {
    if ( inputs[16+j] == -9999 )
      MLPP04Acts[16+j] = 0.51929143170024528;
    else
      MLPP04Acts[16+j] = inputs[16+j] * 1.3923156174110272 + -0.069929848289002006;
  }

  /* Input 3: standard numeric pre-processing: linear shift and scale. */
  for ( j=0; j < 8; ++j )
  {
    if ( inputs[24+j] == -9999 )
      MLPP04Acts[24+j] = 0.52980277776401596;
    else
      MLPP04Acts[24+j] = inputs[24+j] * 1.1311125619766262 + -0.0064131842661201994;
  }

  /* Input 4: standard numeric pre-processing: linear shift and scale. */
  for ( j=0; j < 8; ++j )
  {
    if ( inputs[32+j] == -9999 )
      MLPP04Acts[32+j] = 0.50269117887263026;
    else
      MLPP04Acts[32+j] = inputs[32+j] * 1.0267536506485304 + 0;
  }

  /*
   * Process layer 1.
   */

  /* For each unit in turn */
  for ( u=0; u < 16; ++u )
  {
    /*
     * First, calculate post-synaptic potentials, storing
     * these in the MLPP04Acts array.
     */

    /* Initialise hidden unit activation to zero */
    MLPP04Acts[40+u] = 0.0;

    /* Accumulate weighted sum from inputs */
    for ( i=0; i < 40; ++i )
      MLPP04Acts[40+u] += *w++ * MLPP04Acts[0+i];

    /* Subtract threshold */
    MLPP04Acts[40+u] -= *t++;

    /* Now apply the hyperbolic activation function, ( e^x - e^-x ) / ( e^x + e^-x ).
     * Deal with overflow and underflow

Желтым выделил строчки  непонятные мне.
Может кто нибудь объяснить логику данного кода?
(я понимаю что * это ссылка на ячейку, но что значит строчка выделенная красным я не понимаю)
Или как бы это выглядело в MQL5, это я пойму))

Vladimir Karputov
Модератор
68530
Vladimir Karputov  

Пожалуйста разместите код в сообщении правильно: Правильно вставляем код на форуме

Vladimir Karputov
Модератор
68530
Vladimir Karputov  

Возможно это поможет: https://www.mql5.com/ru/docs/basis/types/object_pointers

Документация по MQL5: Основы языка / Типы данных / Указатели объектов
Документация по MQL5: Основы языка / Типы данных / Указатели объектов
  • www.mql5.com
Основы языка / Типы данных / Указатели объектов - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Vladimir Perervenko
3478
Vladimir Perervenko  

Это как упражнение по программированию надеюсь? Если да, то похвально.

Вы же не собираетесь ЭТО использовать в торговле? Если да, то :

Есть более надежные и проверенные варианты реализации  нейросетей.

Поройтесь по статьям и форуму на этом сайте.

Удачи

Serhiy Dotsenko
973
Serhiy Dotsenko  
klimenkosib:

Добрый день коллеги!
Есть задача: перевести код нейросети написанный на С++ в MQL5.

На этом куске кода у меня ступор:

Желтым выделил строчки  непонятные мне.
Может кто нибудь объяснить логику данного кода?
(я понимаю что * это ссылка на ячейку, но что значит строчка выделенная красным я не понимаю)
Или как бы это выглядело в MQL5, это я пойму))

ещё одна ссылка после которой должно настать просветление https://www.mql5.com/ru/articles/36

MLPP04Acts[40+u] += *w++ * MLPP04Acts[0+i] 

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

обычно вместе с указателями сразу изучают и ссылки, если будет попадатся такой значёк "&" в коде, боятся его не нужно ) http://www.quizful.net/post/cpp-for-beginners-pointers-and-references

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
Vladimir Kazakov
6479
Vladimir Kazakov  
thejobber:
 

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

С фига ли?

Инкремент более приоритетная операция - здесь увеличится указатель.

Смысл такой: получаем данные по указателю, после этого указатель переводим на следующий объект.

Andrey Ziablytsev
1728
Andrey Ziablytsev  

А че ж простые указатели тут в mql5 не пашут? А я то думал будто mql5 срисован с С++ на все сто. Размечтался....

ок, поехали 

double *w = MLPP04Weights, *t = MLPP04Thresholds;

 -- как бы w и  t указатели на массивы MLPP04Weights и MLPP04Thresholds

точнее

w  это MLPP04Weights[0]

t  это  MLPP04Thresholds[0]


 for ( i=0; i < 40; ++i )
      MLPP04Acts[40+u] += *w++ * MLPP04Acts[0+i];

    /* Subtract threshold */
    MLPP04Acts[40+u] -= *t++;

 -- получение значений из массивов с последующим переходом на следующий элемент, короче перевожу ;)

 указатели double *w, *t  заменяем на простые индексы

int w =0;

int t=0;

и далее по тексту  используем их как индексы массивов

  for ( i=0; i < 40; ++i )

      MLPP04Acts[40+u] += MLPP04Weights[w++] * MLPP04Acts[0+i]; 

/* Subtract threshold */

    MLPP04Acts[40+u] -= MLPP04Thresholds[t++];

по идее результат будет аналогичным ;)

Комбинатор
16519
Комбинатор  
diushych:
Какие индексы? Это веса и пороги сети. Их на массивы переделывать надо.
Andrey Ziablytsev
1728
Andrey Ziablytsev  
TheXpert:
Какие индексы? Это веса и пороги сети. Их на массивы переделывать надо.

веса, пороги это и есть массивы ;)

Комбинатор
16519
Комбинатор  
diushych:
Таки похоже на правду.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий