Questions des débutants MQL5 MT5 MetaTrader 5 - page 1054

 

Igor Makanu:

CTrade standard ne fournit pas un service prêt à l'emploi.

Sur MT4, certaines opérations sont codées sur une seule ligne. Sur MT5, vous ne pouvez pas faire la même chose avec SB, même en cent lignes. Sur MQL5 pur, c'est encore pire. C'est bon.

 

Merci, bon exemple, je vais y réfléchir, voici un script que j'ai rédigé pour MT4 - déterminer le profit en pips :

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

Je l'ai écrit de A à Z en 10 minutes ? - Eh bien, à ce sujet, la logique est simple et directe - vous le prenez et l'écrivez, dans MT5 jusqu'à présent nous ne discutons que d'un cheval sphérique dans le vide ... si des transactions et s'il y a des ordres, à gauche pour discuter des types de comptes netting ou hedge.... et nous écrirons quelque chose d'ici demain matin.

 
Igor Makanu:

Merci, bon exemple, je vais l'étudier, j'ai fait un script pour MT4 - déterminer le profit en pips.

Je n'ai pas besoin de vous dire comment exécuter ce script dans MT5. Cependant, le script lui-même comporte des erreurs.

Je vais d'abord vous montrer l'histoire

et le résultat de l'exécution

Прибыль последнего закрытого ордера -259 пунктов


Voici les erreurs

int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++) // Надо бежать в обратную сторону, т.к. последняя позиция может быть закрыта в ту же секунду, что и предпоследняя.
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t) // В отличие от MT4, в MT5 это можно не делать - сортировка по времени закрытия есть.
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point); // При таком вычислении легко потерять один пункт.
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
 
fxsaber:

Et les erreurs ici.

При таком вычислении легко потерять один пункт.

Je n'y ai jamais pensé, le schéma semble être standard : 2 prix - trouver la différence et diviser par les points.

je suis d'accord avec le reste, mais j'ai besoin de réfléchir, le schéma de l'ordre de rebidding est classique et je veux comparer le temps au plus haut.... juste au cas où. je dois réfléchir, même si c'est la première fois que je dois le faire - 99,99% du temps personne n'essaie même de trader le hft TS sur MT4

 
Igor Makanu:

Je n'y ai jamais pensé, le schéma semble être standard : 2 prix - trouver la différence et diviser par des points.

Perte lors du casting double -> int.

Je suis d'accord avec le reste, mais j'ai besoin de réfléchir, le schéma d'exécution des ordres est classique, et je veux comparer le temps au plus haut.... juste au cas où. je dois réfléchir, même si c'est la première fois que je dois le faire - dans 99,99% des cas, personne n'essaie même de trader le hft TS sur MT4

Le HFT n'a rien à voir avec cela. Le script CloseAll peut très bien fermer deux positions en une seconde. Dans MT4, vous devez comparer, dans MT5, c'est inutile. Et il est probablement plus facile de comparer via ArraySort (si, par exemple, vous devez rapidement passer à l'avant-dernière position fermée).

 
fxsaber:

La perte lors du casting double -> int.

tout cela est clair, mais comment calculer correctement la différence de 2 prix en points entiers ?

 
Igor Makanu:

Tout cela est clair, mais comment calculer la différence en pips entre 2 prix ?

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

j'ai besoin d'aide pour calculer le nombre total de pips pour un ordre fermé aujourd'hui (Mql5)

fxsaber, 2017.10.25 01:00

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

int PriceToInteger( const double Price, const double point )
{
  return((int)(Price / point + 0.1));
}

int GetTotalPips( const datetime From = 0 )
{
  int Res = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      if (OrderCloseTime() < From)
        break;
      else if (OrderType() <= OP_SELL)
      {
        const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);
        
        Res += OrderType() ? PriceToInteger(OrderOpenPrice(), point) - PriceToInteger(OrderClosePrice(), point)
                           : PriceToInteger(OrderClosePrice(), point) - PriceToInteger(OrderOpenPrice(), point);
      }
        
  return(Res);
}

void OnStart()
{
  datetime Today = TimeCurrent();
  
  Today -= Today % PeriodSeconds(PERIOD_D1);
  
  Alert(GetTotalPips(Today));
}
 
fxsaber:

Merci !

Je l'ai particulièrement apprécié.

const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);

Je garderai cela à l'esprit, j'ai l'habitude de tout écrire en visibilité globale, votre exemple se lit beaucoup mieux.


....


Dans la boucle d'ordre, est-ce que SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT) ; sera recalculé à chaque fois, parce queOrderSymbol() sera différent à chaque fois ?

 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégie

Questions des débutants MQL5 MT5 MetaTrader 5

Igor Makanu, 2019.06.04 18:43

Merci, bon exemple, je vais y réfléchir, voici un script que j'ai rédigé pour MT4 - déterminer le profit en pips :

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

Rédigé à partir de zéro en 10 minutes ? - Eh bien, approximativement, la logique est simple et directe - vous le prenez et l'écrivez, dans MT5 nous discutons seulement d'un cheval sphérique dans un vide... si des transactions et s'il y a des ordres, à gauche pour discuter des types de comptes netting ou hedge.... et nous écrirons quelque chose dans la matinée.

Et puis-je demander pourquoi nous devrions prendre la valeur absolue de la différence entre le prix d'ouverture et de clôture et ensuite, si le profit de la position est inférieur à zéro, substituer un signe moins à cette valeur.
 
Alexey Viktorov:
Et puis-je demander pourquoi nous devrions prendre la valeur absolue de la différence entre le prix d'ouverture et de clôture, puis, si le bénéfice de la position est inférieur à zéro, substituer le signe moins à la valeur.

Je l'ai écrit à la volée, comme je le voulais - je voulais sortir +100 points ou -100 points, c'était une question de goût - je n'avais pas de tâche spécifique, mais écrire des conditions pour déterminer le type d'ordre et comparer le prix d'ouverture et de clôture, il semblait qu'il y aurait trop de lignes supplémentaires...

ZS : C'est un forum pour les programmeurs, n'est-ce pas ? - Ils sont comme ça, ils peuvent optimiser un code (surtout celui de quelqu'un d'autre) 10 fois plus, de sorte qu'au lieu de 5 lignes, il n'y en aurait que 4 ;))).