A nova sintaxe MQL4 - página 6

 
SDC:

Os erros do compilador quando eu coloco o caminho para o ícone no diretório_dados_do_terminal, o erro diz que não é possível abrir um arquivo em uma pasta da loja virtual mesmo que eu não tenha especificado uma pasta na loja virtual. Eu especifiquei uma pasta no diretório_de_dados_do_terminal.

A única maneira de fazê-lo funcionar era colocar o arquivo na mesma pasta do código fonte e não especificar um caminho, apenas # ícone de propriedade "MyIcon.ico".


Oi, caso alguém tenha problemas com o ícone de propriedade "MyIcon.ico", você deve considerar o tamanho do ícone 96x96 px ou superior. Eu também já experimentei o erro, mas agora funciona.
 

Notei que o compilador executa fundição que eu não esperaria que ocorresse.

Eu tenho o seguinte código:

onde a classe do objeto chave é MT4String, enquanto a função getKey() retorna uma classe mais genérica. O mesmo caso é com o objeto botão. A fundição explícita é omitida.

O código original tinha este aspecto:

Em JAVA, seria necessário fundição explícita, mas o compilador MQL4 também trabalha com esta sintaxe de forma adequada.

Esta fundição implícita é uma característica, que também é válida em C++? Ou é um bug?

 

Não sou especialista em C++, mas passar de uma classe base para uma classe infantil é chamado de downcasting e, de acordo com esta página, parece que o downcasting também deve ser explícito em C++. (como Java) ?

Como a MQL4 permite o downcasting implícito, ou é uma "característica" ou um bug :)

Se for uma "característica", provavelmente significa que o compilador falhará em avisar o codificador de um erro potencial, então não é uma grande característica. Tanto C+++ quanto Java requerem downcasting explícito por uma razão?

Além disso, na MQL4, não há nenhuma maneira construída para verificar a classe de um objeto (por exemplo, instanceOf etc.), então isso significa que um erro de tempo de execução não pode ser evitado a menos que você implemente sua própria verificação de "tipo"...


Animal a;

Dog d;

...

if (a  instanceOf Dog) { // no built in check like this - we all have to roll our own??

 d = a;

}
 
ydrol:

Não sou especialista em C++, mas passar de uma classe base para uma classe infantil é chamado de downcasting e, de acordo com esta página, parece que o downcasting também deve ser explícito em C++. (como Java) ?

Como a MQL4 permite o downcasting implícito, ou é uma "característica" ou um bug :)

Se for uma "característica", provavelmente significa que o compilador falhará em avisar o codificador de um erro potencial, então não é uma grande característica. Tanto C+++ quanto Java requerem downcasting explícito por uma razão?

Além disso, na MQL4, não há nenhuma maneira construída para verificar a classe de um objeto (por exemplo, instanceOf etc.), então isso significa que um erro de tempo de execução não pode ser evitado a menos que você implemente sua própria verificação de "tipo"...




Sim, eu também apreciaria uma instância ou ".classe ", mas até onde percebi, ela não está disponível nem mesmo no C++. Mesmo o depurador MQL4 não sabe o tipo do objeto vigiado. Eu não me importo muito, porque o recurso OOP na MQL4 é implementado surpreendentemente muito bem, e se este fosse o único bug, então eu diria hurray. Eu só estava curioso, se ele estivesse seguindo algum padrão existente, mas parece que era um bug.

 

negociação com um clique

no antigo MT4 eu utilizo um arquivo dll para criar o comércio de um clique da EA

Eu posso digitar o parâmetro... LOT, TP SL diretamente sobre aquelas caixas de texto brancas

quando clico em comprar ou vender... meu EA leu o texto de entrada na caixa.

no novo MT4 eu vejo a função botão... mas não consigo encontrar a função para criar uma caixa de texto como essa

 
WDholic:

no antigo MT4 eu utilizo um arquivo dll para criar o comércio de um clique da EA

Eu posso digitar o parâmetro... LOT, TP SL diretamente sobre aquelas caixas de texto brancas

quando clico em comprar ou vender... meu EA leu o texto de entrada na caixa.

no novo MT4 eu vejo a função botão... mas não consigo encontrar a função para criar uma caixa de texto como essa

Para a entrada do teclado há o tipo de objeto OBJ_EDIT. Ele dispara o evento CHARTEVENT_OBJECT_ENDEDIT se você pressionar a tecla Enter. Mas parece que a tecla Enter é a única maneira de terminar a edição, por exemplo, clicar com o mouse fora dos limites do objeto não termina a edição. Ela me impede de distribuir o objeto como sendo de uso não amigável.

Além disso, se a string vazia for fornecida como valor inicial, então aparece o texto automático "Edit" (e esta palavra até pode ser editada), o que é realmente confuso.

 
void OnChartEvent(const int id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam){

   if(id==CHARTEVENT_OBJECT_ENDEDIT ){
   
      if(sparam=="pulsanteEdit") Print("The text in the Edit field of the object with name ",sparam," has been changed");
     } 
}
void creaPulsanteEdit(const string objNameIns,const string objText,int xDistance,int yDistance,int xSize,int ySize,color clrIns,color clrTextIns){
   
   if(!ObjectCreate(0,objNameIns,OBJ_EDIT,0,0,0)){ 
      stampaErrore("Errore creazione pulsante edit");
      return;
   }
   
   ObjectSetInteger(0,objNameIns,OBJPROP_CORNER,CORNER_LEFT_UPPER);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_XDISTANCE,xDistance); 
   ObjectSetInteger(0,objNameIns,OBJPROP_YDISTANCE,yDistance); 

   ObjectSetInteger(0,objNameIns,OBJPROP_XSIZE,xSize); 
   ObjectSetInteger(0,objNameIns,OBJPROP_YSIZE,ySize);
   
//--- set the text 
   ObjectSetString(0,objNameIns,OBJPROP_TEXT,objText);
   ObjectSetString(0,objNameIns,OBJPROP_FONT,"Arial");
   ObjectSetInteger(0,objNameIns,OBJPROP_FONTSIZE,10);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_READONLY,false);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_BGCOLOR,clrIns);
   ObjectSetInteger(0,objNameIns,OBJPROP_COLOR,clrTextIns);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_BORDER_COLOR,LightSeaGreen);
   
//--- display in the foreground (false) or background (true) 
   ObjectSetInteger(0,objNameIns,OBJPROP_BACK,false);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,objNameIns,OBJPROP_SELECTED,false);
   ObjectSetInteger(0,objNameIns,OBJPROP_HIDDEN,false);
}

void OnTick(){

  creaPulsanteEdit("pulsanteEdit", string1, 10, 275,60,30,Black,LightSeaGreen);

  Print("string1: "+string1);
}

Eu criei este botão para editar o texto dentro dele e gostaria de ler e converter a seqüência de texto em uma variável dupla ou int, mas não funciona e não imprime o "O texto no campo Editar do objeto com nome" foi alterado".

você pode me ajudar?