Discussion de l'article "L’implémentation d'un mode multi-devises dans MetaTrader 5" - page 3

 
Lizar:

La logique hexadécimale est la même partout. Vous pouvez vous renseigner sur les systèmes de numération ici. Vous y trouverez des informations sur les systèmes de numération de position et des références à 16 et au binaire. Vous y trouverez d'autres exemples de conversion d'un système à l'autre.

Toutes les opérations sur les bits sont destinées au système binaire. Pour en savoir plus sur les opérations bitwise dans MQL5 , cliquez ici.

Ces articles sont bons à lire lorsque vous savez déjà de quoi vous parlez :)

Par exemple, vous utilisez le préfixe "0x" dans l'énumération. Si je comprends bien, cela signifie que des nombres hexadécimaux sont écrits, tandis que l'expression "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" utilise l'opération "bitwise AND". Vous écrivez que les opérations bitwise sont destinées au système binaire. Dans ce cas, comment l'opérateur & (pour le système binaire) se rapporte-t-il aux nombres hexadécimaux ?

Autre question : si j'ai bien compris, l'expression "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" est équivalente à l'expression"flag_event !"= CHARTEVENT_NEWBAR_M1". Est-ce exact ? Et si c'est le cas, pourquoi utiliser des opérations bit à bit ?

 

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

Les nombres à l'intérieur du processeur sont de toute façon binaires.

Ainsi, même si vous "voyez" 255 ou FF dans votre tête et que vous les comparez à 8 ou à 0x00000100, il n'y aura aucune différence.


Yedelkin:

Si j'ai bien compris, l'expression "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" est équivalente à l'expression"flag_event !"= CHARTEVENT_NEWBAR_M1". Est-ce exact ? Et si c'est le cas, pourquoi utiliser les opérations bitwise ?

Oui, dans cette situation, c'est exactement ce que cela signifie, mais les opérations bitwise ont une application plus large et plus générale que la simple comparaison, en particulier depuis qu'il est devenu classique d'utiliser les opérations bitwise lorsqu'on travaille avec des constantes.
 
sergeev:

Les nombres à l'intérieur de l'unité centrale sont de toute façon binaires.

Ainsi, même si vous "voyez" 255 ou FF dans votre tête et que vous les comparez à 8 ou à 0x00000100, il n'y aura aucune différence.

La différence est d'ordre terminologique. Mais j'ai compris dans vos propos que cela n'a pas d'importance pour les programmeurs.

sergeev:

Oui, dans cette situation, cela signifie exactement cela, mais les opérations sur les bits ont une application plus large et plus générale que la simple comparaison, d'autant plus qu'il est déjà devenu classique d'utiliser les opérations sur les bits lorsqu'on travaille avec des constantes.

Je vois ! Donc, si je ne connais pas bien les opérations sur les bits, je peux réécrire des expressions en toute sécurité en utilisant des opérateurs de comparaison ? Merci pour cet éclaircissement !

 
Yedelkin:

Ces articles sont bons à lire quand on sait déjà de quoi il s'agit :)

Par exemple, vous utilisez le préfixe "0x" dans votre énumération. Si je comprends bien, cela signifie que l'on écrit des nombres hexadécimaux, alors que l'expression "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" utilise l'opération "bitwise AND". Vous écrivez que les opérations bitwise sont destinées au système binaire. Alors comment l'opérateur & (pour le système binaire) se rapporte-t-il aux nombres hexadécimaux ?

Tous ces systèmes ne font que représenter visuellement les nombres d'une manière différente, et donc si un nombre est dix, il est dix partout. Pour l'ordinateur, TOUS les nombres, quel que soit le système dans lequel nous les écrivons, sont convertis en binaire. Même les lettres que j'écris sont converties en binaire. Dans d'autres systèmes, les nombres sont étiquetés principalement pour améliorer la clarté ou par habitude. Certaines personnes le font pour paraître plus intelligentes. Dans le cas présent, les nombres hexadécimaux ont été utilisés pour des raisons de compacité de l'écriture et de clarté. La visibilité vient quand on sait comment les nombres hexadécimaux sont formés.

Autre question : si j'ai bien compris, l'expression "(flag_event & CHARTEVENT_NEWBAR_M1)!=0" est équivalente à l'expression"flag_event !"= CHARTEVENT_NEWBAR_M1". Est-ce exact ? Et si c'est le cas, pourquoi utiliser des opérations bit à bit ?

Non, ce n'est pas toujours le cas. Cela dépend de ce qui a été écrit dans flag_event. Si seul CHARTEVENT_NEWBAR_M1 a été écrit dans flag_event, alors flag_event = CHARTEVENT_NEWBAR_M1. SiCHARTEVENT_NEWBAR_M1|CHARTEVENT_NEWBAR_M5 est écrit dansflag_event , alors flag_event != CHARTEVENT_NEWBAR_M1.Mais dans les deux cas, la condition (flag_event & CHARTEVENT_NEWBAR_M1)!=0sera remplie .

Si vousécrivez CHARTEVENT_NEWBAR_M5 dans flag_event , alors flag_event != CHARTEVENT_NEWBAR_M1. Mais (flag_event & CHARTEVENT_NEWBAR_M1)=0.

Pour comprendre ces astuces, vous devez comprendre les systèmes numériques et les opérations par bits. Sinon, vous serez mort.

 
Yedelkin:

Je vois ! Autrement dit, s'il est un peu inhabituel pour moi d'utiliser des opérations bitwise, je peux sans risque réécrire des expressions en utilisant des opérateurs de comparaison ? Merci pour cette précision !

Vous pouvez toujours le remplacer, mais cela peut nécessiter des calculs supplémentaires. Soyez prudent dans ce cas :).
 
Lizar:
Vous pouvez toujours le remplacer, mais cela peut nécessiter des calculs supplémentaires. Soyez prudent dans ce cas :).

D'accord ! Encore une question. Lorsque vous écrivez des nombres hexadécimaux, vous utilisez le degré deux. Y a-t-il un sens à utiliser des degrés deux ou s'agit-il d'une question d'habitude ? Par exemple, pourrait-on utiliser de telles combinaisons : 0x00000003, 0x00000009, etc.

 
Yedelkin:

D'accord ! Encore une question. Lorsque vous écrivez des nombres hexadécimaux, vous utilisez des degrés de deux. Y a-t-il un sens à utiliser des degrés de deux ou est-ce une question d'habitude ? Par exemple, peut-on utiliser de telles combinaisons : 0x00000003, 0x00000009, etc.

Non. Cela est dû à l'utilisation d'opérations de type "bitwise". Dans l'espion, j'additionne plusieurs nombres (événements) en un seul nombre (dans flag_event), et dans l'EA, je retire plusieurs nombres d'un seul nombre pour voir quels événements l'espion a envoyés. Et vice versa.

Oh, je n'ai pas lu attentivement. Oui, c'est possible, mais je n'aurais probablement pas assez d'un seul nombre pour tous les événements. Le degré deux est utilisé parce que je travaille avec une représentation binaire du nombre, mais je l'écris en hexadécimal. Chaque bit représente un événement différent.

 
Chapeau bas, messieurs :) Un véritable chef-d'œuvre. Une solution simple, élégante et puissante. Merci beaucoup, Konstantin, et félicitations :-)
 

Par défaut, price[rates_total-1] est égal au prix de clôture de la dernière barre non finie, qui à son tour est égal au dernier prix d'offre.

Si vous voulez obtenir le prix d'achat de force, remplacez cette ligne, par exemple, par ce qui suit.


Auteur, je suis désolé, je n'ai peut-être pas fini de lire, mais cette fonction peut-elle transmettre à l'Expert Advisor non seulement les événements de prix, mais, par exemple,

les événements d'un indicateur ou leurs combinaisons/variations provenant d'autres instruments, c'est-à-dire comme si le signal y était déjà reçu. Si oui, comment l'implémenter.

Je vous remercie de votre réponse.

 
artall:

Par défaut, price[rates_total-1] est égal au prix de clôture de la dernière barre non finie, qui, à son tour, est égal au dernier prix d'offre, c'est-à-dire que nous obtenons toujours le prix d'offre de l'espion par défaut.

Si vous souhaitez obtenir de force le prix d'achat, remplacez cette ligne, par exemple, par ce qui suit.


Auteur, je suis désolé, je n'ai peut-être pas fini de lire, mais cette fonction peut-elle transmettre à l'Expert Advisor non seulement les événements de prix, mais, par exemple,

les événements d'un indicateur ou leurs combinaisons/variations provenant d'autres instruments, c'est-à-dire comme si le signal y était déjà reçu. Si oui, comment l'implémenter.

Je vous remercie pour votre réponse.


Pour cela, il est préférable d'utiliser l'indicateur lui-même en y intégrant la fonction standard EventChartCustom au bon endroit.