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

 
Vitalii Ananev:

Em vez de Fechar[2] colocar o valor do indicador na segunda barra (por exemplo iRSI(.......,2) ) e em vez de Fechar[1] colocar o valor do indicador na primeira barra. E o uroven é o valor do nível.

E o resto já lhe foi dito acima.

Obrigado.
 
Pode dizer-me se alguém viu um volume lateral do dia no lado direito do gráfico para mt5, para mt4 encontrei-o aqui https://www.mql5.com/ru/code/9777. Tenho duas variantes: ou reescrevo as variáveis nele ou encontro uma já pronta. Ou não vejo a utilidade de encomendar,,,,,,, , preciso de verificar uma teoria de equilíbrio ,,,,. Encontrei uma obra para mt5 onde o perfil do dia de ontem é desenhado à esquerda mas há um inconveniente importante, não mostra o que acontece hoje. Por isso, quero acrescentar ao padrão do gráfico informação sobre o que se passa no momento da negociação
Рыночный профиль ( Market Profile)
Рыночный профиль ( Market Profile)
  • votos: 6
  • 2006.10.11
  • Collector
  • www.mql5.com
Рыночный профиль ( Market Profile) использует альтернативное представление информации как о горизонтальном, так и о вертикальном движении рынка.
 
Maria Baburina:

Pré-requisito:


ProfitSellDBL é calculado aqui

Lucro_Upgr = 0.01

Tral_Start__Upgr é igual a uma variável externa do tipo int e é igual a 5.

Tral_Size__Upgr é similarmente igual a 4

TV - valor do tick, =10

SumLotSellDBL = 0.04

Já o li. Viu como funcionaria se Tral_Start__Upgr, Tral_Size__Upgr e as suas variáveis externas fossem definidas como duplas. Isto é, quando tudo é do mesmo tipo sem qualquer conversão e perda de dados. O resultado é o mesmo. O que é que me enganei?
 
Maria Baburina:
Ler. Viu como funcionaria se Tral_Start__Upgr, Tral_Size__Upgr e as suas variáveis externas fossem definidas como duplas. Isto é, quando tudo é do mesmo tipo sem qualquer conversão e perda de dados. O resultado é o mesmo. O que é que me enganei?

Um homem cego a falar com um surdo. Se quiser que alguém o teste, precisa do código mínimo possível que pode ser compilado noutra máquina e testado. Sem código - nada de que falar.

Acrescentado: Usar depuração(Debugging):

-Preconfiguração

-Pontos de paragem

-Iniciar adepuração

-Expressõesobserváveis

-Vista dapilha de chamadas

-Depuraçãopasso a passo

-Parar, Retomar e Terminar a Depuração

-Depuração dahistória

 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Insectos, insectos, perguntas

comp, 2016.04.03 18:21

Erro de tempo de execução

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    SetIndexBuffer(0, this.Buffer);
  }
};

CLASS* Class;

void OnInit( void )
{
  Class = new CLASS;
    
  delete Class;

  Class = new CLASS;

  Class.Buffer[0] = 0; // array out of range
  
  delete Class;
  
  return;
}

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[] )
{  
  return(rates_total);
}

Em quatro funcionou bem! Em cinco é um aborrecimento. Será esta outra limitação arquitectónica em comparação com o quad? Dê-me uma ligação para uma discussão sobre isto, não a consegui encontrar eu próprio.


 
Compreendo correctamente que só pode atribuir qualquer coisa aos amortecedores indicadores após a primeira chamada do próprio terminal (não manualmente) à OnCalculate?
 
comp:
Compreendo correctamente que algo só pode ser atribuído a amortecedores indicadores após a primeira chamada do terminal (não manualmente) OnCalculate?

Os buffers indicadores podem ser acedidos depois de OnCalculate() ter sido chamado. Ao mesmo tempo, o próprio tampão indicador deve ser declarado na área das variáveis globais:

//+------------------------------------------------------------------+
//|                                                  Accelerator.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Accelerator/Decelerator"

//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   1
#property  indicator_type1   DRAW_COLOR_HISTOGRAM
#property  indicator_color1  Green,Red
#property  indicator_width1  2
#property  indicator_label1  "AC"
//--- indicator buffers
double ExtACBuffer[];
double ExtColorBuffer[];
double ExtFastBuffer[];
double ExtSlowBuffer[];
double ExtAOBuffer[];
double ExtSMABuffer[];
//--- handles for MAs
int    ExtFastSMAHandle;
int    ExtSlowSMAHandle;
//--- bars minimum for calculation
#define  DATA_LIMIT 37
 

Penso ter encontrado o que procurava, mas a antiguidade do código dá um erro

Ajude-me a consertá-lo ...... se não for muito incómodo.

e se me puder ajudar a virá-lo para o lado direito do ecrã, isso seria óptimo.

Arquivos anexados:
 
Karputov Vladimir:

Os amortecedores indicadores podem ser acedidos depois de OnCalculate() ter sido chamado.

Ao que parece, está enganado. Só se pode candidatar quando o terminal chama a OnCalculate. Neste caso, a condição no MT4 é mais flexível, porque basta chamar a OnCalculate apenas uma vez. E em MT5, deve esperar pela chamada da OnCalculate pelo próprio terminal sempre após o SetIndexBuffer. Comprovação

#property strict

#property indicator_chart_window
#property indicator_buffers 1

#ifdef __MQL5__
  #property indicator_plots 1
#endif   

#ifdef __MQL5__
  #define TRUE true
  #define FALSE false
#endif   

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    ::SetIndexBuffer(0, this.Buffer);
  }

  #define  TIMESERIES(X)                                                  \
     ::ArraySetAsSeries(X, TRUE);                                        \
     Size = ::MathMin(Copy##X(::Symbol(), ::Period(), 0, bars, X), Size);  

  static int FullOnCalculate( void )
  {
    int Spread[];
    long RealVolume[];
    
    int Size = INT_MAX;
    
    #ifdef __MQL4__
      const int bars = ::Bars;
    #endif

    #ifdef __MQL5__
      const int bars = ::Bars(::Symbol(), ::Period());
    #endif

     TIMESERIES(Spread)
    TIMESERIES(RealVolume)
    
    #ifdef __MQL4__
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, Volume, Spread));
    #endif

    #ifdef __MQL5__
      datetime Time[];
      double Open[];
      double High[];
      double Low[];
      double Close[];
      long TickVolume[];
  
      TIMESERIES(Time)
      TIMESERIES(Open)
      TIMESERIES(High)
      TIMESERIES(Low)
      TIMESERIES(Close)
      TIMESERIES(TickVolume)
    
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, TickVolume, Spread));
    #endif    
  }  
};

CLASS* Class;

bool FirstRunOnCalculate = TRUE; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буфер

void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )
{
  if (id == CHARTEVENT_CHART_CHANGE)
  {
    Print(__FUNCTION__);
    
    ::OnDeinit();
    
    ::Class = new CLASS;
        
  if (!FirstRunOnCalculate)    
    CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
  }
  
  return;
}

void OnDeinit( const int Reason = 0 )
{
  if (::CheckPointer(::Class) == POINTER_DYNAMIC)
    delete ::Class;

  return;
}

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[] )
{  
  Print(__FUNCTION__);  

  if (FirstRunOnCalculate)
    FirstRunOnCalculate = FALSE;
  
  if (::CheckPointer(::Class) != POINTER_INVALID)
    ::Class.Buffer[0] = 0; // array out of range - MT5-ERROR!!!

  return(rates_total);
}

Em MT4 este indicador funcionará sem problemas, em MT5 irá colidir com um erro. Como se verificou, no MT4 basta esperar pela primeira chamada da OnCalculate pelo terminal e fazer o que quiser com os amortecedores, incluindo a sua redefinição usando SetIndexBuffer. Mas em MT5 após TODOS os SetIndexBuffer é necessário esperar pela primeira chamada da OnCalculate pelo terminal.

Esta característica não está documentada em lado nenhum. E não parece enquadrar-se na definição de "principiante".

Podemos esperar que em MT5 este comportamento seja o mesmo que em MT4? Isto é, após a primeira chamada da OnCalculate pelo próprio terminal seria possível ligar para SetIndexBuffer sem problemas?

 
comp:

Ao que parece, está enganado. Só pode chamá-lo quando a OnCalculate é chamada pelo próprio terminal. Neste caso, no MT4 a condição é mais flexível, porque só é necessário chamar a OnCalculate uma vez. Mas em MT5, é preciso esperar pela chamada da OnCalculate pelo próprio terminal sempre após o SetIndexBuffer. Comprovação

Em MT4 este indicador funcionará sem problemas, em MT5 irá colidir com um erro. Como se verificou, no MT4 basta esperar pela primeira chamada da OnCalculate pelo terminal e depois fazer o que quiser com os amortecedores, incluindo a sua redefinição utilizando o SetIndexBuffer. Mas em MT5 após TODOS os SetIndexBuffer é necessário esperar pela primeira chamada da OnCalculate pelo terminal.

Esta característica não está documentada em lado nenhum. E não parece enquadrar-se na definição de "principiante".

Podemos esperar que em MT5 este comportamento seja o mesmo que em MT4? Isto é, após a primeira chamada da OnCalculate pelo próprio terminal será possível ligar para SetIndexBuffer sem problemas?

Não se envolver em verborreia - naturalmente, a chamada da OnCalculate implica uma chamada pelo próprio terminal, porque
A função OnCalculate() é chamada apenas em indicadores personalizados quando é necessário calcular os valores dos indicadores pelo eventoCalculate. Isto geralmente acontece quando se recebe um novo tick para o símbolo, para o qual o indicador é calculado. O indicador não precisa de ser anexado a qualquer tabela de preços deste símbolo.