a inicialização global falhou!!!!!!! - página 5

 
deysmacro:
Comentário() não afeta o gráfico, na maioria das vezes.

  if(ObjectFind(Symbol()+"Lot_Size_Label")==0)
   {         
  int x_check=ObjectGet(Symbol()+"Lot_Size_Label",OBJPROP_XDISTANCE);
  int y_check=ObjectGet(Symbol()+"Lot_Size_Label",OBJPROP_YDISTANCE);
  Comment(x_check+ " , "+y_check); 
   }

Comentário() para verificar quais são os dados dos cordões.

Eles devem mudar quando a etiqueta der certo, mas não mudam.

IOW, os acordes são o que deveriam ser.

A etiqueta desaparece para a direita.

 

Coordenadas são XDISTÂNCIA = 225; YDISTÂNCIA = 27; CORNER = 3;

Primeiro, carregar o índio no gráfico, etiqueta no lugar:

Segundo, fechando o MT4 e reiniciando-o, a etiqueta vai para a direita:

Terceiro, depois de deslocar os Tf's, a etiqueta salta para trás:

Tem algo a ver com as Âncoras relacionadas aos cálculos de Canto e deve ser um bug em B646.

 
O que isso tem a ver com a inicialização global falhou?
 
SDC:
O que isso tem a ver com a inicialização global falhou?

Aquele B646 está seriamente sob escuta!
 
Dadas:


Obrigado, eu tive o mesmo problema com os objetos não sendo apagados no deinit.

Eu estava desenvolvendo alguns indi, e obtive estes resultados estranhos, depois vi na lista de objetos, eles ainda estavam lá.

Consegui contornar isso, provavelmente da maneira mais simples, por ObjectDelete() no início().

Yup, mudando init() para OnInit() e deinit() para OnDeinit() consegui as etiquetas de volta! Obrigado!

Então, depois de um tempo, não!!! Eles ainda estão fazendo a mesma dança.


De nada, Dadas. Eu não usaria ObjectDelete() no método inicial, no entanto. Isso é melhor feito no OnDeInit(). A razão para isso é a seguinte: se você colocar o código em OnStart() ou OnCalculate(), ele será executado toda vez que um tick chegar. Isso é ruim por duas razões: 1) ele adiciona muitas operações usando tempo de atividade que você não pode perder em uma aplicação em tempo real e 2) não faz sentido fazer isso na maioria das situações - geralmente só vai importar quando um gráfico for desinicializado. Você só deve fazer isso nos métodos de "inicialização" se uma mudança de preço afetar seus objetos de alguma forma. Como exemplo, considere isto (que é parte de um aplicativo que pretendo vender, mas compartilhar isto é legal :-) ).

// If no trade is progress, there is no Position Value to display
      if (ObjectFind("PositionValue") > 0)
                ObjectDelete("PositionValue");
                
      if (ObjectFind("PipsProfitLoss") > 0)
                ObjectDelete("PipsProfitLoss");
                
      if (ObjectFind("CurrentStop") > 0)
                ObjectDelete("CurrentStop");
                
      if (ObjectFind("PipsLockedIn") > 0)
                ObjectDelete("PipsLockedIn");
                
      if (ObjectFind("ProfitLockedIn") > 0)
                ObjectDelete("ProfitLockedIn");
                
      if (GlobalVariableCheck(CurrentPairPercentageRisk))
         GlobalVariableDel(CurrentPairPercentageRisk);

Este código captura objetos que sobram de um comércio fechado, se eles existirem.

A propósito - NÃO FAÇA ISTO:

string AcctCurrency = AccountCurrency();
       
      if (AcctCurrency == "")
          return(rates_total);

Você entendeu mal a intenção do código. Ele foi projetado para NÃO executar o indie até que o servidor tenha "assentado". É por isso que eu devolvo 0. Assim, o código indie não executará até que todas as informações necessárias estejam disponíveis. Honestamente ainda não trabalhei com a OnCalculate() porque ainda não precisei, mas posso dizer que o que você está fazendo é um convite ao desastre. Você não está dizendo ao seu programa: "Não execute este código até que tenha dados válidos". Você está apenas lançando coisas ao vento e esperando pelo melhor. Para dizer a verdade, eu não sei o que seu código faria se não estivesse recebendo informações confiáveis do servidor. Após uma considerável quantidade de leitura, seu novo método OnCalculate() não faz sentido para mim. me parece que é desnecessariamente calculando e entregando uma informação de carga que você faria por si mesmo se precisasse e economizando o seu tempo de computação não se incomodando com o que você não precisa. Não tenho certeza do que eles estão tentando realizar com isto.

Feliz Codificação!

 
ProfessorMetal:


Seja bem-vindo, Dadas. Eu não usaria ObjectDelete() no método inicial, no entanto. Isso é melhor feito no OnDeInit(). A razão para isso é a seguinte: se você colocar o código em OnStart() ou OnCalculate(), ele será executado toda vez que um tick chegar. Isso é ruim por duas razões: 1) ele adiciona muitas operações usando tempo de atividade que você não pode perder em uma aplicação em tempo real e 2) não faz sentido fazer isso na maioria das situações - geralmente só vai importar quando um gráfico for desinicializado. Você só deve fazer isso nos métodos de "inicialização" se uma mudança de preço afetar seus objetos de alguma forma. Como exemplo, considere isto (que é parte de um aplicativo que pretendo vender, mas compartilhar isto é legal :-) ).

