Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1167

 

Boa internet e boa saúde para todos.


Pergunta, o que estou fazendo de errado? As arrays (STATIC) são preenchidas, mas o cálculo dá 0 (zero). Você pode me dizer o que eu não tenho em meu código? Por que os elementos da matriz não estão sendo comparados e acrescentados...? Obrigado


 double Open[60],High[60],Lo[60,Close[60]; int to_copy=60;
if(CopyOpen(NULL,PERIOD_H4,1,to_copy,Open)<to_copy)return(0);
   if(CopyHigh(NULL,PERIOD_H4,1,to_copy,High)<to_copy)return(0);
   if(CopyLow(NULL,PERIOD_H4,1,to_copy,Low)<to_copy)return(0);
   if(CopyClose(NULL,PERIOD_H4,1,to_copy,Close)<to_copy)return(0);
//----   
   //int start=to_copy*PeriodSeconds(PERIOD_H4)/PeriodSeconds(_Period);
   int start=to_copy;
   
   if(Tf==true)
     {
      if(prev_calculated==0)
         for(int j=1; j<=start; j++)
           {
            if(Open[j]>Close[j])
               candle+=Open[j]-Close[j];
            if(Close[j]>Open[j])
               candle+=Close[j]-Open[j];
            candleHL+=High[j]-Low[j];
            br+=1;
           } //for 
Comment(High[10],". ",candle);
candle дает результат 0 ноль
 
kopeyka2:

Boa internet e boa saúde para todos.


Pergunta, o que estou fazendo de errado? As arrays (STATIC) são preenchidas, mas o cálculo dá 0 (zero). Você pode me dizer o que eu não tenho em meu código? Por que os elementos da matriz não estão sendo comparados e acrescentados...? Obrigado


1) O laço vai além da matriz - se o tamanho do buffer é 60, o último índice é 59, porque o primeiro índice é 0

2) O código não está completo - por exemplo, como Tf é definido e com o que foi iniciada a vela?


* ao copiar preços a indexação é deslocada por um, porque você copia 60 elementos a partir do primeiro índice, ou seja, os preços da primeira barra fechada já estarão sob índice 0

 

Como funciona a função

IsStopped();

... e que lista de tarefas ele realiza?


Em ajuda está escrito - "Verifica a terminação forçada do programa mql5". Ou seja, "olha" para algumas linhas de código à frente e verifica se alguma coisa está correta? Como é definida sua área de responsabilidade (por exemplo, por linha ou 10 linhas)?


Pensei que isso só impedia que o laço fosse além da matriz, mas o vi de volta no código FAMA antes de copiar preços altos e baixos

 
Alexandr Sokolov:

Como funciona a função

... e que lista de tarefas ele realiza?


Em ajuda está escrito - "Verifica a terminação forçada do programa mql5". Ou seja, "olha" para algumas linhas de código à frente e verifica se alguma coisa está correta? Como é definida sua área de responsabilidade (por exemplo, por linha ou 10 linhas)?


Pensei que isso só impedia que o laço fosse além da matriz, mas vi isso ainda no código FAMA antes de copiar os preços Alto e Baixo

Não parece em nenhum lugar... Está claramente escrito ali. Ele verifica a bandeira... Releia-o.

Документация по MQL5: Проверка состояния / IsStopped
Документация по MQL5: Проверка состояния / IsStopped
  • www.mql5.com
Возвращает true, если в системной переменной _StopFlag содержится значение, отличное от 0. Ненулевое значение записывается в переменную _StopFlag, если поступила команда завершить...
 
Alexandr Sokolov:

Como funciona a função

... e que lista de tarefas ele realiza?


Em ajuda está escrito - "Verifica a terminação forçada do programa mql5". Ou seja, "olha" para algumas linhas de código à frente e verifica se alguma coisa está correta? Como é definida sua área de responsabilidade (por exemplo, por linha ou 10 linhas)?


Pensei que isso só impedia que o laço fosse além da matriz, mas vi isso no código FAMA antes de copiar os preços altos e baixos

se ocorrer uma parada de um programa MQL, o _StopFlag será definido, e pode ser verificado usando uma variável predefinida ou a função IsStopped() - o que for conveniente, use-o dessa forma.

após definir _StopFlag , o programa MQL tem um pouco de tempo para parar, e então o terminal descarrega-o forçadamente

o uso mais difundido é de scripts em loop, você não

while(true)
{
...
}

é melhor escrevê-lo assim:

while(!IsStopped())
{
...
}

bem, às vezes em cálculos de custos ou em grandes ciclos que utilizam

for(int i=0; i<1 e6 && !IsStopped(); i++)
{

}
 

Olá a todos.

Você pode me dizer se é possível fazer loop através de variáveis com nomes: L1, L2, L3 ... Ln para escrever para uma matriz bidimensional

extern string L1       = "1.15110;1.14105;1.13240;1.12370;1.11640;1.11170;1.10655;1.09895;1.08850;1.07850;1.06475;";
extern string L2       = "1.32130;1.31030;1.29860;1.29042;1.27985;1.25605;1.24725;1.23565;1.22505;1.20815;1.20115;1.18850;1.16690;1.14465;"; 
extern string L3       = "0.94947;0.93222;0.91472;0.90077;0.89075;0.88658;0.86814;0.84687;0.82795;0.81132;0.79022;0.75976;"; 

...

extern string Ln      = " ... ";    
 
Alexandr Sokolov:

1) O laço tem uma matriz ultrapassada - se o tamanho do buffer for 60, então o último índice será 59, já que o primeiro índice é 0

2) O código não está completo - por exemplo, como Tf é definido e com o que foi iniciada a vela?


* ao copiar os preços, a indexação é deslocada por um, pois você copia 60 elementos a partir do primeiro índice, ou seja, os preços da primeira barra fechada já estarão sob o índice 0

OBRIGADO por sua resposta. Código completo. Aumentou o tamanho estático da matriz. Removido a entrada de controle zero nos operadores. "boneco" comum. Ainda estou tentando descobrir POR QUE não está acrescentando. O que não está no meu código agora? Obrigado pelas dicas. Ainda não trabalhei com arrays estáticos em mql5.....

ATUALIZEI O CÓDIGO. A questão é a mesma...

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, "
//---- номер версии индикатора
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0
//----
input int       nBars = 20;
//----
int    limit=0,br=0,to_copy=nBars;
double corrHL,corrOC;
double averpips,averpipsH;
double candle,candleHL;
double opn,hgh,lw,cls;
double Open[65],High[65],Low[65],Close[65];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
   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(CopyOpen(NULL,PERIOD_H4,0,to_copy,Open)<to_copy)
      return(0);
   if(CopyHigh(NULL,PERIOD_H4,0,to_copy,High)<to_copy)
      return(0);
   if(CopyLow(NULL,PERIOD_H4,0,to_copy,Low)<to_copy)
      return(0);
   if(CopyClose(NULL,PERIOD_H4,0,to_copy,Close)<to_copy)
      return(0);
     int indexmass=ArraySize(Open);
//----
   if(Tf==true)
     {
      if(prev_calculated==0)
         for(int j=1; j<=to_copy; j++) // поменять на ноль?????
           {
            opn=Open[j];
            hgh=High[j];
            lw=Low[j];
            cls=Close[j];
            if(opn>cls)
               candle+=opn-cls;
            if(cls>opn)
               candle+=cls-opn;
            candleHL+=hgh-lw;
            br+=1;
           } //for j
      if(br>0)
        {
         averpips=candle/br;
         averpips=NormalizeDouble(averpips,_Digits);
         averpipsHL=candleHL/br;
         averpipsHL=NormalizeDouble(averpipsHL,_Digits);
        }
      }
   Comment("indexmass  ",indexmass,"  Open ",Open[10],"  candle  ",candle,"  averpipsHL ",averpipsHL);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Comment("indexmass  ",indexmass,"  Open ",Open[10],"  candle  ",candle,"  averpips ",averpips);
Os valores dos elementos da matriz são maiores que zero. Nos cálculos, zero
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
stepystr:

Olá a todos.

Você pode me dizer se é possível fazer loop através de variáveis com nomes: L1, L2, L3 ... Ln para escrever em uma matriz bidimensional

eliminou o post - você sabe sobre arrays

mas ainda não possível

como uma opção para escrever uma macro substituição, escreva um exemplo específico - talvez alguém escreva uma macro para sua tarefa, eu sou ruim em escrever macros.

 

Gente!!! (Dica ... )))

Código completo. Aumento do tamanho da matriz estática. Removido o controle zero de escrita nos operadores... "boneco" comum. Ainda querem entender por que não conta a adição. O que não está no meu código agora? Obrigado pelas dicas. Ainda não trabalhei comarrays estáticos em mql5.....

ATUALIZEI O CÓDIGO. A questão é a mesma...

Os valores dos elementos da matriz são maiores que zero. Nos cálculos, zero
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

OBRIGADO pela resposta. Código completo. Aumento do tamanho da matriz estática. Removida a entrada de controle zero nos operadores. "boneco" comum. Ainda estou tentando descobrir POR QUE não está acrescentando. O que não está no meu código agora? Obrigado pelas dicas. Ainda não trabalhei com arrays estáticos em mql5.....

ATUALIZEI O CÓDIGO. A questão é a mesma...

Não estou familiarizado com indicadores, mas é apenas desnecessário. Eu já o tenho ))))

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(CopyOpen(NULL,PERIOD_H4,0,to_copy,Open)<to_copy)
      return(0);
   if(CopyHigh(NULL,PERIOD_H4,0,to_copy,High)<to_copy)
      return(0);
   if(CopyLow(NULL,PERIOD_H4,0,to_copy,Low)<to_copy)
      return(0);
   if(CopyClose(NULL,PERIOD_H4,0,to_copy,Close)<to_copy)
      return(0);
     int indexmass=ArraySize(Open);
Razão: