我将免费编写指标 - 页 98

 
Aleksei Stepanenko:

我只能提供一点帮助,绝对免费。

在指示器的底部有两个功能。在评论中,它显示了指标本身的价值和最后一条趋势线上 当前点的价值。

弄清楚。

谢谢你,阿列克谢。祝你有个愉快的一天。
 
A-V-K:
谢谢你,阿列克谢。祝你有个愉快的一天。

.

 

下午好!

我已经写了这个指标


//+------------------------------------------------------------------+
//|                                                      MTF_H&L.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020"
#property strict
#property indicator_chart_window
#property indicator_buffers   2
#property indicator_width1    1
#property indicator_color1    clrTeal
#property indicator_type1     DRAW_LINE
#property indicator_width2    1
#property indicator_color2    clrCrimson
#property indicator_type2     DRAW_LINE
//---
input ENUM_TIMEFRAMES   period01 =  PERIOD_D1;
input ENUM_TIMEFRAMES   period02 =  PERIOD_M15;
input int               percount =  10;         //Ограничение истории

double Buffer1[];
double Buffer2[];
int    index1=-1;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   SetIndexBuffer(0, Buffer1, INDICATOR_DATA);
   SetIndexBuffer(1, Buffer2, INDICATOR_DATA);
//---
   IndicatorDigits(Digits);
   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, limit, barcount;
   barcount=period01/Period()*percount;
   if(barcount != 0) limit = barcount; 
   else limit = rates_total - 2;
   
   for(i=limit;i>=0;i--)
   {
      if(TimeSeconds(time[i])==0)
      index1=iBarShift(Symbol(), period02, time[i], false);

      if(TimeHour(time[i])==0&&TimeMinute(time[i])<period02)
      {
      Buffer1[i]=iOpen(NULL,period02,index1);
      Buffer2[i]=iOpen(NULL,period02,index1);
      }
      else 
      {
      Buffer1[i]=iHigh(NULL,period02,index1);
      if(Buffer1[i]<Buffer1[i+1]){
      Buffer1[i]=Buffer1[i+1];}
      
      Buffer2[i]=iLow(NULL,period02,index1);
      if(Buffer2[i]>Buffer2[i+1]){
      Buffer2[i]=Buffer2[i+1];}
      }
   }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

请帮助我纠正该指标或告诉我如何纠正。

1) 我不知道如何设置参考点 "period01",以便指标在新周期开始时以 "iOpen "开始。

2)我不知道如何使用 "iHighest",所以我不需要使用这种 "拐杖"。

if(Buffer1[i]<Buffer1[i+1]){
   Buffer1[i]=Buffer1[i+1];}

请帮助。

 
MakarFX:

下午好!

我写了以下指标


请帮助我纠正该指标或告诉我如何纠正。

1) 我不知道如何设置参考点 "period01",以便指标在新周期开始时以 "iOpen "开始。

2)我不知道如何使用 "iHighest",所以我不需要使用这种 "拐杖"。

请帮助。

你为什么要写它?

 
Алексей Тарабанов:

你为什么要写它?

寻找一个模式...

如果移到地下室,它看起来像这样


 
MakarFX:

日安!

问候你,马卡!

这里的开盘价 是多少 要立即采取第一小节的极值。比如这个。

if(i==limit || TimeDay(time[i])!=TimeDay(time[i+1]))
   {
   Buffer1[i]=iHigh(NULL,period02,index1);
   Buffer2[i]=iLow(NULL,period02,index1);
   }
else
   {
   if(iHigh(NULL,period02,index1)-Buffer1[i+1]>0)
      {
      Buffer1[i]=iHigh(NULL,period02,index1);
      }
   else
      {
      Buffer1[i]=Buffer1[i+1];
      }
   if(Buffer2[i+1]-iLow(NULL,period02,index1)>0)
      {
      Buffer2[i]=iLow(NULL,period02,index1);
      }
   else
      {
      Buffer2[i]=Buffer2[i+1]; 
      }
   }
还是我的想法有误?
 
Aleksei Stepanenko:

问候你,马卡!

这里的开盘价 是多少 要立即采取第一小节的极值。比如这个。

还是我的想法有误?

我写道。

1) 我不知道如何设置参考点 "period01",以使指标在新周期开始时以 "iOpen "开始。

要马上采取第一条的极值是正确的,我在 "else "之后采取你的代码。谢谢你。

但在这里

if(i==limit || TimeDay(time[i])!=TimeDay(time[i+1]))

不适合,因为它与一天的开始相联系,我需要 "period01 "的选择--H1;H4;等等。

 

另外,你可以用当前日期除以时间框架中的秒数,然后将所得的值与前一个值进行比较。

int part=0;

int OnCalculate(......)
   {

   for(......)
      {
      if(time[i]/PeriodSeconds(period01)>part)
         {      
         part=time[i]/PeriodSeconds(period01);
      
         Buffer1[i]=iHigh(NULL,period02,index1);
         Buffer2[i]=iLow(NULL,period02,index1);
         }
      else
.......
      

启动可能不会与图表同步,但计时条会正确计数。你可以考虑如何使第一次启动同步。

如:

if(time[i]%PeriodSeconds(period01)==0)
 
Aleksei Stepanenko:

另外,你可以用当前日期除以时间框架中的秒数,然后将所得的值与前一个值进行比较。

启动可能不会与图表同步,但计时条会正确计数。你可以考虑如何使第一次启动同步。

如:

非常感谢你,我将尝试一下。
 

不客气。一个较短的条目。

Buffer1[i]=MathMax(iHigh(NULL,period02,index1),Buffer1[i+1]);
Buffer2[i]=MathMin(iLow(NULL,period02,index1),Buffer2[i+1]);