Discussione sull’articolo "L'implementazione di una modalità multivaluta su MetaTrader 5" - pagina 3

 
Lizar:

La logica esadecimale è la stessa ovunque. È possibile leggere i sistemi numerici qui. Qui è possibile leggere dei sistemi numerici posizionali e vedere i riferimenti al 16 e al binario. Ci sono altri esempi di conversione da sistema a sistema.

Tutte le operazioni bitwise sono destinate al sistema binario. Informazioni sulle operazioni bitwise in MQL5 qui.

Questi articoli sono buoni da leggere quando si sa già di cosa si sta parlando :)

Ad esempio, si utilizza il prefisso "0x" nell'enumerazione. Per quanto ho capito, significa che vengono scritti numeri esadecimali, mentre l'espressione "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" utilizza l'operazione "bitwise AND". Lei scrive che le operazioni bitwise sono destinate al sistema binario. Allora come si rapporta l'operatore & (per il sistema binario) con i numeri esadecimali?

Un'altra domanda: se ho capito bene, l'espressione "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" è equivalente all'espressione"flag_event !"= CHARTEVENT_NEWBAR_M1". È corretto? E se è così, perché usare le operazioni bitwise?

 

Вы же пишите, что побитовые операции предназначены для двоичной системы

Qual è la differenza? I numeri all'interno della CPU sono comunque binari.

Quindi anche se "vedete" 255 o FF nella vostra testa e lo confrontate con 8 o con 0x00000100 non ci sarà alcuna differenza.


Yedelkin:

Se ho capito bene, l'espressione "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" è equivalente all'espressione"flag_event !"= CHARTEVENT_NEWBAR_M1". È corretto? E se è così, perché usare le operazioni bitwise?

Sì, in questa situazione significa esattamente questo, ma le operazioni bitwise hanno un'applicazione più ampia e più generale del semplice confronto, soprattutto perché è diventato un comportamento classico usare le operazioni bitwise quando si lavora con le costanti.
 
sergeev:

Che differenza c'è? I numeri all'interno della CPU sono comunque binari.

Quindi, anche se "vedete" 255 o FF nella vostra testa e lo confrontate con 8 o con 0x00000100, non ci sarà alcuna differenza.

La differenza è terminologica. Ma dalle tue parole ho capito che per i programmatori non ha importanza.

sergeev:

sì, in questa situazione significa esattamente questo, ma le operazioni sui bit hanno un'applicazione più ampia e più generale del semplice confronto, soprattutto perché è già diventato un comportamento classico usare le operazioni sui bit quando si lavora con le costanti.

Capisco! Quindi, se non ho dimestichezza con le operazioni sui bit, posso tranquillamente riscrivere le espressioni usando gli operatori di confronto? Grazie per il chiarimento!

 
Yedelkin:

Questi articoli sono belli da leggere quando si sa già di cosa si tratta :)

Ad esempio, nella tua enumerazione usi il prefisso "0x". Per quanto ho capito, significa che vengono scritti numeri esadecimali, mentre l'espressione "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" utilizza l'operazione "bitwise AND". Lei scrive che le operazioni bitwise sono destinate al sistema binario. Allora come si relaziona l'operatore & (per il sistema binario) con i numeri esadecimali?

Tutti questi sistemi rappresentano visivamente i numeri in modo diverso e quindi se un numero è dieci, è dieci ovunque. Per il computer, TUTTI i numeri, indipendentemente dal sistema in cui li scriviamo, vengono convertiti in binario. Anche le lettere che scrivo sono convertite in binario. In altri sistemi, i numeri vengono etichettati principalmente per migliorare la chiarezza o per abitudine. Alcuni lo fanno per sembrare più intelligenti. In questo caso, i numeri esadecimali sono stati utilizzati per compattezza di scrittura e per una maggiore chiarezza. La visibilità si ottiene quando si sa come si formano i numeri esadecimali.

Un'altra domanda: se ho capito bene, l'espressione "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" è equivalente all'espressione"flag_event !"= CHARTEVENT_NEWBAR_M1". È corretto? E se è così, perché usare le operazioni bitwise?

No, non è sempre così. Dipende da cosa è stato scritto in flag_event. Se in flag_event è stato scritto solo CHARTEVENT_NEWBAR_M1 , allora flag_event = CHARTEVENT_NEWBAR_M1. SeCHARTEVENT_NEWBAR_M1|CHARTEVENT_NEWBAR_M5è stato scritto in flag_event , allora flag_event != CHARTEVENT_NEWBAR_M1.Ma in entrambi i casi la condizione (flag_event & CHARTEVENT_NEWBAR_M1)!=0sarà soddisfatta .

Se siscrive CHARTEVENT_NEWBAR_M5 in flag_event , allora flag_event != CHARTEVENT_NEWBAR_M1. Ma (flag_event & CHARTEVENT_NEWBAR_M1)=0.

Per capire questi trucchi, è necessario comprendere i sistemi numerici e le operazioni bitwise. Altrimenti, sarete morti.

 
Yedelkin:

Capisco! Cioè se per me è un po' insolito usare le operazioni bitwise, posso tranquillamente riscrivere le espressioni usando gli operatori di confronto? Grazie per il chiarimento!

Puoi sempre sostituirlo, ma potrebbe richiedere calcoli aggiuntivi. Fate attenzione a questo caso :).
 
Lizar:
È sempre possibile sostituirlo, ma potrebbe richiedere ulteriori calcoli. Fate attenzione a questo caso :).

Ok! Un'altra domanda. Quando si scrivono i numeri esadecimali, si usa il grado di due. Ha senso usare i gradi di due o è anche una questione di abitudine? Ad esempio, si potrebbero usare combinazioni come: 0x00000003, 0x00000009, ecc.

 
Yedelkin:

Ok! Un'altra domanda. Quando si scrivono i numeri esadecimali, si usano i gradi di due. Ha senso usare i gradi di due o è anche una questione di abitudine? Cioè, si possono usare queste combinazioni: 0x00000003, 0x00000009, ecc.

No. Questo è dovuto all'uso delle operazioni bitwise. Nella spia aggiungo diversi numeri (eventi) in un numero (in flag_event), e nell'EA tolgo diversi numeri da un numero per vedere quali eventi ha inviato la spia. E viceversa.

Oh, non ho letto con attenzione. Sì, è possibile, ma probabilmente non avrei un numero sufficiente per tutti gli eventi. Il grado due è usato perché sto lavorando con una rappresentazione binaria del numero, ma lo scrivo in esadecimale. Ogni bit rappresenta un evento diverso.

 
Tanto di cappello, signori :) Un vero capolavoro. Una soluzione semplice ma elegante e potente. Grazie mille, Konstantin, e complimenti :-)
 

Per impostazione predefinita, il prezzo[rates_total-1] è uguale al prezzo di chiusura dell'ultima barra non conclusa, che a sua volta è uguale all'ultimo prezzo di domanda.

Se volete ottenere forzatamente il prezzo ask, sostituite questa riga, ad esempio, con la seguente.


Autore, mi scusi, forse non ho finito di leggere, ma questa funzione può passare all'Expert Advisor non solo gli eventi di prezzo, ma, ad esempio,

eventi di un indicatore o loro combinazioni/variazioni da altri strumenti, cioè come se il segnale fosse già stato ricevuto lì. Se sì, come implementarla.

Grazie per la risposta.

 
artall:

Per impostazione predefinita, il prezzo[rates_total-1] è uguale al prezzo di chiusura dell'ultima barra non conclusa, che a sua volta è uguale all'ultimo prezzo d'acquisto.

Se si desidera ottenere forzatamente il prezzo ask, sostituire questa riga, ad esempio, con la seguente.


Autore, mi scusi, forse non ho finito di leggere, ma questa funzione può passare all'Expert Advisor non solo gli eventi di prezzo, ma, ad esempio,

eventi di un indicatore o loro combinazioni/variazioni da altri strumenti, cioè come se il segnale fosse già stato ricevuto lì. Se sì, come implementarla.

Grazie per la risposta.


A questo scopo, è meglio utilizzare l'indicatore stesso incorporandovi la funzione standard EventChartCustom nel posto giusto.