Questions des débutants MQL4 MT4 MetaTrader 4 - page 52

 
ilnur17021992:
L'étiquette de prix(OBJ_ARROW_LEFT_PRICE) peut-elle avoir son propre texte au lieu du prix, si oui comment ?
ObjectCreate(Name,OBJ_TEXT,Window,aTime,aPrice);
 
Bonjour ! Quelqu'un peut-il expliquer pourquoi les prix sur les graphiques H4 et M15 ne coïncident pas ? Dans la capture d'écran de la M15, le prix a franchi la ligne rouge (à gauche de la ligne verticale). Et une minute plus tard, il y a une capture d'écran de H4 où le prix est encore très loin de celui-ci (à droite de la ligne).
Et ici, dans ce programme, seul un autre dtz a une ombre de la bougie (la bougie est la plus extérieure à droite).
 
Equal:
Bonjour ! Quelqu'un peut-il expliquer pourquoi les prix sur les graphiques H4 et M15 ne correspondent pas ? Dans la capture d'écran de la M15, le prix a franchi la ligne rouge (à gauche de la ligne verticale). Et une minute plus tard, il y a une capture d'écran de H4 où le prix est encore très loin de celui-ci (à droite de la ligne).
Et voici la capture d'écran de ce programme, mais un autre dtz a une ombre de la bougie (la bougie est la plus à l'extérieur à droite).
Vous ne savez pas encore que les devis diffèrent selon les sociétés de courtage ? Ils sont différents même pour la démo et le réel dans une seule et même société de courtage ! Quelle surprise ( :
 

Essayer d'écrire quelque chose de similaire :IceFX DrawProfit

Code :

void start()
{
   for(int i=0;i<OrdersHistoryTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol() && OrderType()<=1)
      History();
   }
}
  
void History()
{
   string Ticket=IntegerToString(OrderTicket());
   color col=Red;
   if(OrderType()==0)col=Blue;
   datetime a=OrderOpenTime();
   double b=OrderOpenPrice();
   datetime c=OrderCloseTime();
   double d=OrderClosePrice();
   double profit=OrderProfit();
  
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
      
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
      
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
      
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_WIDTH,2);
   ObjectSetText(Ticket+"Profit",DoubleToString(profit,2),10,"Arial",White);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d+Point*5);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+10000);      
}

Tout fonctionne, mais j'utilise un conseiller de grille, qui couvre actuellement un groupe d'ordres et, par conséquent, les bénéfices se chevauchent les uns les autres. J'aimerais que le bénéfice de ce groupe fermé soit totalisé et que seul le montant soit affiché (comme implémenté dans l'indicateurDrawProfit d'IceFX), plutôt que séparément pour chaque ordre comme je le fais maintenant. Aidez-moi à le faire correctement :)


Dossiers :
 
Vitalie Postolache:
C'est nouveau pour vous que les devis des différentes sociétés de courtage soient différents ? Oui, ils sont différents même pour la démo et le commerce réel dans une seule et même société de courtage ! Quelle surprise ( :
La surprise est différente. Il s'agit d'un seul et même compte réel et le prix change (il n'est pas le même) simplement en passant à une autre période de temps.
Dans une autre société de courtage, également sur un compte réel, lorsque l'on change le graphique, tout est OK ! Le fait que les prix soient différents est clair, il n'est pas clair que l'on ait comme si deux prix à la fois, un sur les minutes, un sur les heures est différent (très différent). Je comprends que ça ne devrait pas être comme ça, mais je me demande où est le problème. D'ailleurs, le chandelier a "corrigé" en une heure environ après l'ouverture du prochain.
 
ilnur17021992:

Essayer d'écrire quelque chose de similaire :IceFX DrawProfit

Code :

void start()
{
   for(int i=0;i<OrdersHistoryTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol() && OrderType()<=1)
      History();
   }
}
  
void History()
{
   string Ticket=IntegerToString(OrderTicket());
   color col=Red;
   if(OrderType()==0)col=Blue;
   datetime a=OrderOpenTime();
   double b=OrderOpenPrice();
   datetime c=OrderCloseTime();
   double d=OrderClosePrice();
   double profit=OrderProfit();
  
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
      
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
      
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
      
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_WIDTH,2);
   ObjectSetText(Ticket+"Profit",DoubleToString(profit,2),10,"Arial",White);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d+Point*5);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+10000);      
}

Tout fonctionne, mais j'utilise un conseiller de grille, qui couvre actuellement un groupe d'ordres et, par conséquent, les bénéfices se chevauchent les uns les autres. J'aimerais que le bénéfice de ce groupe fermé soit totalisé et que seul le montant soit affiché (comme implémenté dans l'indicateurDrawProfit d'IceFX), plutôt que séparément pour chaque ordre comme je le fais maintenant. Aidez-moi à le faire correctement :)


Le bénéfice est calculé dans un cycle séparé
 
Alekseu Fedotov:
Les bénéfices sont comptabilisés dans un cycle distinct
Laquelle ? Comment puis-je savoir que des commandes spécifiques constituent un groupe et que leurs bénéfices doivent être additionnés ?
 
ilnur17021992:
Laquelle ? Comment puis-je déterminer que des commandes spécifiques constituent un groupe et que leur bénéfice doit être additionné ?
Et quelle est la méthode pour les fermer, un groupe à travers une fonction, ou une autre manière ?
 
Vitaly Muzichenko:
Comment les fermez-vous ? Sont-ils fermés en tant que groupe par une fonction ou d'une autre manière ?
Les ordres sont ouverts par le robot netmaker, pour l'ensemble du groupe il calcule et fixe un TP commun, par lequel ils sont ensuite fermés.


Je joins une capture d'écran :
 
ilnur17021992:
Les ordres sont ouverts par le robot netmaker, pour l'ensemble du groupe il calcule et met un TP commun, auquel ils sont ensuite fermés.

Capture d'écran jointe :

C'est comme ça :

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int TotalPos=-1;
void OnTick()
{
 // остальной код

//--
  if(OrdersTotal()!=TotalPos) { // не мучаем каждый тик
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      History();

      ...
     }
  }}} TotalPos=OrdersTotal(); // запомним количество

//--
}

//+------------------------------------------------------------------+
//| Create Object istory                                             |
//+------------------------------------------------------------------+
void History() {
  string Ticket=(string)OrderTicket();
  color col=Red;
  if(OrderType()==0)col=Blue;
  datetime a=OrderOpenTime();
  double b=OrderOpenPrice();
  datetime c=OrderCloseTime();
  double d=OrderClosePrice();
  double prSep=OrderProfit()+OrderCommission()+OrderSwap();
  double prAll=0;
  int    cn=0;
  string hTicket;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;
      }
   }}}
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
      
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
      
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
  
   Ticket=cn>1?hTicket:Ticket;
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_ANCHOR,0);
   ObjectSetText(Ticket+"Profit",DoubleToString(prAll,2),10,"Arial",/*White*/clrBlack);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+Period()*60*2);
}
Raison: