Questions des débutants MQL5 MT5 MetaTrader 5 - page 242

 

Tu peux faire comme ça :

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:

C'est bien :

Merci.

Question surArraySize, si j'ai défini le nombre d'éléments select [9], la fonction renverra-t-elle une valeur de 10 ? ou jusqu'à ce que j'assigne une valeur, elle sera 0 ?

 
websafe25:

Merci.

Question surArraySize, si j'ai sélectionné [9] défini à la fois, la fonction renverra-t-elle une valeur de 10 ? ou jusqu'à ce que j'assigne une valeur, elle sera 0 ?

Fonctions de groupe pour travailler avec des tableaux

Les tableaux ne peuvent pas avoir plus de quatre dimensions. Chaque dimension est indexée de 0 àdimension_size-1. Dans le cas particulier d'un tableau unidimensionnel de 50 éléments, appeler le premier élément est array[0], le dernier est array[49].

Voici un script pour le tester :

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

Merci.

Question surArraySize, si le nombre d'éléments sélectionnés [9] est défini immédiatement, la fonction renverra-t-elle une valeur de 10 ? ou jusqu'à ce que j'assigne une valeur, elle sera 0 ?

Si le tableau est statique et a une taille de 10 cellules, la fonction ArraySize renverra toujours le nombre 10, quel que soit le contenu de chaque cellule.

En revanche, si le tableau est dynamique, la fonction ArraySize renvoie sa taille réelle (et cette taille peut être modifiée).

 

Je continue à construire mon générateur) Le module se trouve dans Include\Expert\Signal

1. Je ne le trouve pas dans la liste des modules pour le signal.

2. Je suis confus par cette ligne :

 double buy    =Signal_open_b(1);
J'ai besoin de connaître la différence entre
Main(index)-Signal(index)

Sur une barre avec l'indice 1. Si je comprends bien, l'indice est entre parenthèses ?

3. Cette ligne précise-t-elle le nombre de tous les tampons de l'indicateur ou ceux à utiliser ?

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

4. Veuillez indiquer comment demander les données de ce générateur au script pour vérification.

Vous trouverez ci-dessous l'ensemble du code. J'ai peut-être fait une erreur ailleurs, veuillez me conseiller.

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

Je continue à construire mon générateur) Le module se trouve dans Include\Expert\Signal

1. Je ne le trouve pas dans la liste des modules pour le signal.

2. Je suis confus par cette ligne :

J'ai besoin de connaître la différence entre

Sur une barre avec l'indice 1. Si je comprends bien, l'indice est entre parenthèses ?

3. Cette ligne précise-t-elle le nombre de tous les tampons de l'indicateur ou ceux à utiliser ?

4. Veuillez indiquer comment demander les données de ce générateur au script pour vérification.

Vous trouverez ci-dessous l'ensemble du code. J'ai peut-être fait une erreur ailleurs, veuillez me conseiller.

Dans l'en-tête après Class vous devez écrire CSampelSignal
 
barabashkakvn:
Dans l'en-tête après Class vous devez écrire CSampelSignal

Je l'ai fait comme ça :

//+------------------------------------------------------------------+
//| 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.                    |
//+------------------------------------------------------------------+
Je n'arrive pas à le trouver. Dans le menu, je choisis Générer l'EA.
 
forexman77:

Je l'ai fait comme ça :

Je n'arrive pas à le trouver. Dans le menu, je choisis de générer un EA.
Il faut redémarrer MetaEditor.


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

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

Je l'ai ouvert quelques fois, je l'ai fermé. Il n'y a rien.

C'est peut-être parce que j'ai raté le destructeur. Il ne compile pas, il donne une erreur.

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CSampleSignal::~CSampleSignal(void)
  {
  }
~CSampleSignal' - fonction membre non définie
 
forexman77:

Je l'ai fait comme ça :

Je ne le trouve pas. Dans le menu, je sélectionne Generate EA.

Ah, en entier, avec le nom du chapeau, affichez le code, ce que la religion ne permet pas :) ?

Et pourtant, ça vaut quand même la peine de le lire :

MQL5 Wizard : Comment écrire votre propre module de signaux de trading

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

L'erreur dans le code est une description incorrecte des paramètres dans l'en-tête. La couleur mise en évidence est le code modifié :

#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

Bien entendu, j'ai saisi les valeurs des paramètres à partir du plafond. Ces valeurs sont données à titre d'exemple.

Raison: