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

 
Renat Akhtyamov:

La seule chose à considérer ici est qu'après le bloc de la boucle i==x

Dans ce cas, Array[i] après for(...){} retournera une erreur de dépassement de tableau et c'est tout.

En faisant cela, vous créez un terrain fertile pour d'éventuelles erreurs, par exemple, si plus loin dans le code vous avez une variable j, et que vous l'appelez accidentellement i. Ou vous pouvez écrire [i] au lieu de l'indice de tableau [1] et ainsi de suite.
Je n'ai pas écrit ici sur un code particulier, mais sur un exemple de ce qu'il pourrait être. Il se peut fort bien qu'il n'y ait pas de limites de tableau et que l'erreur soit difficile à détecter, et vous passerez de précieuses minutes (voire des heures) à la localiser.
 

(J'ai besoin d'un indice, parce que je commence à avoir du retard)

Il y a une construction comme ça :

int RangeBar = 10;
 HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
 LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

Il trouve lehaut/basde la fourchette en N bougies.

Question : Comment trouver le mêmeHigh/Low, mais pas par les ombres, mais par les corps ?

 
Vitaly Muzichenko:

(J'ai besoin d'un indice, parce que je commence à avoir du retard)

Il y a une construction comme ça :

int RangeBar = 10;
 HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
 LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

Il trouve lehaut/basde la fourchette en N bougies.

Question : Comment trouver le mêmeHigh/Low, mais pas par les ombres, mais par les corps ?

Je dois trouver fmax(Open[i],Close[i]) pour le haut et fmin(Open[i],Close[i]) pour le bas de la bougie.
 
Artyom Trishkin:
Je dois rechercher fmax(Open[i],Close[i]) pour le haut et fmin(Open[i],Close[i]) pour le bas.

C'est-à-dire, faire une boucle au lieu de deux lignes cherchant le High/Low ?

HighRange =iHigh(symbole,0,iHighest(symbole,0,MODE_HIGH,RangeBar,1)) ;

LowRange =iLow(symbole,0,iLowest(symbole,0,MODE_LOW,RangeBar,1))

Ceci est nécessaire pour l'EA, pas l'indicateur, il fonctionne correctement dans l'EA, mais comment trouver la gamme par les corps - je ne peux pas penser à un.

 
Vitaly Muzichenko:

C'est-à-dire, faire une boucle au lieu de deux lignes cherchant le High/Low ?

HighRange =iHigh(symbole,0,iHighest(symbole,0,MODE_HIGH,RangeBar,1)) ;

LowRange =iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

J'en ai besoin pour Expert Advisor, pas pour un indicateur, il fonctionne correctement dans Expert Advisor, mais je n'arrive pas à trouver comment trouver la plage par corps.

J'ai lancé un script de test. Il se peut que ce soit inexact, je n'ai pas travaillé dessus. J'espère que vous trouverez la solution.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.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 script_show_inputs
//--- input parameters
input int      Begin=1;       // Бар начала диапазона поиска
input int      RangeBars=20;  // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates array[];
   double   high=0, low=0;
   int      highest=-1, lowest=-1;
   if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)>0) {
      ArraySetAsSeries(array,true);
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   high=DBL_MIN;
   bar_highest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmax(array[i].open,array[i].close);
      if(value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   low=DBL_MAX;
   bar_lowest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmin(array[i].open,array[i].close);
      if(value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return(low);
}
//+------------------------------------------------------------------+
Si vous avez des questions, n'hésitez pas à les poser...
 
Artyom Trishkin:

J'ai mis en place un script de test. Il peut y avoir des inexactitudes - je l'ai écrit sur le vif. J'espère que vous y arriverez.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
Si vous avez besoin de quelque chose, demandez...

Merci, ça marche très bien !

PS. J'ai cru comprendre que cette chose fonctionnera dans la cinquième ?

 
Vitaly Muzichenko:

Merci, ça marche très bien !

PS. J'en déduis que cette chose fonctionnera dans la cinquième ?

Ouais. J'essaie de faire du code multiplateforme. Ou avec des modifications minimales pour la cinquième.
 
J'ai une très mauvaise main. Veuillez m'aider à ajouter un stop loss pour la vente (slevel).
int start()
{
//+--------------------------------------------------------------------+
//|   -= stop loss в без убыток =-                                      |
//+--------------------------------------------------------------------+
bool   result;
double stop;
int    cmd,error;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderProfit()>pOPCS)
{
cmd=OrderType();
double blevel=OrderStopLoss()<Bid-Point*TS;
double slevel=OrderStopLoss()>Ask+Point*TS;
//---
if(cmd==OP_BUY || cmd==OP_SELL)
{
while(true)
{
if(cmd==OP_BUY && blevel) stop=Bid-Point*TS;
else                      stop=Ask+Point*TS;
result=OrderModify(OrderTicket(),OrderOpenPrice(),stop,0,0,Orange);
if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
else error=0;
if(error==135) RefreshRates();
else break;
}
}
}
}
 
Artyom Trishkin:

J'ai joint un script de test. C'est peut-être inexact, je n'ai pas travaillé ma main. J'espère que vous le comprendrez.

Si vous avez des questions...

Désolé Artem, mais je veux montrer la solution à ce problème d'une manière plus simple.

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

J'espère que chacun pourra l'écrire dans son code et ajouter les vérifications nécessaires. La fonctionnalité est la même pour mql4 et mql5.

 
Alexey Viktorov:

Désolé, Artem, mais je veux montrer une solution plus simple à ce problème.

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

J'espère que chacun pourra l'écrire dans son code et ajouter les vérifications nécessaires. La fonctionnalité est la même pour mql4 et mql5.

О ! Merci. Je ne l'ai pas deviné moi-même le matin... C'est vrai, les tableaux devraient être vérifiés pour le remplissage. Je ne l'ai pas vu dans le quadruple, et dans le quintuple, les données ne sont souvent pas renseignées la première fois en raison du manque de données historiques.

ZS. Vous devriez dormir davantage - vos pensées iront dans ce sens.

Raison: