MetaTrader 4 Build 529 beta lançado com novo compilador - página 18

 
mr_Johns:
O manual da MQL4 (que está no editor) também foi atualizado de acordo?


sim com um pedido de atualização. O manual MQL4 é quase baseado em 5 e não corresponde às realidades do compilador no momento.
 
ALXIMIKS:

Corrija-me se eu me enganei.

Eu uso uma função de biblioteca em um indicador, esta função declara algumas variáveis estáticas que participam do cálculo da matriz de indicadores.

Se eu quiser alterar os parâmetros do indicador para corrigir o cálculo do indicador (dependendo das variáveis estáticas),

passar a bandeira para a função da biblioteca responsável pela reinicialização (você deve expandir os parâmetros de entrada de cada função que tenha variáveis estáticas)

fazer zeragem das variáveis estáticas no corpo, e não se esqueça de remover a bandeira antes de completar o cálculo.

Seria muito mais fácil se as variáveis estáticas tivessem algum parâmetro, definido durante sua declaração, responsável por se essas variáveis serão zeradas durante a reinicialização.

Fazer variáveis globais ao invés de estáticas locais (fora das funções), e rubricá-las na primeira chamada.
 
ALXIMIKS:

Seria muito mais simples se as variáveis estáticas tivessem algum parâmetro a ser definido quando são declaradas, responsável por se o valor dessas variáveis seria ou não reinicializado no momento da reinicialização.

Seria ainda mais fácil, se os desenvolvedores fizessem funções especiais como ResetStaticVars().

// A propósito, não é tão fácil de fazer. Eu não o faria. Uma coisa é simplesmente zerar todo o segmento de dados, e outra coisa é atribuir corretamente todos os valores iniciais do usuário. Uma dor no pescoço, no entanto.

Na verdade (como um paradigma), salvar valores durante a vida do programa é bastante conveniente. Há aqui apenas uma questão de retrocompatibilidade...

 

Sei que esta é uma parte do fórum que fala russo, mas como sou ruim em falar russo (embora eu possa lê-lo) espero que ninguém se importe de postar isto aqui (já que a parte em inglês parece completamente inativa no que diz respeito a estas questões e já que não vi que alguém postou sobre este assunto)

Há um problema sério com o novo metatrader que diz respeito aos parâmetros externos das cordas. Inicialmente eles têm um valor correto, mas assim que o período de tempo ou símbolo é alterado, o conteúdo de um parâmetro de string é perdido. Aqui está um exemplo simples que mostrará exatamente o que está acontecendo. Esse problema também acontece quando esses indicadores são utilizados através de iCustom() chamada e que torna qualquer indicador desse tipo inutilizável de qualquer EA ou outro código

#property indicator_chart_window

extern string TestString = "whatever value that we want initially set";

int OnInit() { return(0); }
int deinit() { return(0); }
int start()
{
   Comment(TestString);
   return(0);
}
 
ALXIMIKS:

Sim com o pedido de atualização. O manual para MQL4
é quase baseado em 5 e não corresponde às realidades do compilador no momento.

Talvez eles tenham deixado algo que está por aí num futuro próximo? conto com isso.
 
mr_Johns:
O manual da MQL4 (que está no editor) também foi atualizado de acordo?

Sim, ela foi atualizada há muito tempo e é ativamente complementada diariamente.
 

Não consigo entender porque precisamos de um projeto como este

#property icon "\\Files\\button.ico"
 
VOLDEMAR:

Não consigo entender porque precisamos de um projeto como este

Quando você iniciar a EA, haverá uma imagem na aba "Geral".
 
nenhuma foto
 
mladen:

Sei que esta é uma parte do fórum que fala russo, mas como sou ruim em falar russo (embora eu possa lê-lo) espero que ninguém se importe de postar isto aqui (já que a parte em inglês parece completamente inativa no que diz respeito a estas questões e já que não vi que alguém postou sobre este assunto)

Há um problema sério com o novo metatrader que diz respeito aos parâmetros externos das cordas. Inicialmente eles têm um valor correto, mas assim que o período de tempo ou símbolo é alterado, o conteúdo de um parâmetro de cadeia é perdido. Aqui está um exemplo simples que mostrará exatamente o que está acontecendo. Esse problema também acontece quando esses indicadores são utilizados através de iCustom() chamada e que torna qualquer indicador desse tipo inutilizável de qualquer EA ou outro código

Mladen, é mais fácil para mim responder em russo, já que você é fluente em leitura.

Aqui está a minha solução para este problema. No meu código init() incluo a função ReInit() que reinicia aquelas variáveis globais, cujos valores devem ser restaurados quando o prazo ou o símbolo muda:

//-----------------------------------------------------------------------------
int init(){
   int Error;
   if( МинНаклонТренда<Zero ) МинНаклонТренда=0;
   if( МинНаклонТренда-МаксНаклонТренда>Zero ) МаксНаклонТренда=МинНаклонТренда;
   if( БарОкончания<1 ) БарОкончания=1;
   if( МинБазовыйПериод<1 ) МинБазовыйПериод=1;
   if( МаксБазовыйПериод<МинБазовыйПериод ) МаксБазовыйПериод=МинБазовыйПериод;
   if( БарНачала<МинБазовыйПериод+БарОкончания ) БарНачала=МинБазовыйПериод+БарОкончания;
   if( БарНачала>Bars-1 ){
      if( Bars>МинБазовыйПериод+БарОкончания ) БарНачала=Bars-1;
      else Alert("Неразрешимая ошибка: история("+Bars+")<=активация("+МинБазовыйПериод
                +")+окончание("+БарОкончания+")");
   }
   if( ТолщинаТрендовой<1 ) ТолщинаТрендовой=1;
   if( ТолщинаТрендовой>5 ) ТолщинаТрендовой=5;
   if( РазмерИндикатораТиков<1 ) РазмерИндикатораТиков=1;
   if( РазмерИндикатораТиков>5 ) РазмерИндикатораТиков=5;
   if( СдвигИндикатораТиков<3 ) СдвигИндикатораТиков=3;
   if( СдвигИндикатораТиков>100 ) СдвигИндикатораТиков=100;
   if( ПоказыватьВсе ) Visibility=0; else Visibility=EMPTY;
   LastBar     =БарОкончания;
   ЦветЛиний[0]=ЦветПоддержки;
   ЦветЛиний[1]=ЦветСопротивления;
   ЦветХорды[0]=ЦветВосходящейХорды;
   ЦветХорды[1]=ЦветНисходящейХорды;
   Цвет123[0]  =Цвет123 ВТ;
   Цвет123[1]  =Цвет123 НТ;
   NewTime     =0;
   ReInit();                                       // Повторная инициализация
   ClearScreen();                                  // Очистить экран
   Error=fVLine("StartLine","Старт",0,БарНачала,0,0,0,0,0,ЦветВертикалей);
   Error=fVLine("DeadLine","Пуск",0,БарОкончания,0,0,0,0,0,ЦветВертикалей);
   DeadLine=TimeCurrent();
   if( СтатическийРежим ){
      if( РежимОтладки ) РежимРаботы=" Отладка "; else РежимРаботы=" ";
      РежимРаботы=РежимРаботы+"Статический режим Пауза "+ПериодИмитацииТиков+" мс";
      МоделироватьДинамику=false;
      //РежимОтладки=false;
      while( true ){                               // Бесконечный цикл
         ReInit();                                 // Повторная инициализация
         start();                                  // Имитация тика
         Sleep(ПериодИмитацииТиков);               // Не работает в индикаторах
   }  }
   else {
      if( МоделироватьДинамику ){
         РежимРаботы=" Режим имитации динамики Размерность "+DoubleToStr(0.5*БарНачала*БарНачала,0);
         Print("      "+Version+РежимРаботы+" История: "+(БарНачала)+" баров с "+TimeToStr(Time[БарНачала]));
         LastBar=БарНачала;
         while( LastBar>БарОкончания ){            // Перебор всех баров истории
            LastBar--;
            start();                               // Имитация тика
         }
         МоделироватьДинамику=false;
         Print("      Режим имитации динамики отключен!");
   }  }
   if( РежимОтладки ) РежимРаботы=" Отладка "; else РежимРаботы=" ";
   РежимРаботы=РежимРаботы+"Динамический режим";
   Print("      "+Version+РежимРаботы+" История: "+(БарНачала)+" баров с "+TimeToStr(Time[БарНачала]));
   if( !ПечататьПредупреждения ) Print("Печать предупреждений запрещена!");
   if( РежимОтладки ) start();                     // Имитация тика
   return(0);
}
//-----------------------------------------------------------------------------
// Повторная инициализация глобальных переменных и массивов
void ReInit(){
   StartTime[0]   =Time[БарНачала];
   StartTime[1]   =Time[БарНачала];
   Groups[0]      =0;
   Groups[1]      =0;
   OldMG[0]       =0;
   OldMG[1]       =0;
   MainGroup[0]   =0;
   MainGroup[1]   =0;
   QualityMax[0]  =0;
   QualityMax[1]  =0;
   OldStopLine    =0;
   return;
}
//-----------------------------------------------------------------------------