Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 884

 

Bon après-midi, messieurs. )) excusez l'amateurisme...

Je ne comprends pas comment fonctionne OrderClose :(

J'ai besoin d'un maximum d'un ordre, c'est-à-dire qu'avant d'en ouvrir un nouveau, je veux que le précédent soit fermé...

Pourquoi cela ne fonctionne-t-il pas de cette façon ?


OrdreClose(nom, 0.01, Bid,5, Red) ;

OrderSend(Symbol(), OP_SELL, 0.01 , NormalizeDouble(Bid,5), 3 , NormalizeDouble(Ask+0.0005,5), NormalizeDouble(Bid-0.0008,5), "", nom,0,Red) ;


Le journal est essentiellement un juron sur un ticket invalide.

dans OrderClose au lieu de nom, que dois-je mettre ? ou est-ce que je pense dans le mauvais sens du tout ?)

 
Sergey Voytsekhovsky:

Essayez minStopLoss = Prix actuel +/- (MaxValue(2*Spread, StopLoss)) ;

J'ai essayé. Deux écarts est de 24, ne fonctionnera pas de cette façon, commence à travailler à 19 du prix de clôture. A partir du prix d'ouverture actuel, on travaille avec trois spreads.
J'ai augmenté le stop d'un point dans la boucle et ouvert un ordre. Il a ouvert le 19. La question n'est pas de savoir comment le fixer. La question est de savoir comment calculer correctement. Il n'y a pas de prix ; ils apparaissent lors de l'ouverture manuelle d'un ordre si vous définissez le stop avec le bouton stop. C'est ridicule. Je fais une lecture massive de ce forum. J'ai trouvé quelques fonctions sur la 7ème page (message #65). Je vous ferai savoir quand je l'aurai vérifié.

 
Sergey Voytsekhovsky:

Je l'ai étudié, mais rien de nouveau, apparemment c'est (nouveau pour moi) bien sûr, évident pour tous les initiés, auto-explicatif. Je n'ai rien trouvé de nouveau, à l'exception de la fonctionnalité décrite ci-dessus de disposition mutuelle des tampons pendant l'indexation. Cette séquence respectée, a obtenu une image encore plus ringarde.

Photos ci-dessous, fichier joint

Vous n'avez peut-être pas de chance, mais je n'aime pas fouiller dans le code des autres. D'autant plus lorsqu'il s'agit de le réparer...

La question suivante : combien de fois pensez-vous que la valeur de l'indicateur sera exactement 50 ?

         ColorHistogram_2Buffer1[i]=50; 

D'après ce que j'ai compris du problème, il devrait y avoir une couleur >50 et une autre <50, mais je n'ai pas vu ==50. Bien sûr, pour éliminer la perte dans le cas ==50, il faut ajouter à l'une des comparaisons >=50 ou à l'autre <=50, comme la religion le permet. Cela peut paraître mieux.

Et la deuxième question : combien de fois pensez-vous qu'il était nécessaire de changer toute l'indexation des tampons ? Après la réindexation, avez-vous corrigé exactement tout le code ? Il serait peut-être plus simple de créer un tampon de couleur d'index 4, et des tampons auxiliaires 5 et 6 en conséquence. Il y aurait moins de besoin d'édition et moins de risques de faire d'autres erreurs.

 
klok79:
J'ai essayé. Deux écarts est de 24, ne fonctionnera pas de cette façon, commence à travailler à 19 du prix de clôture. À partir du prix ouvert actuel, il fonctionne avec trois spreads.
J'ai augmenté le stop d'un point dans la boucle et ouvert un ordre. A 19 ans, il a ouvert. Il ne s'agit pas de savoir comment choisir. La question est de savoir comment le calculer correctement. Aucun prix n'apparaît lorsque j'ouvre un ordre manuellement si je fixe un stop avec le bouton. C'est ridicule. Je fais une lecture massive de ce forum. J'ai trouvé quelques fonctions sur la 7ème page (message #65). Je vais devoir le vérifier et faire un rapport.

Vérifié. Travaux
Tout ceci est étrange, il est dit la même chose minStopLoss = Prix actuel +/- (MaxValue(2*Spread, StopLoss)), seulement sous Prix actuel nous comprenons non pas le prix ouvert de l'ordre mais le prix miroir.
Pourquoi la double page est-elle appropriée ?
Deux autres questions se posent.
1. Pourquoi SymbolInfoInteger est-il utilisé pour obtenir les valeurs Digits() et Point() ; ?
2. Pourquoi une entrée (int) est-elle utilisée avant d'appeler la fonction SymbolInfoInteger ? Si je comprends bien, il s'agit d'une conversion de type forcé.

 
klok79:

Je l'ai vérifié. Cela fonctionne
Tout cela est bizarre, ils écrivent toujours la même chose minStopLoss = Prix actuel +/- (maxZen(2*Spread, StopLoss)) mais le Prix actuel n'est pas le prix d'ouverture de l'ordre mais le prix miroir.
Pourquoi la double page est-elle appropriée ?
Deux autres questions se posent.
1. Pourquoi SymbolInfoInteger est-il utilisé pour obtenir les valeurs Digits() et Point() ; ?
2. Pourquoi une entrée (int) est-elle utilisée avant d'appeler la fonction SymbolInfoInteger ? Si je comprends bien, il s'agit d'une conversion de type forcé.

Pour obtenir Point() SymbolInfoInteger ne fonctionnera en aucun cas.))

En général, il est nécessaire de se rappeler que Point() ou _Point ne concerne que le symbole courant. Pour les caractères autres que celui sur lequel l'EA fonctionne, vous devez utiliser cette même fonction.

La fonction SymbolInfoInteger renvoie non seulement des valeurs int, mais aussi des valeurs long, bool et des énumérations.

 

Sergey Voytsekhovsky, merci pour votre aide. Et une dernière question, si vous le voulez bien, veuillez me suggérer la fonction inverse de la fonctionCharToStr
(pour obtenir un code à partir d'un symbole), car j'ai des fonctions pour cela dans Beisic et Delphi, mais en C++, pour autant que je sache, il y a deux méthodes :
1 - FonctionAscii_cod, qui n'est pas dans mql4
2. - Conversion directe des types. Mais mon code est
string st="A" ;
Print ("Code de caractère A=",(int)st) ;

Produit du texte Code caractère A=0.

Que faire ?

 
klok79:

Sergey Voytsekhovsky, merci pour votre aide. Et une dernière question, si vous le voulez bien, pourriez-vous me suggérer la fonction inverse de la fonctionCharToStr
(pour obtenir son code à partir d'un symbole), car j'ai des fonctions pour cela dans Beisic et Delphi, mais en C++, si je comprends bien, il y a deux méthodes :
1 - FonctionAscii_cod, qui n'est pas dans mql4
2. - Conversion directe de type. Mais mon code est
string st="A" ;
Print ("Code de caractère A=",(int)st) ;

Produit du texte Code caractère A=0.

Que faire ?

StringToCharArray, contrairement à la fonction wiki, ne convertit pas seulement un caractère à la fois, mais peut convertir une chaîne de caractères en un tableau de type ucar avec les codes de tous les caractères de la chaîne.

mql4 possède également une telle fonction.

Документация по MQL5: Преобразование данных / StringToCharArray
Документация по MQL5: Преобразование данных / StringToCharArray
  • www.mql5.com
Посимвольно копирует преобразованную из unicode в ansi строку в указанное место массива типа uchar. Функция возвращает количество скопированных элементов. [in]  Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо...
 
Alexey Viktorov:

Pour obtenir Point() SymbolInfoInteger ne fonctionnera en aucun cas.))

En général, il est nécessaire de se rappeler que Point() ou _Point ne concerne que le symbole courant. Pour les caractères autres que celui sur lequel l'EA fonctionne, vous devez utiliser cette fonction.

La fonction SymbolInfoInteger renvoie non seulement des valeurs int, mais aussi des valeurs long, bool et des énumérations.

En fait, Point a une valeur double. Cela signifie que nous devons l'appeler depuis SymbolInfoDouble

 
Konstantin Nikitin:

En fait, Point a une valeur de double. Cela signifie que la demande doit être faite par SymbolInfoDouble

Il s'agit de ces fonctions pour MQL4 du post #65:

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+

Je n'ai pas vu où Point est obtenu via SymbolInfoInteger()

 
Artyom Trishkin:

Il s'agit de ces fonctions MQL4 du post #65:

Je n'ai pas vu où Point est obtenu via SymbolInfoInteger()

Oui, la même. Nous sommes passés à travers. L'essentiel est qu'il comprenne ce qui est quoi...