インジケータを無償で作成します - ページ 98

 
Aleksei Stepanenko:

私はほんの少ししかお手伝いできません、絶対に無料です。

インジケーターの下部には、2つの機能があります。コメントには、インジケータ自体の値と、最後のトレンドライン 上の現在のポイントの値が表示されます。

図解してください。

アレクセイ、ありがとうございます。良い一日をお過ごしください。
 
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) 新しい期間の始まりに「iOpen」でインディケータが始まるように、「period01」基準点を設定する方法がわかりません。

最初のバーの極値は正しく、"else "の後にあなたのコードを取るために、すぐに取る。ありがとうございます。

しかし、ここで

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

なぜなら、それは一日の始まりにリンクされており、私は "期間01 "選択 - 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]);