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

 

j'ai un code avec des classes avec un panneau d'information!!!
MAIS j'ai un problème !
j'ai une étiquette dessus et je peux la faire réagir par les paramètres à distance.... donc quand vous changez les paramètres 2-3 fois, le panneau lui-même se déplace dans des directions différentes !!! et quand vous changez le délai 2-3 fois !!! comment puis-je me débarrasser de cela ????


un peu plus d'informations :
J'ai trouvé que si dans le fichier Dialog.mqh dans la fonction CAppDialog::Destroy(const int reason) à commenter les lignes
si(m_deinit_reason!=WRONG_VALUE)
retour ;
alors le panneau sera normalement détruit et redémarré lors du changement d'horizon temporel.

Dossiers :
TradePanel.mq4  15 kb
 

Bonjour. J'écris un indicateur MT4 qui ne fonctionne qu'avec des objets graphiques et qui suit également la position des objets graphiques créés par le même indicateur travaillant sur une période différente. Lorsque je déplace manuellement la ligne verticale de la période majeure, les lignes de tendance de la nouvelle position de la ligne verticale de la période majeure sont redessinées, ainsi que la ligne verticale de la période mineure. Tout ceci est géré dans l'événement OnChartEvent. Le problème est que lorsque je déplace la ligne verticale d'une période haute, parfois les objets d'une période basse ne sont pas redessinés tout de suite, mais seulement lorsque je double-clique sur la ligne verticale d'un indicateur, travaillant sur une période haute, ils sont redessinés. Et sur un autre PC plus puissant, cela se produit moins souvent. J'applique la fonction ChartRedraw() dans le code après avoir redessiné les objets.

Cela peut-il se produire en raison du manque de ressources du PC ?

Je veux essayer d'exécuter les indicateurs sur différents graphiques et utiliser EventChartCustom pour générer un événement personnalisé à partir de l'indicateur travaillant sur une période plus élevée vers le second indicateur. Peut-être cela accélérera-t-il le fonctionnement du programme ?

 

Comment mettre rapidement à zéro (effacer) tous les éléments d'une structure ?


La structure est globale. À certains moments, il doit être vidé pour être rempli de nouvelles données plus tard.

Je comprends que vous puissiez, élément par élément, tout ramener à zéro. Y a-t-il un autre moyen ?


struct ABC{

int a1 ;

int a2 ;

int a3 ;

} ;

ABC a ;

Nous avons besoin de quelque chose comme ceci

a = 0 ; // tous les éléments de la structure en acier sont à zéro

 
Sergey Likho:

Comment mettre rapidement à zéro (effacer) tous les éléments d'une structure ?


La structure est globale. À certains moments, il doit être vidé pour être rempli de nouvelles données plus tard.

Je comprends que vous puissiez, élément par élément, tout ramener à zéro. Y a-t-il un autre moyen ?


struct ABC{

int a1 ;

int a2 ;

int a3 ;

} ;

ABC a ;

Nous avons besoin de quelque chose comme ceci

a = 0 ; // tous les éléments de la structure en acier sont à zéro

ZeroMemory(a);
 
Est-ce que quelqu'un a un trailing trade qui se déclenche après N pips et ensuite va après le prix ?
J'en ai un, mais il se déclenche après N pips et s'arrête au breakeven.....
réparez-le s'il vous plaît, je suis hors de ma tête ! !!
void TrailingSL()
{
int    er;
if(shagtrala==0) return;
for(int i = 0; i < OrdersTotal(); i++)
  {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY && NormalizeDouble(Ask-OrderOpenPrice(), Digits) >= NormalizeDouble(shagtrala, Digits) &&
         NormalizeDouble(Ask-OrderStopLoss(), Digits) > NormalizeDouble(lTrailingDistance, Digits))
           {
            er = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss() + (lTrailingDistance * _Point), OrderTakeProfit(),OrderExpiration(),0);
           }
         if(OrderType()==OP_SELL && NormalizeDouble(OrderOpenPrice()-Bid,Digits) >= NormalizeDouble(shagtrala, Digits) &&
         NormalizeDouble(OrderStopLoss()-Bid, Digits) > NormalizeDouble(lTrailingDistance, Digits))
           {
            er = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss() - (lTrailingDistance * _Point), OrderTakeProfit(),OrderExpiration(),0);
           }
        }
     }
  }
return;
}
 
ponochka:
Est-ce que quelqu'un a un trawl qui se déclenche après N pips et ensuite va après le prix ?
J'en ai un, mais il fonctionne après N pips et s'arrête au breakeven.....
réparez-le s'il vous plaît, je suis hors de ma tête ! !!

ici mon chalut fonctionne, il fonctionne :

//____________________________________________________________________________________
bool trailingpos(int magic_,int trail_p){
   string sym=Symbol(); bool res = true; double sl,slnew,tpips = trail_p*Point; int i,k=OrdersTotal();
   for(i=0;i<k;i++){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==sym && OrderMagicNumber()==magic_){
            switch(OrderType()){
               case OP_BUY:
                           slnew = NormalizeDouble(Ask - tpips,Digits);
                           sl = OrderStopLoss();
                           if(OrderOpenPrice() <slnew)
                              if((sl < slnew) || (sl == 0.0)){
                                    if(!OrderModify(OrderTicket(),OrderOpenPrice(),slnew,OrderTakeProfit(),OrderExpiration(),clrNONE))
                                                   {res = false; Print(__FUNCTION__,"OrderModify завершилась с ошибкой № ",GetLastError());}
                           }
                           break;
               case OP_SELL:
                           slnew = NormalizeDouble(Bid + tpips,Digits);
                           sl = OrderStopLoss();
                           if(OrderOpenPrice()> slnew)
                              if((sl > slnew) || sl ==0.0){
                                    if(!OrderModify(OrderTicket(),OrderOpenPrice(),slnew,OrderTakeProfit(),OrderExpiration(),clrNONE))
                                                   {res = false; Print(__FUNCTION__,"OrderModify завершилась с ошибкой № ",GetLastError());}
                           }
                           break;
              }
           }
        }
     }
return(res);}
//____________________________________________________________________________________

appeler la fonction 2 paramètres numéro magique et chalut np

 
Sergey Likho:

Comment mettre rapidement à zéro (effacer) tous les éléments d'une structure ?


La structure est globale. À certains moments, il doit être vidé pour être rempli de nouvelles données plus tard.

Je comprends que vous puissiez, élément par élément, tout ramener à zéro. Y a-t-il un autre moyen ?

// Обнуляет любую простую структуру
template <typename T>
void SetNull( T &Value )
{
  static T NullValue = {0};
  
  Value = NullValue;
}
 

Bonjour ! Existe-t-il un code pour le gain total sur toutes les commandes en un jour ?

J'en ai un :

double getProfitFromTime(datetime time)
  {
   double profit = 0;
   
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
        {
         if(OrderCloseTime() < time)
            break;
         
         profit += OrderProfit() + OrderCommission() + OrderSwap();
        }
   
   return(profit);
  }

C'est comme ça qu'on l'appelle :

getProfitFromTime(iTime(NULL, PERIOD_D1, 0);

Puis-je le modifier d'une manière ou d'une autre, de sorte que je puisse voir le profit pour une paire de devises en un jour et le profit total pour toutes les paires de devises ?

 
ponochka:

et le total pour toutes les paires de devises ?

SupprimezOrderSymbol() == Symbol() de la condition:

if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
alors cette partie du code ne comptera toutes les commandes dans l'historique du terminal par numéro magique que si le numéro magique pour les différentes devises est le même ; si vous enlevezOrderMagicNumber() == magic alors toutes les commandes seront comptées sans tenir compte du numéro magique
 

Bonjour à tous. Un conseil à un nouvel arrivant. Je veux faire une petite recherche sur le comportement des écarts. J'ai un code qui calcule l'écart total. Tout est écrit, tout fonctionne bien.

void ModifySpread()
{
  int Spread = (Ask - Bid) / Point;
  
    
  Sumsp = SumSp + Spread;
  Vol++;
  
  PrevTime = Time[0];
  
  return;
}

Je veux supprimer les moments où le spread n'effectue aucun mouvement, c'est-à-dire que l'offre et la demande ne changent pas.
Je fais ça :

void ModifySpread()
{
  int Spread = (Ask - Bid) / Point;
  if ((prevsbid == Bid)) && (prevsask == Ask))return;
   
  SumSp = SumSp + Spread;
  Vol++;
  
  

  prevsask = Ask;
  prevsbid = Bid;
  PrevTime = Time[0];
  return;
}

Mais rien ne change. Où est-ce que je vais lentement ?

Raison: