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

 

Após as últimas respostas, a imagem começou a ficar mais clara e a mais óbvia é que não estou destinado a me tornar um programador :-)

Até agora, comecei com a listagem mais simples e isto foi o que acabou sendo:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.099999999999999999 2018.10.15 00:00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999999999 2018.10.16 00:00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00



Em alguns casos, por alguma razão, o preço excede a dimensão de dois dígitos significativos após o ponto em qualquer direção.

E isto acontece sem erros nos cálculos, é apenas a saída do valor do preço da base do gráfico tmp1[i]=close[i];

Existe alguma maneira de consertá-la ou simplesmente ignorá-la?



 

Você pode remover tudo o que for relevante para cinco, e obter um modelo para quatro.


Isto pode ser escrito por alguém que sabe a diferença entre um cinco e um quatro, e definitivamente não sou eu :-)


//--- Проверка количества доступных баров
   if(rates_total<fmax(period_ma,4)) return 0;


De onde veio o número 4, qual é o seu significado sagrado?

 
psyman:


Isto pode ser escrito por alguém que sabe a diferença entre um cinco e um quatro, e definitivamente não sou eu :-)



De onde veio o número 4, que significado sagrado ele tem?

Você certamente não ouve ou lê... Eu estava:

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

Qualquer pergunta, assistência e discussão sobre algoritmos e códigos para iniciantes da MQL4

Artyom Trishkin, 2018.10.18 09:26

//+------------------------------------------------------------------+
//| 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[])
  {
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if(limit>1) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total-1;
      // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // необходимые действия по расчёту индикатора
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 
psyman:

Após as últimas respostas, o quadro ficou mais claro e o mais óbvio é que não estou destinado a me tornar um programador :-)

Até agora, comecei com a listagem mais simples e isto foi o que acabou sendo:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.099999999999999999 2018.10.15 00:00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999999999 2018.10.16 00:00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00



Em alguns casos, por alguma razão, o preço excede a dimensão de dois dígitos significativos após o ponto em qualquer direção.

E isto acontece sem nenhum erro nos cálculos, é apenas a saída do valor do preço da base gráfica tmp1[i]=close[i];

Existe alguma maneira de consertá-la ou simplesmente ignorá-la?



Está tudo bem. Para imprimir números fracionários, basta usar DoubleToString() com a precisão necessária. Neste caso, a precisão necessária deve ser Dígitos()

 
psyman:

Após as últimas respostas, o quadro ficou mais claro e o mais óbvio é que não estou destinado a me tornar um programador :-)

Até agora, comecei com a listagem mais simples e isto foi o que acabou sendo:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.099999999999999999 2018.10.15 00:00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999999999 2018.10.16 00:00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00


Em alguns casos, por alguma razão, o preço excede a dimensão de dois dígitos significativos após o ponto em qualquer direção.

E isto acontece sem erros nos cálculos, é apenas a saída do valor do preço da base do gráfico tmp1[i]=close[i];

Isto pode ser derrotado de alguma forma ou simplesmente ignorá-lo?

Estes são valores normais para um número real. Você pode aprender a escrever programas, todos começam lá, você só precisa ler muito e tentar escrever e escrever seus próprios códigos.

A precisão do número real, mantissa, e como tudo é armazenado na memória, você pode pesquisar no Google na web, os princípios de armazenamento são os mesmos em todos os lugares.

se você quer uma bela produção use DoubleToStr()

 
Igor Makanu:

estes são valores normais para um número real, você pode aprender a escrever programas, todos começam lá - você só precisa ler muito e tentar escrever e escrever seus próprios códigos

A precisão do número real, mantissa, e como tudo é armazenado na memória, você pode pesquisar no Google na web, os princípios de armazenamento são os mesmos em todos os lugares.

se você quer uma bela produção, use DoubleToStr()

Onde for possível utilizar funções compatíveis, é melhor oferecê-las para uso. Caso contrário, este épico recomeçará tudo de novo. Neste caso: DoubleToString()

 

Como você poderia evitar que a EA funcionasse com os mesmos instrumentos?

Por exemplo, o EA funciona na janela eur/usd, mas quando executado em outras janelas no eur/usd, alguma mensagem de alerta é exibida. Serei muito grato pela ajuda.

 
gans71:

Como você poderia evitar que a EA funcionasse com os mesmos instrumentos?

Por exemplo, o EA funciona na janela eur/usd, mas quando executado em outras janelas no eur/usd, alguma mensagem de alerta é exibida. Serei muito grato pela ajuda.

Você precisa transferir dados de um EA para outro, procure no fórum

ou usar as variáveis globais do terminal (esta é a maneira mais fácil) - aí você pode escrever o valor da primeira EA, e as cópias subseqüentes da EA lerão este valor e não correrãohttps://www.mql5.com/ru/docs/globals

Документация по MQL5: Глобальные переменные терминала
Документация по MQL5: Глобальные переменные терминала
  • www.mql5.com
Глобальные переменные существуют в клиентском терминале 4 недели с момента последнего обращения, после этого автоматически уничтожаются. Обращением к глобальной переменной считается не только установка нового значения, но и чтение значения глобальной переменной.
 
Igor Makanu:

você precisa transferir dados de um EA para outro, procure no fórum

ou usar as variáveis globais do terminal (esta é a maneira mais fácil) - aí você pode escrever o valor da primeira EA, e as cópias subsequentes da EA lerão este valor e não correrãohttps://www.mql5.com/ru/docs/globals

a EA é a mesma, você precisa proibi-la de funcionar com os mesmos instrumentos
 
gans71:
a EA é a mesma, você não deve permitir que ela funcione com os mesmos símbolos

e? você não poderia ter estudado a ajuda em 2 minutos

Se você está falando especificamente sobre como passar uma string para uma variável global, a única maneira é criar um nome para a variável global, ou seja, no seu caso você executa uma EA no EURUSD, faça uma verificação

if(GlobalVariableCheck(_Symbol)) .....

Se não houver uma variável desse tipo, então crie uma de tamanho excessivo, como esta

if(GlobalVariableSet(_Symbol,Magic)==0) Print("Error writing to global variable # ",GetLastError());

então, na saída do Expert Advisor, apagar a variável global

como está, o terminal não é útil, e eu meio que apontei a direção da busca

Razão: