Voici ma variante de la résolution du problème de la recherche par répétition :
//+------------------------------------------------------------------+//| FindRetryPrices.mq5 |//| Copyright 2016, Vasiliy Sokolov. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2016, Vasiliy Sokolov."#property link"http://www.mql5.com"#property version"1.00"#include <Dictionary.mqh>
inputint RatesPeriod = 10; // Период за который ищутся повторенияinputint RoundPoints = 10; // Загрубление цены в прайсстепахclass CBar : public CObject
{
private:
MqlRates m_bar;
public:
CBar(MqlRates& bar){m_bar = bar;}
datetime Date(){return m_bar.time;}
doubleOpen(){return m_bar.open;}
doubleHigh(){return m_bar.high;}
doubleLow(){return m_bar.low;}
doubleClose(){return m_bar.close;}
};
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
// Нахождение повторяющихся баровMqlRates rates[];
int total = CopyRates(Symbol(), Period(), 0, RoundPoints, rates);
CDictionary* BarsCollections = new CDictionary(total);
for(int i = 0; i < total; i++)
{
double price = PriceToLevel(rates[i].high);
CBar* bar = new CBar(rates[i]);
if(!BarsCollections.ContainsKey(price))
BarsCollections.AddObject(price, new CList());
CList* equal_bars = BarsCollections.GetObjectByKey(price);
equal_bars.Add(bar);
}// Вывод повторов
FOREACH_DICT(BarsCollections)
{
CList* list = node;
if(list.Total() < 2)continue;
string retry_bars = "";
for(CBar* bar = list.GetFirstNode(); bar != NULL; bar = list.GetNextNode())
retry_bars += " [" + TimeToString(bar.Date()) + ", " + DoubleToString(bar.High(), Digits()) + "]";
printf("Обнаружено совпадение баров:" + retry_bars);
}
delete BarsCollections;
}
//+------------------------------------------------------------------+//| Округляет цену в соответствии с параметром RoundPoints |//+------------------------------------------------------------------+double PriceToLevel(double price)
{
double price_step = RoundPoints*Point();
double mn = MathFloor(price/price_step);
return mn * price_step;
}
//+------------------------------------------------------------------+
Pour que le script fonctionne, le fichier Dictionnaire doit être copié dans MQL5\Include
La recherche est effectuée dans la boucle for à passage unique surlignée en jaune. La liste résultante ne contient pas de répétitions (si A répète B et B répète A, un ensemble {A, B} sera produit au lieu de deux {A, B} et {B, A}). ).
Voici ma version de la solution au problème de la recherche de répétitions :
Merci beaucoup à tous ! !! Je vais essayer de trouver une solution aujourd'hui. Il est important de ne pas se contenter de copier un morceau de code dans Expert Advisor, mais de comprendre pourquoi il est écrit de cette façon, alors peut-être que je poserai plus de questions.
Voici ma variante pour résoudre le problème de la recherche de répétitions :
Vasily, lorsque j'ouvre#include <Dictionary.mqh>, il s'ouvre de la même manière que dans le corps de l'EA. Ça devrait être comme ça, ou il devrait y avoir un autre code à l'intérieur ?
Parce que dans le code, que je vois, il n'est pas clair comment il cherche les répétitions ((
// строку int searchPeriod=(Search_Period<1)?1:Search_Period;// можно расписать так:inputint Search_Period=10; // Количество копируемых свечей ... эту строку вы видите в настройкахint searchPeriod; // Сюда будем записывать входной параметрif(Search_Period<1) searchPeriod=1; // Если во входном параметре ввели ноль или меньше нуля, то параметр будет равен нулюelse searchPeriod=Search_Period; // иначе примем входной параметр// соответственно и строку int delta=(Delta<0)?0:Delta;// можно расписать точно так же
Ai-je raison de supposer qu'il s'agit d'une erreur de frappe ? Il faudrait que ce soit 0 au lieu de 1.
comme ça :int searchPeriod=(Search_Period<1)?0:Search_Period ;
et plus loin dans le script exécutable :
int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())) ; // le nombre de bougies à copier
Dans ce cas, nous devrions probablement déjà utiliser une variable : searchPeriod. non ?
------
Autre question, à quoi sert cette ligne ? J'ai découvert que chaque élément de la structure se remet à zéro. Et je ne comprends pas ce que nous mettons à zéro ici si nous semblons avoir juste écrit ces données et devrions les utiliser plus loin.
ZeroMemory(dataCandle) ; // Remise à zéro des données dans la structure
Ai-je raison de supposer qu'il s'agit d'une erreur de frappe ? Il faudrait que ce soit 0 au lieu de 1.
comme ça :int searchPeriod=(Search_Period<1)?0:Search_Period ;
et plus loin dans le script exécutable :
int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())) ; // le nombre de bougies à copier
Dans ce cas, nous devrions probablement déjà utiliser une variable : searchPeriod. non ?
------
Autre question, à quoi sert cette ligne ? J'ai découvert que chaque élément de la structure se remet à zéro. Et je ne comprends pas ce que nous mettons à zéro ici si nous semblons avoir juste écrit ces données et devrions les utiliser plus loin.
ZeroMemory(dataCandle) ; // effacement des données dans la structure
Non, ça ne l'est pas. Voici comment procéder (littéralement) : si la période de recherche définie par l'utilisateur dans les paramètres est inférieure à un, alors la période de recherche sera égale à zéro ; sinon, la période de recherche sera égale à la valeur de la période de recherche définie par l'utilisateur dans les paramètres. Ce n'est pas correct. Nous n'avons pas besoin d'une plage de recherche égale à zéro. Ainsi, si cette plage est définie par l'utilisateur comme étant égale à 0 ou inférieure à zéro (inférieure à un), nous la définirons comme étant égale au minimum - un.
"int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())) ; // nombre de chandeliers à copier ici nous devrions déjà utiliser la variable : searchPeriod. n'est-ce pas ? "
Oui, c'est vrai, c'est une faute de frappe.
"Autre question, à quoi sert cette ligne ? À quoi sert-elle ? J'ai découvert que cela remet à zéro chaque élément de la structure. Et là, je n'arrive pas à comprendre pourquoi et ce que nous mettons à zéro si nous venons d'écrire ces données et que nous devons les utiliser plus tard. ZeroMemory(dataCandle) ; // Mise à zéro des données dans la structure ".
Nous faisons cela avant de remplir la structure avec des données. D'abord on le met à zéro, et ensuite on le remplit. Regarde - on le met à zéro avant la boucle. Et ensuite, dans la boucle, nous remplissons la structure avec des données.
Voici ma variante de la résolution du problème de la recherche par répétition :
Pour que le script fonctionne, le fichier Dictionnaire doit être copié dans MQL5\Include
La recherche est effectuée dans la boucle for à passage unique surlignée en jaune. La liste résultante ne contient pas de répétitions (si A répète B et B répète A, un ensemble {A, B} sera produit au lieu de deux {A, B} et {B, A}). ).
Le résultat de ce script est le suivant :
De la référence :
Voici ma version de la solution au problème de la recherche de répétitions :
Veuillez m'aider à trouver une fonction pour calculer le RSI standard, les exigences sont simples :
1. Retourner la valeur RSI à une barre donnée
2. Calculer l'indice uniquement pour les barres (si nécessaire), qui sont demandées (souhaitable).
3. Être capable de calculer sur le TF spécifié
4. Travaille au détriment du point 2 plus rapidement que l'indicateur
Je veux intégrer la fonction dans l'Expert Advisor, si quelqu'un en a une prête, merci de la partager avec moi.
Je pose la question car cet indicateur est très courant et n'est pas un mystère.
Veuillez m'aider à trouver une fonction pour calculer le RSI standard, les exigences sont simples :
1. Retourner la valeur RSI à une barre donnée
2. Calculer l'indice uniquement pour les barres (si nécessaire), qui sont demandées (souhaitable).
3. Être capable de calculer sur le TF spécifié
4. Travaille au détriment du point 2 plus rapidement que l'indicateur
Je veux intégrer la fonction dans l'EA, si quelqu'un en a une prête, merci de la partager avec moi.
Je pose la question car cet indicateur est très courant et n'est pas un mystère.
Quel est le problème avec l'iRSI standard ? Pas assez secret ?
Il y a mes changements que je devrai faire à la fonction...
Prenez donc un modèle prêt à l'emploi et modifiez-le en fonction de vos besoins :
Prenez donc un modèle prêt à l'emploi et modifiez-le en fonction de vos besoins :
Voici ma variante pour résoudre le problème de la recherche de répétitions :
Vasily, lorsque j'ouvre#include <Dictionary.mqh>, il s'ouvre de la même manière que dans le corps de l'EA. Ça devrait être comme ça, ou il devrait y avoir un autre code à l'intérieur ?
Parce que dans le code, que je vois, il n'est pas clair comment il cherche les répétitions ((
Ai-je raison de supposer qu'il s'agit d'une erreur de frappe ? Il faudrait que ce soit 0 au lieu de 1.
comme ça :int searchPeriod=(Search_Period<1)?0:Search_Period ;
et plus loin dans le script exécutable :
int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())) ; // le nombre de bougies à copier
Dans ce cas, nous devrions probablement déjà utiliser une variable : searchPeriod. non ?
------
Autre question, à quoi sert cette ligne ? J'ai découvert que chaque élément de la structure se remet à zéro. Et je ne comprends pas ce que nous mettons à zéro ici si nous semblons avoir juste écrit ces données et devrions les utiliser plus loin.
ZeroMemory(dataCandle) ; // Remise à zéro des données dans la structure
Ai-je raison de supposer qu'il s'agit d'une erreur de frappe ? Il faudrait que ce soit 0 au lieu de 1.
comme ça :int searchPeriod=(Search_Period<1)?0:Search_Period ;
et plus loin dans le script exécutable :
int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())) ; // le nombre de bougies à copier
Dans ce cas, nous devrions probablement déjà utiliser une variable : searchPeriod. non ?
------
Autre question, à quoi sert cette ligne ? J'ai découvert que chaque élément de la structure se remet à zéro. Et je ne comprends pas ce que nous mettons à zéro ici si nous semblons avoir juste écrit ces données et devrions les utiliser plus loin.
ZeroMemory(dataCandle) ; // effacement des données dans la structure
"comme ceci :int searchPeriod=(Search_Period<1)?0:Search_Period ;"
Non, ça ne l'est pas. Voici comment procéder (littéralement) : si la période de recherche définie par l'utilisateur dans les paramètres est inférieure à un, alors la période de recherche sera égale à zéro ; sinon, la période de recherche sera égale à la valeur de la période de recherche définie par l'utilisateur dans les paramètres. Ce n'est pas correct. Nous n'avons pas besoin d'une plage de recherche égale à zéro. Ainsi, si cette plage est définie par l'utilisateur comme étant égale à 0 ou inférieure à zéro (inférieure à un), nous la définirons comme étant égale au minimum - un.
"int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period())) ; // nombre de chandeliers à copier
ici nous devrions déjà utiliser la variable : searchPeriod. n'est-ce pas ? "
Oui, c'est vrai, c'est une faute de frappe.
"Autre question, à quoi sert cette ligne ? À quoi sert-elle ? J'ai découvert que cela remet à zéro chaque élément de la structure. Et là, je n'arrive pas à comprendre pourquoi et ce que nous mettons à zéro si nous venons d'écrire ces données et que nous devons les utiliser plus tard. ZeroMemory(dataCandle) ; // Mise à zéro des données dans la structure ".
Nous faisons cela avant de remplir la structure avec des données. D'abord on le met à zéro, et ensuite on le remplit. Regarde - on le met à zéro avant la boucle. Et ensuite, dans la boucle, nous remplissons la structure avec des données.