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

 
User_mt5:

Vladimir Karputov, et moi ?)

Je ne peux pas en être sûr, mais essayez la version 0.0.


Ajouté : Il semble que vous ne pouvez pas annuler 'INDICATOR_MINIMUM' et 'INDICATOR_MAXIMUM' avec MQL5.

 
Vladimir Karputov:

Je ne peux pas en être sûr, mais essayez la version 0.0.


Ajouté : Il semble que 'INDICATOR_MINIMUM' et 'INDICATOR_MAXIMUM' ne peuvent pas être annulés par MQL5.

Hélas...

Je vous remercie de votre réponse.

(même problème avec les niveaux, en fait ; mais résolu en fixant le nombre de niveaux)

 
User_mt5:

Hélas...

Merci pour la réponse.

(Le problème des niveaux est en fait le même, mais il est résolu en fixant le nombre de niveaux).

Expérimentez et tout se passera bien.

 
User_mt5:


J'ai comparé les propriétés que le graphique enregistre (en utilisant l'indicateur'Stochastic Oscillator' comme exemple).



<indicator>
name=Stochastic Oscillator
path=
apply=0
show_data=1
scale_inherit=0
scale_line=0
scale_line_percent=50
scale_line_value=0.000000
scale_fix_min=1
scale_fix_min_val=0.000000
scale_fix_max=1
scale_fix_max_val=100.000000
expertmode=0
fixed_height=-1


<indicator>
name=Stochastic Oscillator
path=
apply=0
show_data=1
scale_inherit=0
scale_line=0
scale_line_percent=50
scale_line_value=0.000000
scale_fix_min=0
scale_fix_min_val=-10.500000
scale_fix_max=0
scale_fix_max_val=110.500000
expertmode=0
fixed_height=-1


Il s'agit clairement d'une propriété de type "bool", mais il n'y a pas d'accès à cette propriété depuis le langage MQL5.

 
Vladimir Karputov:

J'ai comparé les propriétés que le graphique enregistre (en utilisant l'indicateur'Stochastic Oscillator' comme exemple).

Il s'agit clairement d'une propriété de type "bool" mais il n'y a pas d'accès à cette propriété depuis MQL5.

Oui, hélas.

Merci encore)

 

Il y a un problème. En utilisant la fonction (voir ci-dessous), nous pouvons obtenir les valeurs TakeProfit et StopLoss par ID de position à partir de l'historique (c'est-à-dire quand la position est déjà fermée), cette fonction fonctionne en temps réel, mais dans le testeur de stratégie, il ne peut pas trouver TakeProfit et StopLoss, parce qu'il ne voit pas les ordres historiques qui fixent des stops (il est important que les stops soient fixés après l'ouverture de la position)

Question : Comment puis-je utiliser le testeur de stratégie pour trouver le TP/Loss d'une position fermée sur la base d'un ticket ?

#include <Trade\DealInfo.mqh>
#include <Trade\HistoryOrderInfo.mqh>

CDealInfo deal;
CHistoryOrderInfo ord;


void GetPosStops(ulong ticket, int& tp, int& sl, double& lot){
   HistorySelectByPosition(ticket);
   tp=0;sl=0;
   double open=0, tp_=0, sl_=0;
   string symbol="";
   ENUM_DEAL_TYPE type=-1;
   for(int i=0; i<HistoryDealsTotal(); i++){
      if(!deal.SelectByIndex(i))continue;
      if(deal.Entry() ==DEAL_ENTRY_IN){
         open=deal.Price();
         symbol=deal.Symbol();
         type=deal.DealType();
         lot=deal.Volume();
         break;
      }
   }
   for(int i=0; i<HistoryOrdersTotal(); i++){
      if(!ord.SelectByIndex(i))continue;
      if(tp_==0)tp_=ord.TakeProfit();
      if(sl_==0)sl_=ord.StopLoss();
      if(tp_>0 && sl_>0)break;
   }
   if(symbol !=""){
      double coef=type==DEAL_TYPE_BUY ? 1:-1;
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      if(tp_>0 && coef*tp_>coef*open)
         tp=(int)(MathAbs(tp_-open)/point);
      if(sl_>0 && coef*sl_<coef*open)
         sl=(int)(MathAbs(sl_-open)/point);   
   }
}
 
Bonjour à tous !
Je suis en train d'essayer de programmer des EA, et je veux commencer par écrire un collecteur de spreads statistiques.
Je veux dire, qu'est-ce que je voudrais qu'il fasse ? Dans le testeur, un EA démarre et collecte des données sur l'historique des ticks pendant une certaine période, par exemple dix jours.
Et ensuite, il génère les données suivantes dans un fichier csv ou xlsx :
Écart moyen pour une période de temps : 00:00 - 09:00 sur le serveur, 09:00 - 18:00, 18:00 - 00:00 (pour les dix jours), écart maximum pour cette période, écart minimum et écart moyen de la paire de devises pour toute la période de dix jours.
Je suis vraiment fatigué de collecter ces données manuellement.

Je sais qu'il existe des programmes qui le font eux-mêmes... Mais je veux le mien, comme entraînement.
Peut-être que des connaisseurs respectés peuvent me dire par où commencer ? Et est-il même possible d'écrire un tel programme ?

Merci d'avance à tous ceux qui ont répondu et qui ont été compréhensifs envers un nouveau venu.
 

Bonjour à tous. Peut-être que quelqu'un a un morceau de code prêt. Il y a 2 paramètres, dépôt=3000 et lot 0.01 c.-à-d. avec le dépôt 3000 le lot sera 0.01, maintenant strictement au doublement c.-à-d. quand le dépôt sera 6000 le lot sera 0.02 à 9000 sera 0.03 comment faire ?

 
Pavel Komarovsky:

Bonjour à tous. Peut-être que quelqu'un a un morceau de code prêt. Il y a 2 paramètres, dépôt=3000 et lot 0.01 c.-à-d. avec le dépôt 3000 le lot sera 0.01, maintenant strictement au doublement c.-à-d. quand le dépôt sera 6000 le lot sera 0.02 à 9000 sera 0.03 comment faire ?

C'est à peu près comme ça :

//+------------------------------------------------------------------+
//|                                                     Script 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double start_deposit=3000;
   double start_lot=0.01;
   double deposit=start_deposit;
   for(int i=0; i<10; i++)
     {
      
      double d=MathFloor(deposit/start_deposit);
      Print(i,"#: ,deposit ",DoubleToString(deposit,2),", d ",DoubleToString(d*start_lot,2));
      //---
      deposit=deposit+start_deposit*0.55;
     }
  }
//+------------------------------------------------------------------+

Résultat :

2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    0#: ,deposit 3000.00, d 0.01
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    1#: ,deposit 4650.00, d 0.01
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    2#: ,deposit 6300.00, d 0.02
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    3#: ,deposit 7950.00, d 0.02
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    4#: ,deposit 9600.00, d 0.03
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    5#: ,deposit 11250.00, d 0.03
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    6#: ,deposit 12900.00, d 0.04
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    7#: ,deposit 14550.00, d 0.04
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    8#: ,deposit 16200.00, d 0.05
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    9#: ,deposit 17850.00, d 0.05
Dossiers :
Script_1.mq5  3 kb
 

Bon moment,

S'il vous plaît, aidez-moi à trouver un bug... Je copie les valeurs des barres (BarsCount) depuis le tampon de l'indicateur dans le script, puis je boucle autour des valeurs, je détecte un signal et je les imprime avec Print() ; cela semble simple, mais ce n'est pas si facile... J'obtiens tous les signaux comme je le voulais, sauf le franchissement de la ligne zéro.

CROSSOVER_OR_REVERSE

Peut-être que le script ne devrait pas le faire de cette façon ? J'ai joint le code et une capture d'écran du journal... Merci beaucoup !

//+------------------------------------------------------------------+
//|                                                B_O_P_Signals.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
enum enMaTypes
  {
   ma_sma,    // Simple moving average
   ma_ema,    // Exponential moving average
   ma_smma,   // Smoothed MA
   ma_lwma    // Linear weighted MA
  };
  
input int       inpSmoothPeriod = 14;       // Result smoothing period
input enMaTypes inpSmoothMethod =  ma_sma;  // Result smoothing type
input double    inpLevelUp      =  0.2;     // Level up
input double    inpLevelDown    = -0.2;     // Level down
input int       BarsCount       = 100;

double Mid_line[1] = {0.0};
int handle=0;
double TREND_VAL[];

void OnStart()
  {
      handle = iCustom(_Symbol,PERIOD_CURRENT,"Balance of Market Power",inpSmoothPeriod,inpSmoothMethod,inpLevelUp,inpLevelDown);
      
      CopyBuffer(handle,2,0,BarsCount,TREND_VAL);
      
      ArraySetAsSeries(TREND_VAL,true);
      
      string Signal ="";
      
        for (int i=ArraySize(TREND_VAL)-1; i>=0; i--)
        {
           int k=1;
            if(TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] > Mid_line[0] && TREND_VAL[i] > inpLevelUp)
            
               Signal = "TREND_UP";
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] > Mid_line[0] && TREND_VAL[i] < inpLevelUp)
            
               Signal = "TREND_UP_ROLLBACK_OR_FLAT";
            else if(TREND_VAL[i] >= Mid_line[0] && TREND_VAL[i+k] <= Mid_line[0])
            
               Signal ="CROSSOVER_OR_REVERSE_UP";
            
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] < Mid_line[0] && TREND_VAL[i] < inpLevelDown)
            
               Signal = "TREND_DN";
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] < Mid_line[0] && TREND_VAL[i] > inpLevelDown)
            
               Signal = "TREND_DN_ROLLBACK_OR_FLAT";
            else if(TREND_VAL[i] < Mid_line[0] && TREND_VAL[i+k] > Mid_line[0])
            
               Signal = "CROSSOVER_OR_REVERSE_DN";
            else Signal = "UNKNOWN_SIGNAL";
            
            Print(string(i),"_", Signal);
        }
      
   
  }
//+------------------------------------------------------------------+
Dossiers :
Question.png  150 kb