Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 242

 

Можно так:

void OnStart()
{
  int select=10;
  MqlRates rates[];
  CopyRates(_Symbol,_Period,0,select,rates);
  for(int i=1;i<select;i++)
  {
    if(rates[i].close<rates[i-1].close)
    {
      //тут какой-нибудь код
    }
  }
}
 
Fleder:

Можно так:

Спасибо.

Вопрос по ArraySize , если у меня сразу определено количество элементов select [9], функция вернет значение 10? или пока я не присвою значения он будет равен 0?

 
websafe25:

Спасибо.

Вопрос по ArraySize , если у меня сразу определено количество элементов select [9], функция вернет значение 10? или пока я не присвою значения он будет равен 0?

Группа функций для работы с массивами

Допускаются не более чем четырехмерные массивы. Индексация каждого измерения производится от 0 до размер_измерения-1. В частном случае одномерного массива из 50 элементов обращение к первому элементу будет выглядеть как array[0], к последнему элементу - array[49]. 

 

Вот скрипт для проверки:

//+------------------------------------------------------------------+
//|                                                  test_script.mq5 |
//|                              Copyright © 2014, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double select[9];
   Print ("Количество элементов массива select =",ArraySize(select));
  }
//+------------------------------------------------------------------+
Документация по MQL5: Операции с массивами
Документация по MQL5: Операции с массивами
  • www.mql5.com
Операции с массивами - Документация по MQL5
 
websafe25:

Спасибо.

Вопрос по ArraySize , если у меня сразу определено количество элементов select [9], функция вернет значение 10? или пока я не присвою значения он будет равен 0?

Если массив статический и имеет размер 10 ячеек, то функция ArraySize всегда будет возвращать число 10, независимо от содержания каждой ячейки.

Если же массив динамический, то функция ArraySize будет возвращать его фактический размер (а этот размер можно изменять). 

 

Продолжаю мастерить свой генератор) Модуль расположен в Include\Expert\Signal

1. Не могу найти его в списке модулей для сигнала.

2. Смущает вот эта строка:

 double buy    =Signal_open_b(1);
нужно получить разницу между 
Main(index)-Signal(index)

на баре с индексом 1. Если правильно понимаю в скобках указывается индекс?

3. В данной строке указывается количество всех буфферов индикатора или которые будут использоваться?

 if(!m_TSI.NumBuffers(11)) return(false);

4. Подскажите, как из скрипта запросить данные из этого генератора, для проверки?

Ниже весь код. Может где еще ошибся, просьба подсказать. 

#include <Expert\ExpertSignal.mqh>
// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Сигнал индикатора 'Blau_Ergodic'                           |
//| Type=SignalAdvanced                                              |
//| Name=MyCustomIndicator                                           |
//| ShortName=MyCustomIndicator                                      |
//| Class=CSignalMyCustInd                                           |
//| Page=signal_envelopes                                            |
//| Parameter=q                                                      |
//| Parameter=r                                                      |
//| Parameter=s                                                      |
//| Parameter=u                                                      |
//| Parameter=ul                                                     |
//+------------------------------------------------------------------+
// wizard description end
//+------------------------------------------------------------------+
//| Class CSignalMyCustInd.                                          |
//| Purpose: Класс генератора торговых сигналов на основе            |
//|          пользовательского индикатора.                           |
//| Является производным от класса CExpertSignal.                    |
//+------------------------------------------------------------------+
class CSampleSignal : public CExpertSignal
  {
protected:
   CiCustom           m_TSI;              // объект для доступа к значениям TSI
   CiClose            m_close;           // объект для доступа к ценам закрытия баров
  //--- настраиваемые параметры
   int      q;  // q - период, по которому вычисляется моментум
   int      r; // r - период 1-й EMA, применительно к моментуму
   int      s;  // s - период 2-й EMA, применительно к результату первого сглаживания
   int      u;  // u - период 3-й EMA, применительно к результату второго сглаживания
   int      ul; // ul - (сигнальная линия) период EMA, применительно к эргодике
   double             m_stop_loss;       // уровень установки ордера "stop loss" относительно цены открытия
   double             m_take_profit;     // уровень установки ордера "take profit" относительно цены открытия
public:
              CSampleSignal();
 //--- методы установки настраиваемых параметров              
   void               Q(int value)                 { q=value;   }
   void               R(int value)                 { r=value;   }
   void               S(int value)                 { s=value;   }
   void               U(int value)                 { u=value;   }
   void               UL(int value)                { ul=value;  }
   void               StopLoss(double value)       { m_stop_loss=value;   }
   void               TakeProfit(double value)     { m_take_profit=value; }
   //--- метод проверки параметров настройки
   virtual bool       ValidationSettings();   
   virtual bool       InitIndicators(CIndicators* indicators);
    //--- методы проверки, если модели рынка сформированы 
   virtual bool      CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration);
   virtual bool      CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration);
protected:
   //--- метод инициализации объектов
   bool               InitMyCustomIndicator(CIndicators* indicators);
   bool               InitClose(CIndicators* indicators);
   //--- методы доступа к данным объектов
   double             Main(int index)                     { return(m_TSI.GetData(0,index)); }
   double             Signal(int index)                   { return(m_TSI.GetData(1,index)); }
   double             Signal_open_b(int index)           {return(Main(index)-Signal(index));}
   double             Signal_open_s(int index)           {return(Signal(index)-Main(index));}
   double             Close(int index)                    { return(m_close.GetData(index)); }
  };
//+------------------------------------------------------------------+
//| Конструктор CSampleSignal.                                       |
//| INPUT:  нет.                                                     |
//| OUTPUT: нет.                                                     |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
void CSampleSignal::CSampleSignal()
  {
   q=2; 
   r=7;
   s=5;
   u=3;
   ul=5;   
  }
//+------------------------------------------------------------------+
//| Проверка параметров настройки.                                   |
//| INPUT:  нет.                                                     |
//| OUTPUT: true-если настройки правильные, иначе false.             |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::ValidationSettings()
  {
  //--- проверка параметров
   if(q<=0||r<=0||s<=0||u<=0||ul<=0)
     {
      printf(__FUNCTION__+": период должен быть больше нуля");
      return(false);
     }
//--- успешное завершение
   return(true);
  }
//+------------------------------------------------------------------+
//| Инициализация индикаторов и таймсерий.                           |
//| INPUT:  indicators - указатель на объект-коллекцию               |
//|                      индикаторов и таймсерий.                    |
//| OUTPUT: true-в случае успешного завершения, иначе false.         |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::InitIndicators(CIndicators* indicators)
  {
//--- проверка указателя
   if(indicators==NULL)       return(false);
//--- инициализация TSI
   if(!InitMyCustomIndicator(indicators))    return(false);
   //--- инициализация таймсерии цен закрытия
   if(!InitClose(indicators)) return(false);
   return(true);
  }
//+------------------------------------------------------------------+
//| Инициализация индикаторов.                                       |
//+------------------------------------------------------------------+
bool CSampleSignal::InitMyCustomIndicator(CIndicators *indicators)
  {
//--- добавление объекта в коллекцию
   if(!indicators.Add(GetPointer(m_TSI)))
     {
      printf(__FUNCTION__+": error adding object");
      return(false);
     }
//--- задание параметров индикатора
   MqlParam parameters[6];
//---
   parameters[0].type=TYPE_STRING;
   parameters[0].string_value="Blau_Ergodic.ex5";
   parameters[1].type=TYPE_INT;
   parameters[1].integer_value=q;
   parameters[2].type=TYPE_INT;
   parameters[2].integer_value=r;
   parameters[3].type=TYPE_INT;
   parameters[3].integer_value=s;
   parameters[4].type=TYPE_INT;
   parameters[4].integer_value=u;
   parameters[5].type=TYPE_INT;
   parameters[5].integer_value=ul;
//--- инициализация объекта
   if(!m_TSI.Create(m_symbol.Name(),0,IND_CUSTOM,6,parameters))
     {
      printf(__FUNCTION__+": error initializing object");
      return(false);
     }
//--- количество буферов
   if(!m_TSI.NumBuffers(11)) return(false);
//--- ok
   return(true);
  }
//+------------------------------------------------------------------+
//| Инициализация таймсерии цен закрытия.                            |
//| INPUT:  indicators - указатель на объект-коллекцию               |
//|                      индикаторов и таймсерий.                    |
//| OUTPUT: true-в случае успешного завершения, иначе false.         |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::InitClose(CIndicators* indicators)
  {
//--- инициализация объекта таймсерии
   if(!m_close.Create(m_symbol.Name(),m_period))
     {
      printf(__FUNCTION__+": ошибка инициализации объекта");
      return(false);
     }
//--- добавление объекта в коллекцию
   if(!indicators.Add(GetPointer(m_close)))
     {
      printf(__FUNCTION__+": ошибка добавления объекта");
      return(false);
     }
//--- успешное завершение
   return(true);
  }
