[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 304

 
alsu:

J'ai regardé votre code.... Vous êtes trop confus))))

Je ne comprends pas bien, pourquoi nous avons besoin d'accumuler les ticks, car il suffit de stocker en mémoire (ou même de ne pas stocker, car la barre actuelle doit être écrite en HST - sinon le graphique ne sera pas mis à jour) les paramètres de la barre actuelle - six nombres TOHLCV, et de les mettre à jour au besoin à la réception des ticks, et de faire couper les barres par une condition donnée (TimeCurrent()-O>1).

Essayez de retravailler le code de cette manière, il sera réduit de 8 fois, je le garantis (je l'ai vérifié :)


Comme ça ? J'ai retravaillé l'algorithme, supprimé l'accumulateur, converti en Expert Advisor, ajouté la gradation des ticks en bearish-bullish, ajouté les queues de chandelles en utilisant un algorithme différent, tout commenté. Je n'ai rien pour le vérifier, il n'y a pas de tiques le week-end. Quant au volume - il me semble que c'était dans FileFlush, il fonctionne avec le tampon. Pour l'avenir, je refuse de mettre quoi que ce soit entre FileSeek et FileFlush...
Dossiers :
elz.jp.mq4  23 kb
 
IgRU4ek:

DoubleToStr(Ask,3) ! !! - On aurait dû voir ça.

Et la solution est dans le fichier (c'est un script de test).


Merci beaucoup.

Je ne comprends toujours pas le mécanisme - pourquoi ma version n'a pas fonctionné et pourquoi "DoubleToStr(Ask,3) != DoubleToStr(Ask,Digits)" - Apparemment, toutes les caractéristiques des fonctions ne sont pas divulguées dans le livre de référence.

Votre fonction a été analysée - j'ai compris la façon dont elle a été résolue. Mais j'étais sûr qu'il devait y avoir un moyen plus "simple" de le résoudre, car l'ensemble des fonctions d'un langage de programmation est conçu pour résoudre des problèmes typiques avec elles, plutôt que de créer ces fonctions typiques pour chaque utilisateur lui-même. J'ai supposé naïvement que DoubleToStr() résout justement ce problème. - Je ne comprends pas l'intérêt de l'utiliser alors (quelles sont ses nuances). Je suis un utilisateur ordinaire, pas un programmeur, pour "entrer dans de tels détails". Quand utiliser des produits de création dans ce cas, si tout le temps sera consacré à la programmation détaillée.

Merci encore. Je vais maintenant essayer de mettre tout cela dans le code. J'espère que ça va marcher.

 
Chiripaha:

Merci beaucoup.

Je ne comprends toujours pas le mécanisme - pourquoi ma version n'a pas fonctionné et pourquoi "DoubleToStr(Ask,3) != DoubleToStr(Ask,Digits)" - Apparemment, toutes les caractéristiques des fonctions ne sont pas divulguées dans le livre de référence.

Votre fonction a été analysée - j'ai compris la façon dont elle a été résolue. Mais j'étais sûr qu'il devait y avoir un moyen plus "simple" de le résoudre, car l'ensemble des fonctions d'un langage de programmation est conçu pour résoudre des problèmes typiques avec elles, plutôt que de créer ces fonctions typiques pour chaque utilisateur lui-même. J'ai supposé naïvement que DoubleToStr() résout exactement ce problème. - Je ne comprends pas l'intérêt de l'utiliser alors (quelles sont ses nuances). Je suis un utilisateur ordinaire, pas un programmeur, pour "entrer dans de tels détails". Quand utiliser des produits de création dans ce cas, si tout le temps sera consacré à la programmation détaillée.

Merci encore. Je vais maintenant essayer de mettre tout cela dans le code. J'espère que ça va marcher.

DoubleToStr() effectue une conversion avec un nombre en deux étapes : elle arrondit d'abord (selon les règles des mathématiques) le nombre au bon signe, puis le convertit en chaîne de caractères.
 

Essayez pour votre cas

double x = MathFloor(y*1000)/1000 ;

 
IgRU4ek:
DoubleToStr() effectue la conversion en un nombre en deux étapes : elle arrondit d'abord (par des règles mathématiques) le nombre au bon signe, puis le convertit en une chaîne de caractères.


Merci pour cette précision. Je ne le savais pas, bien sûr, et j'ai blâmé StrToDouble() dans ce cas. Mais après votre clarification, je suppose maintenant qu'ils sont tous deux arrondis :(

La raison de l'arrondi n'est pas claire. Si l'arrondi était nécessaire, il serait préférable dans ce cas d'utiliser d'abord une fonction d'arrondi (selon les besoins) - la même normalisation. Il y aurait alors les deux possibilités avec et sans arrondi. Sinon, nous aurions un encombrement inutile. De plus, je ne comprends pas pourquoi il s'arrondit alors que je dois simplement transformer un numéro existant en un type différent. Je l'ai déjà obtenu (un numéro), pourquoi devrais-je l'inventer en plus.

 
Roger:

Essayez pour votre cas

double x = MathFloor(y*1000)/1000 ;


Exactement ! Une bonne solution. Je l'ai déjà vu, mais j'ai manqué quelque chose dans mon cas. Merci beaucoup à toi, Alexandre, aussi ! - Maintenant, j'aurai 2 solutions ! : )) (Pour le dessin animé "Prostokvashino")
 

Une question aussi théorique. Le prix de clôture, en termes de tick, est-il un bid ou un ask du dernier tick de la bougie ? J'ai remarqué que si l'offre est écrite dans Close[0], alors la cotation sur le coureur est la même que sur les minutes.

J'y ai pensé... Enchérir dans l'idée...

 
Zhunko:
Beaucoup d'erreurs. Peut-être devriez-vous regarder un exemple et le faire par analogie ?


En gros, c'est la même chose. D'après ce que je comprends, bien qu'il n'y ait rien à ce sujet dans le tutoriel, l'inclusion n'est nécessaire que comme lien entre le conseiller expert et la bibliothèque.

La fonction est importée dans l'inline, et les fonctions à importer sont déclarées. Vous mettez un signe . entre les déclarations ;

Ici, j'ai écrit un inlude et une bibliothèque (avec une seule fonction, mais c'est juste pour un test).

L'inclusion est ici :

//+------------------------------------------------------------------+
//|                                       HozIncludeToScalper_M1.mqh |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

#import "Scalper_M1_lbr.ex4"

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA);

// Очередная функция

// Очередная функция

// Очередная функция

#import

Lorsque toutes les fonctions nécessaires (utilisées par un hibou spécifique) sont déclarées, mettez#import à la fin.

Voici la bibliothèque elle-même :

//+-------------------------------------------------------------------------------------+
//|                                                                  Scalper_M1_lbr.mq4 |
//|                                                                                 hoz |
//|                                                                                     |
//+-------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#property library

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA)
{
   switch (typeOfMA)
   {
      case 1:      return (iMA(NULL, i_fastMATF, i_fastMAPeriod, i_fastMAShift, i_fastMAMethod, i_fastMAApplied, i_fastMAIndex));
      case 2:      return (iMA(NULL, i_slowMATF, i_slowMAPeriod, i_slowMAShift, i_slowMAMethod, i_slowMAApplied, i_slowMAIndex));
      case 3:      return (iMA(NULL, i_filtrMATF, i_filtrMAPeriod, i_filtrMAShift, i_filtrMAMethod, i_filtrMAApplied, i_filtrMAIndex));
   }
}

Il ne compile même pas.

'i_fastMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 38)
'i_fastMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 50)
'i_fastMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 66)
'i_fastMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 81)
'i_fastMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 97)
'i_fastMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 114)
'i_slowMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 38)
'i_slowMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 50)
'i_slowMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 66)
'i_slowMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 81)
'i_slowMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 97)
'i_slowMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 114)
'i_filtrMATF' - variable not defined    E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 38)
'i_filtrMAPeriod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 51)
'i_filtrMAShift' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 68)
'i_filtrMAMethod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 84)
'i_filtrMAApplied' - variable not defined       E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 101)
'i_filtrMAIndex' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 119)
18 ошибок, 0 предупреждений     

Vous ne déclarez rien dans la bibliothèque et n'avez pas d'erreurs, mais moi j'en ai pour une raison quelconque. Je n'ai pas vu de différence.

 

Victor, vous avez beaucoup de variables dans votre fonction et aucune n'est déclarée.

Le compilateur a dit :

variable non définie

Une variable n'est pas définie. Il y en a 18.

==============

À en juger par la conception de la fonction, il s'agit d'une fonction hautement spécialisée. Pourquoi l'avoir mis dans la bibliothèque ? D'autant plus qu'elle sera probablement appelée dans la boucle à chaque mesure.

Vous parliez de vitesse et d'optimisation. Vous créez un code très lent. Dans MQL4, vous ne devez pas mettre les fonctions dans une boucle. Moins il y a d'appels de fonction dans une boucle, plus le code s'exécute rapidement.

==============

Il y a longtemps, lorsque j'ai commencé à écrire en MQL4, j'ai écrit mon premier indicateur d'indice forex. Il y avait aussi des fonctions, des opérations avec des chaînes de caractères... Quel gâchis... Ça m'a pris 5 minutes pour changer de TF.

Puis je me suis assis et j'ai réfléchi, j'ai éliminé toutes les fonctions et je les ai ouvertes directement dans le bloc de la boucle. Élimination du travail avec les chaînes de caractères, en les remplaçant par des identifiants. Tout ce qui pouvait être calculé à l'avance et qui n'a pas changé - c'est ainsi que je l'ai calculé (optimisation). Déplacement du code vers le conseiller expert. En conséquence, le calcul le plus lourd lors du changement de TF était de 15 secondes. Puis j'ai transféré les calculs à DLL. Maintenant, ça prend environ 5 secondes.

 
ed3sss:

Bonjour.

Pourriez-vous me dire si l'opérateur OrdersTotal() compte réellement tous les ordres ouverts ou ceux qui appartiennent au symbole assigné au Conseiller Expert ?

Si c'est général, comment pouvons-nous calculer uniquement l'EURUSD s'il y a des ordres ouverts pour l'USDCHF, etc.

Merci.

if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // выбираем тип ордера для дальнейшей обработки
      {  if (OrderSymbol()!=”EURUSD”) continue; // обрабатываем ордера только по EURUSD
      ...
      }
   }
}
Raison: