Erros, bugs, perguntas - página 1175

 
A100:

......................funções (pesquisa, cálculo, etc.) geralmente devolvem comprimento/tamanho, ou -1 em caso de insucesso, o que torna o tratamento de erros muito mais fácil.

não tanto como para sacrificar metade da gama de valores.
 

Saudações. Alguma dica para novatos sobre quais as funções a utilizar para definir uma tomada comum numa grelha de ordens no caso de um sinal inverso?

 
Estou a aprender operações de arquivo. Alguém sabe se a MQL4/5 é mais rápida com ficheiros csv ou txt?
 
paladin800:
Estou a aprender operações de arquivo. Alguém sabe se a MQL4/5 é mais rápida com ficheiros csv ou txt?
bin
 
papaklass:
Que problemas está a tentar resolver ao trabalhar com ficheiros?
É necessário escrever o estado das posições num ficheiro e utilizar o MT4 para ler estes dados. É necessária uma correlação de posições de um símbolo com outro(s) símbolo(s). Por exemplo, se já existe um certo número de posições no EURUSD, não devem ser abertas mais posições para GBPUSD. Sei como fazê-lo sem operações de arquivo, só quero aprender a trabalhar com operações de arquivo, só para alargar os meus horizontes.
 

Por favor, dê um exemplo de código de como chamar um indicador de recurso ligado de um EA, que por sua vez utiliza outro indicador de recurso ligado em si mesmo. Por exemplo, existe um indicador A, e B é chamado a partir dele. Há também o perito C que utiliza A. O que deve ser escrito em #resource e ao chamar o iCustom em todos os casos?

A ajuda não está claramente escrita a este respeito. A construção habitual no indicador A:#resource "\B.ex4" e depoisiCustom(::Indicadores\B.ex4) funciona bem quando A é lançado por si só.Mas se A for inserido no Expert Advisor#resource "A.ex4", um erronão pode carregar recurso para o indicador em anexo apareceindicando um caminho de síntese absolutamente errado que de alguma forma menciona o directório de Bibliotecas, enquanto o indicador B é pesquisado no seu interior (MQL4\Libraries\::Indicadores\B.ex4::Indicadores\B.ex4).

 
meat:

Em relação ao ArraySize, levantei um problema semelhante na MQL4 no outro dia: https://www.mql5.com/ru/forum/152471. Tanto quanto sei, tudo deveria ser o mesmo na MQL5.

Talvez, a minha mensagem tenha sido aí considerada :) Relativamente a este problema, o Service Desk respondeu que a razão era o funcionamento incorrecto do optimizador e que este mudará o tipo de construção para novo. Na verdade é agora não documentado :) E a propósito, eles vão mudá-lo para uint para o ArrayResize também. Aconselhei-os a mudá-lo para ulong, caso contrário terão de voltar a este problema num futuro próximo devido à falta de valores de 32-bit quando armazenarem grandes volumes.

Quanto ao valor -1 sobre o erro, não deve haver qualquer problema com ele, porque: (int)-1 = (uint)-1 = 0xFFFFFFFFFFFF = UINT_MAX, ou seja, a representação de bits é a mesma. Embora a operação de comparação dê um resultado diferente, ou seja, se assim fosse no código

tornar-se-á incorrecto.

Mais uma vez obrigado pelo pedido, o tipo de retorno das funções ArraySize e ArrayRange não será alterado, deixaremos o tipo int. Corrigamos o optimizador de código, agora o erro descrito por si não irá ocorrer.

O número total de elementos na matriz MQL não pode exceder INT_MAX e isto não se alterará.
Se precisar de matrizes de maior tamanho num programa MQL, deve criar uma classe separada (por exemplo, CBigArray).
 

A tentar dominar o iCustom em mql5. Dominava-o em mql4 :)

O problema é desenhar algo semelhante ao MACD, mas em vez de uma média móvel rápida deve ser utilizado o indicador VIDYA, que se encontra na pasta Exemplos.

Peguei num código MACD padrão e coloquei parâmetros para o VIDYA em vez do MA. O problema é que tudo se compila mas nada é desenhado.

Marquei dois lugares no código abaixo onde alterei o código MACD padrão. Caso contrário, tudo é igual. Por favor, digam-me o que mais me falta. Presumo que seja a jusante, algures no código.

//+------------------------------------------------------------------+
//|                                                         MACD.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Moving Average Convergence/Divergence"
#include <MovingAverages.mqh>
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   2
#property  indicator_type1   DRAW_HISTOGRAM
#property  indicator_type2   DRAW_LINE
#property  indicator_color1  Silver
#property  indicator_color2  Red
#property  indicator_width1  2
#property  indicator_width2  1
#property  indicator_label1  "MACD"
#property  indicator_label2  "Signal"
//--- input parameters
Первый вставленный кусок:
input int                Per=7;               // Per
input int                Per1=21;             // Per1
input int                Shift=0            // Shift
Конец

input int                InpSlowEMA=84;               // Slow EMA period
input int                InpSignalSMA=9;              // Signal SMA period
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price
//--- indicator buffers
double                   ExtMacdBuffer[];
double                   ExtSignalBuffer[];
double                   ExtFastMaBuffer[];
double                   ExtSlowMaBuffer[];
//--- MA handles
int                      ExtFastMaHandle;
int                      ExtSlowMaHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1);
//--- name for Dindicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"MACD("+string(InpSlowEMA)+","+string(InpSignalSMA)+")");
//--- get MA handles
Второй вставленный кусок
   ExtFastMaHandle=iCustom(NULL,0,"Examples\\VIDYA",
                     Per,
                     Per1,
                     Shift
                     );
Конец
   ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_SMA,InpAppliedPrice);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
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 &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
//--- check for data
   if(rates_total<InpSignalSMA)
      return(0);
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtFastMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtFastMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(ExtSlowMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtSlowMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
     }
//--- get Fast EMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
     {
      Print("Getting fast EMA is failed! Error",GetLastError());
      return(0);
     }
//--- get SlowSMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
     {
      Print("Getting slow SMA is failed! Error",GetLastError());
      return(0);
     }
//---
   int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
//--- calculate MACD
   for(int i=limit;i<rates_total && !IsStopped();i++)
      ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
//--- calculate Signal
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Nilog:

A tentar dominar o iCustom em mql5. Em mql4 consegui dominá-lo virtuosamente :)


O que é que se escreve no registo? Sem verificações de erros (por exemplo, ao receber uma pega). O número tampão no novo indicador coincide com o antigo?
 

Não sei se isto já aconteceu, mas a questão é, nova barra, o valor PLOT_EMPTY_VALUE para o tampão está definido em 0.0, mas de facto existem por vezes valores completamente diferentes