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

 

Bonjour, j'ai un comportement étrange de la fonction système OrderCalcProfit, j'ai l'impression que le paramètre volume est ignoré dans le calcul, c'est-à-dire que la taille du profit est toujours calculée pour le volume 1.0.

J'essaie de le vérifier dans le testeur pour différentes paires de devises sur différents comptes de démonstration.

1. Le calcul est correct pour 1.0, voir calc_profi101.png.

2. Le deuxième appel et tout appel ultérieur de la fonction renvoient un résultat de profit basé sur un volume de 1.0, la valeur du volume est ignorée, voir une capture d'écran (calc_profit02.png) - volume passé 0.5, mais le résultat est toujours le même que pour 1.0

Pouvez-vous me dire quel est le problème ? Merci

Dossiers :
 
aveshoff:

Bonjour, j'ai un comportement étrange de la fonction système OrderCalcProfit, j'ai l'impression que le paramètre volume est ignoré dans le calcul, c'est-à-dire que la taille du profit est toujours calculée pour le volume 1.0.

J'essaie de le vérifier dans le testeur pour différentes paires de devises sur différents comptes de démonstration.

1. Le calcul est correct pour 1.0, voir calc_profi101.png.

2. Le deuxième appel et tout appel ultérieur de la fonction renvoient un résultat de profit basé sur un volume de 1.0, la valeur du volume est ignorée, voir une capture d'écran (calc_profit02.png) - volume passé 0.5, mais le résultat est toujours le même que pour 1.0

Pouvez-vous me dire quel est le problème ? Merci

Je pense que la réponse est dans l'aide :

"... profit

[out] Variable qui contiendra la valeur du bénéfice calculé si la fonction réussit. La valeur de l'estimation des bénéfices dépend de nombreux facteurs et peut changer en fonction de l'évolution du marché. ... "


Ajouté : bien que ce ne soit qu'une supposition.

 
aveshoff:

Bonjour, j'ai un comportement étrange de la fonction système OrderCalcProfit, j'ai l'impression que le paramètre volume est ignoré dans le calcul, c'est-à-dire que la taille du profit est toujours calculée pour le volume 1.0.

J'essaie de le vérifier dans le testeur pour différentes paires de devises sur différents comptes de démonstration.

1. Le calcul est correct pour 1.0, voir calc_profi101.png.

2. Le deuxième appel et tout appel ultérieur de la fonction renvoient un résultat de profit basé sur un volume de 1.0, la valeur du volume est ignorée, voir une capture d'écran (calc_profit02.png) - volume passé 0.5, mais le résultat est toujours le même que pour 1.0

Pouvez-vous me dire quel est le problème ? Merci

Voici l'examinateur du test - tout fonctionne correctement :

//+------------------------------------------------------------------+
//|                                             OrderProfitCheck.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\AccountInfo.mqh>
CAccountInfo      m_account;                    // object of CAccountInfo class
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string symbol=Symbol();
   ENUM_ORDER_TYPE trade_operation=ORDER_TYPE_BUY;
   double volume=1.0;
   double price_open=1.09350;
   double price_close=1.0930;
   double profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 1.0, profit -> ",DoubleToString(profit,2));
   volume=0.5;
   profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 0.5, profit -> ",DoubleToString(profit,2));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+

et le résultat :

2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 1.0, profit -> -50.00
2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 0.5, profit -> -25.00
Dossiers :
 
Pouvez-vous me dire. Est-ce possible et comment peut-on connaître la langue du terminal utilisé de manière programmatique ?
 
Uladzimir Izerski:
Pouvez-vous me donner un indice. Est-ce possible et comment puis-je déterminer par programme la langue du terminal utilisé ?

Je détermine qu'il s'agit de la langue du terminal russe ou d'une autre langue - la sortie est en anglais.

   if(InpTrailingStop!=0 && InpTrailingStep==0)
     {
      string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")?
                      "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!":
                      "Trailing is not possible: parameter \"Trailing Step\" is zero!";
      //--- when testing, we will only output to the log about incorrect input parameters
      if(MQLInfoInteger(MQL_TESTER))
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_FAILED);
        }
      else // if the Expert Advisor is run on the chart, tell the user about the error
        {
         Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_PARAMETERS_INCORRECT);
        }
     }


Ajouté : je pensais avoir sauvegardé toutes les langues de l'énumération TERMINAL_LANGUAGE - mais je ne les trouve pas. J'ai dû perdre...

 
Bonjour à tous, quelqu'un peut-il aider à ajouter ici qu'à SL ne serait pas seulement flip, mais aussi ajouter beaucoup ou plus. Et lorsque le TP est déclenché, il recule d'un lot.
input double   Lot=1;
input int      TakeProfit = 6;
input int      Stoploss   = 6;

int TP;
int SL;

CTrade trader;
bool Invertor;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   TP = TakeProfit;
   SL = Stoploss;

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   double points;

   if(!PositionSelect(_Symbol))
     {
      if(Invertor)
         trader.Buy(Lot);
      else trader.Sell(Lot);
     }
   else
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         points=(SymbolInfoDouble(_Symbol,SYMBOL_BID)-PositionGetDouble(POSITION_PRICE_OPEN))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }

         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
        }
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         points=(PositionGetDouble(POSITION_PRICE_OPEN)-SymbolInfoDouble(_Symbol,SYMBOL_ASK))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }
        }
     }   
  }
 
Andrey990:
Bonjour à tous, est-ce que quelqu'un peut aider à ajouter ici que chez SL, ce ne serait pas seulement un retournement mais aussi un ajout important ou plus. Et lorsque le TP est déclenché, il retourne un lot.

1. Je déconseille catégoriquement l'utilisation de fonctions qui sélectionnent une position par un caractère. Utilisez une fonction qui sélectionne une position par un index dans une liste.

2. Pour savoir comment une position a été fermée, l'énumérationENUM_DEAL_REASON doit être consultée dans OnTradeTransaction.

Exemple avec ENUM_DEAL_REASON :

Stop Loss Take Profit

Si la fermeture se fait par Stop loss - doublez le volume, si par Take Profit - fixez le volume minimum. Pour détecter que la transaction a eu lieu suite au déclenchement du Stop Loss ou du Take Profit, utilisez OnTradeTransaction. À partir de la version 1625, il existe une belle énumération ENUM_DEAL_REASON : ENUM_DEAL_REASON Description DEAL_REASON_SL Opération réalisée à la suite du déclenchement du Stop Loss DEAL_REASON_TP Opération réalisée à la suite du déclenchement du Take Profit... qui peuvent être suivis dans OnTradeTransaction. En d'autres termes, vous pouvez maintenant déterminer facilement et surtout de manière fiable que cette transaction était le résultat du déclenchement du Take Profit ou du Stop Loss. Pour le moment (build 1626), cet EA ne peut être testé qu'en direct - soit sur un graphique, soit en mode débogage avec des données réelles (F5 dans MetaEditor). J'ai également appliqué une solution de contournement pour le moment : Déterminer ce qui a déclenché : Take Profit ou Stop Loss dans la procédure OnTradeTransaction : if (deal_symbol==m_symbol...

CodeBase | 2017.07.13 07:42 |Vladimir Karputov| EAs | MetaTrader 5

 

Est-il possible d'entrer les données de connexion du compte dans un programme tiers et de gérer le compte et, vous savez, d'ouvrir/fermer des positions?

Ou est-ce uniquement par le biais d'un robot installé sur le compte ?

 

Je transfère des indicateurs de MQL4 vers MQL5, question sur les tampons et les "plots". L'indicateur a 2 buffers et 1 plot :

#property indicator_buffers 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS) ;
SetIndexBuffer(1,Array2,INDICATOR_DATA) ;


Si le premier tampon est utilisé pour les calculs, etc., et que le second doit être tracé, alors

D'abord, est-il nécessaire de définir DRAW_NONE pour le premier tampon s'il est déjà défini comme INDICATOR_CALCULATIONS dans la fonction SetIndexBuffer() ?

PlotIndexSetInteger( ?,PLOT_DRAW_TYPE,DRAW_NONE) ;

Deuxièmement, quel indice dois-je définir dans PlotIndexSetInteger() au lieu du point d'interrogation (?) si seul le deuxième tampon doit être dessiné ?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM) ;


Troisièmement, si j'utilise deux styles de type DRAW_HISTOGRAM, je peux définir une couleur pour chacun d'eux et obtenir un histogramme comme dans l'indicateur Volumes, où les barres vertes et rouges alternent, mais si j'utilise DRAW_HISTOGRAM2, puis-je définir deux couleurs pour une barre également ou une seule couleur est définie pour ce style ?

 
The_Sheikh:

Je transfère des indicateurs de MQL4 vers MQL5, question sur les tampons et les "plots". L'indicateur a 2 buffers et 1 plot :

#property indicator_buffers 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS) ;
SetIndexBuffer(1,Array2,INDICATOR_DATA) ;


Si le premier tampon est utilisé pour les calculs, etc., et que le second doit être tracé, alors

D'abord, est-il nécessaire de définir DRAW_NONE pour le premier tampon s'il est déjà défini comme INDICATOR_CALCULATIONS dans la fonction SetIndexBuffer() ?

PlotIndexSetInteger( ?,PLOT_DRAW_TYPE,DRAW_NONE) ;

Deuxièmement, quel indice dois-je définir dans PlotIndexSetInteger() au lieu du point d'interrogation (?) si seul le deuxième tampon doit être dessiné ?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM) ;


Troisièmement, si j'utilise deux styles de type DRAW_HISTOGRAM, je peux définir une couleur pour chacun d'eux et obtenir un histogramme comme dans l'indicateur Volumes, où les barres vertes et rouges alternent, mais si j'utilise DRAW_HISTOGRAM 2, puis-je définir deux couleurs pour une barre également ou une seule couleur est définie pour ce style ?

Pourquoi es-tu si dur avec toi-même ? Quel est le problème d'attribuer d'abord les tampons d'affichage, puis les tampons auxiliaires ?

Pour DRAW_HISTOGRAМ2 3 tampons sont définis et la séquence est obligatoire, 2 tampons de valeur d'abord, suivis d'un tampon de couleur. Mais il existe une différence entre DRAW_HISTOGRAM et DRAW_HISTOGRAM2 : DRAW_HISTOGRAM est dessiné de zéro à la valeur du tampon, tandis que DRAW_HISTOGRAM2 est dessiné de la valeur d'un tampon à la valeur d'un autre tampon.

Raison: