Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 640

 

Bonjour camarades !

MT5 dispose d'outils merveilleux et très utiles tels que "Impulse Elliott Wave" et "Correcting Elliott Wave".

La question est la suivante : puis-je intégrer ces outils de MT5 dans MT4 ?

Je travaille sur MT4 et il n'est pas très pratique de passer à MT5 pour l'analyse.

Ou : Quelles sont les autres façons de résoudre le problème ?

 
Bonjour, le langage possède un paramètre de marché tel que MarketInfo(Symbol(), MODE_TICKVALUE). Pouvez-vous décrire en termes généraux comment cette valeur est calculée ?
 
mql_writer:
Bonjour, le langage possède un paramètre de marché tel que MarketInfo(Symbol(), MODE_TICKVALUE). Pouvez-vous décrire en termes généraux comment cette valeur est calculée ?

C'est la valeur de la variation minimale du prix (1 pip) dans la devise de dépôt à 1.00 lot ! Le calcul est très simple : 1.00(lot)/1.36030(cotation actuelle de l'Euro) = 0.7351 en Euro.
 
borilunad:

C'est la valeur de la variation minimale du prix (1 pip) dans la devise de dépôt à 1.00 lot ! Calculé très simplement : 1.00(lot)/1.36030(cotation actuelle de l'Euro) = 0.7351 en Euro.

Sauf qu'une demande via marketinfo renvoie en quelque sorte 10 pour toutes les paires, à l'exception des paires de yens )))).


Où avez-vous trouvé cette formule ?

 
evillive:

sauf qu'une requête via marketinfo renvoie en quelque sorte 10 pour toutes les paires sauf les paires de yens ))))


Où avez-vous trouvé cette formule ?


Je fais toutes les formules moi-même et je les ai prises dans mon dossier.

Et celui-ci est de Doki :

MODE_TICKVALUE.

16

Taille de la variation minimale du prix du symbole dans la monnaie de dépôt

Les calculs ne sont pas partagés.

 
borilunad:


Je fabrique moi-même toutes les formules et je les ai maintenant obtenues à partir de mon tableau.

Et ça, ça vient des Docks :

MODE_TICKVALUE

16

Taille de la variation minimale du prix de l'instrument dans la monnaie de dépôt

Les calculs ne sont pas partagés.


Bien que pour un lot de 1 eurodollar, 1 pip coûte réellement 10 dollars, donc c'est OK.

Et les calculs ne doivent pas être partagés uniquement avec ceux qui ont honte de les montrer.

Dans ce cas, la formule devrait être correcte - MODE_TICKVALUE = MODE_LOTSIZE * MODE_TICKSIZE - pour l'euro, la formule pour les crosses et le yen est un peu différente.

 
Top2n:


Pour être honnête, je n'ai pas encore trouvé comment l'appliquer. Il reste un millimètre à faire, c'est dommage de s'arrêter quand c'est presque fini.

Task, ne pas écrire le prix dans le tableau si l'objet time(2nd parameter+3600sec>current)||(1st parameter time - 2nd parameter time)<3600sec )

Pourquoi émuler une erreur ?

Une erreur sert à signaler que, pour une raison quelconque liée aux limitations ou aux défaillances du système, l'algorithme n'a pas réussi à s'exécuter et à obtenir un résultat présentant certaines garanties (naturellement limitées, mais - ). La fonction FillAndPrint() montre de manière éloquente ce qu'une situation d'erreur signifie et ce qu'elle ne signifie pas. Lorsqu'une erreur se produit, il n'essaie même pas d'imprimer le résultat. S'il n'y a pas d'erreur, on peut se fier au résultat. C'est ainsi que la logique "erreur/absence d'erreur" devrait être construite.

Mais ici, nous devons modifier l'algorithme : nous devons également appliquer un filtre supplémentaire.

Il faut donc le faire :

/******************************************************************************/
bool AddValueIfFiltered(double &array[], const string name) {
#define MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 3600
#define MAX_SECS_AFTER_PRICE2              3600

  const datetime dt1 = (datetime)ObjectGet(name, OBJPROP_TIME1);
  const datetime dt2 = (datetime)ObjectGet(name, OBJPROP_TIME2);
  const datetime dt = TimeCurrent();

  Print("name = ", name, ", dt = ", dt, ", dt1 = ", dt1, ", dt2 = ", dt2);

  if (dt <= dt2 + MAX_SECS_AFTER_PRICE2 && dt1 + MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 <= dt2) { // Фильтруем, прежде чем попытаться добавить
    if (!AddValue(array, ObjectGetValueByShift(name, 1))) { // Пытаемся добавить
      return false; // Ошибка, значение не добавлено
    }
  }

  return true; // Нет ошибки, значение, если удовлетворило условию фильтра, добавлено к массиву
}

/******************************************************************************/
bool AddValueIfFound(double &array[], const string name) {
  const int type = ObjectType(name);

  if (type == OBJ_TREND) {
    switch ((color)ObjectGet(name, OBJPROP_COLOR)) { // Тип color допустимо использовать в switch
    case Goldenrod:
    case Gainsboro:
    case White:
      if (!AddValueIfFiltered(array, name)) { // Пропускаем через фильтр
        return false;
      }
    }
  }

  return true; // Нет ошибки, значение, если найдено, добавлено к массиву
}

Nous avons d'abord "filtré" par types d'objets et paramètres, en ne sélectionnant que les objets dont nous avons besoin parmi tous ceux qui sont disponibles, puis nous avons appliqué un filtre supplémentaire. C'est à peu près comme ça qu'une personne ferait. C'est ce qu'une personne ferait, non ?

Pour chacune de ces petites sous-tâches, nous avons besoin d'une fonction distincte.

Les nombres ne doivent pas figurer dans les expressions, sauf dans des cas très particuliers, par exemple, s'il est nécessaire de doubler, et que ce doublement est dans la nature de l'algorithme. Ensuite, le nombre 2 peut être utilisé directement dans les expressions. Et dans d'autres cas aussi rares.

Dans les autres cas, il convient d'utiliser des moyens mnémotechniques. Tout d'abord, ils améliorent considérablement la compréhension de ce qui se passe dans un lieu donné, et contribuent donc à réduire la probabilité de commettre une erreur. Et deuxièmement, la valeur elle-même est fixée à un seul endroit et il est facile de la modifier si nécessaire, et il sera impossible de faire une erreur par rapport au cas où le nombre est utilisé à plusieurs reprises dans l'algorithme, et sans utiliser de moyens mnémotechniques doivent corriger les chiffres à plusieurs endroits de l'algorithme.

Résultat de la course :

02:08:46 Script 2 EURUSDm,H1: loaded successfully
02:08:46 2 EURUSDm,H1: initialized
02:08:46 2 EURUSDm,H1: Sell:
02:08:46 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:02, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: Buy:
02:08:46 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:02, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: uninit reason 0
02:08:46 Script 2 EURUSDm,H1: removed

Pas un seul objet n'est trouvé. Augmentez les valeurs des deux mnémoniques 10 fois jusqu'à 36000 (10 heures), et exécutez à nouveau :

02:09:03 Script 2 EURUSDm,H1: loaded successfully
02:09:03 2 EURUSDm,H1: initialized
02:09:03 2 EURUSDm,H1: Sell:
02:09:03 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:14, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 0
02:09:03 2 EURUSDm,H1: Buy:
02:09:03 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:14, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 1
02:09:03 2 EURUSDm,H1: Price[0] = 1.35869
02:09:03 2 EURUSDm,H1: uninit reason 0
02:09:03 Script 2 EURUSDm,H1: removed

Une tendance a déjà "passé" le filtre. Nous rétablissons maintenant la valeur du premier mnémonique à 3600 et nous exécutons :

02:09:12 Script 2 EURUSDm,H1: loaded successfully
02:09:12 2 EURUSDm,H1: initialized
02:09:12 2 EURUSDm,H1: Sell:
02:09:12 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:26, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.36152
02:09:12 2 EURUSDm,H1: Buy:
02:09:12 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:26, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.35869
02:09:12 2 EURUSDm,H1: uninit reason 0
02:09:12 Script 2 EURUSDm,H1: removed

Nous pouvons voir que maintenant les deux lignes de tendance ont "passé" le filtrage. À propos, je recommande de déboguer toutes les branches (parties) du programme de cette manière, et pas seulement une branche.

Pour vous aider à le formaliser en quelque sorte, je vais essayer de l'expliquer de cette façon. Un programme est apparemment comme un plan.

Chaque élément majeur du plan peut être décomposé en éléments d'un sous-plan plus petit. Les plus petits en encore plus petits. Les points des plus petits sous-plans sont exécutés directement.

Chaque plan, sous-plan et même les points des plus petits sous-plans correspondent à des fonctions du programme. Les éléments des plus petits sous-plans correspondent à des fonctions "finales" qui n'appellent que des fonctions système, voire ne les appellent pas du tout, par exemple AddValue() ou DiffInSecs() sont des exemples dans la discussion ci-dessus. Les éléments du sous-plan ci-dessus correspondent aux fonctions qui appellent les fonctions qui mettent en œuvre les éléments du sous-plan ci-dessous. Dans celles discutées ci-dessus, ce sont MassTrendNumber(), AddValueIfFound(), AddValueIfFiltered(). Les fonctions de "bas niveau" ne doivent pas appeler les fonctions de "haut niveau", et les fonctions de "haut niveau" ne doivent pas sauter plusieurs niveaux vers le bas, c'est-à-dire qu'elles ne doivent appeler que les fonctions du niveau inférieur. Cette règle est beaucoup plus stricte pour le "bas niveau" que pour le "haut niveau".

Essayez de construire vos programmes en organisant les actions qu'ils contiennent comme des fonctions (courtes) liées par ce type d'arborescence, dans le sens de qui appelle qui.

Ce programme a un arbre dégénéré : une branche qui se "ramifie" plusieurs fois. Et il se "ramifie" non pas en deux petites branches mais en une seule. Mais on peut constater que les fonctions de "haut niveau" appellent systématiquement les fonctions de "bas niveau". Dans cette modification, j'ai inséré un niveau supplémentaire dans cette structure, une autre "branche non ramifiée" - AddValueIfFiltered().

 
Désolé, je n'ai pas vu le fil de discussion tout de suite.
https://www.mql5.com/ru/forum/152102 J'ai une question
 
borilunad:

Tout est correct ! Avec une cotation à 4 chiffres, c'était toujours 1, et avecune cotation à 5 chiffres, c'est maintenant 10, car il y a 10 fois plus de pips (et moins de profondeur). Et la valeur d'un tick min. devrait être calculée à partir du prix actuel !

J'ai 4 chiffres maintenant, sur ewardollar à 1 lot 1 point coûte 10$ et il en a toujours été ainsi. Pour les croix, le coût sera de 8 à 16, la formule est un peu plus compliquée dans ce cas.

Par exemple, pour la livre euro, marketinfo a donné 16,984, le taux de change livre-dollar = 1,6984, c'est-à-dire que 1 pip de la livre euro vaut 1 livre, multiplié par la valeur du point livre-dollar, qui est toujours de 10,0 (100000 * 0,0001 = 10,0 ou 100000 * 0,00010 = 10,0 - comme on veut).


Tous ces calculs ne sont corrects que si votre compte est en dollars :

Dans ce cas, pour xUSD (EURUSD, GBPUSD etc.) tickvalue = lot*point = 100000*0.0001 = 10.0

pour USDx (USDCHF, USDJPY etc) tickvalue = lot*point/offre = 100000*0.01/101.93 = 9.8107

pour xUSD/yUSD (EURGBP) tickvalue = Bid(yUSD)*lot*point = 1.6980*100000*0.0001 = 16.98

pour les croisements xUSD/USDy (EURJPY) tickvalue = lot*point/offre(USDy) = 100000*0.01/101.91=9.8126

 
evillive:

J'ai 4 chiffres maintenant, sur ewardollar à 1 lot 1 point coûte 10$ et il en a toujours été ainsi. Pour les croix, le coût sera de 8 à 16, la formule est un peu plus compliquée dans ce cas.

Par exemple, pour la livre euro, marketinfo a donné 16,984, le taux de change de l'evodollar = 1,3604, le taux de change livre-dollar = 1,6984, c'est-à-dire que 1 pip de la livre euro vaut 1 livre, multiplié par la valeur du point livre-dollar, qui est toujours de 10,0 (100000*0,0001 = 10,0 ou 100000*0,00010 = 10,0 - comme on veut).




Le mien est simple et pratique ! Et à l'époque où il y avait un devis à 4 chiffres, je n'avais pas encore écrit de programmes, donc je ne peux pas juger. :)

Bonne nuit !