//+------------------------------------------------------------------+
//| Проверка выполнения условия для покупки.                         |
//| INPUT:  price      - ссылка для размещения цены открытия,        |
//|         sl         - ссылка для размещения цены stop loss,       |
//|         tp         - ссылка для размещения цены take profit,     |
//|         expiration - ссылка для размещения времени истечения.    |
//| OUTPUT: true-если условие выполнено, иначе false.                |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- подготовка данных
   double buy    =Signal_open_b(1);
   double unit  =PriceLevelUnit();
//--- проверка условия
   if(buy>1)
     {
      price=m_symbol.NormalizePrice(Close(0));
      sl   =m_symbol.NormalizePrice(price-m_stop_loss*unit);
      tp   =m_symbol.NormalizePrice(price+m_take_profit*unit);
      expiration+=m_expiration*PeriodSeconds(m_period);
      //--- условие выполнено
      return(true);
     }
//--- условие не выполнено
   return(false);
  }
 
forexman77:

Продолжаю мастерить свой генератор) Модуль расположен в Include\Expert\Signal

1. Не могу найти его в списке модулей для сигнала.

2. Смущает вот эта строка:

нужно получить разницу между 

на баре с индексом 1. Если правильно понимаю в скобках указывается индекс?

3. В данной строке указывается количество всех буфферов индикатора или которые будут использоваться?

4. Подскажите, как из скрипта запросить данные из этого генератора, для проверки?

Ниже весь код. Может где еще ошибся, просьба подсказать. 

В шапке после Class нужно написать CSampelSignal
 
barabashkakvn:
В шапке после Class нужно написать CSampelSignal

Сделал вот так:

//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Сигнал индикатора 'Blau_Ergodic'                           |
//| Type=SignalAdvanced                                              |
//| Name=MyCustomIndicator                                           |
//| ShortName=MyCustomIndicator                                      |
//| Class=CSampelSignal                                              |
//| Page=signal_envelopes                                            |
//| Parameter=q                                                      |
//| Parameter=r                                                      |
//| Parameter=s                                                      |
//| Parameter=u                                                      |
//| Parameter=ul                                                     |
//+------------------------------------------------------------------+
// wizard description end
//+------------------------------------------------------------------+
//| Class CSampelSignal.                                          |
//| Purpose: Класс генератора торговых сигналов на основе            |
//|          пользовательского индикатора.                           |
//| Является производным от класса CExpertSignal.                    |
//+------------------------------------------------------------------+
Не нахожу. В меню выбираю сгенерировать советника.
 
forexman77:

Сделал вот так:

Не нахожу. В меню выбираю сгенерировать советника.
Нужно перезапустить MetaEditor.


Мастер MQL5: Как написать свой модуль торговых сигналов
Мастер MQL5: Как написать свой модуль торговых сигналов
  • 2010.12.28
  • MetaQuotes Software Corp.
  • www.mql5.com
Генератор торговых стратегий Мастера MQL5 значительно упрощает проверку торговых идей. В статье рассказывается о том, как написать и подключить в Мастер MQL5 свой собственный класс торговых сигналов с реализацией сигналов по пересечению ценой скользящей средней, рассматривается структура и формат описания созданного класса для Мастера MQL5.
 
barabashkakvn:
Нужно перезапустить MetaEditor.

https://www.mql5.com/ru/articles/226

Несколько раз открыл, закрыл. Нет ничего.

Может потому что деструктор пропустил. Он не компилируется ошибку выдает.

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CSampleSignal::~CSampleSignal(void)
  {
  }
~CSampleSignal' - member function not defined
 
forexman77:

Сделал вот так:

Не нахожу. В меню выбираю сгенерировать советника.

А, полностью, с названием шапки, выложить код, что религия не позволяет :) ?

И еще, все-же стоит прочесть:

Мастер MQL5: Как написать свой модуль торговых сигналов

https://www.mql5.com/ru/forum/3724/page3#comment_66962 

 

А ошибка в коде - неправильное описание параметров в шапке. Выделенное цветом - это измененный код:

#include <Expert\ExpertSignal.mqh>
// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Сигнал индикатора 'Blau_Ergodic'                           |
//| Type=SignalAdvanced                                              |
//| Name=MyCustomIndicator                                           |
//| ShortName=MyCustomIndicator                                      |
//| Class=CSampleSignal                                              |
//| Page=signal_envelopes                                            |
//| Parameter=q,int,12,Parametr_q                                    |
//| Parameter=r,int,6,Parametr_r                                     |
//| Parameter=s,int,9,Parametr_s                                     |
//| Parameter=u,int,24,Parametr_u                                    |
//| Parameter=ul,int,8,Parametr_ul                                   |
//+------------------------------------------------------------------+
// wizard description end

Конечно значения параметров я поставил с потолка. Эти значения только для примера.

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