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

 
Alexey Viktorov:

C'est la même chose dans mql5. Il est même légèrement allongé. N'est-ce pas ce dont nous avons besoin ?

SYMBOLE_TRADE_TICK_VALUE

Valeur SYMBOL_TRADE_TICK_VALUE_PROFIT

double

SYMBOL_TRADE_TICK_VALUE_PROFIT

Valeur de tick calculée pour une position rentable

double

SYMBOLE_TRADE_TICK_VALUE_PERTE

Valeur calculée d'un tick pour une position perdante

double

SYMBOLE_TRADE_TICK_SIZE

Modification du prix minimum

double

Mince, je suis tellement bête, j'ai mis TICK_SIZE au lieu de TICK_VALUE... Je devrais aller me coucher.
 
Les gars, qu'est-ce qui ne va pas ici, aidez-moi ! ?
 
Alexey Viktorov :

La première chose qui a attiré mon attention est la séquence de tampons.

Les tampons de construction doivent TOUJOURS être exécutés en séquence. Par exemple, si les tampons de données sont les numéros 2 et 3, le tampon de couleur DOIT être le numéro 4.

Si ce n'est pas la seule erreur, nous examinerons la question plus en détail.

OK, j'ai trouvé une telle fonctionnalité dans les instructions, ici :

Guide de référence MQL5 / Indicateurs personnalisés / SetIndexBuffer
".....

boolSetIndexBuffer(
intindex,// index du tampon
doublebuffer[],// tableau
ENUM_INDEXBUFFER_TYPEdata_type// ce qui sera stocké
) ;

Paramètres

indice

[in] Numéro de tampon de l'indicateur. La numérotation commence à partir de 0. Le nombre doit être inférieur à la valeur déclarée dans #property indicator_buffers.

tampon[]

[in] Tableau déclaré dans le programme de l'indicateur personnalisé.

type de données

[Type de données stockées dans le tableau d'indicateurs. La valeur par défaut est INDICATOR_DATA (valeurs de l'indicateur calculé). Peut également prendre la valeur INDICATOR_COLOR_INDEX, ce tampon est alors destiné à stocker les indices des couleurs pour le tampon indicateur précédent. Jusqu'à 64 couleurs peuvent être spécifiées dans la ligne #property indicator_colorN. La valeur INDICATOR_CALCULATIONS signifie que ce tampon participe aux calculs intermédiaires de l'indicateur, et qu'il n'est pas destiné à être dessiné.

 

J'ai essayé de le refaire et j'ai eu encore plus de conneries. L'histogramme a complètement disparu et l'indicateur de ligne est devenu pour le moins étrange. Le signal a été coupé au-dessus de 50 et le signal principal était plus bas. Il n'y a pas de tels seuils dans le code.

 
Artyom Trishkin:

Je vous ai donné un lien pour étudier non pas l'histogramme, mais comment travailler avec le tampon de couleur. Faites abstraction de l'histogramme et concentrez-vous sur la façon dont vous devez travailler avec la couleur.

Je l'ai étudié, mais rien de nouveau, apparemment c'est (nouveau pour moi) bien sûr, évident pour tous les initiés, auto-explicatif. Je n'ai rien trouvé de nouveau, à l'exception de la fonctionnalité décrite ci-dessus de disposition mutuelle des tampons pendant l'indexation. Cette séquence respectée, a obtenu une image encore plus ringarde.

Photos ci-dessous, fichier joint

//+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3

#property indicator_type1   DRAW_COLOR_HISTOGRAM2
#property indicator_color1  clrGreen,clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1 

#property indicator_type1   DRAW_LINE       // основная
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width2  3 

#property indicator_type2   DRAW_LINE       // сигнальная
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID
#property indicator_width3  2 

//--- input parameters
input int InpKPeriod=5;  // K period
input int InpDPeriod=3;  // D period
input int InpSlowing=3;  // Slowing

//--- indicator buffers
double    ColorHistogram_2Buffer1[]; 
double    ColorHistogram_2Buffer2[]; 
double    ColorHistogram_2Colors[];
double    ExtMainBuffer[];
double    ExtSignalBuffer[];
double    ExtHighesBuffer[];
double    ExtLowesBuffer[];
color     colors[]={clrRed,clrGreen};
int       cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping

   SetIndexBuffer(0,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);  
   
   //ArraySetAsSeries(ExtMainBuffer,true);
   //ArraySetAsSeries(ExtSignalBuffer,true);
   //ArraySetAsSeries(ExtHighesBuffer,true);
   //ArraySetAsSeries(ExtLowesBuffer,true);
   //ArraySetAsSeries(ColorHistogram_2Buffer1,true);
   //ArraySetAsSeries(ColorHistogram_2Buffer2,true);
   //ArraySetAsSeries(ColorHistogram_2Colors,true);
   
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,80);
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch_HISTOGRAM("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")");
   PlotIndexSetString(3,PLOT_LABEL,"Main");
   PlotIndexSetString(4,PLOT_LABEL,"Signal");
   //PlotIndexSetString(2,PLOT_LABEL,"UP");
   //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger(5,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(6,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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[])
  {
   int i,k,start;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//---
   start=InpKPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1;k<=i;k++)
        {
         if(dmin>low[k])  dmin=low[k];
         if(dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod-1+InpSlowing-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1);k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0) ExtMainBuffer[i]=100.0;
         else ExtMainBuffer[i]=sumlow/sumhigh*100;
      if(ExtMainBuffer[i]>50){
         cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
      if(ExtMainBuffer[i]<50){
         cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0;
     }
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sum=0.0;
      for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+ 
Dossiers :
 

Bonjour.

Pouvez-vous me dire où je peux trouver l'algorithme d'ouverture d'un ordre "fiable" (pour l'instant, je ne m'intéresse qu'aux ordres au marché), car je suis dans l'impasse.

