Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 242

 

Si può fare così:

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:

Va bene:

Grazie.

Domanda suArraySize, se ho definito il numero di elementi select [9], la funzione restituirà un valore di 10? o finché non assegnerò un valore sarà 0?

 
websafe25:

Grazie.

Domanda suArraySize, se ho selezionato [9] definito in una volta, la funzione restituirà un valore di 10? o finché non assegnerò un valore sarà 0?

Funzioni di gruppo per lavorare con gli array

Non sono ammesse più di quattro matrici dimensionali. Ogni dimensione è indicizzata da 0 adimension_size-1. In un caso particolare di un array unidimensionale di 50 elementi, chiamando il primo elemento è array[0], l'ultimo è array[49].

Ecco uno script per testarlo:

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

Grazie.

Domanda suArraySize, se ho il numero di elementi selezionati [9] definito immediatamente, la funzione restituirà un valore di 10? o finché non assegnerò un valore sarà 0?

Se l'array è statico e ha una dimensione di 10 celle, la funzione ArraySize restituirà sempre il numero 10, indipendentemente dal contenuto di ogni cella.

Se l'array è dinamico, tuttavia, la funzione ArraySize restituirà la sua dimensione effettiva (e questa dimensione può essere cambiata).

 

Continuando a costruire il mio generatore) Il modulo si trova in Include\Expert\Signal

1. Non riesco a trovarlo nella lista dei moduli per il segnale.

2. Sono confuso da questa frase:

 double buy    =Signal_open_b(1);
Ho bisogno di ottenere la differenza tra
Main(index)-Signal(index)

Su una barra con indice 1. Se ho capito bene, l'indice è tra parentesi?

3. Questa linea specifica il numero di tutti i buffer dell'indicatore o quelli da utilizzare?

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

4. Si prega di consigliare come richiedere i dati di questo generatore dallo script per la verifica?

Qui sotto c'è tutto il codice. Forse ho fatto un errore da qualche altra parte, per favore consigliatemi.

#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 costruire il mio generatore) Il modulo si trova in Include\Expert\Signal

1. Non riesco a trovarlo nella lista dei moduli per il segnale.

2. Sono confuso da questa frase:

Ho bisogno di ottenere la differenza tra

Su una barra con indice 1. Se ho capito bene, l'indice è tra parentesi?

3. Questa linea specifica il numero di tutti i buffer dell'indicatore o quelli da utilizzare?

4. Si prega di consigliare come richiedere i dati di questo generatore dallo script per la verifica?

Qui sotto c'è tutto il codice. Forse ho fatto un errore da qualche altra parte, per favore consigliatemi.

Nell'intestazione dopo Class si dovrebbe scrivere CSampelSignal
 
barabashkakvn:
Nell'intestazione dopo Class dovete scrivere CSampelSignal

L'ho fatto così:

//+------------------------------------------------------------------+
//| 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.                    |
//+------------------------------------------------------------------+
Non riesco a trovarlo. Nel menu scelgo Genera EA.
 
forexman77:

Fatto così:

Non riesco a trovarlo. Nel menu scelgo di generare un EA.
È necessario riavviare MetaEditor.


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

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

L'ha aperto un paio di volte e l'ha chiuso. Non c'è niente.

Forse è perché ho mancato il distruttore. Non compila, dà un errore.

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CSampleSignal::~CSampleSignal(void)
  {
  }
~CSampleSignal' - funzione membro non definita
 
forexman77:

Fatto così:

Non lo trovo. Nel menu seleziono Generate EA.

Ah, per esteso, con il nome del cappello, postare il codice, ciò che la religione non permette :) ?

Eppure, vale ancora la pena leggerlo:

MQL5 Wizard: come scrivere il proprio modulo di segnali di trading

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

L'errore nel codice è la descrizione errata del parametro nell'intestazione. Il colore evidenziato è il codice modificato:

#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, ho inserito i valori dei parametri dal soffitto. Questi valori sono solo per esempio.