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

 
KolyanSNA:
こんにちは!ターミナルでフォントサイズを 変更するにはどうしたらいいですか?どなたかヒントをください。

そのようなニーズがある場合は、OSの表示設定でズームを変更するのが有効かもしれません。

 

マウスがグラフィック上をクリックしたときに、キーボードのボタンが押されたかどうかをOnChartEventから 判断する方法はありますか?

 

指標を理解するために、ご教授ください。

ここで、新しいバーの 開始ごとに再計算を行う必要があります。

ロジック - ジグザグは、ボトム(直近の3本のバーのうち、隣り合う2本のバーより低いもの)とトップ(直近の3本のバーのうち、隣り合う2本のバーより高いもの)を結ぶ必要があります。

ピークの後に新しいピークが続くと、新しいピークにインジケータが再描画され、古いピークが削除される、というのは分かりやすいと思います。

実際、このインジケータはすべての高値と安値を順次結んでいますが、何が問題なのでしょうか?

#property indicator_chart_window
#property indicator_buffers 2 
#property indicator_plots   1 
//--- plot ZigZag 
#property indicator_label1  "ZigZag" 
#property indicator_type1   DRAW_ZIGZAG 
#property indicator_color1  clrBlue 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
//--- indicator buffers 
double         ZigZagBuffer1[]; 
double         ZigZagBuffer2[]; 
double a = 0;
int last = 0; //В последний раз была вершина или низина 
int lastN = 0; //Номер бара с экстремумом
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- связывание массивов и индикаторных буферов 
   SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA); 
   SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA); 
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); 
   ArrayInitialize(ZigZagBuffer1, EMPTY_VALUE);
   ArrayInitialize(ZigZagBuffer2, EMPTY_VALUE);
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetString(0,PLOT_LABEL,"ZigZag1;ZigZag2"); 
//--- 
   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(a != iOpen(_Symbol, PERIOD_CURRENT, 0))
   {
      a = iOpen(_Symbol, PERIOD_CURRENT, 0);
      for(int i = Bars(_Symbol, PERIOD_CURRENT) - 3; i > 0; i--)
      {
         if(high[i] <= high[i+1] && high[i+2] <= high[i+1] && low[i] >= low[i+1] && low[i+2] >= low[i+1]) //В обе стороны на одном баре
         {
            if(last == 0) continue; //Если с этого начинается расчет - пропускаем просто
            if(last == 1) //Если была вершина
            {
               if(high[lastN] > high[i+1])//Если новая верщина не перебила старую
               {
                  ZigZagBuffer1[i+1] = high[i+1];
                  ZigZagBuffer2[i+1] = low[i+1];
                  lastN = i+1;
                  continue;
               }
               //Если перебила
               ZigZagBuffer1[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               ZigZagBuffer2[i+1] = low[i+1];
               last = -1;
               lastN = i+1;
               continue;
            }
            if(last == -1)
            {
               if(low[lastN] < low[i+1])//Если новая низина не перебила старую
               {
                  ZigZagBuffer1[i+1] = high[i+1];
                  ZigZagBuffer2[i+1] = low[i+1];
                  lastN = i+1;
                  continue;
               }
               //Если перебила
               ZigZagBuffer2[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               ZigZagBuffer2[i+1] = low[i+1];
               last = 1;
               lastN = i+1;
               continue;
            }
         }
         if(high[i] <= high[i+1] && high[i+2] <= high[i+1]) //Новая вершина
         {
            if(last == 0)
            {
               last = 1;
               lastN = i+1;
               ZigZagBuffer1[i+1] = high[i+1];
               continue;
            }
            if(last == 1)
            {
               ZigZagBuffer1[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               lastN = i+1;
               continue;
            }
            if(last == -1)
            {
               ZigZagBuffer1[i+1] = high[i+1];
               lastN = i+1;
               last = 1;
               continue;
            }
         }
         if(low[i] >= low[i+1] && low[i+2] >= low[i+1])//Новая низина
         {
            if(last == 0)
            {
               last = -1;
               lastN = i+1;
               ZigZagBuffer2[i+1] = low[i+1];
               continue;
            }
            if(last == -1)
            {
               ZigZagBuffer2[lastN] = EMPTY_VALUE;
               ZigZagBuffer2[i+1] = low[i+1];
               lastN = i+1;
               continue;
            }
            if(last == 1)
            {
               ZigZagBuffer2[i+1] = low[i+1];
               lastN = i+1;
               last = -1;
               continue;
            }
         }
      }
   }
   
   return(rates_total); 
} 
Обработчик события "новый бар"
Обработчик события "новый бар"
  • www.mql5.com
Для создателей индикаторов и экспертов всегда был актуален вопрос написания экономичного кода с точки зрения времени выполнения. Можно подойти к решению этой задачи с разных сторон. Из этой обширной темы в данной статье будет затронут, казалось бы уже решенный вопрос: проверка появления нового бара. Это достаточно популярный способ ограничения...
 
Roman Sharanov:

指標を理解するために、ご教授ください。

ここで、新しいバーの 開始ごとに再計算を行う必要があります。

ロジック - ジグザグは、ボトム(直近の3本のバーのうち、隣り合う2本のバーより低いもの)とトップ(直近の3本のバーのうち、隣り合う2本のバーより高いもの)を結ぶ必要があります。

ピークの後に新しいピークが続くと、新しいピークにインジケータが再描画され、古いピークが削除される、というのは分かりやすいと思います。

実際、インジケーターはHIとLHをすべて直列に接続していますが、何が問題なのでしょうか?

私の理解では、2つの描画バッファを持っていますね。どちらも描かれています。各バッファーにはそれぞれのラインがあり、1つの極限を得ることができます。ジグザグに3つのバッファがあります。最大値と最小値を別々に計算するものと、最大値をバッファに書き込んだ後に最小値を探すという符号にしたがって描画するもの、その逆の2つです。

 
質問ですが、MT4の標準ライブラリの 記述はあるのでしょうか、ないのでしょうか?
 
Valeriy Yastremskiy:

描画バッファは2つあるそうですね。どちらも描かれています。各バッファーは独自のラインを持っており、あなたは1つの極端なを取得します。ジグザグに3つのバッファがあります。2つの計算バッファは最大値と最小値用に分かれており、1つのバッファはmaximaバッファに書き込まれた最後の最大値に続く描画に使用され、その逆も同様である。

ヘルプ - ジグザグは2つのバッファを使用して構築され、2つのバッファを持つ例もあります。

 
Valeriy Yastremskiy:
質問ですが、MT4の標準ライブラリの 記述はあるのでしょうか、ないのでしょうか?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
 
Artyom Trishkin:

MT4です。

記事にクドい。素晴らしい作品です。

 
Roman Sharanov:

ヘルプ - ジグザグは2つのバッファの上に構築され、2つのバッファを持つ例もあります。

ZZコードの開始。

//+------------------------------------------------------------------+
//|                                                       ZigZag.mq4 |
//|                   Copyright 2006-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2006-2014, MetaQuotes Software Corp."
#property link      "http://www.mql4.com"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1  Red
//---- indicator parameters
input int InpDepth=12;     // Depth
input int InpDeviation=5;  // Deviation
input int InpBackstep=3;   // Backstep
//---- indicator buffers
double ExtZigzagBuffer[];
double ExtHighBuffer[];
double ExtLowBuffer[];

描画バッファは1つ。3つのアレイ

コードを見てください。ロジックは複雑です。普通、その場でやるのは難しいですよね。

ロシア語に翻訳されたコメントを含むZigZagコード
ファイル:
ZigZagRu.mq4  19 kb
 
Valeriy Yastremskiy:

MT4です。

記事にクドい。素晴らしい作品です。

そんなことはどうでもよくて、ほとんどすべてのものがフィットする。

ありがとうございます。