MetaTrader 4 Build 529 beta liberado con nuevo compilador - página 18

 
mr_Johns:
¿Se ha actualizado también el manual del MQL4 (que está en el editor)?


sí con una solicitud de actualización. El manual de MQL4 está prácticamente basado en el 5 y no se corresponde con las realidades del compilador en este momento.
 
ALXIMIKS:

Corríjanme si me equivoco.

Utilizo una función de la biblioteca en un indicador, esta función declara algunas variables estáticas que participan en el cálculo de la matriz del indicador.

Si quiero cambiar los parámetros del indicador para corregir el cálculo del mismo (en función de las variables estáticas),

pasar la bandera a la función de la biblioteca que se encarga de la reinicialización (debe ampliar los parámetros de entrada de cada función que tenga variables estáticas)

hacer la puesta a cero de las variables estáticas en el cuerpo, y no olvidar eliminar la bandera antes de completar el cálculo.

Sería mucho más fácil si las variables estáticas tuvieran algún parámetro, establecido durante su declaración, responsable de que estas variables se pongan a cero durante la reinicialización.

Hacer variables globales en lugar de estáticas locales (fuera de las funciones), e inicializarlas en la primera llamada.
 
ALXIMIKS:

Sería mucho más sencillo si las variables estáticas tuvieran algún parámetro a establecer cuando se declaran, responsable de que el valor de estas variables se restablezca o no en la reinicialización.

Sería aún más fácil, si los desarrolladores hacen una función especial como ResetStaticVars().

// Por cierto, no es tan fácil de hacer. Yo no lo haría. Una cosa es simplemente poner a cero todo el segmento de datos, y otra cosa es asignar correctamente todos los valores iniciales del usuario. Aunque es un dolor de cabeza.

En realidad (como paradigma) guardar los valores durante la vida del programa es bastante conveniente. Sólo hay una cuestión de compatibilidad con el pasado, así que...

 

Sé que esta es una parte del foro en la que se habla ruso, pero como se me da mal hablar ruso (aunque sé leerlo) espero que a nadie le importe publicar esto aquí (ya que la parte en inglés parece completamente inactiva en cuanto a estos temas y ya que no vi que alguien publicara sobre este asunto)

Hay un problema grave con el nuevo metatrader que tiene que ver con los parámetros de cadenas externas. Inicialmente tienen un valor correcto, pero en cuanto se cambia el marco temporal o el símbolo se pierde el contenido de un parámetro de cadena. He aquí un ejemplo sencillo que mostrará exactamente lo que ocurre. Este problema también ocurre cuando dichos indicadores se utilizan a través de la llamada iCustom() y eso hace que cualquier indicador de este tipo sea inutilizable desde cualquier EA u otro 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:

Sí, con la solicitud de actualización. El manual para MQL4
está casi basado en el 5 y no corresponde a las realidades del compilador en este momento.

¿quizás se han dejado algo ahí que está en el futuro próximo? cuento con ello.
 
mr_Johns:
¿Se ha actualizado también el manual del MQL4 (que está en el editor)?

Sí, se ha actualizado hace mucho tiempo y se complementa activamente a diario.
 

No puedo entender por qué necesitamos un diseño como este

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

No puedo entender por qué necesitamos un diseño como este

Al iniciar el EA, habrá una imagen en la pestaña "General".
 
sin imagen
 
mladen:

Sé que esta es una parte del foro en la que se habla ruso, pero como se me da mal hablar ruso (aunque sé leerlo) espero que a nadie le importe publicar esto aquí (ya que la parte en inglés parece completamente inactiva en cuanto a estos temas y ya que no vi que alguien publicara sobre este asunto)

Hay un problema grave con el nuevo metatrader que tiene que ver con los parámetros de cadenas externas. Inicialmente tienen un valor correcto, pero en cuanto se cambia el marco temporal o el símbolo se pierde el contenido de un parámetro de cadena. He aquí un ejemplo sencillo que mostrará exactamente lo que ocurre. Este problema también ocurre cuando dichos indicadores se utilizan a través de la llamada iCustom() y eso hace que cualquier indicador de este tipo sea inutilizable desde cualquier EA u otro código

Mladen, me resulta más fácil responder en ruso, ya que tú dominas la lectura.

Esta es mi solución a este problema. En mi código init() incluyo la función ReInit() que reinicializa esas variables globales, cuyos valores deben ser restaurados cuando el marco temporal o el símbolo cambian:

//-----------------------------------------------------------------------------
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;
}
//-----------------------------------------------------------------------------