Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 989

 
Aleksey Vyazmikin:

Como encontro a razão para esta mensagem?

Profiler

 
Artyom Trishkin:

Não sabe como verificar o valor de retorno para zero? E não sabe como sair da OnCalculate() com um retorno de zero? Nunca tentou procurar informações no sítio web?

  1. Obter o valor necessário da função
  2. Verificar se é zero
    1. Se for zero, então devolva 0;
    2. Se não for zero, então para o passo 3
  3. Trabalhar com este valor
Nunca pensei que iria contar o básico da lógica sobre este recurso a um homem com a classificação superior a 13 mil...

Isto não é um indicador.

Especificei intencionalmente se devo fazer verificações em cada chamada ou uma no início do OnTick é suficiente...

As devoluções não são aceitáveis para mim ... e fazer looping na espera no testador é impossível, e no real deve funcionar (ou não?).

A minha classificação não é para programação, não sou um programador, e estou a aprender este complicado negócio apenas graças a pessoas como você, aprecio realmente o feedback de pessoas com conhecimentos.

Obrigado pela vossa compreensão.

 
Artyom Trishkin:

Profiler

E se acontecer uma vez por dia ou menos?

 
Olá. Por alguma razão Handel só transmite quando definido para todos os períodos, mas eu defino para um período específico e não há nada. Não sei qual é o problema. Tentativa de digitação em handel directamente não a partir de variáveis globais, o resultado é o mesmo. O que é que está errado? Preciso que o valor seja de um período.
//+------------------------------------------------------------------+
//|                                                        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:
Olá. Não consigo encontrar nada, por alguma razão o handel só transfere quando está definido para todos os períodos, mas eu defino-o para um determinado período e nada acontece. Não sei qual é o problema. Tentei introduzir dados não provenientes de variáveis globais directamente no handel, o resultado é o mesmo. O que é que está errado?
      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);

Estude o erro, Artem tem razão em dizer que deve verificar tudo 10 vezes...

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 impróprio, tamanho impróprio ou objecto de matriz dinâmica corrompida


ERR_INDICATOR_DATA_NOT_FOUND

4806

Dados solicitados não encontrados


 
kopeyka2:
Olá. Reparei que o handel só se transfere quando está definido para todos os períodos, mas quando o defino para um determinado período, nada acontece. Não compreendo qual é o problema. Tentativa de digitação em handel directamente não a partir de variáveis globais, o resultado é o mesmo. O que é que está errado? Preciso que o valor seja do mesmo período.

Tira exemplos da CodeBase dos indicadores do Scriptor, não tira? Certo? Depois procure no seu código (recentemente publicado) exemplos que tenham MTF no seu nome, mas sem MCP.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Isto é, se quiser obter dados sobre o símbolo actual, mas a partir de um período de tempo diferente do período do gráfico, então precisa de um exemplo de um indicador multi-tempo. No MCP ainda não se deve envolver - lá no OOP com a utilização das classes padrão. Vai ficar confuso.

Por exemplo, 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;

É apenas para MA a trabalhar no período e símbolo actuais. Para trabalhar num período diferente, o cálculo será diferente. Procurem - tudo está perto, e a direcção que vos dei.

 
Artyom Trishkin:

Tira exemplos da CodeBase dos indicadores do Scriptor, não tira? Certo? Depois procure no seu código (recentemente publicado) exemplos que tenham MTF no seu nome, mas sem MCP.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Isto é, se quiser obter dados sobre o símbolo actual, mas a partir de um período de tempo diferente do período do gráfico, então precisa de um exemplo de um indicador multi-tempo. No MCP ainda não se deve envolver - lá no OOP com a utilização das classes padrão. Vai ficar confuso.

Por exemplo, este cálculo:

é apenas para MA a trabalhar no período e símbolo actuais. Para trabalhos sobre um período diferente, o cálculo será diferente. Pesquisa - tudo está perto, e eu dei-lhe a direcção.

Obrigado...
 
Aleksey Vyazmikin:

Estude o erro, Artem tem razão em dizer que deve verificar tudo 10 vezes...

ERR_INVALID_ARRAY

4006

Matriz de tipo impróprio, tamanho impróprio ou objecto de matriz dinâmica corrompida

Obrigado
 
kopeyka2:
Obrigado

Por favor, mas eu copiei o erro errado, deveria ser

ERR_INDICATOR_DATA_NOT_FOUND

4806

Os dados solicitados não foram encontrados

A questão é que o número de barras é diferente para diferentes TFs e isto deve ser tido em conta.

 
Aleksey Vyazmikin:

Por favor, mas eu copiei o erro errado, deveria ser

ERR_INDICATOR_DATA_NOT_FOUND

4806

Os dados solicitados não foram encontrados

A questão é que o número de barras é diferente para diferentes TFs e isto deve ser tido em conta.

Estava apenas a verificá-lo. Mas o PROBLEMA é que, tendo passado por um período constante, em

CopyBuffer o valor em outros prazos NÃO é PERMANENTE. No período de manuseamento estabelecido o valor era, mas nos prazos mais pequenos 0,0 (zero). Movido em busca do tampão... zero. Porque não é passado paraCopyBuffer?