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

 
Youri Lazurenko:

Je procède comme suit : j'ouvre un ordre avec un TP et un SL nuls, puis je modifie (l'ordre) avec les paramètres TP et SL requis. J'ai déjà écrit, tout fonctionne et fonctionnait bien sur d'autres comptes, seulement sur ndd une telle chose. Je n'ai jamais travaillé avec quelqu'un d'autre avec des comptes similaires auparavant, je ne peux pas comparer. Peut-être que c'est seulement le bip de forex4u, ou peut-être tous les comptes ndd. J'aimerais le savoir pour une référence future.
Puisque vous avez une erreur de 130, regardez les paramètres de l'ordre d'arrêt. Dans tous les cas, ils ne doivent pas être plus proches que la valeur StopLevel définie dans les paramètres du serveur. S'il est égal à zéro, alors utilisez le double écart+1 point
 
Youri Lazurenko:

Je procède comme suit : j'ouvre un ordre avec un TP et un SL nuls, puis je modifie (l'ordre) avec les bons paramètres de TP et de SL. J'ai déjà écrit, tout fonctionne et fonctionnait bien sur d'autres comptes, seulement sur ndd une telle chose. Je n'ai jamais travaillé avec quelqu'un d'autre avec des comptes similaires auparavant, je ne peux pas comparer. Peut-être que c'est seulement le bip de forex4u, ou peut-être tous les comptes ndd. Je souhaiterais obtenir de plus amples informations.

Lorsque vous ouvrez des positions, utilisez ces fonctions pour calculer des stops et des reprises corrects :

//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
 
Alexey Viktorov:

Quelle est la différence ?

Pips = Charge/Lots/Valeur du pic en chiffres spécifiques 8/2/4 = 1

ou

Pips = Charge/(Lots*Tickvalue) en nombres spécifiques 8/(2*4) = 8/8 = 1

Les nombres fractionnaires peuvent aussi être utilisés...


La différence est que mon homonyme multiplie également parPoint pour une raison quelconque :(OrderCommission()/(tv*OrderLots()))*Point()
 
Artyom Trishkin:
Si vous avez l'erreur 130, alors regardez les paramètres des ordres stop. Dans tous les cas, ils ne doivent pas être plus proches que la valeur StopLevel définie dans les paramètres du serveur. S'il est égal à zéro, utilisez l'écart double + 1 point.


Merci beaucoup pour les fonctionnalités données, dans votre prochain post.

Le problème, c'est que je n'ai pas du tout fixé de butée (moyenne). Et pourquoi cette erreur n'est pas présente lorsque je démarre le terminal le matin et que la modification se produit, mais uniquement présente (erreur) en début de session lors de l'ouverture d'un ordre (graphiques journaliers) et si c'est un sur une paire. Le support technique a répondu qu'il n'y a pas de limitations pour cette modification, ni en temps ni en distance (l'écart n'est pas important).

Je vais essayer de faire quelques expériences avec toutes les recommandations et je tirerai mes conclusions plus tard.

Merci beaucoup, encore une fois.

 
Vitalie Postolache:

La différence est que mon homonyme multiplie également par Point pour une raison quelconque :(OrderCommission()/(tv*OrderLots()))*Point()

OK, je vais répondre : Il y a un prix de 1.0520, dans les calculs nous avons obtenu le nombre (int)Comm, alors nous devons l'ajouter / soustraire du prix = 1.0520 + (int)Comm ? Maintenant, afin de ne pas multiplier par Point - cela se fait immédiatement.

 
Youri Lazurenko:


Merci beaucoup pour les fonctionnalités données, dans votre prochain post.

Le problème, c'est que je n'ai pas du tout défini d'arrêt (moyenne). Et pourquoi cette erreur n'est pas présente lorsque je démarre le terminal le matin et que la modification se produit, mais uniquement présente (erreur) en début de session lors de l'ouverture d'un ordre (graphiques journaliers) et si c'est un sur une paire. Le support technique a répondu qu'il n'y a pas de limitations pour cette modification, ni en temps ni en distance (l'écart n'est pas important).

Je vais essayer de faire quelques expériences avec toutes les recommandations et je tirerai mes conclusions plus tard.

Merci beaucoup, encore une fois.

Vous êtes les bienvenus.

Pour l'utiliser : dans la fonction d'ouverture de position, à la place du stop en pips, copiez la fonction call, dans laquelle vous substituez le stop en pips. Ou bien le prix stop doit être saisi directement - le compilateur sélectionnera la fonction requise. Il en va de même pour les prises de bénéfices.

Exemple :

double price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);         // Цена открытия для Buy
double sl=CorrectStopLoss(Symbol(), OP_BUY, price, 200);    // Стоп в 200 пунктов (вместо пунктов можно вписать расчётную цену, например Ask+200*Point() или значение цены МА)
double tp=CorrectTakeProfit(Symbol(), OP_BUY, price, 300);  // Тейк в 300 пунктов (если вписать расчётную цену, то будет использоваться тип функции с double-параметром)
OrderSend(Symbol(),OP_BUY,Lots,price,slippage,sl,tp,"Комментарий ордера",Magic,0,clrBlue);
 
Vitaly Muzichenko:

OK, je vais répondre : Il y a un prix de 1.0520, dans les calculs nous avons obtenu le nombre (int)Comm, alors nous devons l'ajouter / soustraire du prix = 1.0520 + (int)Comm ? Maintenant, afin de ne pas multiplier par Point - cela se fait immédiatement.


Eh bien, peut-être que oui. C'est juste que la question était initialement posée de savoir comment traduire la commission en pips, et non en prix.
 
Artyom Trishkin:

Vous êtes les bienvenus.

Utilisez cette méthode : dans la fonction d'ouverture d'une position à la place du stop en pips, tapez l'appel de la fonction dans laquelle vous voulez substituer le stop en pips. Ou bien le prix stop doit être saisi directement - le compilateur sélectionne la fonction requise. Il en va de même pour les prises de bénéfices.

Exemple :

Encore une fois, merci beaucoup. Tous les meilleurs.
 
S'il vous plaît, conseillez Messieurs : Je dessine des lignes de Fibonacci avec des couleurs et des niveaux de style différents et je mets toujours le même que le dernier, comment le réparer ?

                  ObjectCreate(0,Fibo_Arrow,OBJ_FIBO,0,Time[0],Close[0],Time[0],price); // создание метки стпа на графике   
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_HIDDEN,true);        // Запрет на показ имени графического объекта в списке объектов 
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_SELECTABLE,false);   // запрет на выделение перемещение объекта мышью   
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_RAY_RIGHT,false);    // луч вправо
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_TOOLTIP,"r\n");       // подпись линии и и её длины в подсказку                  
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_COLOR,1,clrNONE);       // цвет   
                  
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELS,3);           // установим количество уровней   
                      
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,0,1.5);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,0,Green);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,0,2);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,0,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,0,"0.5"); // описание уровня 
                  
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,1,2);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,1,Lime);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,1,0);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,1,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,1,"1"); // описание уровня 
                  
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,2,2.5);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,2,Green);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,2,2);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,2,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,2,"1.5"); // описание уровня 
 
Money_Maker:
Chers experts, veuillez me conseiller : je construis des lignes de Fibonacci avec des couleurs et des styles de niveaux différents, mais elles sont toujours identiques à la dernière, comment y remédier ? redessiner et glisser n'est utile en aucun endroit(

Niveaux Fibo avec cet objet, vous ne pouvez pas faire des styles et des couleurs différents pour chaque ligne. Dessinez des lignes séparées si vous voulez un arc-en-ciel.