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

 
barabashkakvn:
在指标代码中查看,OnCalculate()函数。

做到以下几点。

int limit=rates_total-prev_calculated;
   double pr=close[0];
   //----
   if(rates_total-prev_calculated>=Period_)
      limit=limit-Period_;
      //----
   for(int i=limit-1;i>=0;i--)
     {
      CopyBuffer(ma1Handle,0,i,1,ma1Val);
      ExtMapBuffer1[i]=ma1Val[0]-pr;
     }
什么都没有用。在MQL4中一切都很清楚。我对MQL5不是很了解。我想应该调用一些函数来获取价格?
 
forexman77:

我的做法如下。

什么都没有用。在MQL4中一切都很清楚。我对MQL5不是很了解。也许,必须调用一些函数才能获得价格?

写在OnInit中。

//--- установим индексацию для буфера как в таймсерии 
ArraySetAsSeries(ma1Val,true); 
 
forexman77:

我的做法如下。

什么都没有用。在MQL4中一切都很清楚。我对MQL5不是很了解。也许,为了获得价格,必须调用一些函数?

你可以使用CopyRates(类似于CopyBuffer)来访问价格历史。

当前的卖出价、买入价可以通过SymbolInfoTickSymbolInfoDouble(如Spread指标)获得。

 
barabashkakvn:

写在OnInit中。

自动交易
你可以使用CopyRates(类似于CopyBuffer)来访问价格历史。卖出价、买入价的当前值可以通过SymbolInfoTick 获得。

什么都没有用。这里是所有的代码。

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  clrRed
#property  indicator_style1  STYLE_SOLID
#property  indicator_label1  "BUY TP"
input int Period_=34;
int ma1Handle;
double ma1Val[1];
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,ExtMapBuffer1,INDICATOR_DATA);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,Period_);
   ArraySetAsSeries(ExtMapBuffer1,true);
   ma1Handle=iMA(_Symbol,_Period,Period_,0,MODE_EMA,PRICE_CLOSE);
   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 limit=rates_total-prev_calculated;
   //----
   if(rates_total-prev_calculated>=Period_)
      limit=limit-Period_;
      //----
   for(int i=limit-1;i>=0;i--)
     {
       MqlTick latest_price;       // Будет использоваться для текущих котировок
      if(!SymbolInfoTick(_Symbol,latest_price))
          {
          Alert("Ошибка получения последних котировок - ошибка:",GetLastError(),"!!");return(0);
          }
      double iclose=latest_price.bid;
      CopyBuffer(ma1Handle,0,i,1,ma1Val);
      ExtMapBuffer1[i]=iclose - ma1Val[0];
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
forexman77:

什么都没有用。这里是所有的代码。

为什么不呢?这对我来说是有效的。

指示器在工作,不是吗!?

附加的文件:
test.mq5  3 kb
 
Вbarabashkakvn:

我不明白为什么不可以。这对我来说很有效。

在视觉上,乍一看,它看起来是正确的。但是当我重新计算价格和移动平均线之间的差异时,我得到了一个完全不同的数字。

我在欧元兑美元/1.36421-1.36168=0.00253上检查,指标显示为0.00157。

 

下午好。

MQL5语言 中是否有任何现成的函数代码,就像KimIV在MQL4中的http://forum.mql4.com/ru/38949

Только "Полезные функции от KimIV". - MQL4 форум
  • www.mql5.com
Только "Полезные функции от KimIV". - MQL4 форум
 
forexman77:

在视觉上,乍一看,它看起来是正确的。但是,在重新计算了价格和移动平均线之间的差异后,我们得到了一个完全不同的数字。

我检查了欧元兑美元/1.36421-1.36168=0.00253,指标显示0.00157截图附后。

啊,好吧,你需要在你的要求中更加准确。现在它正在正确计数。
附加的文件:
test.mq5  3 kb
 
abeiks:

下午好。

MQL5语言 中是否有任何现成的函数代码,就像KimIV在MQL4中的http://forum.mql4.com/ru/38949

在mql5中使用的不是函数代码,而是对象库。函数很难连接,在OOP中则比较容易:连接所需的库,创建一个对象并在其中获得必要的方法--类似于算法语言中的函数。
 
我注册了一个信号,你能告诉我是否需要终端运行和账户开放?
原因: