English (original) : J'aimerais faire une demande de fonctionnalité linguistique pour MQL. Si ce n'est pas le bon fil de discussion, merci de me le faire savoir. La demande originale se trouve sur le forum anglais...
Russe (Google translate) : Je voudrais faire une demande de fonctionnalité linguistique pour MQL.Si ce n'est pas le bon fil de discussion, merci de me le faire savoir.La demande originale se trouve sur le forum anglais ...
Encore une astuce pour les droits d'accès : Si vous avez un désir irrésistible de donner accès à des champs/fonctions privés d'une classe à une autre classe, vous pouvez faire ce qui suit en utilisant des outils MQL standard :
Nous devons : rendre l'accès à A::f1() à partir de B
//--------- как былоclass A
{
int m;
int f1() {return m;} // нужно дать к нему доступ классу Bpublic:
A(int a): m(a) {}
};
class B {};
Réécrivons-le comme suit :
class A;
class B
{
private:
class AB
{
public:
virtualint CallAf1(A&) const = 0;
AB() {ABptr = &this;}
} static *ABptr;
// внутри B используем этот метод для получения доступа к A::f1()staticint CallAf1(A & obj)
{
return ABptr.CallAf1(obj);
}
public:
class AB2: AB {};
// вспомогательный метод - только для проверкиstaticvoid _f1_test(A & obj)
{
Print("test ", CallAf1(obj));
}
};
B::AB *B::ABptr = NULL;
class A
{
int m;
int f1() {return m;}
public:
A(int a): m(a) {}
//-- добавленоprivate:
class AB3: B::AB2
{
int CallAf1(A &obj) const {return obj.f1();}
} staticconst ABlink;
};
const A::AB3 A::ABlink;
Pour appeler (A)a.f1() dans B, appelez CallAf1(a). Si f1() a des paramètres, nous les ajoutons à CallAf1().
Test :
voidOnStart()
{
A f(2);
B::_f1_test(f);
}
Vous pouvez rendre CallAf1() protégé, mais ce sera un grand trou dans les droits d'accès - n'importe où dans le code, vous pouvez créer un descendant de la classe B et dans celui-ci une méthode publique pour appeler CallAf1() - c'est-à-dire que tout le monde aura accès à A::f1().
P.S. La construction est très lourde (si vous le souhaitez, vous pouvez l'intégrer dans des macros), mais elle présente un avantage par rapport à l'ami C++ : elle ne donne pas accès à tous les membres de la classe, mais seulement à certains d'entre eux.
Encore une astuce pour les droits d'accès : Si vous avez un désir irrésistible d'accorder l'accès à des champs/fonctions privés d'une classe à une autre classe, vous pouvez le faire à l'aide des outils MQL standard
Il m'a fallu beaucoup de temps pour m'y mettre... bonne continuation avec la virtualisation, merci !
fxsaber #: J'ai mis du temps à m'y mettre... bon coup de virtualisation, merci !
La seule chose que je n'ai pas écrite au début, c'est qu'il ne faut plus créer d'objets de classe B::AB2 (et ses descendants), sinon tout s'écroule :-)
L'exécution de cet Expert Advisor dans le Testeur en mode tous les symboles
inputint inTmp = 0; // https://www.mql5.com/ru/forum/321656/page90#comment_44727856bool Res = true;
// Проверяет, нормализована ли цена по алгоритму NormalizeDouble.bool IsNDPrice( constdouble &Price )
{
return(Price == NormalizeDouble(Price, 5));
}
// Проверяет, нормализована ли цена, как при парсинге или ручном вводе.bool IsNDPrice2( constdouble &Price )
{
return(Price == (double)DoubleToString(Price, 5));
}
voidOnTick()
{
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick))
// Res &= IsNDPrice(Tick.bid) && IsNDPrice(Tick.ask); // OnTester == 1.
Res &= IsNDPrice2(Tick.bid) && IsNDPrice2(Tick.ask); // OnTester == 0.
}
doubleOnTester()
{
return(Res);
}
montre que tous les prix sont normalisés en utilisant l'algorithme NormalizeDouble. Et que si vous travaillez avec des prix obtenus non pas à partir du terminal, mais par analyse ou saisie manuelle, ils nécessitent une normalisation pour fonctionner correctement. Il n'y a pas lieu de se tromper.
REASON_ACCOUNT (même si le compte n'est pas modifié, mais que l 'on se reconnecte simplement), le conseiller expert est complètement déchargé et une nouvelle copie est chargée.
Pour cette raison, ExpertRemove dans OnDeinit n'affecte pas la nouvelle copie, car il touche la copie déchargée.
Après Deinit, la nouvelle copie d'EA attend plus d'une seconde (jusqu'à deux secondes) pour démarrer. Quelles sont les raisons d'une attente aussi longue et est-il possible de l'accélérer ?
SymbolInfoTick renverra le dernier tick à chacun de ces trois appels. En d'autres termes, la soi-disant collecte de ticks sans passer par des indicateurs est discutable, et c'est un euphémisme.
Preuve de l'impossibilité de collecter des ticks par un indicateur (sans saut).
English (original) : J'aimerais faire une demande de fonctionnalité linguistique pour MQL. Si ce n'est pas le bon fil de discussion, merci de me le faire savoir. La demande originale se trouve sur le forum anglais...
Russe (Google translate) : Je voudrais faire une demande de fonctionnalité linguistique pour MQL. Si ce n'est pas le bon fil de discussion, merci de me le faire savoir. La demande originale se trouve sur le forum anglais ...
Comment remplir un tableau avec une seule ligne ?
clr_struct clr[] = {{0x999999}, {0x999999}};Encore une astuce pour les droits d'accès : Si vous avez un désir irrésistible de donner accès à des champs/fonctions privés d'une classe à une autre classe, vous pouvez faire ce qui suit en utilisant des outils MQL standard :
Nous devons : rendre l'accès à A::f1() à partir de B
Réécrivons-le comme suit :
Pour appeler (A)a.f1() dans B, appelez CallAf1(a). Si f1() a des paramètres, nous les ajoutons à CallAf1().
Test :
Vous pouvez rendre CallAf1() protégé, mais ce sera un grand trou dans les droits d'accès - n'importe où dans le code, vous pouvez créer un descendant de la classe B et dans celui-ci une méthode publique pour appeler CallAf1() - c'est-à-dire que tout le monde aura accès à A::f1().
P.S. La construction est très lourde (si vous le souhaitez, vous pouvez l'intégrer dans des macros), mais elle présente un avantage par rapport à l'ami C++ : elle ne donne pas accès à tous les membres de la classe, mais seulement à certains d'entre eux.
Encore une astuce pour les droits d'accès : Si vous avez un désir irrésistible d'accorder l'accès à des champs/fonctions privés d'une classe à une autre classe, vous pouvez le faire à l'aide des outils MQL standard
J'ai mis du temps à m'y mettre... bon coup de virtualisation, merci !
REASON_ACCOUNT (même si le compte n'est pas modifié, mais que l 'on se reconnecte simplement), le conseiller expert est complètement déchargé et une nouvelle copie est chargée.
Pour cette raison, ExpertRemove dans OnDeinit n'affecte pas la nouvelle copie, car il touche la copie déchargée.
Résultat après la reconnexion.
Après Deinit, la nouvelle copie d'EA attend plus d'une seconde (jusqu'à deux secondes) pour démarrer. Quelles sont les raisons d'une attente aussi longue et est-il possible de l'accélérer ?
SymbolInfoTick renverra le dernier tick à chacun de ces trois appels. En d'autres termes, la soi-disant collecte de ticks sans passer par des indicateurs est discutable, et c'est un euphémisme.
Preuve de l'impossibilité de collecter des ticks par un indicateur (sans saut).
Résultat.
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading
Erreurs, bugs, questions
fxsaber, 2023.02.14 13:11
Malheureusement, MQL4 ne permet pas encore ce genre de travail.