Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 242

 

Pode ir assim:

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:

Está bem:

Obrigado.

Pergunta sobre oArraySize, se eu tiver o número de elementos seleccionados [9] definido, a função irá devolver um valor de 10? ou até eu atribuir um valor será 0?

 
websafe25:

Obrigado.

Pergunta sobre oArraySize, se eu tiver seleccionado [9] definido de imediato, a função devolverá um valor de 10? ou até eu atribuir um valor será 0?

Funções de grupo para trabalhar com matrizes

Não são permitidas mais do que arrays tetradimensionais. Cada dimensão é indexada de 0 adimension_size-1. Num caso particular de uma matriz unidimensional de 50 elementos, chamar o primeiro elemento é matriz[0], o último é matriz[49].

Aqui está um guião para o testar:

//+------------------------------------------------------------------+
//|                                                  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:

Obrigado.

Pergunta sobre oArraySize, se eu tiver o número de elementos seleccionados [9] definido imediatamente, a função irá devolver um valor de 10? ou até eu atribuir um valor será 0?

Se a matriz for estática e tiver um tamanho de 10 células, a função ArraySize devolverá sempre o número 10, independentemente do conteúdo de cada célula.

Se a matriz for dinâmica, no entanto, a função ArraySize devolverá o seu tamanho real (e este tamanho pode ser alterado).

 

Continuando a construir o meu gerador) O módulo está localizado em IncludeExpert\Signal

1. Não consigo encontrá-lo na lista de módulos para o sinal.

2. Estou confuso com esta linha:

 double buy    =Signal_open_b(1);
Preciso de obter a diferença entre
Main(index)-Signal(index)

Numa barra com índice 1. Se bem entendi, o índice está entre parênteses?

3. Esta linha especifica o número de todos os amortecedores do indicador ou os que devem ser utilizados?

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

4. Aconselha-se como solicitar os dados deste gerador a partir do guião para verificação?

Abaixo está todo o código. Talvez eu tenha cometido um erro noutro lugar, por favor aconselhem-me.

#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:

Continuando a construir o meu gerador) O módulo está localizado em IncludeExpert\Signal

1. Não consigo encontrá-lo na lista de módulos para o sinal.

2. Estou confuso com esta linha:

Preciso de obter a diferença entre

Numa barra com índice 1. Se bem entendi, o índice está entre parênteses?

3. Esta linha especifica o número de todos os amortecedores do indicador ou os que devem ser utilizados?

4. Aconselha-se como solicitar os dados deste gerador a partir do guião para verificação?

Abaixo está todo o código. Talvez eu tenha cometido um erro noutro lugar, por favor aconselhem-me.

No cabeçalho após a aula deve escrever CSampelSignal
 
barabashkakvn:
No cabeçalho, após a aula, é necessário escrever CSampelSignal

Fi-lo desta forma:

//+------------------------------------------------------------------+
//| 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.                    |
//+------------------------------------------------------------------+
Não o consigo encontrar. No menu, escolho Gerar EA.
 
forexman77:

Fizeram-no assim:

Não o consigo encontrar. No menu, opto por gerar uma EA.
Necessidade de reiniciar o MetaEditor.


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

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

Abriu-o algumas vezes, fechou-o. Não há nada.

Talvez seja por ter perdido o destruidor. Não compila, dá um erro.

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CSampleSignal::~CSampleSignal(void)
  {
  }
~CSampleSignal' - função de membro não definida
 
forexman77:

Fizeram-no assim:

Não o encontro. No menu, selecciono Gerar EA.

Ah, por extenso, com o nome do chapéu, afixar o código, o que a religião não permite :) ?

E mesmo assim, ainda vale a pena ler:

MQL5 Wizard: Como escrever o seu próprio módulo de sinais de negociação

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

O erro no código é a descrição incorrecta do parâmetro no cabeçalho. A cor realçada é o código modificado:

#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

Naturalmente, introduzi os valores dos parâmetros a partir do tecto. Estes valores são apenas por exemplo.