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

 
Artyom Trishkin #:

E se houver dois monitores? Diferente...

Depois é preciso entender a resolução da tela onde a imagem é exibida. O objeto também pode chegar a 2 monitores) mas é uma tarefa mais complicada.
Sim, a ligação às fontes padrão do sistema através de valores negativosTextSetFont() é uma boa solução.
 

Ajude a otimizar o indicador. O indicador funciona mas lentamente, leva muito tempo para otimizar a EA com ele. Por favor, informe o que foi feito de errado? Como agilizar seu trabalho?

//+------------------------------------------------------------------+
//|                                                     Momentum.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red

#property indicator_maximum 1
#property indicator_minimum 0

#property indicator_width1 2

//---- input parameters
extern int  MomPeriod    = 10;
extern int  WindowOfNorm = 45; // ширина окна нормирования в барах
extern int  MA_Length    = 10; // Average Period
extern int  MA_Mode      =  0; // Mode of Moving Average

//---- buffers
double NormBuffer[],MomBuffer[],AvgVolumes[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicator line
   SetIndexStyle(2,DRAW_NONE);
   SetIndexBuffer(2,NormBuffer);

   SetIndexStyle(1,DRAW_NONE);
   SetIndexBuffer(1,MomBuffer);
   
    SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,AvgVolumes);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Momentum                                                         |
//+------------------------------------------------------------------+
int start()
  {
   for(int i = 1;i <= 130; i++)
     {
      MomBuffer[i]=iMA(NULL,0,MomPeriod,0,0,0,i)*100/iMA(NULL,0,MomPeriod,0,0,0,i+MomPeriod);

      // нормирование
      NormBuffer[i]=Norm(WindowOfNorm,i);
      //-----
      AvgVolumes[i] = iMAOnArray(NormBuffer,0,MA_Length,0,MA_Mode,i);
     }
   return(0);
  }
//+------------------------------------------------------------------+

// нормирование
double Norm(int norm, int i) {
   // экстремумы
   double max=MomBuffer[ArrayMaximum(MomBuffer,norm,i)];
   double min=MomBuffer[ArrayMinimum(MomBuffer,norm,i)];
   // вычисление осциллятора
   double delta=max-min; // размах
   if(delta==0) return(1);
   else return((MomBuffer[i]-min)/delta);
  }

Arquivos anexados:
 
IrishDance #:

Ajude a otimizar o indicador. O indicador funciona mas lentamente, leva muito tempo para otimizar a EA com ele. Por favor, informe o que foi feito de errado? Como fazer para que funcione mais rápido?

Não é assim que se faz. Basta prestar atenção a esta linha

//|                      Copyright © 2004, MetaQuotes Software Corp. |

A linguagem de programação mudou tanto em 18 anos que não deveria funcionar em absoluto. Não entendo porque MQ ainda não desativou int init() e int start() completamente

 

O que está errado, com 2 parâmetros VLine no testador dá erro 2022.03.24 18:24:27.615 TestGenerator: erro de dados incomparável (limite de volume 263 em 2022.03.18 14:30 excedido)

Se a primeira vez que o parâmetro1 é removido, tudo está bem.

bool FlagOpOr=false;
bool FlagClOr=false;
bool Work=true;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

   
//---
   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[])
  {

//---
     static bool FlagNDay=true, FlagVLRed=false,FlagVLBlue=false;
  static datetime Data = 0, NData=0;
  Data = Day();
 if(NData!=Data){FlagVLRed=true; FlagVLBlue=true;NData=Data;} 
if(FlagVLRed==true && Hour()==0){ VLine(1,clrRed); FlagVLRed=false;}
if(FlagVLBlue==true &&  Hour()==1){ VLine(1,clrBlue); FlagVLBlue=false;  }
      
    
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+

void OnDeinit(const int reason)//int deinit(void)void
  {
   int i;
   int obj_total=ObjectsTotal();
   for(i=obj_total-1;i>=0;i--)
     {
 string     sn=ObjectName(i);
      string Head=StringSubstr(sn,0,4);// Извлекаем первые 4 сим
      if(Head == "VLin")
        {
          ObjectDelete(sn);       

       }
     }
   
    Comment("");
   return;
  }
 
  //+------------------------------------------------------------------+
  bool VLine( int time1=0, color clr = clrRed ){
  string  var1=TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
     string NameLine="VLine_" +  "_"+var1;
            bool   created=ObjectCreate(0,NameLine,OBJ_VLINE,0,TimeCurrent(),0);
            if(created)// если создался - сделаем ему тюнинг
              {              
               //--- точка привязки сверху, чтобы не наезжать на бар
               ObjectSetInteger(0,NameLine,OBJPROP_STYLE,STYLE_SOLID);
               //--- последний штрих - покрасим
               ObjectSetInteger(0,NameLine,OBJPROP_COLOR,clr);
               //--- установим толщину линии 
               ObjectSetInteger(0,NameLine,OBJPROP_WIDTH,2); 
                
              }
              else return(false );time1=0;
              return(true);
              }
 

Boa tarde a todos. Tenho 20-40 gráficos abertos durante a negociação. Tenho que gastar muito tempo para encontrar o correto na parte inferior de todos os instrumentos ou no item "janela" do menu superior. Se eu pudesse usar um script para acelerá-lo, eu coloco um script nos parâmetros de entrada, digito o símbolo necessário e ele se abrirá como se fosse encontrado com meus olhos e clicado. Como implementar uma coisa dessas?

 
DanilaMactep #:

Boa tarde a todos. Tenho 20-40 gráficos abertos durante a negociação. Tenho que gastar muito tempo para encontrar o correto na parte inferior de todos os instrumentos ou no item "janela" do menu superior. Se eu pudesse usar um script para acelerá-lo, eu coloco um script nos parâmetros de entrada, digito o símbolo necessário e ele se abrirá como se fosse encontrado com meus olhos e clicado. Como isso pode ser feito?

Como lógica, o roteiro deve descobrir quantos gráficos/janelas estão abertos e para quais instrumentos, lembrá-los (símbolos e gráficos_idies) e depois, de acordo com o número de instrumentos, desenhar um painel com botões com o nome do instrumento escrito neles. Ao pressionar o botão, o gráfico com o instrumento desejado muda sua propriedade para ser expandido (pode ser colapsado) e, sobretudo, e o roteiro se fecha.

 
Valeriy Yastremskiy #:

Logicamente, o roteiro deve descobrir quantos gráficos/janelas estão abertos e para quais instrumentos, lembrá-los (símbolos e gráficos_idies), depois, de acordo com o número de instrumentos, desenhar um painel com botões com o nome do instrumento escrito neles. Ao pressionar o botão, o gráfico com o instrumento desejado muda sua propriedade para ser expandido (pode ser colapsado) e, sobretudo, e o roteiro se fecha.

Má lógica - que diferença faz - em que botões olhar - no fundo, na janela do menu ou nos botões desenhados pelo roteiro? Deve ser feito de alguma forma para que você insira o símbolo desejado nos parâmetros de entrada, e o script abriu esta janela para você - para que fosse mais fácil e rápido. Alguém tem um milagre assim, por favor, compartilhe?
 

Olá!

Estou procurando um EA, um operador de rede.

Abre as ordens de mercado em uma grade.

Fecha as ordens quando a grade atinge um certo (%) lucro.

Já vi um consultor especializado assim, e agora não consigo encontrá-lo.

Já vi um consultor especializado assim, e agora não consigo encontrá-lo.

 
DanilaMactep #:
Má lógica - que diferença faz em quais botões olhar - na parte inferior, na janela do menu ou nos botões desenhados pelo roteiro? Deve ser feito de alguma forma, que inseriu o símbolo desejado nos parâmetros de entrada, e o script abriu esta janela para você - tão mais fácil e rápido seria. Alguém tem um milagre assim, por favor, compartilhe?
Abrir uma nova janela (abre sem EA e com modelo padrão) ou levantar ou expandir uma janela já aberta.
Veja o código em anexo, há uma enumeração gráfica e um desenho na tabela por condição. Talvez isso ajude.
 
Eu não consigo descobrir o que está errado. Há um loop no indicador, mas parece funcionar bem. No início, durante os testes tudo funciona, mas no mesmo lugar em que o programa fica pendurado, o terminal também, eu tenho que apagar o código fonte do terminal. Em outras moedas também fica pendurado. Coloco comentários ao redor do programa e ele finalmente chega aoComentário(taxas_total+"\n "+prev_calculado); antes de retornar e parar. E o comentário mostra que temos números como 3247 e 3247, o que significa que a condição para trabalhar (taxas_total>prev_calculado) não é cumprida e o programa não deve fazer nada. Por que é pendurado?
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(rates_total>prev_calculated)
     { 
         Comment("0");
          if(Count==0)
             total = rates_total-4;
          else
             total = rates_total - prev_calculated+2;

          if(total>10000)
             total=10000;

          for(int i=total; i>2; i--)
            {
            }
       
          while(begin<size-2)
            {
            }
      Count++;
     }  
     Comment(rates_total+"\n"+prev_calculated);          //виснет здесь(коммент 3247 и 3247)
   return(rates_total);
  }
Razão: