MetaTrader 4 Build 529测试版发布,带有新的编译器 - 页 18

 
mr_Johns:
MQL4手册(在编辑器中)是否也进行了相应的更新?


是的,并要求更新。 MQL4手册 几乎是以5为基础的,目前并不符合编译器的实际情况
 
ALXIMIKS:

如果我弄错了,请纠正我。

我在一个指标中使用了一个库函数,这个函数声明了一些静态 变量,参与了指标数组的计算。

如果我想改变指标参数,以纠正指标计算(取决于静态变量)。

将该标志传递给负责重新初始化的库函数(你应该扩展每个有静态变量的函数的输入参数)。

在正文中对静态变量进行归零,不要忘记在完成计算之前删除标志。

如果静态变量有一些参数,在其声明时设置,负责这些变量在重新初始化时是否会被重置为零,那就容易多了。

制作全局变量 而不是局部静态变量(在函数之外),并在第一次调用时初始化它们。
 
ALXIMIKS:

如果静态变量在声明时有一些参数需要设置,负责这些变量的值是否会在重新初始化时被重置,那就简单多了。

如果开发者制作像ResetStaticVars()这样的特殊函数,那就更容易了。

// 顺便说一下,这不是那么容易做到的。我不会。简单地将整个数据段归零是一回事,另一回事是正确分配所有用户的初始值。 不过,这也是一种痛苦。

实际上(作为一种范式)在程序的生命周期内保存数值是相当方便的。 这里只是一个向后兼容的问题,所以......。

 

我知道这是论坛的俄语部分,但由于我不善于说俄语(尽管我能读懂),希望大家不要介意在这里发帖(因为就这些问题而言,英语部分似乎完全不活跃,而且我没有看到有人发帖讨论这个问题)。

新的metatrader有一个严重的问题,涉及外部字符串参数。最初它们有一个正确的值,但一旦时间框架或符号 被改变,字符串参数的内容就会丢失。下面是一个简单的例子,它将准确地显示正在发生什么。当这些指标通过iCustom()调用使用时,这个问题也会发生,这使得任何EA或其他代码都无法使用这些指标。

#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:

是的,有更新请求。MQL4的手册
几乎是基于5的,并 不符合目前编译器的实际情况。

也许他们在那里留下了在不久的将来的东西,我指望它。
 
mr_Johns:
MQL4手册(在编辑器中)是否也进行了相应的更新?

是的,它已经更新了很久,并且每天都在积极补充。
 

我想不明白为什么我们需要这样的设计

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

我想不明白为什么我们需要这样的设计

当你启动EA时,在 "常规 "标签上会有一张图片。
 
无图片
 
mladen:

我知道这是论坛的俄语部分,但由于我不善于说俄语(尽管我能读懂),希望大家不要介意在这里发帖(因为就这些问题而言,英语部分似乎完全不活跃,而且我没有看到有人发帖讨论这个问题)。

新的metatrader有一个严重的问题,涉及外部字符串参数。最初它们有一个正确的值,但一旦时间框架或符号被改变,字符串参数的内容就会丢失。下面是一个简单的例子,它将准确地显示正在发生什么。当这些指标通过iCustom()调用使用时,这个问题也会发生,这使得任何EA或其他代码都无法使用这些指标。

姆拉登,我用俄语回答比较容易,因为你的阅读能力很流利。

以下是我对这个问题的解决方案。在我的init()代码中,我包含了ReInit()函数,它重新初始化了那些全局变量,当时间框架或符号发生变化时,这些变量的值应该被恢复。

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