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

 
Galim_V:

Esta é a maneira de modificar

há muitos erros no código, em

if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))

é melhor normalizar os preços, então eles funcionarão, então o servidor dará um erro de "preços errados", é desejável normalizar oStopLoss_SELL

e, muito provavelmente, você precisa verificar se o StopLoss é igual a zero, e não é desejável comparar números reais para ser igual, você deve tentar comparar números reais com > ou <

 
Jessy111:

Ajude-me a consertar um bug no indicador, ele não se eleva nem abaixa do dia quando está na última vela da hora.

Eu esbocei o indicador, seu código não gosta de trabalhar com cordas, eu o escreveria mais simples, aqui está um exemplo. Embora se sua tarefa for levar em conta a compensação de tempo do servidor, então o contrário é necessário.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot line1
#property indicator_label1  "HighDay"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "LowDay"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

static int LastDay=-1,daystart;
static double dhigh,dlow;
//--- indicator buffers
double         H[],L[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,H);
   SetIndexBuffer(1,L);
   IndicatorDigits(_Digits);
   LastDay=-1;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   int i,j,limit;
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      LastDay=-1;
      daystart=limit;
      dhigh = high[limit];
      dlow  = low[limit];
// расчет истории      
      for(i=limit; i>=0 && !IsStopped(); i--)
        {
         if(LastDay!=TimeDay(time[i]))
           {
            LastDay=TimeDay(time[i]);
            j=daystart;
            daystart=i;
            while(j>daystart)
              {
               H[j]=dhigh;
               L[j]=dlow;
               j--;
              }
            dhigh = high[i];
            dlow  = low[i];
           }
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
        }
// рисуем текущий день при первом запуске
      i=daystart;
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
   else
     {
// рисуем текущий день на каждом тике
      i=0;
      dhigh = high[0];
      dlow  = low[0];
      while(TimeDay(time[0])==TimeDay(time[i]))
        {
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
         i++;
        }
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

Meu exemplo também não é um exemplo, eu o escrevi rapidamente, acho que não deveria ter contado do final da história até o início da primeira corrida, mas da barra zero até a história, o código teria sido mais curto e teria sido capaz de calcular o dia atual mais rápido - o ciclo teria sido mais curto,

Mas eu verifiquei no testador, parece funcionar sem problemas, que seja assim, é tarde, estou com sono... Eu fiz um mau exemplo (((

 
Igor Makanu:

há muitos erros no código, em

é melhor normalizar os preços, então eles funcionarão, então o servidor dará um erro de "preços errados", é desejável normalizar oStopLoss_SELL

E, muito provavelmente, você precisa verificar se o StopLoss é igual a zero, e não é desejável comparar números reais para ser igual, você deve tentar comparar números reais com > ou <

É isso mesmo. Eu acabei de mostrar um lugar no código, porque ele não modifica as ordens do mercado: solicitar uma parada do mercado dará 0.

 
Igor Makanu:

Aqui está um indicador esboçado, não gosto de seu código com cordas, eu o escreveria mais simples, aqui está um exemplo. Embora se sua tarefa é levar em conta a compensação de tempo do servidor, então você tem que fazer isso de forma diferente.

Meu exemplo também não é um exemplo, eu o escrevi rapidamente, acho que não deveria ter contado do final da história até o início da primeira corrida, mas da barra zero até a história, o código teria sido mais curto e teria sido capaz de calcular o dia atual mais rápido - o ciclo teria sido mais curto,

Mas eu verifiquei no testador, parece funcionar sem problemas, que seja assim, é tarde, estou com sono... Mau exemplo feito (((

Não é meu código, eu o encontrei na Internet, não consigo escrever indicadores. :)

Pelo que vale um mau exemplo, eu realmente gostei do seu indicador, ele funciona no Testador de Estratégia e em gráficos reais.

Muito obrigado pela ajuda rápida!

Posso também pedir-lhe que remova as linhas que desenham o canal? Marquei-as com setas vermelhas na imagem da tela.

E se não for muito incômodo, favor acrescentar a função de desligar/ligar a formação de linhas no dia atual. Eu os marquei na captura de tela com setas azuis. https://prnt.sc/kuuj3e

Obrigado de antemão!

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
 

Olá Querido!

Favor aconselhar como executar o procedimento OnInit();

após as variáveis do Expert Advisor terem sido alteradas!?

Ao colocar o Expert Advisor no gráfico, há o OnInit(); mas quando as variáveis são alteradas, não há o OnInit!?

Como identificar o evento da mudança de variável do Expert Advisor!?

Por favor, ajude com conselhos, ou melhor, com código, como fazer isso!?

 
Игорь:

Olá Querido!

Favor aconselhar como executar o procedimento OnInit();

após as variáveis do Expert Advisor terem sido alteradas!?

Ao colocar o Expert Advisor no gráfico, há o OnInit(); mas quando as variáveis são alteradas, não há o OnInit!?

Como identificar o evento da mudança de variável do Expert Advisor!?

Por favor, ajude com conselhos, ou melhor, com código, como fazer isso!?

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int var1 = 1;
//+------------------------------------------------------------------+
int OnInit()
  {
      Print("Вызов OnInit(), var1=",var1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+

Experimente este código, leia a mensagem no log EA (troque o TF, digite a variável, reinicie o terminal sem fechar o EA...)

e a segunda opção é descrever no escopo global variável com modificador estático

#property strict

input int var1=1;
static bool FirstRun=true;
//+------------------------------------------------------------------+
int OnInit()
  {
   Print("Вызов OnInit(), var1=",var1);
// раскоментируйте FirstRun=true; если нужно контролировать вызов OnInit()
//   FirstRun=true;     
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(FirstRun)
     {
      Print("Это первый запуск эксперта");
      FirstRun=false;
     }
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

experimentar tal código, ler a mensagem no registro do Expert Advisor (trocar o TF, digitar a variável, recarregar o terminal sem fechar o Expert Advisor...)

e a segunda opção é descrever no escopo global variável com modificador estático

No escopo global com o modificador static????? Isto é algum tipo de perversão.

 
Alexey Viktorov:

Em nível global com o modificador estático????? Isto é algum tipo de perversão.

Mas, pela minha experiência, quando as compilações do MT4 foram freqüentemente atualizadas, é melhor escrevê-las de acordo com o clássico C++, do que obter a resposta "escreva o código corretamente" ao se comunicar com os desenvolvedores



ZS: Lembro-me por que comecei a escrever o modificador estático globalmente, se eu quiser ter certeza de não "perder" o valor da variável durante a execução do programa MQL. Anteriormente (cerca de 5 anos atrás) a diretiva #property strict precompiler não existia e ao habilitar arquivos (#include ou biblioteca - não me lembro mais) eu "perdi minha variável" uma vez, pois os nomes das variáveis coincidiam com o nome da variável.Fui amaldiçoado pela MQL, mas mais tarde descobri este erro por acidente. Mas se eu escrevesse um modificador estático o compilador mostraria um erro de compilação também neste caso.

O compilador MT4 atual é bastante útil e confiável, e com a diretiva #propriedade rigorosa, talvez eu não precise de tais precauções, mas eu escrevo estático como um hábito quando não quero "perder um valor" de uma variável

ZZZY: este modificador não afeta a velocidade de execução do programa MQL, e é conveniente para mim abrir meu código mais tarde, e tendo visto estática saberei exatamente, que esta variável tem um valor, que é importante não "perder" durante a execução do programa

 
Igor Makanu:

Mas, pela minha experiência, quando as compilações do MT4 foram freqüentemente atualizadas, é melhor escrevê-las de acordo com o clássico C++, do que obter a resposta "escreva o código corretamente" ao se comunicar com os desenvolvedores



ZS: Lembro-me por que comecei a escrever o modificador estático globalmente, se eu quiser ter certeza de não "perder" o valor da variável durante a execução do programa MQL. Anteriormente (cerca de 5 anos atrás) a diretiva #property strict precompiler não existia e ao habilitar arquivos (#include ou biblioteca - não me lembro mais) eu "perdi minha variável" uma vez, pois os nomes das variáveis coincidiam com o nome da variável.Fui amaldiçoado pela MQL, mas mais tarde descobri este erro por acidente. Mas se eu escrevesse um modificador estático o compilador mostraria um erro de compilação também neste caso.

O compilador MT4 atual é bastante útil e confiável, e com a diretiva #propriedade estrita, talvez eu não precise de tais precauções, mas eu escrevo estático como um hábito quando não quero "perder um valor" de uma variável

ZZZY: este modificador não afeta a velocidade de execução do programa MQL, e é conveniente para mim abrir meu código após algum tempo, e tendo visto estático saberei exatamente, que esta variável tem um valor, o que é importante para não "perder" durante a execução do programa

O compilador gerará um aviso se os nomes das variáveis coincidirem com os do arquivo de inclusão. Para mim, um aviso é igual a um erro e eu reajo da mesma forma a eles. E variáveis de nível global com um modificador estático são iguais a manteiga.

Mas... Se você gosta de escrever assim, ninguém pode proibir você.

 
Alexey Viktorov:

Mas... Mas... se você gosta de escrever desta maneira, ninguém pode proibi-lo.

Tenho dúvidas sobre minha singularidade neste assunto... Não sou o único, pesquisando na pasta MQL5 encontrei tais declarações com modificador estático a nível global em várias fontes de entrega MT5

Mesmo no artigo "RANDOM DECISION FOREST IN THE SUMMARY" no código fonte encontrei uma declaração em nível global: data estática last_time=0;

assim escrevi como considero adequado alocar e serei, não 100% das variáveis no nível global descrevendo como estáticas

Deus protege os necessitados, disse a freira ))))

Razão: