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

 
Artyom Trishkin:

J'ai vu un morceau de votre code pour trouver des sommets en zigzag - je pense qu'il provient d'Igor Kim. Ici, dans le code de recherche d'extremum, on insère en plus l'économie du temps d'extremum trouvé. Vous le cherchez dans la boucle... Pour l'identifier, il faut se souvenir du moment où l'indice de la boucle indique que l'extremum est déjà identifié - avant de renvoyer la valeur de son prix. C'est-à-dire que l'on passe en plus la variable datetime par référence dans la fonction où l'on doit écrire l'heure à laquelle on a trouvé l'extremum du zigzag. Lorsque la fonction renvoie la valeur du prix, elle écrit en plus dans cette variable la valeur de l'heure d'ouverture de la barre où se trouve l'extremum requis du zigzag.

Je suis désolé, mais je suis loin de mon ordinateur de travail et je ne peux pas vous donner un exemple de code.

Tout s'est arrangé, merci !
 
Bonjour ! Je fais un peu d'écriture en MQL4, mais je ne suis pas très bon en MQL5. J'ai besoin d'une petite aide pour calculer la différence entre le haut et le bas de la journée. La 4ème version possède de bonnes fonctions à cet effet : iHigh et iLow, mais elles sont absentes ici. J'ai essayé d'utiliser copyHigh et copyLow, mais j'obtiens beaucoup d'erreurs après avoir soustrait la valeur minimale de la valeur maximale. Pourriez-vous me dire comment résoudre ce problème, de préférence avec un extrait de code. Merci d'avance !
 
Александр Богданов:
Bonjour ! Je fais un peu d'écriture en MQL4, mais je ne suis pas très bon en MQL5. J'ai besoin d'une petite aide pour calculer la différence entre le haut et le bas de la journée. La 4ème version possède de bonnes fonctions à cet effet : iHigh et iLow, mais elles sont absentes ici. J'ai essayé d'utiliser copyHigh et copyLow, mais j'obtiens beaucoup d'erreurs après avoir soustrait la valeur minimale de la valeur maximale. Pourriez-vous me dire comment résoudre ce problème, de préférence avec un extrait de code. Merci d'avance !
Vous feriez mieux de me montrer votre fragment de code avec beaucoup d'erreurs et d'obtenir un tas de commentaires sur ce qui ne va pas.
 
Александр Богданов:
Bonjour, j'écris un peu en MQL4, mais je suis un zéro complet en MQL5. J'avais besoin d'écrire une petite aide pour calculer la différence entre le haut et le bas de la journée. La 4ème version possède de bonnes fonctions à cet effet : iHigh et iLow, mais elles sont absentes ici. J'ai essayé d'utiliser copyHigh et copyLow, mais j'obtiens beaucoup d'erreurs après avoir soustrait la valeur minimale de la valeur maximale. Pourriez-vous me dire comment résoudre ce problème, de préférence avec un extrait de code. Merci d'avance !
Insérez-le au début du code

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

Test des "CopyTicks".

fxsaber, 2016.10.19 07:59

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
Cela vous permet d'utiliser iHigh et iLow comme vous en avez l'habitude dans MT5.
 
fxsaber:
fxsaber:
Insérez ceci au début du code
Cela vous permettra d'utiliser les familiers iHigh et iLow dans MT5.
Merci beaucoup ! Cela rendra très facile
 
Александр Богданов:
Bonjour ! Je fais un peu d'écriture en MQL4, mais je ne suis pas familier avec MQL5. J'ai besoin d'une petite aide pour calculer la différence entre le haut et le bas de la journée. La 4ème version possède de bonnes fonctions à cet effet : iHigh et iLow, mais elles sont absentes ici. J'ai essayé d'utiliser copyHigh et copyLow, mais j'obtiens beaucoup d'erreurs après avoir soustrait la valeur minimale de la valeur maximale. Pourriez-vous me dire comment résoudre ce problème, de préférence avec un extrait de code. Merci d'avance !

Si la tâche consiste uniquement à afficher sur l'écran, la meilleure solution est un indicateur. L'indicateur, dans OnCalculate() a toutes les séries temporelles nécessaires :

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

Par défaut, dans l'indicateur MQL5, la barre la plus à droite a l'indice rates_total-1. Et votre tâche se résume à une soustraction élémentaire :

   double difference=high[rates_total-1]-low[rates_total-1];


Cependant, cette approche simple ne s'affichera correctement que si l'indicateur fonctionne sur l'échelle de temps D1. S'il est exécuté sur d'autres horizons temporels, alors CopyHigh et CopyLow doivent être utilisés - en gros, rien de compliqué.

Maintenant je vais écrire un exemple....

//+------------------------------------------------------------------+
//|                                               High minus Low.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//--- input parameter
input ENUM_TIMEFRAMES period=PERIOD_D1;   // для какого периода считать High-Low
//---
double multiplier=0.0;
double High[],Low[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   multiplier=MathPow(10,Digits());
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- разницу цен переводим в пункты
   double difference=(iHigh(Symbol(),period,0)-iLow(Symbol(),period,0))*multiplier;
//--- вывод результата на экран
   Comment("High-Low=",DoubleToString(difference,0));
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Получим Low для заданного номера бара                            |
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+
//| Получим High для заданного номера бара                           |
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+


Vous pouvez maintenant exécuter l'indicateur sur n'importe quelle période du symbole actuel et choisir pour quelle période calculer la différence entre le haut et le bas.
Dossiers :
 
Александр Богданов:
Bonjour ! Je fais un peu d'écriture en MQL4, mais je ne suis pas très bon en MQL5. J'ai besoin d'une petite aide pour calculer la différence entre le haut et le bas de la journée. La 4ème version possède de bonnes fonctions à cet effet : iHigh et iLow, mais elles sont absentes ici. J'ai essayé d'utiliser copyHigh et copyLow, mais j'obtiens beaucoup d'erreurs après avoir soustrait la valeur minimale de la valeur maximale. Pourriez-vous me dire comment résoudre ce problème, de préférence avec un extrait de code. Merci d'avance !
Si vous voulez obtenir les hauts et les bas quotidiens (hauts et bas de la journée en cours), vous pouvez utiliser SymbolInfoDouble() avec les identifiants SYMBOL_BIDHIGH et SYMBOL_BIDLOW (ou tout autre, selon votre préférence).
 
Bonjour 2016.10.21_19:58 MSC. Vérification de l'EA dans le testeur de stratégie. L'EA fonctionne, ouvre et ferme une transaction. Mais le testeur de stratégie donne une erreur : position de départ incorrecte 0 pour la fonction ArrayMinimum ; -1 ; tableau hors de portée dans 'CLose.mqh' (86,59) ; le test s'est arrêté à cause d'une erreur critique dans l'EA. Il y a une capture d'écran du conseiller expert et le code du fichier CLose.mqh à activer. Je ne vois pas d'erreur en dehors du tableau dans ce code. C'est pourquoi je ne comprends pas quelle est l'erreur. S'il vous plaît, conseillez-moi si vous le pouvez. C'est tout pour le moment. 20:08 MSC. Erreur critique
//+------------------------------------------------------------------+
//|                                                        CLose.mqh |
//|                                              Nickityuk N., 2016. |
//|                             https://www.mql5.com/users/nicityuk/ |
//+------------------------------------------------------------------+
#property copyright "Nickityuk N., 2016."
#property link      "https://www.mql5.com/users/nicityuk/"
#property strict
#include <Expert\OPen.mqh>
//#include <ARrayMinimum.mqh>
double AOmax,AOmax2,AOmin,AOmin2,AOm0,AOn0,z5max0,z5min0,clm,cln,AO[];
int aom,aom2,aon,aon2;
datetime ttm,ttn,hm,hn;
//+------------------------------------------------------------------+
//| Calculate for close order                                        |
//+------------------------------------------------------------------+
void CLose()
  {if(buy==0 && sell==0) {return;}
   else if(OrderType()==OP_BUY) {CloseBuy();}
        else                     CloseSell();}
//+------------------------------------------------------------------+
void St()
  {St0=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_MAIN,0);
   Si0=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_SIGNAL,0);
   St1=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_MAIN,1);
   Si1=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_SIGNAL,1);}
void CloseBuy()
  {St(); if(St0-20>0 && Si0-20>0)
           {if(St1-Si1>0 && St0-Si0<0) {AOm0=iAO(NULL,0,0);
               if(AOm0-AOm1>=0) {AOm1=iAO(NULL,0,0); return;}
               else if(St0-80>0 && St0-100<=0 && Si0-80>0)
                      {if(Si0-100<=0 && St1-Si1>0 && St0-Si0<0)
                         {TwoExtremeAO_Buy(); OneExtremeBuy(); ExpirationBuy();}
                       else return;}            
                    else return;}
            else return;}        
         else return;}
void CloseSell()
  {St(); if(St0-80<0 && Si0-80<0)
           {if(St1-Si1<0 && St0-Si0>0) {AOn0=iAO(NULL,0,0);
               if(AOn0-AOn1<=0) {AOn1=iAO(NULL,0,0); return;}
               else if(St0-20<0 && St0>=0 && Si0-20<0)
                      {if(Si0>=0 && St1-Si1<0 && St0-Si0>0)
                         {TwoExtremeAO_Sell(); OneExtremeSell(); ExpirationSell();}
                       else return;}  
                    else return;}
            else return;}        
         else return;}
//+------------------------------------------------------------------+                      
void CalculateClose()
  {v0=iVolume(NULL,PERIOD_M1,0); //--- go trading only for first tiks of new bar
   v1=iVolume(NULL,PERIOD_M1,1);
   v2=iVolume(NULL,PERIOD_M1,2);
   v3=iVolume(NULL,PERIOD_M1,3);
   v4=iVolume(NULL,PERIOD_M1,4);
   if(v0+v1+v2+v3+v4-10/12>0) return;  
   for(index=0;index<24;index++)
     {AO[index]=iAO(NULL,PERIOD_M5,index);}
   ArrayResize(AO,24,4);
   ArraySetAsSeries(AO,true);}
   //index=0; AO[index]=iAO(NULL,PERIOD_M5,index);}
//+------------------------------------------------------------------+      
void TwoExtremeAO_Buy()
  {CalculateClose();
   if(ArrayMaximum(AO,23,0)==0) return;
   else aom=ArrayMaximum(AO,23,0); AOmax=AO[aom];
   if(ArrayMinimum(AO,aom,0)>0) {aon=ArrayMinimum(AO,aom,0);}
   else return;
   if(ArrayMaximum(AO,aon,0)==0) return;
   else aom2=ArrayMaximum(AO,aon,0); AOmax2=AO[aom2];
     if(AOmax2-AOmax>0) {return;}
     else if(AOmax2-AOmax<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                {Print("OrderClose error.",GetLastError());}
                              else //index=2;
                                   //while(iFractals(NULL,0,MODE_UPPER,index)==0) {index++;}
                                   //Sleep(3000); luf=iFractals(NULL,0,MODE_UPPER,index);
                                   //SL=NormalizeDouble(luf+(Ask-Bid)+(1*_Point),_Digits);
                                   TP=NormalizeDouble(Ask-tp*_Point,_Digits);
                                   tic=OrderSend(Symbol(),OP_SELL,LotsCalculated(),Bid,50,0,TP,"",MAGIC,0,Red);
                                   AOn1=iAO(NULL,0,index); return;}
          else return;}
//+------------------------------------------------------------------+          
void TwoExtremeAO_Sell()
  {CalculateClose();
   if(ArrayMinimum(AO,23,0)==0) return;
   else aon=ArrayMinimum(AO,23,0); Print(aon,""); AOmin=AO[aon];
   if(ArrayMaximum(AO,aon,0)>0) {aom=ArrayMaximum(AO,aon,0);}
   else return;
   if(ArrayMinimum(AO,aom,0)==0) return;
   else aon2=ArrayMinimum(AO,aom,0); AOmin2=AO[aon2]; //Print(aon2,"");
     if(AOmin2-AOmin>0) {return;}
     else if(AOmin2-AOmin<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                {Print("OrderClose error.",GetLastError());}
                              else //index=2;
                                   //while(iFractals(NULL,0,MODE_LOWER,index)==0) {index++;}
                                   //Sleep(3000); ldf=iFractals(NULL,0,MODE_LOWER,index);
                                   //SL=NormalizeDouble(ldf-(1*_Point),_Digits);
                                   TP=NormalizeDouble(Bid+tp*_Point,_Digits);
                                   tic=OrderSend(Symbol(),OP_BUY,LotsCalculated(),Ask,50,0,TP,"",MAGIC,0,Blue);
                                   AOm1=iAO(NULL,0,0); return;}
          else return;}
//+------------------------------------------------------------------+                      
void OneExtremeBuy()
  {index=0;
   while(iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,1,index)==0) {index++;}
   z5max0=iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,1,index); ttm=iTime(NULL,0,index); clm=iClose(NULL,PERIOD_M5,0); //Sleep(3000);
   if((clm-(z5max0-300*Point))<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                       {Print("OrderClose error.",GetLastError());}
                                   else return;}
   else return;}
void OneExtremeSell()
  {index=0;
   while(iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,2,index)==0) {index++;}
   z5min0=iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,2,index); ttn=iTime(NULL,0,index); cln=iClose(NULL,PERIOD_M5,0); //Sleep(3000);
   if((cln-(z5min0+300*Point))>0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                       {Print("OrderClose error.",GetLastError());}
                                   else return;}
   else return;}
//+------------------------------------------------------------------+                                                                      
void ExpirationBuy()
  {hm=TimeHour(ttm); if((hm+3)-TimeCurrent()<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                                   {Print("OrderClose error.",GetLastError());}
                                                 else return;}
                     else return;}
void ExpirationSell()
  {hn=TimeHour(ttn); if((hn+3)-TimeCurrent()<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                                   {Print("OrderClose error.",GetLastError());}
                                                 else return;}
                     else return;}
//+------------------------------------------------------------------+          
 
Николай Никитюк:
Bonjour 2016.10.21_19:58 MSC. Vérification du conseiller dans le testeur de stratégie. Le conseiller travaille, ouvre et ferme une transaction. Mais le testeur de stratégie donne une erreur : position de départ incorrecte 0 pour la fonction ArrayMinimum ; -1 ; tableau hors de portée dans 'CLose.mqh' (86,59) ; le test s'est arrêté en raison d'une erreur critique dans l'EA. Il y a une capture d'écran du conseiller expert et le code du fichier CLose.mqh à activer. Je ne vois pas d'erreur en dehors du tableau dans ce code. C'est pourquoi je ne comprends pas quelle est l'erreur. S'il vous plaît, conseillez-moi si vous le pouvez. C'est tout pour le moment. 20:08 MSC.

Peut-on convertir cela en int (avec aon=NormalizeDouble(aon,0)), car cela ressemble à un double et le résultat n'est pas très clair ?

:

if(ArrayMinimum(AO,aom,0)>0) {aon=ArrayMinimum(AO,aom,0);}
 
Karputov Vladimir:

Il suffit d'entrer un paramètre d'entrée dans votre EA et, en fonction de la valeur qui lui est attribuée au démarrage, vous allez soit acheter uniquement, soit vendre uniquement :

input bool Long=true;            // allow only "Long"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
...
void OnTick()
  {
   if(!Long)
      trade.Sell(0.01);
   if(Long)
      trade.Buy(0.01);
  }
Et pour le trading manuel, que suggérez-vous ?