初学者的问题 MQL5 MT5 MetaTrader 5 - 页 265

 
C-4:
你说的'对齐'是什么意思?将尾数按小数位数归 一?- 这就是NormalizeDouble函数的作用。如果是其他东西,请更详细地描述它。

在输入任何正双,在输出四舍五入到实际价格,可以在这个工具。

如果价格步数是0.25,那么就四舍五入到0.25。有点像这样。

double RoundPrice(const double price)
{
   if(price<=0) return(-1);
   double tick_size=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
   double p=round(price/tick_size);
   return(NormalizeDouble(p*tick_size,_Digits));
}

但话虽如此,如果有一个偏移量(如0.13;0.38;0.63;0.88),那么它也算。然后。

在输入1.0时,输出1.13。

1.25为输入,1.38为输出。

1,5 ---> 1,63...

在API层面上,这可以被编码成几个汇编语言命令,而且这显然是一个基本功能。我以为有一个 =/

 
如何通过实时更新来更新到新的版本。实时更新在哪里?
 
Newalligator:
如何通过实时更新来更新到新的版本。这个实时更新在哪里?
你应该在MetaQuotes-Demo服务器上开一个模拟账户,并偶尔连接到它,以检查更新。如何在MetaQuotes-Demo服务器上开立一个模拟账户
 
谢谢你的回答,我是实盘交易,MT5一直开着。如果软件说我需要更新,那很好。 如果没有,实时更新在哪里?
 
Newalligator:
谢谢你的回答,我是实盘交易,MT5一直开着。如果程序本身提示我更新,这很好,但如果没有,这个实时更新在哪里?
当你在MetaQuotes-Demo服务器上连接到你的账户时,MetaTrader将自动检查更新。如果有更新,它将自动下载新版本。
 

大家好!有一个问题 - 我不能在一个自定义指标 中使用另一个自定义指标的读数。我几乎可以肯定我做错了,但我还是要把代码粘贴出来。

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   
   if(rates_total < iPeriod ) {
      return(0);
   }
   
   int first;
   
   if ( prev_calculated == 0 ) {
      first = iPeriod + begin;
   } else {
      first = prev_calculated - 1;
   }
      
   // Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");   
   CopyBuffer(iRocHandleEURUSD, 0, 0, rates_total, aRocRatesEURUSD);

   for(int bar = first; bar < rates_total; bar++) {

在这段代码中,变化率指标(aRocRatesEURUSD) 的缓冲区不可用。我不明白如何正确连接这个指标,请帮助我理解。

 
jommerbot:

大家好!有一个问题 - 我不能在一个自定义指标 中使用另一个自定义指标的读数。我几乎可以肯定我做错了,但我还是要把代码粘贴出来。

在这段代码中,变化率指标(aRocRatesEURUSD) 的缓冲区不可用。我不能理解如何正确连接这个指标,请帮助我理解。

指标手柄必须在OnInit()中声明。

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");   
  }
否则,事实证明,你每次调用OnCalculate()都会创建一个新的自定义指标。
 
barabashkakvn:

指标手柄应该在OnInit()中声明。

这也行不通。缓冲区阵列最后要么是空的,要么是充满了左手的值。
 
jommerbot:
这也是行不通的。结果是,带有缓冲区的数组要么是空的,要么是充满了左边的值。
然而,在OnInit()中声明指标句柄是正确的。另一个问题是,为什么每次有新的刻度线出现时,你都要写上(OnCalculate()函数)?
rates_total,      // размер входных таймсерий

到缓冲区

aRocRatesEURUSD

?这真的会减慢终端的速度。此外,这是一个非常深刻的故事。

我想你会发现,阅读《指标的经济性重新计算原则》一文会很有趣。

还要阅读OnCalculate()函数的帮助。

 

好吧,即使在最简单的情况下也是不行的。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  Red

double ExtLineBuffer[];   
int iRocHandleEURUSD;  
int iPlotShift = 0;
int iPeriod = 6;
 
void OnInit() {
   SetIndexBuffer(0, ExtLineBuffer, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_SHIFT, iPlotShift);
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, iPeriod - 1);
   
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");    
   if( iRocHandleEURUSD == INVALID_HANDLE )
   {
      Print("Не удалось получить хендл индикатора ROC EURUSD");  
   }
}

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   
   if(rates_total < iPeriod ) {
      return(0);
   }
   
   int first;
   double aRocRatesEURUSD[]; 
   
   if ( prev_calculated == 0 ) {
      first = iPeriod + begin;
   } else {
      first = prev_calculated - 1;
   }
   
   for(int bar = first; bar < rates_total; bar++) {
      CopyBuffer(iRocHandleEURUSD, 0, bar, 1, aRocRatesEURUSD);
      Print(aRocRatesEURUSD[ 0 ]);   
      ExtLineBuffer[ bar ] = NormalizeDouble(aRocRatesEURUSD[ 0 ], SYMBOL_DIGITS);
   }
     
   return(rates_total);
}

我不明白我的错误在哪里。在EA 和脚本中复制相同的指标 缓冲区可以工作,但在指标中不能。指示器手柄被初始化,没有错误。