Este código captura objetos que sobram de um comércio fechado, se eles existirem.

A propósito - NÃO FAÇA ISTO:

Você entendeu mal a intenção do código. Ele foi projetado para NÃO executar o indie até que o servidor tenha "assentado". É por isso que eu devolvo 0. Assim, o código indie não executará até que todas as informações necessárias estejam disponíveis. Honestamente ainda não trabalhei com a OnCalculate() porque ainda não precisei, mas posso dizer que o que você está fazendo é um convite ao desastre. Você não está dizendo ao seu programa: "Não execute este código até que tenha dados válidos". Você está apenas lançando coisas ao vento e esperando pelo melhor. Para dizer a verdade, eu não sei o que seu código faria se não estivesse recebendo informações confiáveis do servidor. Após uma considerável quantidade de leitura, seu novo método OnCalculate() não faz sentido para mim. me parece que é desnecessariamente calculando e entregando uma informação de carga que você faria por si mesmo se precisasse e economizando o seu tempo de computação não se incomodando com o que você não precisa. Não tenho certeza do que eles estão tentando realizar com isto.

Feliz Codificação!


Mais uma vez, obrigado!

Eu encontrei a resposta para as etiquetas flutuantes.

Parece que agora temos que amarrar a Âncora do Objeto no próprio código:

https://docs.mql4.com/en/constants/objectconstants/enum_anchorpoint

Portanto, devo acrescentar o seguinte:

if(Corner==0) Anchor=ANCHOR_LEFT;
if(Corner==1) Anchor=ANCHOR_RIGHT;
if(Corner==2) Anchor=ANCHOR_LEFT;
if(Corner==3) Anchor=ANCHOR_RIGHT; 

e depois usar outra linha para fixar o objeto:

    ObjectSet(objname,OBJPROP_ANCHOR,Anchor);

A vida não está ficando mais fácil!

E então isto não ajuda, afinal de contas!!!

BTW. Eu lhe direi o que eles estão tentando realizar:

Eles querem impedir o maior número possível de pessoas de brincar com códigos.

Tem que ser o mais comercial possível.

Até recentemente, quase qualquer pessoa era capaz de mexer com simples mql4.

Agora, o objetivo é comercializar tudo!

 
Dadas:

Aquele B646 está seriamente sob escuta!
Isso pode ser assim, mas a inicialização global falhou é um erro específico não relacionado a esta discussão sobre os pontos de ancoragem dos objetos.
 
ProfessorMetal:


seu novo método OnCalculate() não faz sentido para mim. me parece que é desnecessariamente calculando e entregando uma informação de carga que você faria por si mesmo se precisasse e economizando o seu tempo de computação por não se preocupar com o que você não precisa. Não tenho certeza do que eles estão tentando realizar com isto.

Feliz Codificação!

A OnCalculate fornece o resultado do cálculo de quantas barras já foram processadas pelo indicador. Ele substitui a antiga função IndicatorCounted. Ele também alcança compatibilidade com mql5 porque as matrizes de série são passadas a ele por referência, em comparação com a antiga forma mql4 de usar as matrizes de série global. De um ponto de vista de codificação, há muito pouca diferença.

 

Mais uma vez, você é bem-vindo, Dadas. Eu havia esquecido de usar as propriedades do ANCHOR, embora eu faça uso delas em algumas de minhas coisas.

SDC, obrigado pela informação. A documentação não esclarece realmente seu propósito. Suspeito que o significado pode ter se perdido na tradução do russo para o inglês. Agora faz mais sentido. Presumo que não seja para ser usado no lugar de OnStart(), mas sim no lugar de IndicatorCounted(). Seria uma boa adição à documentação para fornecer um exemplo que mostra uma espécie de "antes" e "depois" demonstrando a substituição de IndicatorCounted() por OnCalculate(). Terei que voltar e rever a documentação à luz de sua explicação e ver como as peças se juntam. Mais uma vez, obrigado.

Prof

 

Você usa int OnCalculate() no lugar de int start(). Funciona em cada tic como start(). A antes e depois seria algo parecido com isto,

int start()
  {
   int i=0, limit=0;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) return(-1);
//----
   limit = Bars-counted_bars-1;
   for (i = limit; i >= 0; i--)
   {
//---- indicator calculations
   }
   return(0);
  }

//--------------------------------------------------
//--------------------------------------------------

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=0, limit=0;
//--- check for possible errors
   if(prev_calculated < 0) return(-1);
//---
   limit = rates_total-prev_calculated;
   for(i = limit; i >= 0; i--)
   {
//--- indicator calculations
   }
   return(rates_total);
  }

Os parâmetros formais da OnCalculate o tornam mais autocontido, o codificador não tem que depender de chamar todos os tipos de globos que aparentemente em círculos oop é mau codificador, tapa no pulso. Na prática, não há realmente muita diferença entre o uso de qualquer um deles. Também OnCalculate é o mesmo que mql5, portanto você tem a opção de escrever código de compatriota.

Razão: