Inglese (originale): Vorrei fare una richiesta di funzionalità della lingua MQL. Se questo non è il thread corretto, fatemelo sapere. La richiesta originale è sul forum inglese ...
Russo (Google translate): Vorrei fare una richiesta di funzionalità della lingua MQL.Se questo non è il thread corretto, fatemelo sapere.La richiesta originale è sul forum inglese ...
Un altro lifehack per i diritti di accesso: Se si ha un desiderio irresistibile di dare accesso a campi/funzioni private di una classe a un'altra classe, si può fare quanto segue usando gli strumenti standard di MQL:
Abbiamo bisogno di: rendere possibile l'accesso ad A::f1() da parte di B
//--------- как былоclass A
{
int m;
int f1() {return m;} // нужно дать к нему доступ классу Bpublic:
A(int a): m(a) {}
};
class B {};
Riscriviamo in questo modo:
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;
Per chiamare (A)a.f1() all'interno di B, chiamare CallAf1(a). Se f1() ha dei parametri, li aggiungiamo a CallAf1().
Prova:
voidOnStart()
{
A f(2);
B::_f1_test(f);
}
Si può rendere protetta CallAf1(), ma sarà un grosso buco nei diritti di accesso: in qualsiasi punto del codice si può creare un discendente della classe B e in esso un metodo pubblico per chiamare CallAf1() - cioè tutti avranno accesso a A::f1().
P.S. Il costrutto è molto macchinoso (se si vuole, lo si può racchiudere in macro), ma ha un vantaggio rispetto all'amico C++: non dà accesso a tutti i membri della classe, ma solo a quelli selezionati.
Un altro trucco per i diritti di accesso: Se avete un desiderio irresistibile di concedere l'accesso a campi/funzioni private di una classe ad un'altra classe, potete farlo utilizzando gli strumenti standard di MQL
Mi ci è voluto molto tempo per capirlo... buona mossa con la virtualizzazione, grazie!
fxsaber #: Ci è voluto molto tempo per entrare in gioco... buona mossa con la virtualizzazione, grazie!
L'unica cosa che non ho scritto all'inizio è che non si possono creare altri oggetti di classe B::AB2 (e i suoi discendenti), altrimenti tutto va a rotoli :-)
L'esecuzione di questo Expert Advisor nel Tester in modalità tutti i simboli
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);
}
mostra che tutti i prezzi sono normalizzati utilizzando l'algoritmo NormalizeDouble. E che se si lavora con prezzi ottenuti non dal Terminale, ma tramite parsing o input manuale, essi richiedono la normalizzazione per un corretto funzionamento. Non c'è bisogno di sbagliarsi.
REASON_ACCOUNT (anche se il conto non viene cambiato, ma viene solo rifatto il login) l'Expert Advisor viene completamente scaricato e ne viene caricata una nuova copia.
Per questo motivo ExpertRemove in OnDeinit non ha effetto sulla nuova copia, perché tocca quella scaricata.
Dopo Deinit, la nuova copia di EA attende più di un secondo (fino a due secondi) per avviarsi. Quali sono le ragioni di un'attesa così lunga ed è possibile velocizzarla?
SymbolInfoTick restituirà l'ultimo tick in ognuna di queste tre chiamate. In altre parole, la cosiddetta raccolta di tick senza saltare attraverso gli indicatori è discutibile, per usare un eufemismo.
Prova dell'impossibilità di raccogliere i tick da un indicatore (senza salti).
Inglese (originale): Vorrei fare una richiesta di funzionalità della lingua MQL. Se questo non è il thread corretto, fatemelo sapere. La richiesta originale è sul forum inglese ...
Russo (Google translate): Vorrei fare una richiesta di funzionalità della lingua MQL. Se questo non è il thread corretto, fatemelo sapere. La richiesta originale è sul forum inglese ...
come riempire un array con una riga?
clr_struct clr[] = {{0x999999}, {0x999999}};Un altro lifehack per i diritti di accesso: Se si ha un desiderio irresistibile di dare accesso a campi/funzioni private di una classe a un'altra classe, si può fare quanto segue usando gli strumenti standard di MQL:
Abbiamo bisogno di: rendere possibile l'accesso ad A::f1() da parte di B
Riscriviamo in questo modo:
Per chiamare (A)a.f1() all'interno di B, chiamare CallAf1(a). Se f1() ha dei parametri, li aggiungiamo a CallAf1().
Prova:
Si può rendere protetta CallAf1(), ma sarà un grosso buco nei diritti di accesso: in qualsiasi punto del codice si può creare un discendente della classe B e in esso un metodo pubblico per chiamare CallAf1() - cioè tutti avranno accesso a A::f1().
P.S. Il costrutto è molto macchinoso (se si vuole, lo si può racchiudere in macro), ma ha un vantaggio rispetto all'amico C++: non dà accesso a tutti i membri della classe, ma solo a quelli selezionati.
Un altro trucco per i diritti di accesso: Se avete un desiderio irresistibile di concedere l'accesso a campi/funzioni private di una classe ad un'altra classe, potete farlo utilizzando gli strumenti standard di MQL
Ci è voluto molto tempo per entrare in gioco... buona mossa con la virtualizzazione, grazie!
REASON_ACCOUNT (anche se il conto non viene cambiato, ma viene solo rifatto il login) l'Expert Advisor viene completamente scaricato e ne viene caricata una nuova copia.
Per questo motivo ExpertRemove in OnDeinit non ha effetto sulla nuova copia, perché tocca quella scaricata.
Risultato dopo il relogin.
Dopo Deinit, la nuova copia di EA attende più di un secondo (fino a due secondi) per avviarsi. Quali sono le ragioni di un'attesa così lunga ed è possibile velocizzarla?
SymbolInfoTick restituirà l'ultimo tick in ognuna di queste tre chiamate. In altre parole, la cosiddetta raccolta di tick senza saltare attraverso gli indicatori è discutibile, per usare un eufemismo.
Prova dell'impossibilità di raccogliere i tick da un indicatore (senza salti).
Risultato.
Forum sul trading, sui sistemi di trading automatizzati e sulla verifica delle strategie di trading
Errori, bug, domande
fxsaber, 2023.02.14 13:11
Sfortunatamente, MQL4 non è ancora in grado di svolgere questo tipo di lavoro.