Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
variabile statica, sarà la stessa per tutte le istanze senza ereditarietà.
Ho controllato, ebbene sì, si è rivelato più semplice di così!
2019.08.29 15:14:09.847 tst__ EURUSD,M15: inizializzato
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: MyTerminalInfoString
Vedo che la variabile Language è stata inizializzata solo una volta, cioè questa è una soluzione più semplice
Grazie!
Per favore, ditemi, in cosa è diverso?
Creare un oggetto, o puntatore, in questo modo
dalla creazione classica
La differenza è che nel primo caso, non è necessario specificare l'identificatore di classeCClass in C++.
Ho abbozzato la mia classe, che dovrebbe inizializzare i campi una volta con valori costanti, e sembra funzionare come previsto:
Non mi piacciono 2 cose:
1. Ripeto chiamando SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - perché l'ordine di inizializzazione non è definito, cioè non è sicuro che VolumeSTEP sarà inizializzato prima e solo alloraGetDigitsInVolumeStep() sarà chiamato
2. Voglio sbarazzarmi del metodo statico static int GetDigitsInVolumeStep() - ho visto un video su youtube che dice che in OOP puro non si dovrebbero usare metodi statici, e ora sto combattendo contro i mulini a vento
il link al video, è essenzialmente lo stessohttps://youtu.be/lfdAwl3-X_c ehttps://youtu.be/zME4SOCHT0I
come posso riscrivere questi 2 punti che non mi piacciono in modo diverso?
1. Ripeto la chiamata a SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - perché l'ordine di inizializzazione non è specificato, cioè non è certo che avrò VolumeSTEP inizializzato per primo, e solo allora GetDigitsInVolumeStep() sarà chiamato
1. cioè avete paura che l'ordine di inizializzazione della statica sia indefinito? In realtà non lo è, i plus si inizializzano in ordine di definizione nel codice. Quindi non preoccupatevi, prima VolumeSTEP e poi VolumeDIGITS.
1. Quindi avete paura che l'ordine di inizializzazione della statica sia indefinito? In realtà non è così, in plus l'inizializzazione è in ordine di definizione nel codice. Quindi non preoccupatevi, prima VolumeSTEP e poi VolumeDIGITS.
Sì, non che io abbia paura, diciamo che sono protetto, credo che il codice dovrebbe avere almeno qualche garanzia contro i cambiamenti nel comportamento di compilazione - in generale SI
ZS: qui in generale, perché l'argomento per la prima volta un giorno - voglio vedere come realistico per fare qualcosa come nel video autore Egor dice, mentre dubito che si ottiene qualcosa di efficace - ora sto usando metodi statici, e con l'inizializzazione sono già alcuni dubbi apparso
1. cioè avete paura che l'ordine di inizializzazione della statica sia indefinito? In realtà non lo è, i plus si inizializzano in ordine di definizione nel codice. Quindi non preoccupatevi, prima VolumeSTEP e poi VolumeDIGITS.
Anche in MQL.
https://www.mql5.com/ru/docs/basis/oop/staticmembers
Sì, non che io abbia paura, diciamo che sono protetto, credo che il codice dovrebbe avere almeno qualche garanzia contro i cambiamenti nel comportamento di compilazione - in generale SI
ZS: qui in generale, perché l'argomento per la prima volta un giorno - voglio vedere come realistico per fare qualcosa come nel video autore Egor dice, mentre dubito che otterremo qualcosa di efficace - ora sto usando metodi statici, e con l'inizializzazione sono già alcuni dubbi apparso
Per usarlo in questo modo:
E in un codice come questo:
Utilizzare come segue:
E nel codice come questo:
oops, un po' di sviamento, ecco cosa posso fare
Ecco cosa voglio ottenere in generale:
1. la classe CDeal è autonoma, apre/chiude/controlla il suo ordine con una strategia - le strategie sono enumerate, così l'ottimizzatore può scorrere il mix di strategie
2. secondo il passo 1, non ho bisogno da nessuna parte di avere le variabili di ambiente terminale SYMBOL_VOLUME_MAX, SYMBOL_VOLUME_MIN,SYMBOL_VOLUME_STEP e la quantità di caratteri in SYMBOL_VOLUME_STEP - non cambia durante il funzionamento del programma MQL
3. partendo dai punti 1 e 2, posso incapsulare i metodi di apertura/chiusura/ negoziazione degli ordini e le proprietà degli ordini stessi in una classe CDeal - non userò tutto questo da qualche parte? - cioè posso usarli tutti in una classe
pp 1-3 tutto è risolvibile, ma... OK, ora mi avete aiutato con la statica, che sia così, perché ho un riferimento, almeno posso giustificare la mia decisione in qualche modo, ora il codice è così
creato 3 istanze di Cdeal, l'ho trovato nel registro:
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: inizializzato
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::CdealVolumeMAX = 100000.0 , VolumeMIN = 0.01 , VolumeSTEP = 0.01 , VolumeDIGITS = 2
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::CdealVolumeMAX = 100000.0 , VolumeMIN = 0.01 , VolumeSTEP = 0.01 , VolumeDIGITS = 2
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::CdealVolumeMAX = 100000.0 , VolumeMIN = 0.01 , VolumeSTEP = 0.01 , VolumeDIGITS = 2
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::GetDigitsInVolumeStep
Finora, tutto ha funzionato come previsto!
Cioè, ora non ci sono sezioni di codice ripetuto (chiamate) - è un codice efficiente, ma come liberarsi dall'uso della funzione statica static int Cdeal::GetDigitsInVolumeStep() - nel video, l'autore crede che sia possibile scrivere codice OOP senza funzioni statiche, io vedo che non solo è scomodo, ma non è sempre possibile usare tutto, a proposito dei metodi Get e Set - molto probabilmente ne farò a meno, vedrò più tardi
L'opzione del campo statico ha un enorme svantaggio. Non si possono avere valori diversi di questo campo in diverse istanze della classe.
Sì, grazie, lo so, lo scopo è solo quello di ottenere un codice efficiente senza variabili eccessive e uso di memoria inutile
Non ho ancora risolto la questione:come evitare di usare la funzione statica static int Cdeal::GetDigitsInVolumeStep()
Ecco uno schema della mia classe, che dovrebbe inizializzare i campi una volta con valori costanti, sembra funzionare come previsto: