Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 3

 
Artyom Trishkin:
Nous devons regarder plus profondément...

Plus profond, où est-ce que c'est?

Toutes les tentatives, avec le nouvel indicateur, aboutissent à un blocage.

Et avec l'indicateur, qui est inchangé, il y a un hoquet momentané.

Quelle pourrait être la solution ?

 
mila.com:

Plus profond, où est-ce que c'est?

Toutes les tentatives, avec le nouvel indicateur, aboutissent à un raccrochage.

Et avec l'indicateur inchangé, il y a un hoquet momentané.

Quelle pourrait être la solution ?

Dans votre indicateur - au lieu d'utiliser les données d'autres indicateurs personnalisés, en particulier - recherchez des fractales de n'importe quelle dimension, créez simplement une fonction pour rechercher de telles fractales et travaillez avec elles.
 
Artyom Trishkin:
Il suffit de créer des fonctions permettant de trouver ces fractales et de travailler avec elles.

Pour vous, c'est une chose simple à faire).

mais pour moi, c'est une tâche impossible.

Une fonction comme celle-ci ?


bool isDnFractal(int bar,int max,const double &low[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && low[bar]>low[bar-i])    return(false);
      if(i<=rightSide && low[bar]>=low[bar+i])  return(false);
      }
//---
   return(true);
  }

C'est une fractale inférieure.

Comment l'utiliser ?

 
mila.com:

Pour vous, c'est plus facile à faire).

Mais pour moi, c'est une tâche impossible.

Comment implanter la fonction de cet indicateur dans le mien ?


bool isDnFractal(int bar,int max,const double &low[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && low[bar]>low[bar-i])    return(false);
      if(i<=rightSide && low[bar]>=low[bar+i])  return(false);
      }
//---
   return(true);
  }

Eh bien, vous en avez besoin pour retourner le prix d'une fractale sur la barre requise. Ici, j'ai fait un indicateur simple. Il possède deux fonctions que vous pouvez reprendre et utiliser dans les vôtres - je les ai spécialement organisées comme des fonctions - avec des contrôles pour les valeurs invalides.

//+------------------------------------------------------------------+
//|                                             iFreeNumFractals.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpperFractal
#property indicator_label1  "UpperFractal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot LowerFractal
#property indicator_label2  "LowerFractal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSteelBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input          int      LeftNum=2;     // Количество баров слева
int leftNum;     // Количество баров слева
input          int      RightNum=2;    // Количество баров справа
int rightNum;    // Количество баров справа
//--- indicator buffers
double         BufferUpperFractal[];
double         BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUpperFractal);
   SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,159);
   PlotIndexSetInteger(1,PLOT_ARROW,159);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
//---
   leftNum=(LeftNum<1?1:LeftNum);
   rightNum=(RightNum<1?1:RightNum);
//---
   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[])
  {
//---
   if(rates_total<leftNum+rightNum) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>0) {
      ArrayInitialize(BufferUpperFractal,0.0);
      ArrayInitialize(BufferUpperFractal,0.0);
      limit=rates_total-leftNum-1;
      }
   //---
   for(int i=limit; i>rightNum; i--) {
      if(GetFreeUpperFractal(i,limit,high,leftNum,rightNum)>0) BufferUpperFractal[i]=high[i];
      if(GetFreeLowerFractal(i,limit,low ,leftNum,rightNum)>0) BufferLowerFractal[i]=low[i];
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(int shift,const int limit,const double &low[],int left_dimension=2,int right_dimension=2) {
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>limit-1) return(-1);
   for(int i=shift; i>shift-right_dimension; i--) if(low[i]>low[i-1]) return(-1);
   for(int i=shift; i<shift+left_dimension; i++)  if(low[i]>low[i+1]) return(-1);
   return(low[shift]);
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(int shift,const int limit,const double &high[],int left_dimension=2,int right_dimension=2) {
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>limit-1) return(-1);
   for(int i=shift; i>=shift-right_dimension; i--) if(high[i]<high[i-1]) return(-1);
   for(int i=shift; i<=shift+left_dimension; i++)  if(high[i]<high[i+1]) return(-1);
   return(high[shift]);
}
//+----------------------------------------------------------------------------+
 

Pour détacher complètement les fonctions permettant d'obtenir des fractales arbitraires de l'indicateur, nous ne devons pas passer par référence les tableaux high[] et low[] et la valeur limite dans ceux-ci.

Comme notre code est très proche de MQL5, nous devrons refuser les fonctions High[], Low[], iHigh() et iLow(). Voici comment cela se présente dans cet indicateur :

//+------------------------------------------------------------------+
//|                                             iFreeNumFractals.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpperFractal
#property indicator_label1  "UpperFractal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot LowerFractal
#property indicator_label2  "LowerFractal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSteelBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input          int      LeftNum=2;     // Количество баров слева
int leftNum;     // Количество баров слева
input          int      RightNum=2;    // Количество баров справа
int rightNum;    // Количество баров справа
//--- indicator buffers
double         BufferUpperFractal[];
double         BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUpperFractal);
   SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   // PlotIndexSetInteger(0,PLOT_ARROW,217);
   // PlotIndexSetInteger(1,PLOT_ARROW,218);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
//---
   leftNum=(LeftNum<1?1:LeftNum);
   rightNum=(RightNum<1?1:RightNum);
//---
   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[])
  {
//---
   if(rates_total<leftNum+rightNum) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>0) {
      ArrayInitialize(BufferUpperFractal,0.0);
      ArrayInitialize(BufferUpperFractal,0.0);
      limit=rates_total-leftNum-1;
      }
   //---
   for(int i=limit; i>rightNum; i--) {
      if(GetFreeUpperFractal(Symbol(),PERIOD_CURRENT,i,leftNum,rightNum)>0) BufferUpperFractal[i]=high[i];
      if(GetFreeLowerFractal(Symbol(),PERIOD_CURRENT,i,leftNum,rightNum)>0) BufferLowerFractal[i]=low[i];
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   for(int i=shift; i>shift-right_dimension; i--) if(GetPriceLow(symbol_name,timeframe,i)>GetPriceLow(symbol_name,timeframe,i-1)) return(-1);
   for(int i=shift; i<shift+left_dimension; i++)  if(GetPriceLow(symbol_name,timeframe,i)>GetPriceLow(symbol_name,timeframe,i+1)) return(-1);
   return(GetPriceLow(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   for(int i=shift; i>=shift-right_dimension; i--) if(GetPriceHigh(symbol_name,timeframe,i)<GetPriceHigh(symbol_name,timeframe,i-1)) return(-1);
   for(int i=shift; i<=shift+left_dimension; i++)  if(GetPriceHigh(symbol_name,timeframe,i)<GetPriceHigh(symbol_name,timeframe,i+1)) return(-1);
   return(GetPriceHigh(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetPriceHigh(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyHigh(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
double GetPriceLow(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyLow(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
Cependant, nous devons également vérifier la présence de -1 à partir des fonctions GetPriceHigh() et GetPriceLow().
 
Bonjour, conseillez moi comment faire un EA utilisant un cadre temporel de 15 minutes pour vérifier la valeur toutes les 20 minutes, disons à 9-20, 9-40 suivi d'un croisement RSI et si le niveau est franchi en vingt minutes, vérifier le changement de prix. C'est ce que je dois réparer :
if (Hour()==9 && (Minute() == 20) && (RSI>70))
Price2==Bid;
     {
      if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
  
         {
          ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
          return(0);
         }
     }

Autrement dit, disons qu'à 9-20, le RSI a été franchi. Je veux que mon EA se souvienne du prix à 9-20 et à 9-40 vérifie les 20 dernières minutes par rapport au prix à 9-20. Si elle baisse, elle ouvrira une position courte. Merci beaucoup.
 
strongflex:
Bonjour, je vous conseille de faire un conseiller expert utilisant un cadre temporel de 15 minutes pour vérifier la valeur toutes les 20 minutes, disons à 9-20, 9-40 suivi d'un croisement RSI et si le niveau est franchi en vingt minutes, vérifié le changement de prix. C'est ce que je dois réparer :
if (Hour()==9 && (Minute() == 20) && (RSI>70))
Price2==Bid;
     {
      if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
  
         {
          ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
          return(0);
         }
     }

Autrement dit, disons qu'à 9-20, le RSI a été franchi. Je veux que mon EA se souvienne du prix à 9-20 et à 9-40 vérifie les 20 dernières minutes par rapport au prix à 9-20. Si elle baisse, elle ouvrira une position courte. Merci beaucoup.

:)

Et si vous exécutez le conseiller expert à 9.22 ?

Et s'il y a une défaillance du système ou du terminal ? Le prix sera perdu.

C'est-à-dire qu'il faut chercher ce qui était il y a 20 minutes au moment de ce contrôle. Le moment est venu où les minutes sont supérieures ou égales à un multiple de vingt - vérifiez l'état du RSI sur la barre, qui était il y a 20 minutes. S'il a le bon croisement, alors procédez comme prévu...

Cependant, sur M15, vous ne pouvez pas déterminer le moment exact du passage et le prix exact, mais vous pouvez regarder le prix sur M1 - au moins 15 fois plus précis.

 
Artyom Trishkin:

:)

Et si vous exécutez l'EA à 9.22 ?

Que se passe-t-il en cas de défaillance du système ou du terminal ? Le prix sera perdu.

C'est-à-dire qu'il faut chercher ce qui était il y a 20 minutes au moment de ce contrôle. Le moment est venu où les minutes sont supérieures ou égales à un multiple de vingt - vérifiez l'état du RSI sur la barre, qui était il y a 20 minutes. S'il a le croisement souhaité, alors nous procédons comme prévu...

Cependant, sur M15, vous ne pouvez pas déterminer le moment exact du passage et le prix exact, mais vous pouvez regarder le prix sur M1 - au moins 15 fois plus précis.

Ok, j'ai compris que je ne peux pas le faire))) Les gars, qui peut écrire cette partie du code ? Je paierai 1000 roubles.
 
strongflex:
Ok, je comprends que je ne peux pas y faire face)))) gars qui peuvent écrire cette partie du code ? Je vais payer 1000 roubles
double rci20 = iRSI(NULL,PERIOD_M1,14,PRICE_CLOSE,20);//RCI 20 минут назад.
   Comment("RSI = ",rci20);

Et où sont les mille ?

(je plaisante)

 
Alekseu Fedotov:
double rci20 = iRSI(NULL,PERIOD_M1,14,PRICE_CLOSE,20);//RCI 20 минут назад.
   Comment("RSI = ",rci20);

Et où sont les mille ?

(plaisanterie)

La durée du RSI doit être de 15 minutes. Nous avons besoin que l'EA le vérifie toutes les 20 minutes à partir de l'ouverture du marché (9-00, 9-20, 9-40 etc.). Disons qu'à 10-20, il y a un croisement entre le niveau 70 et le niveau inférieur, il se souvient du prix et à 10-40, il vérifie si le prix est inférieur à celui de 10-20, il ouvre une position courte.
Raison: