Обсуждение статьи "Создай торговый робот за 6 шагов!"

 

Опубликована статья Создай торговый робот за 6 шагов!:

Вы не знаете как устроены торговые классы и пугаетесь слов "Объектно-ориентированное программирование"? На самом деле вовсе не обязательно всё это знать, чтобы написать свой собственный модуль торговых сигналов - достаточно следовать простым правилам. Всё остальное сделает Мастер MQL5 и вы получите готовый торговый робот!


Автор: MetaQuotes

 
И всё бы хорошо - торговые роботы создаются в 5 кликов мыши, их можно прогнать в тестере для оптимизации параметров торговой системы, можно полученного робота поставить торговать на счёте и ничего допиливать напильником не нужно.
Разве можно такого робота пускать в торговлю? Ведь библиотека торговых классов не содержит обработки различных ошибок, что было необходимым условием даже на чемпионате, не говоря уже о реальной торговле. Правильнее написать, что в пять кликов можно создать эксперта только для беглой проверки идей в тестере, но для торговли такой эксперт будет непригоден.
 
Спасибо за работу! А за картинку с коробкой и кубиками отдельное спасибо! Систематизирует :-) 
 

продолжу...

задумал  преобразовать строки этого примера:

if(m_method_fast!=MODE_SMA && m_method_fast!=MODE_EMA && m_method_fast!=MODE_SMMA && m_method_fast!=MODE_LWMA)

if(m_method_slow!=MODE_SMA && m_method_slow!=MODE_EMA && m_method_slow!=MODE_SMMA && m_method_slow!=MODE_LWMA)

в алгоритм:

1) два массива:

первый содержит  m_method_fast и m_method_slow

второй значения перечисление ENUM_MA_METHOD

 2) В цикле взяв значение первого массива, проверить нахождение во втором.

 Подскажите, как это реализовать? 

Понял, что нужно подключать CArray . Только какого типа?

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

Спасибо! 

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Методы скользящих
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Методы скользящих
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Методы скользящих - Документация по MQL5
 
bivmail:

продолжу...

задумал  преобразовать строки этого примера:

if(m_method_fast!=MODE_SMA && m_method_fast!=MODE_EMA && m_method_fast!=MODE_SMMA && m_method_fast!=MODE_LWMA)

if(m_method_slow!=MODE_SMA && m_method_slow!=MODE_EMA && m_method_slow!=MODE_SMMA && m_method_slow!=MODE_LWMA)

в алгоритм:

1) два массива:

первый содержит  m_method_fast и m_method_slow

второй значения перечисление ENUM_MA_METHOD

 2) В цикле взяв значение первого массива, проверить нахождение во втором.

 Подскажите, как это реализовать? 

Понял, что нужно подключать CArray . Только какого типа?

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

Спасибо! 

Как-то так:

func(int& array1[],int& array2[])
  {
   int total1=ArraySize(array1);
   int total2=ArraySize(array2);
//---
   for(int i=0;i<total1;i++)
     {
      for(int j=0;j<total2;j++)
        {
         if(array1[i]==array2[j])
           {
            // нашел
           }
        }
     }
  }
 

да, до этого уже дотопал в С++ для начинающих :-)

 Вот только там нет такого типа данных  ENUM_MA_METHOD

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

 сейчас вижу два пути:

 

//первый способ описать оба массива

  ENUM_MA_METHOD l_array_enum_ma_method[3];

  l_array_enum_ma_method[0]=MODE_SMA;

  l_array_enum_ma_method[1]=MODE_EMA;

  l_array_enum_ma_method[2]=MODE_SMMA;

  l_array_enum_ma_method[3]=MODE_LWMA;

  print("array size %d", ArraySize(l_array_enum_ma_method));

  print("ENUM_MA_METHOD size %d", ArraySize(ENUM_MA_METHOD));

  

   ENUM_MA_METHOD l_array_select_method[1];

   l_array_select_method[0]=m_MethodFast;

   l_array_select_method[1]=m_MethodSlow;

   //далее по схеме

   

   //второй способ, подключить библиотеку

   //#include <Arrays\ArrayInt.mqh>

     CArrayInt *l_array_enum_ma_method=new CArrayInt;

   l_array_enum_ma_method[0]=MODE_SMA;

  l_array_enum_ma_method[1]=MODE_EMA;

  l_array_enum_ma_method[2]=MODE_SMMA;

  l_array_enum_ma_method[3]=MODE_LWMA;

   l_array_enum_ma_method.Sort();

   //--- search element

   if(l_array_enum_ma_method.Search(m_MethodFast)!=-1) printf("Element found");

   else                        printf("Element not found");

   //--- delete array

   delete l_array_enum_ma_method;

 

во втором способе  нужно подключить библиотеку конкретного типа, а что это за тип такой ENUM_MA_METHOD?

 хм.. странно, нажимал ответить, а получилось новым сообщением... 

 

Посмотрите как правильно вставлять код.
 
bivmail:

да, до этого уже дотопал в С++ для начинающих :-)

 Вот только там нет такого типа данных  ENUM_MA_METHOD

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

 сейчас вижу два пути:

 

 

во втором способе  нужно подключить библиотеку конкретного типа, а что это за тип такой ENUM_MA_METHOD?

 хм.. странно, нажимал ответить, а получилось новым сообщением... 

Первый способ:

 ENUM_MA_METHOD l_array_enum_ma_method[]={MODE_SMA,MODE_EMA,MODE_SMMA,MODE_LWMA};
//--- далее по тексту

Второй способ:

#include <Arrays\ArrayInt.mqh>

CArrayInt l_array_enum_ma_method;
//---
l_array_enum_ma_method.Add(MODE_SMA);
l_array_enum_ma_method.Add(MODE_EMA);
l_array_enum_ma_method.Add(MODE_SMMA);
l_array_enum_ma_method.Add(MODE_LWMA);
//--- далее по тексту

Никак сообразить не могу, для чего столько телодвижений?

 

ой.. приспасибо прибольшое, это как раз пытаюсь сделать.. офф.

 В первом случае уже видел такой способ записи, но еще не осознал нужное,

по-второму - сбился на ArrayInt. Подумалось раз Int, значит хранится значение только число, но  ,

видимо, MODE_SMA компилятор как раз и преобразует в число, а при обратном получении значения, нужно будет выполнить неявное преобразование (с помощью круглых скобок) к типу (ENUM_MA_METHOD), т.е. нечто,  аналогичное 

 

  ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);

 

P.S. В третьем разделе 3. Методы для установки параметров, дума
ется, надо стереть преждевременно объявленные строчки:

 

 CiCustom          m_fast_ma;        // индикатор в виде объекта
   CiCustom          m_slow_ma;        // индикатор в виде объекта
 
bivmail:

P.S. В третьем разделе 3. Методы для установки параметров, думается, надо стереть преждевременно объявленные строчки:

Убрали, спасибо.
 

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

компилятор возвращает ошибку  'm_MethodFast' - constant expression required, ' m_MethodSlow' - constant expression required

конечно, вопросы чайника. может где в другой ветке такое надо спрашивать? чтобы по статье не засорять?  

//первый способ описать оба массива
//int *Finger_m_MethodFast;
//int *Finger_m_MethodSlow;
//Finger_m_MethodFast=&m_MethodFast;
//Finger_m_MethodFast=&m_MethodSlow;
//   int l_array1_select_method[]={Finger_m_MethodFast,Finger_m_MethodFast};
   ENUM_MA_METHOD l_array1_select_method[]={m_MethodFast,m_MethodSlow};
   ENUM_MA_METHOD l_array2_enum_ma_method[]={MODE_SMA,MODE_EMA,MODE_SMMA,MODE_LWMA};

   int total_array1=ArraySize(l_array1_select_method);
   int total_array2=ArraySize(l_array2_enum_ma_method);
   bool NoErrorsFlag=false;
   for(int i_array1=0;i_array1<total_array1;i_array1++)
     {

      for(int i_array2=0;i_array2<total_array2;i_array2++)
        {
         if(l_array1_select_method[i_array1]=l_array2_enum_ma_method[i_array2])
           {
            NoErrorsFlag=true;
           }
        }
      if(!NoErrorsFlag)
        {
         PrintFormat("Недопустимый тип сглаживания %s скользящей средней!",EnumToString(l_array1_select_method[i_array1]));
        }

     }

   if(!NoErrorsFlag)
     {
      return(false);
     }

 

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