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

 
erotin:

Pouvez-vous me dire ce qui ne va pas avec le rationnement du lot ?

Tout est faux. Lisez l'article "Quels sont les contrôles qu'une EE doit passer...". Il y a là une fonction toute prête.

 

C'est fait, j'ai créé un modèle vide et préparé tout ce qui est nécessaire pour la fonction iCustom().

J'ai mis l'indicateur iCrossAD qui m'intéresse dans la fonction.

La fonction fonctionne, elle trouve correctement les indices des flèches Up et Down les plus extérieures, mais les valeurs de prix auxquelles ces flèches ont été fixées sont fausses.

Le code est court, donc je vais le mettre ici, je vais joindre les fichiers de ce conseiller et de l'indicateur juste au cas où.

//+------------------------------------------------------------------+
//|                                             TestDoEasyPart08.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property description ""
#property strict
//--- includes
#include <DoEasy\Engine.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
//---
input string               Inp_param_indi_iCrossAD = "Input parameters indicator iCrossAD";//----- "Внешние параметры индикатора iCrossAD" -----

input uint                 InpPeriodFind           = 400;                 // Bars for calculate
input uint                 InpUnheckedBars         = 2;                   // Unchecked bars
input uint                 InpPeriodIND            = 21;                  // CCI period

//--- global variables

CEngine        engine;
CTrade         trade;
CPositionInfo  apos;
CSymbolInfo    asymbol;

uint            period_find = InpPeriodFind;       //Number bars for calculate

int            CrossAD;                           //Хэндл индикатора iCrossAD

double         Buf_Arrow_Sell[],                  //Массив буфера для приема значений последних стрелок ВНИЗ из индикатора iCrossAD
               Last_Arrow_Sell_volume,            //Переменная для записи значения цены последней стрелки ВНИЗ индикатора iCrossAD
               Last_Arrow_Sell_index;             //Переменная для записи значения индекса свечи последней стрелки ВНИЗ индикатора iCrossAD
               
double         Buf_Arrow_Buy[], Last_Arrow_Buy_volume, Last_Arrow_Buy_index;
   
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(Buf_Arrow_Buy, true);
   ArraySetAsSeries(Buf_Arrow_Sell, true);
//---
   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- delete objects
   ObjectsDeleteAll(0,"",-1);
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int n=0;
   
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
         Last_Arrow_Sell_index  = n;
         Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(!MQLInfoInteger(MQL_TESTER))
      engine.OnTimer();
  }
Dossiers :
iCrossAD.mq5  49 kb
 

Voici à quoi ressemblent les entrées du journal de l'onglet "Experts".

2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = -11203799.85975282, Last_Arrow_Sell_index = 50.0

2019.05.20 15:11:16.798 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

2019.05.20 15:11:16.798 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = -11203799.85975282, Last_Arrow_Sell_index = 50.0


 
Sergey Voytsekhovsky:

Voici à quoi ressemblent les entrées du journal dans l'onglet "Experts".

2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

Au lieu du prix auquel les flèches ont été créées = -11211905.17483469



 

Sergey Voytsekhovsky:

...

Au lieu des prix auxquels les flèches ont été créées = -11211905.17483469

Appuyez sur Ctrl+D, déplacez la souris le long des lignes de l'indicateur et voyez dans la fenêtre de données quelles sont les valeurs de ses tampons.

 
Artyom Trishkin:

Appuyez sur Ctrl+D, faites glisser la souris le long des lignes de l'indicateur et regardez dans la fenêtre de données pour voir quelles sont les valeurs de ses tampons.

Si j'ai bien compris, je cherchais un chat dans une pièce qui n'est pas là ? Le tableau n'était pas rempli avec des prix, mais avec les valeurs de l'indicateur à ce moment-là ? Merci, je vais y repenser.

Une dernière question - le compilateur me donne 2 avertissements


non-concordance des signes Test_iCustom.mq5 79 20

non-concordance des signes Test_iCustom.mq5 92 20


Je ne peux pas comprendre leur raison, s'il vous plaît dites-moi. Que signifie "sign mismatch" (traducteur Yandex) ? ???


 
Sergey Voytsekhovsky:

Si j'ai bien compris, je cherchais un chat dans une pièce qui n'est pas là ? Le tableau n'était pas rempli avec des prix, mais avec les valeurs de l'indicateur à ce moment-là ? Merci, je vais y repenser.

Une dernière question - le compilateur me donne 2 avertissements


non-concordance des signes Test_iCustom.mq5 79 20

non-concordance des signes Test_iCustom.mq5 92 20


Je ne peux pas comprendre leur raison, s'il vous plaît dites-moi. Que signifie "non-concordance des signes" (traducteur Yandex) ?


Vous pourriez perdre un signe numérique. Montrez ces lignes de code.

 
Artyom Trishkin:

Vous pourriez perdre un signe numérique. Montrez ces lignes de code.

for(n=0; n<period_find; n++)
La seconde est exactement la même (boucles pour trouver des valeurs non nulles dans les tableaux Arrows).
 
Sergey Voytsekhovsky:
La seconde est exactement la même (boucles pour trouver des valeurs non nulles dans les tableaux "Flèches").

Quels sont les types de variables n et period_find ? La chose la plus importante qu'ils n'ont pas montrée...

Essayez-le :

for(n=0; n<(int)period_find; n++)

Pourquoi déclarez-vous une variable de boucle au niveau du gestionnaire OnTick() ?

Vous pouvez le faire de cette façon :

for(int n=0; n<(int)period_find; n++)

Vous pouvez supprimer la déclaration n de OnTick() - nous n'en avons pas besoin ici.

 
Artyom Trishkin:

Quels sont les types de variables n et period_find ? La chose la plus importante et non montrée...

uint            period_find = InpPeriodFind;       //Number bars for calculate
int             n=0;