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

 
Artyom Trishkin:
Pendant que je suis encore sur mon portable, je vais dire ceci : où dans le code Alert et la boucle avec le print, la structure est déjà remplie.

L'alerte est juste en dehors des boucles dans la fonction On Start ()

 
Andrey Koldorkin:

L'alerte est juste en dehors des boucles dans la fonction On Start ()

Eh bien, c'est là que vous devez lire la structure remplie dans la boucle.
 
Andrey Koldorkin:

L'alerte est juste en dehors des boucles dans la fonction On Start ()

Ici, je vous montre approximativement comment en faire une fonction. Puis vous l'appelez quand vous en avez besoin :

//+------------------------------------------------------------------+
//|                                                     TestCopy.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs

enum enumYN
  {
   enYes=1, // Да
   enNo=0,  // Нет
  };

//--- input parameters
input int StartCopy=1;        // Номер бара, с которого начинаем копировать
int startCopy=(StartCopy<0)?0:StartCopy;
input int Search_Period=10;   // Количество копируемых свечей
int searchPeriod=(Search_Period<1)?1:Search_Period;
input int Delta=2;            // Количество пунктов допуска
int delta=(Delta<0)?0:Delta;
input enumYN AsSeries=enYes;  // Массив array как таймсерия
MqlRates array[];             // Массив структур для копирования Open, High, Low, Close, Time
  
struct DataCandle             // Структура для хранения всех совпадений
  {
   int number_matched;           // Количество совпадений
   MqlRates reference_candle;    // Данные эталонной свечи
   MqlRates matched_candles[];   // Массив свечей, совпадающих с эталонной по нужному критерию 
  };
  DataCandle dataCandle[];    // Массив структур данных свечей и их совпадений
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int copy_bars=(int)fmin(searchPeriod,Bars(Symbol(),Period()));                                  // количество копируемых свечей
   int searchResult=GetDataCandles(Symbol(),PERIOD_CURRENT,startCopy,copy_bars,array,dataCandle);  // Вызываем функцию поиска совпадающих свечей
   
   //--- если результат есть какой-то ...
   if(searchResult>0) {
      //--- ... посмотрим чего понаписали в массивы
      Alert("Array is series: ",ArrayIsSeries(array),
            "\ntime array[0]: ",TimeToString(array[0].time,TIME_DATE|TIME_MINUTES),
            "\ntime array[",string(searchPeriod-1),"]: ",TimeToString(array[ArraySize(array)-1].time,TIME_DATE|TIME_MINUTES));
      for(int i=0; i<ArraySize(dataCandle)-1; i++) {
         string refs_txt="";
         string matched_txt="";
         refs_txt="Свеча "+IntegerToString(i,2,'0')+": время "+TimeToString(dataCandle[i].reference_candle.time)+", high: "+DoubleToString(dataCandle[i].reference_candle.high,Digits())+" имеет совпадений: "+(string)dataCandle[i].number_matched+" шт. ";
         if(dataCandle[i].number_matched>0) {
            for(int j=0; j<ArraySize(dataCandle[i].matched_candles); j++) {
               matched_txt="Совпадение "+IntegerToString(j+1)+": "+TimeToString(dataCandle[i].matched_candles[j].time)+", high: "+DoubleToString(dataCandle[i].matched_candles[j].high,Digits());
               }
            }
         Print(refs_txt,matched_txt);
         }
      }
  }
//+------------------------------------------------------------------+
int GetDataCandles(string sy, ENUM_TIMEFRAMES timeframe, int begin_copy, int number_copy, MqlRates &array_rates[], DataCandle &data_candle[]) {
   int copied=0;
   copied=CopyRates(sy,timeframe,begin_copy,number_copy,array_rates);      // копируем данные
   if(copied>0) {                                                          // если скопировали
      ArraySetAsSeries(array_rates,AsSeries);                              // Задаём массив как таймсерию или нет
      ArrayResize(data_candle,copied);                                     // задаём размер структуры равным числу скопированных данных
      ZeroMemory(data_candle);                                             // Обнуляем данные в структуре
      //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
      for(int i=0; i<copied-1; i++) {                                      // цикл по скопированным данным от начала до "на один меньше размера массива"
         data_candle[i].reference_candle.high=array_rates[i].high;         // ищем этот high
         data_candle[i].reference_candle.low=array_rates[i].low;           // запомнили low для сравнения
         data_candle[i].reference_candle.time=array_rates[i].time;         // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size=0;                                                       // размер массива совпадающих свечей
         ArrayResize(data_candle[i].matched_candles,size);                 // Размер массива совпадений в ноль
         data_candle[i].number_matched=size;                               // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for(int j=0; j<copied; j++) {                                     // в цикле от i+1 до copy_bars
            if(j==i) continue;                                             // пропустим свечу "саму себя"
            //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину Point)
            if(NormalizeDouble(delta*Point()-fabs(array_rates[i].high-array_rates[j].high),Digits())>=0) {
               size++;                                               
               ArrayResize(data_candle[i].matched_candles,size);                 // увеличим размер массива совпадающих свечей
               data_candle[i].number_matched=size;                               // запишем количество совпадений
               data_candle[i].matched_candles[size-1].high=array_rates[j].high;  // запишем в массив high совпадающей свечи
               data_candle[i].matched_candles[size-1].low=array_rates[j].low;    // запишем в массив low совпадающей свечи
               data_candle[i].matched_candles[size-1].time=array_rates[j].time;  // запишем в массив время совпадающей свечи
               }
            }
         }
      }
   return(copied);
}
//+------------------------------------------------------------------+
 
Koldun Zloy:

Vous pouvez.

Des possibilités étonnantes.

Merci beaucoup.

Pouvez-vous me dire où trouver des informations à ce sujet ?

J'essaie maintenant de publier du texte sur l'url, mais le code donné dans l'aide ne veut pas s'autoriser même sur mon site personnel.

Je me demande quelles informations je dois recueillir sur un site tiers, autres que l'adresse url, afin d'autoriser et de publier le texte.

 
mila.com:

Pouvez-vous me dire où trouver des informations à ce sujet ?

Ici

 

Salutations.
Les gars qui connaissent le sujet, je ne sais pas comment résoudre le problème.
Je suis
en train d'écrire un panneau de trading pour moi-même sous MT4 en utilisant les classes de création de panneaux et les dialogues disponibles dans MT4.
Pour entrer des données dans le prix d'ouverture
de la transaction, ainsi que pour fixer le SL et le TP, j'utilise la classe CEdit (c'est une classe de contrôle simple basée sur l'objet "Input field "). Comme alternative, il y a la classeCSpinEdit (c'est une classe du contrôle combiné "Incrément-Décrément de champ"), mais elle est utilisée pour les données entières. En général, je suis plus à l'aise en utilisantCEdit, car je n'ai pas besoin de l'incrément .

Alors,
comment faire pour qu' il soitpossible d'entrer uniquement des chiffres dansle champ de saisie CEdit ? Il serait préférable de masquer l'entrée. Comme il est mis en œuvre dans le terminal MT4, lorsque nous appuyons sur "Nouvel ordre", nous voyons que les champs stop loss et take profit sont masqués comme 0,0000, etc. Comment faire de même avecCEdit ? C'est juste que je ne suis pas très loin dans le sujet du cours et certaines choses ne sont pas claires.

 
Andrey Zuev:

Salutations.
Les gars qui sont dans le sujet conseillent, ne savent pas comment résoudre le problème.
Je suis en train d'écrire
un panneau de trading pour moi-même sous MT4 en utilisant les classes de création de panneaux et les boîtes de dialogue disponibles dans MT4.
J'utilise la classe
CEdit (c'est une classe de contrôle simple basée sur l'objet "Entry field"). Comme alternative, il y a la classe CSpinEdit (c'est une classe du contrôle combiné "Incrément-Décrément du champ"), mais elle est utilisée pour les données entières. En général, je suis plus à l'aise en utilisantCEdit, car je n'ai pas besoin de l'incrément .

Alors,
comment faire pour qu' il soitpossible d'entrer uniquement des chiffres dansle champ de saisie CEdit ? Il serait préférable de masquer l'entrée. Comme il est mis en œuvre dans le terminal MT4, lorsque nous appuyons sur "Nouvel ordre", nous voyons que les champs stop loss et take profit sont masqués comme 0,0000, etc. Comment faire de même avec CEdit ? C'est juste que je ne suis pas très loin dans le sujet du cours et certaines choses ne sont pas claires.

Voici le panneau de dialogue avec le contrôle CEdit (pour plus de clarté, l'exemple est fait en un seul fichier) - le panneau vérifie les caractères saisis. Seuls les chiffres sont autorisés :

//+------------------------------------------------------------------+
//|                                                 ControlsEdit.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property description "Панель индикации и диалогов управления. Демонстрация работы класса CEdit"
#include <Controls\Dialog.mqh>
#include <Controls\Edit.mqh>
//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
//--- indents and gaps
#define  INDENT_LEFT                         (11)      // indent from left (with allowance for border width)
#define  INDENT_TOP                          (11)      // indent from top (with allowance for border width)
#define  INDENT_RIGHT                        (11)      // indent from right (with allowance for border width)
#define  INDENT_BOTTOM                       (11)      // indent from bottom (with allowance for border width)
#define  CONTROLS_GAP_X                      (5)       // gap by X coordinate
#define  CONTROLS_GAP_Y                      (5)       // gap by Y coordinate
//--- for buttons
#define  BUTTON_WIDTH                        (100)     // size by X coordinate
#define  BUTTON_HEIGHT                       (20)      // size by Y coordinate
//--- for the indication area
#define  EDIT_HEIGHT                         (20)      // size by Y coordinate
//--- for group controls
#define  GROUP_WIDTH                         (150)     // size by X coordinate
#define  LIST_HEIGHT                         (179)     // size by Y coordinate
#define  RADIO_HEIGHT                        (56)      // size by Y coordinate
#define  CHECK_HEIGHT                        (93)      // size by Y coordinate
//+------------------------------------------------------------------+
//| Class CControlsDialog                                            |
//| Usage: main dialog of the Controls application                   |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
  {
private:
   CEdit             m_edit;                          // CEdit объект

public:
                     CControlsDialog(void);
                    ~CControlsDialog(void);
   //--- create
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- chart event handler
   //--- chart event handler
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

protected:
   //--- create dependent controls
   bool              CreateEdit(void);
   //--- handlers of the dependent controls events
   void              OnChangeEdit(void);
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CControlsDialog::CControlsDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CControlsDialog::~CControlsDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CControlsDialog)
ON_EVENT(ON_END_EDIT,m_edit,OnChangeEdit)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Create                                                           |
//+------------------------------------------------------------------+
bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- create dependent controls
   if(!CreateEdit())
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Create the display field                                         |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateEdit(void)
  {
//--- coordinates
   int x1=INDENT_LEFT;
   int y1=INDENT_TOP;
   int x2=ClientAreaWidth()-INDENT_RIGHT;
   int y2=y1+EDIT_HEIGHT;
//--- create
   if(!m_edit.Create(m_chart_id,m_name+"Edit",m_subwin,x1,y1,x2,y2))
      return(false);
//--- разрешим редактировать сожержимое
   if(!m_edit.ReadOnly(false))
      return(false);
   if(!Add(m_edit))
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CControlsDialog ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create application dialog
   if(!ExtDialog.Create(0,"Controls",0,40,40,380,344))
      return(INIT_FAILED);
//--- run application
   ExtDialog.Run();
//--- succeed
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- очистим комментарии
   Comment("");
//--- destroy dialog
   ExtDialog.Destroy(reason);
  }
//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnChangeEdit(void)
  {
//--- allowed to use 0 to 9 digits only
   string   text     =m_edit.Text();
   int      text_len =StringLen(text);
   string   sample   ="0123456789";
   for(int i=0;i<text_len;i++)
     {
      string substr=StringSubstr(text,i,1);
      if(StringFind(sample,substr,0)==-1)
        {
         m_edit.Text("Допустымы только цифры");
         break;
        }
     }
  }
//+------------------------------------------------------------------+
Dossiers :
 
Koldun Zloy:

Ici

Le livre n'est pas en vente, mais est disponible gratuitement.

Merci.

 
Bonjour. Pouvez-vous me dire quel code écrire pour fermer l'ordre à la fin de la journée ?
 
Bonjour messieurs du forum ! !! J'ai un problème. J'ai testé le conseiller expert les jours de semaine et il a obtenu un résultat, mais le week-end, il me donne un résultat totalement différent ! Dites-moi pourquoi ?