MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 370

 
PokrovMT5:

こんにちは、あなたはそれが任意のプログラムまたはタイムフレームを指定することができますバーデータへの参照であるかどうかに関係なく、この指標のためにiDataに入力する必要がある場合は、教えてください、なぜ他のタイムフレームのデータは、現在の異なるオンタイムフレームのチャートに正しく反映されていませんが、指定したタイムフレームのチャートにのみ反映されていますか?ありがとうございます。


分かりかねる

しかし、これは 役に立つと思います

Доступ к таймсериям и индикаторам - Справочник MQL4
Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Функции для работы с таймсериями и индикаторами. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым). Для копирования значений таймсерий и индикаторов рекомендуется использовать только динамические массивы, так как функции копирования...
 

リンクありがとうございます。私は全く同じ絵を持っていますが、アルゴリズムが少し違うだけで、ポイントは(最終的な描画で)より多くのポイントを作り、それらを閾値で表示させることです。

 
Alekseu Fedotov:

よくわからないんです。

でも、それが役に立つと思う んです。


ありがとうございます、ぜひ調べてみますが、例として、ゼロの代わりに別の時間枠のデータを書き込むと、なぜか正常に反映されないので、まずコピーしてからレンダリングした方がいいのでしょうか。

iClose(NULL,0,i);
 

ノバヤ

リンクありがとうございます。私は全く同じ絵を持っていますが、アルゴリズムが少し違うだけで、本質は(最終的な描画で)より多くのポイントを作り、閾値でそれらを表示することです。


あなたはそうすることができますが、それはRencoが判明し、すなわち、等しいセグメント距離m /頂点に分割します。これは、アルゴリズム自体の頂点を探索することを壊し、初期のコードを維持しながら、どのように作るかという問題は、ポイント間の閾値(追加描画上)、すべて最後とトップの間の距離の倍数を取得する必要があります(閾値よりも小さくなります)。

 
//+------------------------------------------------------------------+
//|                                                       FastZZ.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, Yurich"
#property link      "https://login.mql5.com/ru/users/Yurich"
//---
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Gold
#property indicator_color4 DodgerBlue

#property indicator_width3 3
#property indicator_width4 3

//--- input parameters
extern int  Depth    = 10;
//---
double zzH[], zzL[];
double depth;
int last, direction, pbars;
datetime lastbar;

double ArrUp[];
double ArrDn[];
//+------------------------------------------------------------------+
int init()
{
//---- indicators
   SetIndexBuffer(0,zzH);
   SetIndexBuffer(1,zzL);
   SetIndexBuffer(2,ArrUp);
   SetIndexBuffer(3,ArrDn);
   
   SetIndexStyle(0,DRAW_ZIGZAG);
   SetIndexStyle(1,DRAW_ZIGZAG);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexStyle(3,DRAW_ARROW);
   
   SetIndexArrow(2,159);
   SetIndexArrow(3,159);
   
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   IndicatorDigits(Digits);
//----
   depth=Depth*Point;
   direction=1;
   last=0;
   pbars=0;
   lastbar=0;
   return(0);
}
//+------------------------------------------------------------------+
int start()
{
   int limit=Bars-IndicatorCounted()-1;
   if(lastbar!=Time[0])
   {
      lastbar=Time[0];
      last++;
   }
   if(MathAbs(Bars-pbars)>1) { last=Bars-1; limit=last;}
   pbars=Bars;
   //---
   for(int i=limit; i>0; i--)
   {
      bool set=false;
      zzL[i]=0;
      zzH[i]=0;
      ArrUp[i]=EMPTY_VALUE;
      ArrDn[i]=EMPTY_VALUE;
      //---
      if(direction>0)
      { 
         if(High[i]>zzH[last]+depth)
         {
            zzH[last]=0;
            zzH[i]=High[i];
           
            ArrUp[i]=High[i];
            
            if(Low[i]<High[last]-depth)
            {
               if(Open[i]<Close[i])
                {
                  zzH[last]=High[last]; 
                  ArrUp[last]=High[last];
                }else direction=-1;
               zzL[i]=Low[i];
               ArrDn[i]=Low[i];
            }
            last=i;
            set=true;
         }
         if(Low[i]<zzH[last]-depth && (!set || Open[i]>Close[i]))
         {
            zzL[i]=Low[i];
            ArrDn[i]=Low[i];
            
            if(High[i]>zzL[i]+depth && Open[i]<Close[i])
             {
               zzH[i]=High[i];
               ArrUp[i]=High[i]; 
             }else direction=-1;
            last=i;
         }
      } else //direction<0
      {
         if(Low[i]<zzL[last]-depth)
         {
            zzL[last]=0;
            zzL[i]=Low[i];
        
            ArrDn[i]=Low[i];            
            
            if(High[i]>Low[last]+depth)
            {
               if(Open[i]>Close[i])
                {
                  zzL[last]=Low[last]; 
                  ArrDn[last]=Low[last];
                }else direction=1;
               zzH[i]=High[i];
               ArrUp[i]=High[i];
            }
            last=i;
            set=true;
         }
         if(High[i]>zzL[last]+depth && (!set || Open[i]<Close[i]))
         {
            zzH[i]=High[i];
            ArrUp[i]=High[i];
            
            if(Low[i]<zzH[i]-depth && Open[i]>Close[i])
             {
               zzL[i]=Low[i]; 
               ArrDn[i]=Low[i];
             }else direction=1;
            last=i;
         }
      }
   }
//----
   zzH[0]=0;
   zzL[0]=0;
//----
   return(0);
}
//+------------------------------------------------------------------+
 

なぜかコードがすぐにコメントを挿入してくれなかったので、書き直しました。

 
PokrovMT5:

ありがとうございます、調べてみますが、例としてゼロを書く代わりに別の時間枠のデータを入れても正しく反映されないのはなぜでしょうか、先にコピーしてから描画したほうがいいのでしょうか?



CopyCloseはもっと現代的な関数ですが、大丈夫iClose(...)はうまく動きます。

どのようにしたら正常に動作しないのですか? 画像かコードの一部か、もう少し具体的に教えてください。

 
Alekseu Fedotov:

CopyCloseはもっと現代的な関数ですが、まあ、iClose(...)でも問題ありません。

どのように間違って動作するのですか? 写真かコードの一部か、もっと正確に教えてください。

さて、ここで簡単な例を挙げてみましょう。終値をチャートで見たい、1時間をタイムフレームで見たい、時計ではすべてうまくいくが、他のタイムフレームでは違うということです。より小さな時間枠で、より高いものの終値を見ようというものである。画像は30分です。
//+------------------------------------------------------------------+
//|                                                   Проверка 2.mq4 |
//|                                                  Bugaev Vladimir |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Bugaev Vladimir"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 clrBlue
#property indicator_width1 2
int i,limit;

double C,CC[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
IndicatorBuffers(1);
//----      
   SetIndexBuffer(0,CC);
  
   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[])
 
 {
if(prev_calculated<1) limit=rates_total-1;
if(prev_calculated>0)limit=rates_total-prev_calculated;
for(i=limit; i>0; i--)  
  
  {
 C= iClose(NULL,60,i);
 CC[i]=C; 



  }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
PokrovMT5:
ここでは最も単純な例です。私はチャートの終値を見たいのですが、タイムフレームは1時間で書かれており、時計ではすべてがうまくいき、他のタイムフレームではすべてが異なっています。より小さな時間枠で、より高いものの終値を見ようというものである。画像は30分です。

このように


     int shift;
     datetime  T;
  
   for(i=limit; i>=0; i--)
     {
      T = iTime(NULL,0,i); 
      shift=iBarShift(NULL,60,T); 
      C=iClose(NULL,60,shift);
      CC[i]=C;
     }
 
Alekseu Fedotov:

そういうことなんです。



ありがとうございました。