Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 989

 
Aleksey Vyazmikin:

¿Cómo puedo encontrar el motivo de este mensaje?

Perfilador

 
Artyom Trishkin:

¿No sabes cómo comprobar si el valor de retorno es cero? ¿Y no sabe cómo salir de OnCalculate() con un retorno de cero? ¿Nunca has intentado buscar información en la web?

  1. Obtener el valor requerido de la función
  2. Comprueba si es cero
    1. Si es cero, entonces devuelve 0;
    2. Si no es cero, entonces al paso 3
  3. Trabajar con este valor
Nunca pensé que iba a contar los fundamentos de la lógica en este recurso a un hombre con la calificación superior a 13 mil...

Esto no es un indicador.

He especificado intencionadamente si debo hacer comprobaciones en cada llamada o con una al inicio de OnTick es suficiente...

Las devoluciones no son aceptables para mí... y hacer un bucle de espera en el probador es imposible, y en el real debería funcionar (¿o no?).

Mi calificación no es para programar, no soy un programador, y estoy aprendiendo este complicado negocio sólo gracias a gente como tú, realmente aprecio la retroalimentación de la gente conocedora.

Gracias por su comprensión.

 
Artyom Trishkin:

Perfilador

¿Y si ocurre una vez al día o menos?

 
Hola. Por alguna razón Handel sólo transmite cuando se establece en todos los períodos, pero me puse en un período específico y no hay nada. No sé cuál es el problema. Intenté escribir en handel directamente y no desde las variables globales, el resultado es el mismo. ¿Qué pasa? Necesito que el valor sea de un periodo.
//+------------------------------------------------------------------+
//|                                                        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:
Hola. Por alguna razón, handel sólo se transfiere cuando se pone en todos los períodos, pero lo pongo en un período determinado y no hay nada. No sé cuál es el problema. He probado a introducir datos no procedentes de variables globales directamente en handel, el resultado es el mismo. ¿Qué pasa?
      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);

Estudia el error, Artem tiene razón al decir que hay que revisar todo 10 veces...

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

Matriz de tipo inadecuado, tamaño inadecuado u objeto de matriz dinámica corrupto


ERR_INDICATOR_DATA_NOT_FOUND

4806

Datos solicitados no encontrados


 
kopeyka2:
Hola. Me he dado cuenta de que el handel sólo se transfiere cuando está configurado para todos los períodos, pero cuando lo configuro para un período determinado, no pasa nada. No entiendo cuál es el problema. Intenté escribir en handel directamente y no desde las variables globales, el resultado es el mismo. ¿Qué pasa? Necesito que el valor sea del mismo periodo.

Tomas ejemplos del CodeBase de los indicadores de Scriptor, ¿no es así? ¿Verdad? A continuación, busque en su código (recientemente publicado) los ejemplos que tienen MTF en su nombre, pero sin MCP.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Es decir, si quiere obtener datos sobre el símbolo actual, pero de otro marco temporal distinto al del periodo del gráfico, entonces necesita un ejemplo de indicador de marco temporal múltiple. En MCP no debe involucrarse todavía - allí en la OOP con el uso de las clases estándar. Te confundirás.

Por ejemplo, este cálculo:

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

Es sólo para MA que trabajan en el período actual y el símbolo. Para trabajar en un período diferente, el cálculo será diferente. Búscalo - todo está cerca, y la dirección que te di.

 
Artyom Trishkin:

Tomas ejemplos del CodeBase de los indicadores de Scriptor, ¿no es así? ¿Verdad? A continuación, busque en su código (recientemente publicado) los ejemplos que tienen MTF en su nombre, pero sin MCP.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Es decir, si quiere obtener datos sobre el símbolo actual, pero de otro marco temporal distinto al del periodo del gráfico, entonces necesita un ejemplo de indicador de marco temporal múltiple. En MCP no debe involucrarse todavía - allí en la OOP con el uso de las clases estándar. Te confundirás.

Por ejemplo, este cálculo:

es sólo para MA que trabaja en el período actual y el símbolo. En el caso de trabajos en un periodo diferente, el cálculo será distinto. Buscar - todo está cerca, y te di la dirección.

Gracias...
 
Aleksey Vyazmikin:

Estudia el error, Artem tiene razón al decir que hay que revisar todo 10 veces...

ERR_INVALID_ARRAY

4006

Matriz de tipo inadecuado, tamaño inadecuado u objeto de matriz dinámica corrupto

Gracias
 
kopeyka2:
Gracias

Por favor, pero he copiado el error equivocado, debería ser

ERR_INDICATOR_DATA_NOT_FOUND

4806

No se han encontrado los datos solicitados

La cuestión es que el número de barras es diferente para los distintos TF y esto debe tenerse en cuenta.

 
Aleksey Vyazmikin:

Por favor, pero he copiado el error equivocado, debería ser

ERR_INDICATOR_DATA_NOT_FOUND

4806

No se han encontrado los datos solicitados

La cuestión es que el número de barras es diferente para los distintos TF y esto debe tenerse en cuenta.

Lo estaba comprobando. Pero el PROBLEMA es que al haber puesto handel en un periodo constante, en

CopyBuffer el valor en otros plazos NO ES PERMANENTE. En el período de asa establecido el valor era, pero en los marcos de tiempo más pequeños 0,0 (cero). Se movió en busca del buffer... cero. ¿Por qué no se pasa alCopyBuffer?

Razón de la queja: