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

 
Aleksey Vyazmikin:

Comment trouver la raison de ce message ?

Profiler

 
Artyom Trishkin:

Vous ne savez pas comment vérifier si la valeur de retour est nulle ? Et je ne sais pas comment quitter OnCalculate() avec un retour de zéro ? N'avez-vous jamais essayé de rechercher des informations sur le site web ?

  1. Obtenir la valeur requise de la fonction
  2. Vérifiez si elle est égale à zéro
    1. S'il est égal à zéro, alors il renvoie 0 ;
    2. S'il n'est pas égal à zéro, passez à l'étape 3.
  3. Travailler avec cette valeur
Je n'ai jamais pensé que je raconterai les bases de la logique sur cette ressource à un homme dont l'évaluation dépasse 13 mille...

Il ne s'agit pas d'un indicateur.

J'ai intentionnellement spécifié si je devais faire des vérifications à chaque appel ou si une vérification au début de OnTick est suffisante...

Les retours ne sont pas acceptables pour moi ... et de boucler l'attente dans le testeur est impossible, et dans le réel devrait travailler (ou pas ?).

Je ne suis pas un programmeur et j'apprends ce métier compliqué uniquement grâce à des personnes comme vous. J'apprécie vraiment les commentaires de personnes compétentes.

Merci de votre compréhension.

 
Artyom Trishkin:

Profiler

Et si ça arrive une fois par jour ou moins ?

 
Bonjour. Pour une raison quelconque, Handel ne transmet que lorsqu'il est réglé sur toutes les périodes, mais j'ai réglé sur une période spécifique et il n'y a rien. Je ne sais pas quel est le problème. J'ai essayé de taper dans le manuel directement et non à partir de variables globales, le résultat est le même. Qu'est-ce qu'il y a ? J'ai besoin que la valeur soit d'une seule période.
//+------------------------------------------------------------------+
//|                                                        77777.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
//----
input string xBars="2018.11.19 00:00";            //Дата начала отсчета
input bool DataBars=false;                        //Считать по дате (true)
input int InpMAShift=1;                           //Сдвиг бара расчета 
input ENUM_TIMEFRAMES Timeframes=PERIOD_D1;       //Таймфрейм скользящей
input ENUM_MA_METHOD  Method=MODE_EMA;            //Метод  расчета скользящей
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; //Расчет цены скользящей
input ENUM_LINE_STYLE MAStyle=STYLE_DASH;         //Стиль всех скользящих линий
input int InpMAPeriod1=5;                         //Скользящая 1 периода

//----
int handle_ma,shift;
double BufferPrice[];
//---
int period;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   period=(InpMAPeriod1<1 ? 1 : InpMAPeriod1);
//---
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
   ArraySetAsSeries(BufferPrice,true);
//--- create MA's handles
   ResetLastError();

//----------------------------------------------------------------+
//                     ПРОБЛЕМА ТУТ 
//
//----------------------------------------------------------------+
   handle_ma=iMA(NULL,PERIOD_D1,period,0,MODE_SMA,PRICE_CLOSE);         //ПРОБЛЕМА ТУТ 
 //  handle_ma=iMA(NULL,PERIOD_CURRENT,period,0,MODE_SMA,PRICE_CLOSE);      // БЕЗ ПРОБЛЕМЫ
   if(handle_ma==INVALID_HANDLE)
     {
      Print("The iMA (",(string)period,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  ObjectDelete(0,"Proba");
   Comment("");
  }
//+------------------------------------------------------------------+
//| 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<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;
//----   
if(DataBars==false)
    shift=InpMAShift;
 else
    shift=iBarShift(NULL,PERIOD_CURRENT,StringToTime(xBars)); 
    
 double ma1=BufferPrice[shift];
 datetime tm=iTime(NULL,Timeframes,shift);
 
 Comment(NormalizeDouble(BufferPrice[shift],_Digits),"    ",shift);
 
 
   HLine("Proba","",tm,ma1,MAStyle,1,Red);

//--- return value of prev_calculated for next call

   return(rates_total);
  }
//+------------------------------------------------------------------+
void HLine(string name,
           string text,
           datetime tm,
           double price,
           int stl,
           int wid,
           color clr)
  {
   if(ObjectFind(0,name)!=0)
     {
      ObjectCreate(0,name,OBJ_HLINE,0,tm,price);
      ObjectSetInteger(0,name,OBJPROP_TIME, tm);
      ObjectSetString(0,name,OBJPROP_TEXT,text); 
      ObjectSetString(0,name,OBJPROP_FONT,"Times New Roman"); 
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,10); 
      ObjectSetInteger(0,name,OBJPROP_STYLE, stl);
      ObjectSetInteger(0,name,OBJPROP_WIDTH, wid);
      ObjectSetInteger(0,name,OBJPROP_COLOR, clr);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true); 
     }
  }

 
kopeyka2:
Bonjour. Je ne trouve rien, pour une raison quelconque le handel ne se transfère que lorsqu'il est réglé sur toutes les périodes, mais je le règle sur une certaine période et rien ne se passe. Je ne sais pas quel est le problème. J'ai essayé d'entrer des données ne provenant pas de variables globales directement dans le manuel, le résultat est le même. Qu'est-ce qu'il y a ?
      ResetLastError();
   if(CopyBuffer(handle_ma,0,0,count,BufferPrice)<0)
     {
      PrintFormat("Failed to copy data from the handle_ma indicator, error code %d",GetLastError());
      return(0.0);
     }
//   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);

Étudiez l'erreur, Artem a raison de dire qu'il faut tout vérifier 10 fois...

2019.01.25 20:12:26.169 Test777 (Si Splice,M1)  Failed to copy data from the handle_ma indicator, error code 4806

ERR_INVALID_ARRAY

4006

Tableau de type inadéquat, de taille inadéquate ou objet de tableau dynamique corrompu


ERR_INDICATEUR_DATA_NOT_FOUND

4806

Données demandées non trouvées


 
kopeyka2:
Bonjour. J'ai remarqué que le handel n'est transféré que lorsqu'il est réglé pour toutes les périodes, mais lorsque je le règle pour une certaine période, rien ne se passe. Je ne comprends pas quel est le problème. J'ai essayé de taper directement dans le manuel et non dans les variables globales, le résultat est le même. Qu'est-ce qu'il y a ? J'ai besoin que la valeur soit de la même période.

Vous prenez des exemples dans la CodeBase des indicateurs de Scriptor, n'est-ce pas ? N'est-ce pas ? Regardez ensuite dans son code (récemment publié) les exemples qui ont MTF dans leur nom, mais sans MCP.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Par exemple, si vous voulez obtenir des données sur le symbole actuel, mais à partir d'un autre cadre temporel que la période du graphique, vous avez besoin d'un exemple d'indicateur multi-cadres temporels. Dans MCP, vous ne devriez pas encore vous impliquer - il s'agit de la POO avec l'utilisation des classes standard. Vous serez confus.

Par exemple, ce calcul :

//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;

C'est uniquement pour les MA travaillant sur la période et le symbole actuels. Pour travailler sur une période différente, le calcul sera différent. Cherchez - tout est proche, et la direction que je vous ai donnée.

 
Artyom Trishkin:

Vous prenez des exemples dans la CodeBase des indicateurs de Scriptor, n'est-ce pas ? N'est-ce pas ? Regardez ensuite dans son code (récemment publié) les exemples qui ont MTF dans leur nom, mais sans MCP.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Par exemple, si vous voulez obtenir des données sur le symbole actuel, mais à partir d'un autre cadre temporel que la période du graphique, vous avez besoin d'un exemple d'indicateur multi-cadres temporels. Dans MCP, vous ne devriez pas encore vous impliquer - il s'agit de la POO avec l'utilisation des classes standard. Vous serez confus.

Par exemple, ce calcul :

c'est uniquement pour les MA travaillant sur la période et le symbole actuels. Pour un travail sur une période différente, le calcul sera différent. Recherche - tout est proche, et je vous ai donné la direction.

Merci...
 
Aleksey Vyazmikin:

Étudiez l'erreur, Artem a raison de dire qu'il faut tout vérifier 10 fois...

ERR_INVALID_ARRAY

4006

Tableau de type inadéquat, de taille inadéquate ou objet de tableau dynamique corrompu

Merci.
 
kopeyka2:
Merci.

S'il te plaît, mais j'ai copié la mauvaise erreur, ça devrait être

ERR_INDICATEUR_DATA_NOT_FOUND

4806

Les données demandées n'ont pas été trouvées

Le fait est que le nombre de barres est différent pour les différentes TF et qu'il faut en tenir compte.

 
Aleksey Vyazmikin:

S'il te plaît, mais j'ai copié la mauvaise erreur, ça devrait être

ERR_INDICATEUR_DATA_NOT_FOUND

4806

Les données demandées n'ont pas été trouvées

Le fait est que le nombre de barres est différent pour les différentes TF et qu'il faut en tenir compte.

Je ne faisais que vérifier. Mais le PROBLÈME, c'est qu'après avoir fixé Handel sur une période constante, en

CopyBuffer la valeur sur d'autres horizons temporels n'est PAS PERMANENTE. Sur la période de la poignée fixée, la valeur était, mais sur les plus petits délais, 0,0 (zéro). Il est parti à la recherche du tampon... zéro. Pourquoi n'est-il pas passé àCopyBuffer ?