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

 
Andrey Koldorkin:

Je vais voir ce que je peux trouver. Merci. (gloussements)

Vous êtes les bienvenus. Il enregistre simplement toutes les valeurs élevées dans un tableau, puis imprime toutes les données enregistrées dans le tableau dans le journal dans une boucle.

Ce script ne fait pas nécessairement ce que vous voulez qu'il fasse. Il montre simplement comment les données sont stockées dans le tableau.

 
Artyom Trishkin:

Pas du tout. Il enregistre simplement toutes les valeurs élevées dans un tableau, puis imprime toutes les données enregistrées dans le tableau dans une boucle du journal de bord.

Ce script ne fait pas nécessairement ce dont vous avez besoin. Il montre simplement le principe de la sauvegarde des données dans un tableau.

C'est exactement ce que je cherchais. J'avais besoin qu'il enregistre les données dans un tableau pour la période que je choisissais. C'est la partie que j'ai comprise de vous.

Maintenant, ma question est la suivante : comment puis-je accéder aux données enregistrées dans le tableau et les comparer ?

Ici, il s'agit d'itérer, d'écrire le tableau étape par étape. C'est bien. Mais maintenant, nous devons comparer les éléments entre eux.

Est-il nécessaire de déclarer un nouveau nombre d'itérations, puis de récupérer les données et de les comparer d'une manière ou d'une autre ? Mais là encore, il faut écrire les résultats quelque part et ... tout se répète à la fin.

En gros, si la période de comparaison est de 5 à 7 bougies, alors la première doit être comparée aux 6 autres, puis à la deuxième et ainsi de suite..... Et si deux ou plusieurs d'entre eux ont un haut égal, vous devez d'abord calculer ce haut, et ensuite trouver le chandelier avec le bas le plus bas. C'est-à-dire la fonction qui consiste à appeler des chandeliers concrets à la fin pour récupérer tous leurs paramètres.

Mais est-il possible de le faire ?

 
Andrey Koldorkin:

c'est exactement ce que je cherchais. Ce dont j'avais besoin, c'était d'enregistrer les données dans un tableau pour la période que je sélectionnais. J'ai compris cette partie.

Maintenant, ma question est la suivante : comment puis-je accéder aux données enregistrées dans le tableau et les comparer ?

Ici, il s'agit d'itérer, d'écrire le tableau étape par étape. C'est bien. Mais maintenant, nous devons comparer les éléments entre eux.

Est-il nécessaire de déclarer un nouveau nombre d'itérations, puis de récupérer les données et de les comparer d'une manière ou d'une autre ? Mais là encore, il faut écrire les résultats quelque part et ... tout se répète à la fin.

En gros, si la période de comparaison est de 5 à 7 chandeliers, alors le premier doit être comparé aux 6 autres, puis au deuxième et ainsi de suite..... Et si deux ou plusieurs d'entre eux ont un haut égal, vous devez d'abord calculer ce haut, et ensuite trouver le chandelier avec le bas le plus bas. C'est-à-dire la fonction qui consiste à appeler des chandeliers concrets à la fin pour récupérer tous leurs paramètres.

Mais est-il possible de le faire ?

Ici, nous interrogeons simplement le tableau sauvegardé et affichons toutes les données sauvegardées dans le journal :

for(int i=0; i<ArrayRange(mass_high,0); i++) {
   printf("Время: %s, High: %.5f",TimeToString((int)mass_high[i][1],TIME_DATE|TIME_MINUTES),mass_high[i][0]);
   }

Soyons plus précis sur la tâche :

Nous devons trouver ... quoi exactement dans le tableau sauvegardé ?

 
Artyom Trishkin:

C'est ici que le tableau sauvegardé est interrogé, et que toutes les données sauvegardées sont enregistrées :

Soyons précis sur la tâche :

Nous devons trouver dans le tableau sauvegardé ... quoi exactement ?

J'ai besoin d'enregistrer un tableau de données pour toutes les bougies fermées (c'est-à-dire que la bougie actuelle n'est pas comptée) - bougies High, Low, Open, Close (4 paramètres) pour la période qui est spécifiée dans les paramètres. - c'est le cas.

Ensuite, je dois comparer les paramètres. Supposons que la période de recherche soit égale à 10 chandeliers. Ici, nous devons vérifier tous les hauts pour la période de 10 chandeliers. S'il y a deux correspondances ou plus, nous devrions revenir :

1. Drapeau - "Il y a une correspondance".

1. La valeur haute où les chandeliers ont la même valeur.

2. Les numéros de ces chandeliers, ainsi nous pouvons nous y référer et trouver les paramètres Low, Close, Open pour eux.

En général, je comprends une grande partie de ce comment faire.

Ce qui n'est pas clair, c'est comment se référer aux chandeliers qui forment le niveau. Idéalement, lors du recalcul, on pourrait mémoriser le numéro d'itération (i) mais il y a d'abord un recalcul selon lequel le log est écrit et il ne peut pas être appliqué.

Et dans cette variante, comme l'indique le journal des sorties - ici aussi, ce n'est pas ce qui est requis.

Je comprends que je dois d'abord prendre une bougie 1 et la comparer avec 9 autres, s'il y a une correspondance, alors extraire les numéros de ces bougies et leurs paramètres, activer la case à cocher. Ensuite, vérifiez la bougie 2 avec les autres et ainsi de suite jusqu'au milieu de l'échantillon, car alors iront des doublons de comparaisons uniquement de l'autre côté.

Si le nombre de chandeliers était fixe, je l'aurais écrit comme ceci - environ 5 cycles de comparaison. Mais c'est là la question : comment rendre possible un tel recalcul pour toute taille d'échantillon ?

 
Andrey Koldorkin:

J'ai besoin d'écrire un tableau de données pour toutes les bougies fermées (c'est-à-dire que la bougie actuelle n'est pas comptée) - bougies High, Low, Open, Close (4 paramètres) pour la période spécifiée dans les paramètres. - c'est le cas.

Ensuite, je dois comparer les paramètres. Supposons que la période de recherche soit égale à 10 chandeliers. Ici, nous devons vérifier tous les hauts pour la période de 10 chandeliers. S'il y a deux correspondances ou plus, nous devrions revenir :

1. Drapeau - "Il y a une correspondance".

1. La valeur haute où les chandeliers ont la même valeur.

2. Les numéros de ces chandeliers, ainsi nous pouvons nous y référer et trouver les paramètres Low, Close, Open pour eux.

En général, je comprends une grande partie de ce comment faire.

Ce qui n'est pas clair, c'est comment se référer aux chandeliers qui forment le niveau. Idéalement, lors du recalcul, on pourrait mémoriser le numéro d'itération (i) mais il y a d'abord un recalcul selon lequel le log est écrit et il ne peut pas être appliqué.

Et dans cette variante, comme l'indique le journal des sorties, ce n'est pas non plus ce qui est requis.

Je comprends que je dois d'abord prendre une bougie 1 et la comparer avec 9 autres, s'il y a une correspondance, alors extraire les numéros de ces bougies et leurs paramètres, activer la case à cocher. Ensuite, vérifiez la bougie 2 avec les autres et ainsi de suite jusqu'au milieu de l'échantillon, car alors iront des doublons de comparaisons uniquement de l'autre côté.

Si le nombre de chandeliers était fixe, je l'aurais écrit comme ceci - environ 5 cycles de comparaison. Mais c'est là la question - comment rendre possible un tel recalcul pour toute taille d'échantillon.

Et d'ailleurs, il est peu probable que la coïncidence exacte des valeurs de prix soit fréquente. Nous devons fixer un certain delta, et considérer qu'il y a coïncidence si les prix ne diffèrent pas plus que cette valeur.

Donc, si nous avons besoin d'une liste distincte de chandeliers correspondants pour chaque chandelier de la plage, j'essaierais d'utiliser un tableau de structures. Je vais y réfléchir et je vous le ferai savoir.
 
Andrey Koldorkin:

J'ai besoin d'écrire un tableau de données pour toutes les bougies fermées (c'est-à-dire que la bougie actuelle n'est pas comptée) - bougies High, Low, Open, Close (4 paramètres) pour la période spécifiée dans les paramètres. - il l'est.

Ensuite, je dois comparer les paramètres. Supposons que la période de recherche soit égale à 10 chandeliers. Ici, nous devons vérifier tous les hauts pour la période de 10 chandeliers. S'il y a deux correspondances ou plus, nous devrions revenir :

1. Drapeau - "Il y a une correspondance".

1. La valeur haute où les chandeliers ont la même valeur.

2. Les numéros de ces chandeliers, ainsi nous pouvons nous y référer et trouver les paramètres Low, Close, Open pour eux.

En général, je comprends une grande partie de ce comment faire.

Ce qui n'est pas clair, c'est comment se référer aux chandeliers qui forment le niveau. Idéalement, lors du recalcul, on pourrait mémoriser le numéro d'itération (i) mais il y a d'abord un recalcul selon lequel le log est écrit et il ne peut pas être appliqué.

Et dans cette variante, comme l'indique le journal des sorties, ce n'est pas non plus ce qui est requis.

Je comprends que je dois d'abord prendre une bougie 1 et la comparer avec 9 autres, s'il y a une correspondance, alors extraire les numéros de ces bougies et leurs paramètres, activer la case à cocher. Puis vérifiez la bougie 2 avec les autres et ainsi de suite jusqu'au milieu de l'échantillon, car alors iront des doublons de comparaisons uniquement de l'autre côté.

Si le nombre de chandeliers était fixe, je l'aurais écrit comme ceci - environ 5 cycles de comparaison. Mais c'est là la question - comment permettre un tel recalcul pour toute taille d'échantillon.

Au lieu que le drapeau "coïncidence" mette le compteur, sur la valeur haute où le compteur est le plus grand, il y a un niveau

Les valeurs élevées peuvent être arrondies, par exemple 1,23456 à 1,2346.

et 1,23462 arrondi à 1,2346

parce qu'il est peu probable que sur 10 chandeliers, 2 aient un sommet à 1.23456

donc danse du niveau

et le nombre de chandeliers est fixe, vous écrivez une certaine quantité de données dans la structure

c'est-à-dire que le nombre de chandeliers inscrits dans la structure est le même nombre d'itérations

 
Andrey Koldorkin:

J'ai besoin d'écrire un tableau de données pour toutes les bougies fermées (c'est-à-dire que la bougie actuelle n'est pas comptée) - bougies High, Low, Open, Close (4 paramètres) pour la période spécifiée dans les paramètres. - c'est le cas.

Ensuite, je dois comparer les paramètres. Supposons que la période de recherche soit égale à 10 chandeliers. Ici, nous devons vérifier tous les hauts pour la période de 10 chandeliers. S'il y a deux correspondances ou plus, nous devrions revenir :

1. Drapeau - "Il y a une correspondance".

1. La valeur haute où les chandeliers ont la même valeur.

2. Les numéros de ces chandeliers, ainsi nous pouvons nous y référer et trouver les paramètres Low, Close, Open pour eux.

En général, je comprends une grande partie de ce comment faire.

Ce qui n'est pas clair, c'est comment se référer aux chandeliers qui forment le niveau. Idéalement, lors du recalcul, on pourrait mémoriser le numéro d'itération (i) mais il y a d'abord un recalcul selon lequel le log est écrit et il ne peut pas être appliqué.

Et dans cette variante, comme l'indique le journal des sorties, ce n'est pas non plus ce qui est requis.

Je comprends que je dois d'abord prendre une bougie 1 et la comparer avec 9 autres, s'il y a une correspondance, alors extraire les numéros de ces bougies et leurs paramètres, activer la case à cocher. Ensuite, vérifiez la bougie 2 avec les autres et ainsi de suite jusqu'au milieu de l'échantillon, car alors iront des doublons de comparaisons uniquement de l'autre côté.

Si le nombre de chandeliers était fixe, je l'aurais écrit comme ceci - environ 5 cycles de comparaison. Mais c'est là la question - comment rendre possible un tel recalcul pour toute taille d'échantillon.

C'est une tâche intéressante, mais votre compréhension de la façon de résoudre ce problème n'est pas correcte, car jusqu'à présent vous n'avez pas beaucoup de connaissances en programmation.

Regardez : vous avez une certaine série de citations. Votre tâche consiste à choisir dans cet ensemble uniquement les barres qui remplissent certaines conditions. Par exemple, vous voulez obtenir une collection de barres, dont les hauteurs correspondent les unes aux autres. En fait, il peut y avoir plusieurs conditions de sélection, et elles peuvent être ajoutées au fil du temps. Une fois que vous avez une collection de barres, vous pouvez facilement analyser tous leurs autres paramètres.

Ainsi, pour votre tâche, vous devez écrire une fonction qui renverrait un tableau de barres répondant à une certaine condition (pseudocode) :

массив_баров = ПолучитьНужныеБары(Символ(), Таймфрейм(), Период(), УсловиеОтбора);
C'est-à-dire qu'il n'y a pas vraiment de problème à se souvenir et à itérer certaines données et index. Vous n'avez pas besoin des index des barres elles-mêmes, mais d'une collection spécifique qui satisfait à une condition donnée. Une fois que vous l'avez, vous résolvez beaucoup de problèmes d'un seul coup.
 
Artyom Trishkin:
Ainsi, si nous avons besoin d'une liste différente de chandeliers correspondants pour chaque chandelier de la fourchette, j'essaierais d'utiliser un tableau de structures. Je vais y réfléchir et je vous le ferai savoir.

Pensée. Je suis en train d'écrire un script de test :

//+------------------------------------------------------------------+
//|                                                     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
//--- input parameters
input int Search_Period=10;   // Количество копируемых свечей
int searchPeriod=(Search_Period<1)?1:Search_Period;
input int Delta=2;            // Количество пунктов допуска
int delta=(Delta<0)?0:Delta;
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(Search_Period,Bars(Symbol(),Period()));   // количество копируемых свечей
   int copied=CopyRates(Symbol(),PERIOD_CURRENT,1,copy_bars,array);  // копируем данные
   if(copied>0) {                                                    // если скопировали
      ArrayResize(dataCandle,copied);                                // задаём размер структуры равным числу скопированных данных
      ZeroMemory(dataCandle);                                        // Обнуляем данные в структуре
      //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
      for(int i=0; i<copy_bars-1; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"
         dataCandle[i].reference_candle.high=array[i].high;          // ищем этот high
         dataCandle[i].reference_candle.low=array[i].low;            // запомнили low для сравнения
         dataCandle[i].reference_candle.time=array[i].time;          // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size=0;                                                 // размер массива совпадающих свечей
         ArrayResize(dataCandle[i].matched_candles,size);            // Размер массива совпадений в ноль
         dataCandle[i].number_matched=size;                          // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for(int j=i+1; j<copy_bars; j++) {                          // в цикле от i+1 до copy_bars
            //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину delta*Point)
            if(NormalizeDouble(delta*Point()-fabs(array[i].high-array[j].high),Digits())>=0) {
               size++;                                               
               ArrayResize(dataCandle[i].matched_candles,size);            // увеличим размер массива совпадающих свечей
               dataCandle[i].number_matched=size;                          // запишем количество совпадений
               dataCandle[i].matched_candles[size-1].high=array[j].high;   // запишем в массив high совпадающей свечи
               dataCandle[i].matched_candles[size-1].low=array[j].low;     // запишем в массив low совпадающей свечи
               dataCandle[i].matched_candles[size-1].time=array[j].time;   // запишем в массив время совпадающей свечи
               //Print("Время свечи ",i," :",TimeToString(dataCandle[i].reference_candle.time=array[i].time),", high=",DoubleToString(dataCandle[i].reference_candle.high=array[i].high,Digits()),". Совпадение со свечой ",TimeToString(dataCandle[i].matched_candles[size-1].time=array[j].time),", её high ",DoubleToString(dataCandle[i].matched_candles[size-1].high=array[j].high,Digits()),". Совпадений: ",(string)dataCandle[i].number_matched);
               }
            }
         }
      }

   //--- Посмотрим чего понаписали в массивы
   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);
      }
  }
//+------------------------------------------------------------------+

J'ai essayé de décrire toutes les étapes.

Après avoir rempli toutes les correspondances dans la boucle, nous avons un tableau qui contient tous les chandeliers et les chandeliers correspondants. Après cela, vous pouvez chercher le bas de l'échelle. Et vous pouvez l'organiser directement dans la boucle. C'est plus pratique pour vous.

 

Voici une autre façon de procéder : des correspondances sont écrites pour chaque bougie de la fourchette. Dans la version précédente, les correspondances étaient écrites uniquement pour une bougie - c'est-à-dire qu'aucune correspondance n'était écrite pour celle qui correspondait à celle-ci.

//+------------------------------------------------------------------+
//|                                                     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
//--- input parameters
input int Search_Period=10;   // Количество копируемых свечей
int searchPeriod=(Search_Period<1)?1:Search_Period;
input int Delta=2;            // Количество пунктов допуска
int delta=(Delta<0)?0:Delta;
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(Search_Period,Bars(Symbol(),Period()));   // количество копируемых свечей
   int copied=CopyRates(Symbol(),PERIOD_CURRENT,1,copy_bars,array);  // копируем данные
   if(copied>0) {                                                    // если скопировали
      ArrayResize(dataCandle,copied);                                // задаём размер структуры равным числу скопированных данных
      ZeroMemory(dataCandle);                                        // Обнуляем данные в структуре
      //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
      for(int i=0; i<copy_bars; i++) {                               // цикл по скопированным данным от начала до конца
         dataCandle[i].reference_candle.high=array[i].high;          // ищем этот high
         dataCandle[i].reference_candle.low=array[i].low;            // запомнили low для сравнения
         dataCandle[i].reference_candle.time=array[i].time;          // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size=0;                                                 // размер массива совпадающих свечей
         ArrayResize(dataCandle[i].matched_candles,size);            // Размер массива совпадений в ноль
         dataCandle[i].number_matched=size;                          // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for(int j=0; j<copy_bars; j++) {                            // в цикле от 0 до copy_bars
            if(j==i) continue;                                       // пропустим свечу "саму себя"
            //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину Point)
            if(NormalizeDouble(delta*Point()-fabs(array[i].high-array[j].high),Digits())>=0) {
               size++;                                               
               ArrayResize(dataCandle[i].matched_candles,size);            // увеличим размер массива совпадающих свечей
               dataCandle[i].number_matched=size;                          // запишем количество совпадений
               dataCandle[i].matched_candles[size-1].high=array[j].high;   // запишем в массив high совпадающей свечи
               dataCandle[i].matched_candles[size-1].low=array[j].low;     // запишем в массив low совпадающей свечи
               dataCandle[i].matched_candles[size-1].time=array[j].time;   // запишем в массив время совпадающей свечи
               //Print("Время свечи ",i," :",TimeToString(dataCandle[i].reference_candle.time=array[i].time),", high=",DoubleToString(dataCandle[i].reference_candle.high=array[i].high,Digits()),". Совпадение со свечой ",TimeToString(dataCandle[i].matched_candles[size-1].time=array[j].time),", её high ",DoubleToString(dataCandle[i].matched_candles[size-1].high=array[j].high,Digits()),". Совпадений: ",(string)dataCandle[i].number_matched);
               }
            }
         }
      }

   //--- Посмотрим чего понаписали в массивы
   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);
      }
  }
//+------------------------------------------------------------------+
 
L'idée d'ouvrir des ordres sur un signal d'achat ou de prise à la baisse, comment faire pour qu'il n'y ait qu'un seul trade d'achat/vente et un trade d'ordre en attente, j'en ai un ouvert sur chaque tick du trade. Aidez à résoudre le problème.
Dossiers :
ritfv.png  46 kb
ohs.txt  5 kb