初学者的问题 MQL4 MT4 MetaTrader 4 - 页 196

 
Vitaly Muzichenko:

这就是布局,4号和5号之间没有区别

句柄应该在OnInit()创建一次,而不是在每一步创建。你还不知道吗?

 
删除,需要考虑一下。
 
Vitaly Muzichenko:

这个怎么样?

而这样一来,你仍然会在每一个刻度上建立一个手柄。 使用造型器,你会立即看到逻辑错误。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
          ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index)
  {
#ifdef __MQL4__
   return(iMA(symb,tf,period,ma_shift,method,price,index));
#else
   double buf[1];
   static int hMA=-1;
   int handle=iMA(symb,tf,period,ma_shift,method,price);
   if(handle<hMA)
     {
      PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
      return(WRONG_VALUE);
     }
   else
     {
      if(CopyBuffer(handle,0,index,1,buf)<0)
        {
         PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
         return(WRONG_VALUE);
        }
     }
   hMA=handle;
   return(buf[0]);
#endif
  }
 
Vladimir Karputov:

但你仍然在为每一个刻度创建一个手柄。 使用造型器,你会立即看到逻辑错误。

像这样

double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
                                      ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index) {
 #ifdef __MQL4__
  return(iMA(symb,tf,period,ma_shift,method,price,index));
 #else
  double buf[1];
  static int handle=-1;
   if(handle<0) {
    handle=iMA(symb,tf,period,ma_shift,method,price);
   }
   if(handle<0) {
    PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
然后,其余的峰值搜索代码是跨平台的
 
Vitaly Muzichenko:

我想是的。

然后,其余的峰值搜索代码是跨平台的

是的,它是...

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
          ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index)
  {
#ifdef __MQL4__
   return(iMA(symb,tf,period,ma_shift,method,price,index));
#else
   double buf[1];
   static int handle=-1;
   if(handle<0)
     {
      handle=iMA(symb,tf,period,ma_shift,method,price);
     }
   if(handle<0)
     {
      PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
      return(WRONG_VALUE);
     }
   else
     {
      if(CopyBuffer(handle,0,index,1,buf)<0)
        {
         PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
         return(WRONG_VALUE);
        }
     }
   return(buf[0]);
#endif
  }

显然更好。但是这个块的位置 不对--它应该紧接着 创建句柄 之后放置。

 
Vladimir Karputov:

是的,现在

显然更好。但是这个块的位置不对--它应该紧接着 创建句柄 之后放置。

最好的方法可能是这样的,它将打印一次创建错误,但这样就会减少对if(...)的检查。

double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
                                      ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index) {
 #ifdef __MQL4__
  return(iMA(symb,tf,period,ma_shift,method,price,index));
 #else
  double buf[1];
  static int handle=-1;
   if(handle<0) {
    handle=iMA(symb,tf,period,ma_shift,method,price);
    PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
 
Vitaly Muzichenko:

最好的方法可能是这样的,它将打印一次创建错误,但这样就会减少对if(...)的检查。

我在你的混乱中看不到任何东西--一切都很模糊。

使用造型器
 
Vladimir Karputov:

我在你的混乱中看不到任何东西--它都融合在一起了。

使用造型器

如果有的话,我在造型师中没有看到我的风格,而且有哦很多。

附加的文件:
cc.PNG  100 kb
 

不幸的是,我的索引器是基于MQL4的,这个功能只是它的一小部分。

这就是为什么实现MQL5的效率不高的原因,而且重写整个事情会很漫长,也很有问题。

 
GlaVredFX:

不幸的是,我的索引器是基于MQL4的,这个功能只是它的一小部分。

这就是为什么实现MQL5的效率不高的原因,而且重写整个事情会很漫长,也很有问题。

在MQL5中重写一个指标平均需要半小时。喝了一杯咖啡。