Le problème est que sur mon compte (Alpari), les niveaux StopLevel et FreezeLevel sont nuls et si j'utilise uniquement ces limitationshttps://book.mql4.com/ru/appendix/limits, cela signifie qu'un StopLoss à l'achat peut être fixé au niveau Bid et à la vente au niveau Ask, mais ce n'est pas vrai. Dans ce cas, OrderSend renvoie une erreur "No price" (ERR_OFF_QUOTES, code 136).

Dans le même temps, les transactions sans stop ou avec des stops de 50 points ou plus s'ouvrent sans problème.

J'ai découvert par expérience que le SlopLoss minimum est de 19 pips. Je ne sais pas comment déterminer cette marge de manière programmatique.

 
Ces niveaux doivent être fixés à partir du prix de clôture de l'ordre, et non du prix d'ouverture. Et le prix de clôture lors de la fixation de ces niveaux ne doit pas être égal à la valeur fixée.
 
klok79:

Bonjour.

Pouvez-vous me dire où je peux trouver l'algorithme d'ouverture d'un ordre "fiable" (pour l'instant, je ne m'intéresse qu'aux ordres au marché), car je suis dans l'impasse.

Le problème est que sur mon compte (Alpari), les niveaux StopLevel et FreezeLevel sont nuls et si j'utilise uniquement ces limitationshttps://book.mql4.com/ru/appendix/limits, cela signifie qu'un StopLoss à l'achat peut être fixé au niveau Bid et à la vente au niveau Ask, mais ce n'est pas vrai. Dans ce cas, OrderSend renvoie une erreur "No price" (ERR_OFF_QUOTES, code 136).

Dans le même temps, les transactions sans stop ou avec des stops de 50 points ou plus s'ouvrent sans problème.

J'ai découvert par expérience que le SlopLoss minimum est de 19 pips. Je ne sais pas comment déterminer cette marge de manière programmatique.

Essayez minStopLoss = Prix actuel +/- (MaxValue(2*Spread, StopLoss)) ;

 
Pourquoi les objets ne sont pas détruits lorsque le débogage est arrêté ? Je comprends que OnDeinit() n'est pas appelé du tout. Après l'arrêt du débogage, je dois tuer le terminal à chaque fois.
 

Bon après-midi le code ci-dessous problème est souvent mis à jour tableau adx_sig[9] . Je voulais obtenir une dépendance des données mises à jour à temps. Mais quelque chose a mal tourné.

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
input int                  ADX_adx_period          = 14;                                                 // adx period ADX 
input int                  ADX_lower_level         = 20;                                                 // Lower level ADX 
int h_adx[9];
double adx1_buffer[3];
double adx2_buffer[3];
double adx3_buffer[3];
ENUM_TIMEFRAMES handle_period[9]={PERIOD_CURRENT,PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1};
int adx_sig[9];
int OnInit()
  {
//---
   for(int i=0; i<ArraySize(handle_period); i++)
     {
      //--- Установим хэндлы для индикаторов
      h_adx[i]=iADX(_Symbol,handle_period[i],ADX_adx_period);
        if(h_adx[i]<0) 
        {
         Alert("Ошибка при создании индикаторов - : ",GetLastError(),"!!");
        }
     }   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    for(int i=0; i<ArraySize(handle_period); i++)
     {
      //--- Удаляем хэндлы для индикаторов
      IndicatorRelease(h_adx[i]);
     }
     //---
       
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   for(int i_sig=0; i_sig<ArraySize(handle_period); i_sig++)
     {
      if(CopyBuffer(h_adx[i_sig],0,0,3,adx1_buffer)<3)Print("CopyBuffer adx1_buffer ",GetLastError());
      if(CopyBuffer(h_adx[i_sig],1,0,3,adx2_buffer)<3)Print("CopyBuffer adx2_buffer ",GetLastError());
      if(CopyBuffer(h_adx[i_sig],2,0,3,adx3_buffer)<3)Print("CopyBuffer adx3_buffer ",GetLastError());
      if(adx3_buffer[1]<adx2_buffer[1] && adx3_buffer[1]>=ADX_lower_level && adx3_buffer[1]>adx3_buffer[2])adx_sig[i_sig]=1;
      else if(adx3_buffer[1]>adx2_buffer[1] && adx3_buffer[1]>=ADX_lower_level && adx3_buffer[1]<adx3_buffer[2])adx_sig[i_sig]=-1;
      else adx_sig[i_sig]=0;
      }
      PrintFormat("ADX sig0=%i sig1=%i sig2=%i sig3=%i sig4=%i sig5=%i sig6=%i sig7=%i sig8=%i",adx_sig[0],adx_sig[1],adx_sig[2],adx_sig[3],adx_sig[4],adx_sig[5],adx_sig[6],adx_sig[7],adx_sig[8]); 
  }