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

 
-Aleks-:

请帮助我们!(MQL4)

我需要在M15图表上获得当天的开盘时间,同时考虑到每个条形图--用于指标。

我决定以秒为单位进行计算,并考虑到当前栏位(0),但我一定是搞错了。

D_Shift=(Open_time-pos*15*60-(Open_time-Open_timeTF))/1440*60;

如果为了指标,那么。

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            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   for(int i=0;i<rates_total-1;i++)
     {
      TimeToStruct(time[i],dt_struct);
      if(dt_struct.day<temp_day)
        {
         Print("Start day ",time[i-1]);
         break;
        }
     }

//--- done
   return(rates_total);
  }

但是:这段代码将在每次进入OnCalculate()时被执行--根据你的需要,你可以添加bool 标志或将代码放在单独的函数中。

 
Karputov Vladimir:

如果是为了指标,那么。

但是:这段代码将在每次OnCalculate()时执行--根据你的需要,或者添加一个bool 标志或者将代码放在一个单独的函数中。

谢谢,但在每一个刻度 做重新计算是不好的 - 我需要分析你的代码,然而,当我想了解为什么我的代码不工作时,在日志中返回奇怪的数字。

敞开_时间TF 1454715900
开放时间 1454284800
Delta_1S 431100
Δ_M15 479

结果发现,一天中的第一个柱子和当前的柱子之间有479个柱子的差异--这是为什么?

 
-Aleks-:

谢谢,但是在每个tick上重新计算并不好--我需要考虑你的代码,然而,当我想了解为什么我的代码不工作的时候,日志返回奇怪的数字。

敞开_时间TF 1454715900
开放时间 1454284800
Delta_1S 431100
Δ_M15 479

结果发现,一天中的第一个柱子和当前的柱子之间有479个柱子的差异--这是为什么?

我确实表明我不是灵媒,这就是原因。

但是:这段代码将在每次进入OnCalculate()时被执行--这里取决于你的需要,要么添加一个bool 标志,要么把代码放在一个单独的函数中

 
Karputov Vladimir:

我确实指出了我不是灵媒,这就是原因。

为什么这里需要通灵能力?上面的代码中有一些变量,我展示了这些变量返回的数字,并问为什么是这种情况,而不是相反--根据代码。
 
Karputov Vladimir, 我不明白你的代码 - 因为我是这个行业的初学者,我以前没有使用过OnCalculate 函数,所以我不明白那里计算的是什么费率_总数,最重要的是,在哪里返回?我也不明白如何把它全部变成一个单独的函数......没有注释就很难理解。
 
-Aleks-:
Karputov Vladimir,我不明白你的代码--我是这个行业的初学者,我以前没有使用过OnCalculate 函数,所以我不明白那里计算的是什么费率_总数,更重要的是,它应该返回到哪里?我也不明白如何把它全部变成一个单独的函数......没有注释就很难理解。

以下是MQL4指标的完整代码。

//+------------------------------------------------------------------+
//|                                                    Start day.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//--- input parameters
input int      timer=10; // seconds
//--- parameter
bool           IsDefineTime=true; // true -> you can define time
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(timer);
//---
   IsDefineTime=true;
//---
   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            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }
//+------------------------------------------------------------------+

它的工作原理:当你启动指示器时,你设置定时器的时间间隔(例如,10秒)--这意味着每10秒定时器将被触发。

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }

IsDefineTime 变量被分配值为true。它是用来做什么的?当IsDefineTime=true时,我们可以在OnCalculate()中,进入一个循环来确定一天的开始时间。

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }

在这个循环中,我们从最右边的条形图(其索引为 "0")开始遍历time[] 数组(该数组存储开盘时间值)。当找到一天的开始时间时,我们取消它的值,并给变量IsDefineTime 赋值为false--通过这种方式,我们保护自己不再进入确定一天开始时间的循环,直到定时器再次运行。

附加的文件:
Start_day.mq4  3 kb
 

卡尔普托夫-弗拉基米尔 ,感谢你的澄清,然而,这如何解决这个问题?

粗略地说,我们需要知道当前时间框架中与当天开始时的条形图相对应的条形图。我们需要了解每个条形图,并据此计算和绘制指标。

 
-Aleks-:

卡尔普托夫-弗拉基米尔 ,感谢你的澄清,然而,这如何解决这个问题?

粗略地说,我们需要知道当前时间框架中与当天开始时的条形图相对应的条形图。你需要知道它在每个柱子上的情况,并据此计算和绘制指标。

你是这样问的,也是这样被回答的:) 。如果你想要的不是这一天的第一个小节的时间,而是这个小节的索引--它就在这里,当你打印一天的开始时。

.
.
.
Print("Start day ",time[i-1]);
.
.
.

你使用指数[i-1]--这是一天中第一根柱子的编号。

 
Karputov Vladimir:

正如你所问的,你得到了你的答案:) 。如果你需要的不是一天中第一个小节的时间,而是这个小节的索引,它就在这里,当你打印一天的开始。

你使用指数[i-1]--这是一天中第一根柱子的编号。

我同意--我问得很糊涂。

在我做的应用程序中,有一个指标,但它不能正确计算。我非常笨,即使在你的解释下,我也不明白如何使它正确地确定一天开始时第一个条形图所对应的指数。

请原谅我的无礼,但也许你能告诉我如何将你的代码和我的代码结合起来?

附加的文件:
 

-Aleks-:

我怎样才能让它正确地检测到一天开始时第一个条形图所对应的指数?

这是一个有点混乱的问题。

datetime Day00=86400*(TimeCurrent()/86400);//начало дня
int bar_shift=iBarShift(_Symbol,PERIOD_CURRENT,Day00);//индекс первого бара текущего дня