Erros, bugs, perguntas - página 742

 
TheXpert:
Por isso, fazer uma fábrica. Isso resolveria o problema.

É suficientemente fácil trabalhar lá dentro tal como está. O objecto é estruturado de forma bastante rígida. Chama um método de Carga virtual de cada um dos seus membros, que por sua vez fazem o mesmo. No início de cada bloco de dados (objecto) é escrita a identificação do tipo (para controlo ao carregar). É tudo o que há a fazer. É uma espécie de fábrica de fabrico próprio.

Faz sentido fazer uma fábrica se o tipo previamente desconhecido puder estar no ficheiro. Então a tabela de registo de fábrica e tipo será necessária. Embora o problema não tenha sido tão resolvido, consegui fazê-lo com clipes de papel e fita adesiva. :)

 

Fã do Gunn.

Se o segundo ponto de ancoragem estiver no futuro, o ângulo muda.

Além disso, este objecto tem alguns problemas com a cópia (com Ctrl pressionado). Muitas vezes não copia, mas arrasta o original, e é preciso a terceira ou quinta tentativa para copiar.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов - Документация по MQL5
 
MetaDriver:

OK, óptimo.

Slava, posso perguntar (para desenvolvimento geral) porque não se pode inicializar a tabela do método virtual no início do construtor (depois da inicialização dos antepassados)?

Já vos disse. Os construtores trabalham segundo uma hierarquia. Enquanto um antepassado está a ser construído, não há informação sobre descendentes.
 
stringo:
Já vos disse antes. Os construtores trabalham a hierarquia. Enquanto um antepassado estiver a ser construído, não há informação sobre descendentes.

Já o li. E eu compreendi-o perfeitamente. E fiz uma pergunta com base na minha compreensão do que li. Vou tentar torná-la mais clara, com imagens.

class MySecond: MyFirst
{
  void  MySecond(MyArg arg): 
    MyFirst(arg)
   { // Можно код инициализации VMT добавлять здесь. Тогда не будет проблем с виртуальными вызовами.
     ...............
     MyVirtualFunc();
      ...........
     return;
   } // Сейчас код инициализации VMT добавляется здесь.

};

Compreendo tudo, é mais difícil fazê-lo, há todo o tipo de subtilezas. É muito mais fácil e versátil (para si) escrever toda a inicialização implícita no final. E até acredito de antemão que "ninguém faz isso" e que "não é costume em C++", etc.

Mas para nós ( utilizadores ), é mais simples, mais universal, razoável e lógico considerar MySecond() construtor como um território da classe MySecond e não MyFirst. Pense no que é mais fácil: fazer funcionar funções virtuais em construtores ou expressar importantes e sérias restrições ao código do construtor na documentação em vários locais e, apesar disso, receber regularmente mensagens importantes e sérias de novatos ao Service Desk e ao Fórum "sobre os bugs virtuais em construtores". Este é também um factor sério - os novatos são esperados muito em breve...

 
struct SDaylyRange {double min, max, open, close;};
void OnStart()
  {
//---
   SDaylyRange tmp, tmp2;
   tmp = 2+3 ? tmp : tmp2;
   if (2+3) tmp = tmp; else tmp = tmp2;
  }

O operador tensor com estruturas leva a erro de geração de código (embora se o substituir por se, funcione)

 

Recebo regularmente erros 4401

ERR_HISTORY_NOT_FOUND

O seguinte código indicador

datetime prevTime[22];
MqlRates _Rates[];

bool IsNewBar(ENUM_TIMEFRAMES period) {
   datetime currentTime[1];
   CopyTime(Symbol(), period, 0, 1, currentTime);
   int _;
   switch (period) {
      case PERIOD_M1  : _= 1;
         break;
      case PERIOD_M2  : _= 2;
         break;
      case PERIOD_M3  : _= 3;
         break;
      case PERIOD_M4  : _= 4;
         break;
      case PERIOD_M5  : _= 5;
         break;
      case PERIOD_M6  : _= 6;
         break;
      case PERIOD_M10 : _= 7;
         break;
      case PERIOD_M12 : _= 8;
         break;
      case PERIOD_M15 : _= 9;
         break;
      case PERIOD_M20 : _= 10;
         break;
      case PERIOD_M30 : _= 11;
         break;
      case PERIOD_H1  : _= 12;
         break;
      case PERIOD_H2  : _= 13;
         break;
      case PERIOD_H3  : _= 14;
         break;
      case PERIOD_H4  : _= 15;
         break;
      case PERIOD_H6  : _= 16;
         break;
      case PERIOD_H8  : _= 17;
         break;
      case PERIOD_H12 : _= 18;
         break;
      case PERIOD_D1  : _= 19;
         break;
      case PERIOD_W1  : _= 20;
         break;
      case PERIOD_MN1 : _= 21;
         break;  
      default         : _= 0;    
   } 
   if(currentTime[0]== prevTime[_]) return(false);
   else {
      prevTime[_] = currentTime[0];
      return(true);
   }
}

