新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 624

 
Galim_V:

这就是如何修改

代码中存在 许多错误,在

if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))

最好对价格进行规范化处理,这样他们就会工作,然后服务器会发出 "错误的价格 "的错误,最好对StopLoss_SELL 进行规范化处理。

最有可能的是,你需要检查StopLoss是否等于零--比较实数是否相等是不可取的,你应该尝试比较实数是否>或<。

 
Jessy111:

帮助我修复指标中的一个错误,当它在一小时的最后一根蜡烛上时,它不能画出当天的最高点和最低点。

我已经勾画出了指标,你的代码不喜欢与字符串打交道,我会写得更简单,这里有一个例子。尽管如果你的任务是考虑到服务器的时间 偏移,那么就需要反过来。

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot line1
#property indicator_label1  "HighDay"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "LowDay"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

static int LastDay=-1,daystart;
static double dhigh,dlow;
//--- indicator buffers
double         H[],L[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,H);
   SetIndexBuffer(1,L);
   IndicatorDigits(_Digits);
   LastDay=-1;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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,j,limit;
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      LastDay=-1;
      daystart=limit;
      dhigh = high[limit];
      dlow  = low[limit];
// расчет истории      
      for(i=limit; i>=0 && !IsStopped(); i--)
        {
         if(LastDay!=TimeDay(time[i]))
           {
            LastDay=TimeDay(time[i]);
            j=daystart;
            daystart=i;
            while(j>daystart)
              {
               H[j]=dhigh;
               L[j]=dlow;
               j--;
              }
            dhigh = high[i];
            dlow  = low[i];
           }
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
        }
// рисуем текущий день при первом запуске
      i=daystart;
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
   else
     {
// рисуем текущий день на каждом тике
      i=0;
      dhigh = high[0];
      dlow  = low[0];
      while(TimeDay(time[0])==TimeDay(time[i]))
        {
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
         i++;
        }
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

我的例子也不是例子,我写得很快,我想我不应该在第一次运行时从历史的终点算到起点,而是从零条算到历史,代码会更短,能更快地计算出当前日期--周期会更短。

但我在测试器中检查了一下,似乎没有问题,就让它这样吧,现在很晚了,我困了......我做了一个糟糕的例子((()

 
Igor Makanu:

代码 中存在很多错误,在

最好对价格进行规范化处理,这样他们就会工作,然后服务器会发出 "错误的价格 "的错误,最好对StopLoss_SELL 进行规范化处理。

而最有可能的是,你需要检查StopLoss是否等于零,而比较实数是否相等是不可取的,你应该尝试比较实数是否>或<。

这就对了。我只是在代码中显示了一个地方,为什么它不修改市场订单:从市场上请求止损会得到0。

 
Igor Makanu:

这是一个草图的指标,我不喜欢你用字符串的代码,我会写得更简单,这是一个例子。不过,如果你的任务是考虑到服务器的时间偏移,那么你必须以不同的方式进行。

我的例子也不是例子,我写得很快,我想我不应该在第一次运行时从历史的终点算到起点,而是从零条算到历史,代码会更短,能更快地计算出当前日期--周期会更短。

但我在测试器中检查了一下,似乎没有问题,就让它这样吧,现在很晚了,我困了......糟糕的例子做了((())。

这不是我的代码,我在网上找到的,我不会写指标。:)

对于一个糟糕的例子来说,我真的很喜欢你的指标,它在策略测试器和真实图表上都能发挥作用。

非常感谢您的快速帮助!

我还可以请你删除绘制通道的线条吗? 我已经在截图上用红色箭头标出了它们。

如果一点都不麻烦的话,请增加关闭/开启当前日期的线条形成的功能。我在截图上用蓝色箭头标记了它们。https://prnt.sc/kuuj3e

提前感谢!

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
 

亲爱的,你好!

请告知如何执行OnInit()程序。

专家顾问的变量被改变后!?

当把专家顾问放在图表上时,有OnInit();但当变量被改变时,没有OnInit!?

如何识别专家顾问变量变化的事件!?

请帮助提供建议,或更确切地说,用代码,如何做到这一点!?

 
Игорь:

亲爱的,你好!

请告知如何执行OnInit()程序。

专家顾问的变量被改变后!?

当把专家顾问放在图表上时,有OnInit();但当变量被改变时,没有OnInit!?

如何识别专家顾问变量变化的事件!?

请帮助提供建议,或更确切地说,用代码,如何做到这一点!?

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int var1 = 1;
//+------------------------------------------------------------------+
int OnInit()
  {
      Print("Вызов OnInit(), var1=",var1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+

用这段代码做实验,阅读EA日志中的信息(切换TF,输入变量,重新启动终端而不关闭EA......)。

第二个选项是在全局范围内用修饰符static 描述变量。

#property strict

input int var1=1;
static bool FirstRun=true;
//+------------------------------------------------------------------+
int OnInit()
  {
   Print("Вызов OnInit(), var1=",var1);
// раскоментируйте FirstRun=true; если нужно контролировать вызов OnInit()
//   FirstRun=true;     
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(FirstRun)
     {
      Print("Это первый запуск эксперта");
      FirstRun=false;
     }
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

用这样的代码做实验,阅读Expert Advisor日志中的信息(切换TF,输入变量,重新加载终端而不关闭Expert Advisor......)。

第二个选项是在全局范围内用修饰符static 描述变量。

在全局范围内用修改器static????? 这是某种变态的行为。

 
Alexey Viktorov:

在全局层面上使用静态修改器static????? 这是某种变态的行为。

但根据我的经验,当MT4的build经常更新时,最好是按照经典的C++编写,而不是在与开发人员沟通时听信 "正确编写代码 "的答案。



ZS:我记得我为什么开始全局性地写静态修改器,如果我想确保在MQL-程序运行期间不会 "丢失 "变量值。 早些时候(大约5年前),#property strict预编译器指令并不存在,当启用文件(#include或library-我已经不记得了)时,我曾经 "丢失了我的变量",因为变量名与变量名重合。我被MQL诅咒了,但后来我意外地发现了这个错误。 但如果我写一个静态修改器,编译器在这种情况下也会显示一个编译错误。

目前的编译器是MT4,相当方便和可靠,而且有#property strict指令,也许我不需要这样的预防措施,但当我不想 "失去一个变量的值 "时,我写静态是一种习惯。

ZZZY:这个修改器不影响MQL程序的执行速度,而且在一段时间后,我可以很方便地打开我的代码,当我看到静态的时候,我会很清楚地知道这个变量有一个值,这对在程序执行过程中 "不丢失 "很重要。

 
Igor Makanu:

但根据我的经验,当MT4的build经常更新时,最好是按照经典的C++编写,而不是在与开发人员沟通时听信 "正确编写代码 "的答案。



ZS:我记得我为什么开始全局性地写静态修改器,如果我想确保在MQL-程序运行期间不会 "丢失 "变量值。 早些时候(大约5年前),#property strict预编译器指令并不存在,当启用文件(#include或library-我已经不记得了)时,我曾经 "丢失 "我的变量,因为变量名与变量名重合。我被MQL诅咒了,但后来我意外地发现了这个错误。 但如果我写一个静态修改器,编译器在这种情况下也会显示一个编译错误。

目前的MT4编译器相当方便和可靠,而且有#属性严格指令,也许我不需要这样的预防措施,但当我不想 "失去一个变量的值 "时,我写静态是一种习惯。

ZZZY:这个修改器不影响MQL程序的执行速度,而且在一段时间后,我可以很方便地打开我的代码,当我看到静态的时候,我会很清楚地知道这个变量有一个值,这对在程序执行过程中 "不丢失 "很重要。

如果变量名与include文件中的变量名重合,编译器将产生警告。对我来说,警告等于错误,我对它们的反应也是如此。而带有静态修改器 的全局水平变量等于油。

但是...如果你喜欢这样写,没有人可以禁止你。

 
Alexey Viktorov:

但是...但是......如果你喜欢这样写,没有人可以禁止你。

我对自己在这件事上的独特性产生了怀疑......。我不是唯一的一个,在MQL5文件夹中搜索,我发现在MT5交付的几个来源中,在全局水平上有这样的静态修改器 的声明。

甚至在 "摘要中的随机决定森林 "一文的源代码中,我发现了一个全局级别的声明:static datetime last_time=0。

所以我写了我认为合适的分配和将,我没有100%的变量在全局层面描述为静态的

上帝保护有需要的人,修女说... ))))