int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| 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 (IsNewBar(_Period)) {
    int err = CopyRates(Symbol(), PERIOD_D1, 0, 2, _Rates);
   Print("Count:", err);
   if (err < 1) {
       Print("ERROR:", GetLastError());
       Print("__Symbol:", Symbol());
       return(rates_total);
   }

}
return(rates_total); 
}

produzirá um erro imediatamente ao arrancar (se não em D1). Ou antes, uma vez após o início do terminal e a abertura do gráfico - para colocar o indicador, vamos obter um erro. Se o terminal não estiver fechado, não haverá tal erro no início.

Mas após algum tempo (um par de horas - 2 horas foram suficientes para mim), veremos que o erro será detectado no gráfico já aberto. (corri-o na m30)

 

Olá, senhores desenvolvedores!

Podemos fazer alterações no compilador MQL5 para, pelo menos, nos dar um aviso?

por erros deste tipo no código.

if(Flag_Exitl=true) {break;}


A condição de comparação aqui não é correcta (deveria ser == ), é por isso que será sempre quebrada.

Como abordar esta situação no compilador (se for possível), para que eu possa ficar menos acidentado ao escrever o código?

(Pensei que não iria funcionar, parece separar a atribuição e a comparação em se, então a questão é removida).

 
Fia:

Olá, mestres desenvolvedores!

É possível mudar o compilador MQL5 para, pelo menos, dar um aviso?

por erros deste tipo no código.

if(Flag_Exitl=true) {break;}


A condição de comparação não é correcta (deveria ser == ), por isso será sempre quebrada.

Como abordar esta situação no compilador (se possível), para que eu possa ficar menos acidentado ao escrever o código?

(Pensei que não iria funcionar, posso dividir a tarefa e a comparação em se, por isso a pergunta é retirada).

A condição pode ser escrita incorrectamente, mas é permitida na MQL5.

Vou traduzir o que tem codificado: a variável Flag_Exitl deve ser definida como verdadeira e depois verificar se Flag_Exitl é verdadeira, depois quebrar.

A sequência de acções é exactamente igual a esta.

 

Não compreendo bem como trabalhar com amortecedores que não precisam de ser mostrados no ecrã.

De acordo com o código abaixo, por alguma razão

1) não desenha nada

2) ambos os amortecedores são chamados Label1

embora contenham os dados correctos

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   2

//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_color1  clrRed, clrWhite
#property indicator_type1   DRAW_COLOR_LINE

//--- plot Label2
#property indicator_label2  "Label2"
#property indicator_color2  clrRed, clrGreen
#property indicator_type2   DRAW_COLOR_LINE

//--- indicator buffers
double         L1_1[];
double         L2_1[];
double         Colors_1[];

//--- indicator buffers
double         L1_2[];
double         L2_2[];
double         Colors_2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0,L1_1,INDICATOR_DATA);
   SetIndexBuffer(1,L1_2,INDICATOR_DATA);
   SetIndexBuffer(2, Colors_1,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3, Colors_2,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4, L2_1, INDICATOR_CALCULATIONS);
   SetIndexBuffer(5, L2_2, INDICATOR_CALCULATIONS);
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
   for (int i = 0; i < rates_total; i++)
   {
      L1_1[i] = i;
      L1_2[i] = i + 1;
   }
   return(rates_total);
}
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 

Olá. Posso estar a escrever na direcção errada, mas espero que me possam apontar na direcção certa. Para onde ir com uma pergunta sobre o Web API para mt5? )

Tentarei explicar a situação apenas por precaução. Tenho МТ manager e WEB API com php... A factura em russo é criada, os dados são enviados e até são exibidos no gestor МТ, mas há um problema - os dados no gestor МТ são exibidos em unicode ("044404300c0438043b0438044f" - é assim que o nome do utilizador se parece). Ao enviar dados nada é codificado ou descodificado, a partir do cliente MT tudo é criado normalmente... Pelo menos qual a forma de olhar? (

Razão: