記事"一个绘制支撑和阻力线的指标实例"についてのディスカッション

 

新しい記事 一个绘制支撑和阻力线的指标实例 はパブリッシュされました:

本文提供了一个例子,它是关于如何实现根据指定条件绘制支撑和阻力线的指标的,另外,它也包含了一个可以使用的指标,您将看到,创建指标的过程有多么简单。您也将能学习如何通过修改指标代码来构建用于绘制任何所需线形的条件。

您可以在这里加上任何想要的条件,但是本质是一样的: 我们要寻找一个条件, 价格会根据它在某一水平进行反转,条件符合的越多,水平支撑线或者阻力线就越有效。作为实例,我们将首先进行第一个版本的构建,让我们分析价格在一天之内的变化。

每日变动

作者: Andrey Kisselyov

 

反対側から傾斜レベルを引くことはできますか?

つまり、サポートラインやレジスタンスラインは、上昇時に下から引くのではなく、逆に上から引くのですか?

 
Alexandr Gavrilin:

反対側から傾斜レベルを引くことはできますか?

つまり、サポートラインやレジスタンスラインを、上昇時に下からではなく、逆に上から引くことはできますか?


もちろんです。それほど難しいことではありません。
 

リテラシーのある方、MQL5で、設定されたバー数の 最高値と最安値を見つける方法を教えてください。

例えば、mql4では簡単にできます。

_High   = NormalizeDouble(iHigh(Symb,PERIOD_CURRENT,iHighest(Symb,PERIOD_CURRENT,MODE_HIGH,CanalBar,0)), Digits); // 直近のCanalBarの最高値を計算する。 
_Low    = NormalizeDouble(iLow (Symb,PERIOD_CURRENT,iLowest (Symb,PERIOD_CURRENT,MODE_LOW, CanalBar,0)), Digits); // 直近のCanalBarの最安値を計算する。
   

ここでは見つけたものをチャートに線を引くだけです。

しかし、mql5では、設定したバー数の最高値と最安値をどうやって求めるのかが謎だ。iHighestと iLowest

というように、簡単には理解できません。

もしコード例があれば教えていただけると助かります。

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

 
Konstantin Seredkin:

リテラシーのある方、MQL5で、設定されたバー数の 最高値と最安値を見つける方法を教えてください。

例えば、mql4では簡単にできます。

ここでは見つけたものをチャートに線を引くだけです。

しかし、mql5では、設定したバー数の最高値と最安値をどうやって求めるのかが謎だ。iHighestと iLowest

というように、簡単には理解できません。

もしコード例があれば教えていただけると助かります。


_High   = NormalizeDouble(high[ArrayMaximum(high, 0, CanalBar)], Digits); // 直近のCanalBarの最高値を計算する。 

ここで、highは棒グラフの高値の配列です。

インジケーターであれば、OnCalculationで取得します。
Expert Advisorであれば、CopyHighで取得します。

ArraySetAsSeries trueを忘れないでください。


ありがとうございます。

 

SPS

 
Konstantin Seredkin:

リテラシーのある方、MQL5で設定されたバー数の 最高値と最安値を見つける方法を教えてください。

例えば、mql4では簡単にできます。

ここでは見つけたものをチャートに線を引くだけです。

しかし、mql5では、設定したバー数の最高値と最安値をどうやって求めるのかが謎だ。iHighestと iLowest

というように、簡単には理解できません。

もしコード例があれば教えていただけると助かります。

ありがとうございます。

まず、あなたのコードについてですが、現在のチャートの最大値を要求しているという事実に基づいて、もっとシンプルにします。頂点の例をあげますが、谷の場合はすべてほとんど同じです。
、すべてのデータに対する一般的な要求のコマンドと、現在のデータに対する要求のコマンドを混同しています。この場合は不要です。
//現在のデータ(どのEAやインジケータからでも現在のデータにアクセスできる)については、次のようになります。
   _High=NormalizeDouble(High[iHighest(Symb,_Period,MODE_HIGH,CanalBar)],_Digits);

//一般的なデータ(EAやインジケーターからデータベース内のデータへのアクセス)は、以下のようになります。 
   _High=NormalizeDouble(iHigh(Symb,PERIOD_CURRENT,iHighest(Symb,PERIOD_CURRENT,MODE_HIGH,CanalBar)),MarketInfo(Symb,MODE_DIGITS));

次にmt5のコードについて。

   double high[];
   ArrayResize(high,CanalBar);
   CopyHigh(Symb,PERIOD_CURRENT,0,CanalBar,high);
   _High=NormalizeDouble(high[ArrayMaximum(high)],SymbolInfoInteger(Symb,SYMBOL_DIGITS));
   ArrayFree(high);

この場合、どのインジケーターやEAからでも、どのシンボルでもデータベース内のどのデータにもアクセスできます。
、インデックスの方向について注意する必要はありません。必要なのは最大値だけで、それがどこにあるかは関係ありません。
ArrayMaximum()コマンド(ヘルプによると)は、配列のインデックスの方向を考慮して必要な値を返します。

c/u.

P.S.もちろん、取引から1ポイントをキャッチするピップスミスを構築するのでない限り、価格を正規化する必要はありません。

 
Andrey Kisselyov:
まず、あなたのコードについてですが、現在のチャートの最大値を要求しているという事実に基づいて、もっとシンプルにします。トップスの例をあげますが、トラフの場合はすべてほとんど同じです。 、すべてのデータへの一般的な要求のコマンドと、現在のデータへの要求のコマンドを混同しています。この場合は不要です。

次にmt5のコードについて。



ArrayMaximum()コマンド(ヘルプによると)は、配列のインデックス方向を考慮して必要な値を返します。

c/u.

P.S.私なら価格を正規化しません。もちろん、トレードから1ポイントをキャッチするピップスミスを構築するのでなければ、不要です。


これで解決です。

さて、ここでもう一つ質問です。

実装は以下の通りです。

input int CanalBar  = 200; // 計算するバーの数

//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {

   double high[];
   ArrayResize(high,CanalBar);
   CopyHigh(_Symbol,PERIOD_CURRENT,0,CanalBar,high);
   double _High=NormalizeDouble(high[ArrayMaximum(high)],SymbolInfoInteger(_Symbol,SYMBOL_DIGITS));
   ArrayFree(high);
   
   
   HLineCreate(0,"HIGH",0,_High,"",clrBlue,1,1); // チャートに線を引く。

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
| 水平線を作成する|
//+------------------------------------------------------------------+
//| をベースにしている:|
//| MQL5リファレンスガイド/標準定数、列挙型、および構造体||MQL5リファレンスガイド/標準定数、列挙型、および構造体
//| / オブジェクト定数 / オブジェクトの種類 / OBJ_HLINE |.
//+------------------------------------------------------------------+
bool HLineCreate(const long            chart_ID=0,        // チャートID
                 const string          name="HLine",      // 行名
                 const int             sub_window=0,      // サブウィンドウ番号
                 double                price=0,           // ライン価格
                 const string          toolTip="\n",      // ツールチップテキスト
                 const color           clr=clrRed,        // 線の色
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // ラインスタイル
                 const int             line_width=1,      // 線の太さ
                 const bool            back=false,        // 背景に
                 const bool            selection=true,    // 移動を選択する
                 const bool            hidden=true,       // オブジェクトのリストに隠れる
                 const long            z_order=0,         // マウスクリックの優先順位
                 const int             timeFrames=OBJ_ALL_PERIODS)//異なる周期でオブジェクトを表示する
  {
//--- エラー値をリセットする
   ResetLastError();
//--- 水平線を作る
   if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
     {
      Print(LINE_NUMBER,__FUNCTION__,
            ": failed to create a horizontal line! Error code = ",GetLastError());
      return(false);
     }
//--- ツールチップのテキストを設定する
   ObSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- 線の色を設定する 
   ObSetIntegerColor(chart_ID,name,OBJPROP_COLOR,clr);
//--- 行の表示スタイルを設定する
   ObSetIntegerLineStyle(chart_ID,name,style);
//--- 線の太さを設定する
   ObSetIntegerInt(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- 前景(false)または背景(true)に表示する。
   ObSetIntegerBool(chart_ID,name,OBJPROP_BACK,back);
//--- マウスライン移動モードを有効(true)にするか無効(false)にするか。
//--- ObjectCreate 関数でグラフィカル・オブジェクトを作成する場合、デフォルトではオブジェクト
//--- 選択して移動することはできない。このメソッドの内部では、選択パラメータ
//--- デフォルトはtrueで、このオブジェクトを選択して動かすことができる。
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTED,selection);
//--- オブジェクトのリストで、グラフィカル・オブジェクトの名前を隠す (true) または表示する (false)
   ObSetIntegerBool(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- チャートのマウス・クリック・イベントを受け取る優先順位を設定する。
   ObSetIntegerLong(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- 異なる時間枠でオブジェクトの可視性を設定する 
   ObSetIntegerInt(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
//--- 実行成功
   return(true);
  }


ビジュアルテストを 開始すると、チャートに線が引かれますが、止まったままで、テスト中に値が変わることはありません。

 
Konstantin Seredkin:

よし、これですべて片付いた。

さて、ここでもうひとつ質問だ。

実装は以下の通りです


ビジュアル・テストを 開始すると、チャート上の線は描画されますが、静止し、その値の線はテスト中に変化しません。

これを試してみてください:

void HLineCreate(const long            chart_ID=0,        // チャートID
                 const string          name="HLine",      // 行名
                 const int             sub_window=0,      // サブウィンドウ番号
                 double                price=0,           // ライン価格
                 const string          toolTip="\n",      // ツールチップテキスト
                 const color           clr=clrRed,        // 線の色
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // ラインスタイル
                 const int             line_width=1,      // 線の太さ
                 const bool            back=false,        // 背景に
                 const bool            selection=true,    // 移動を選択する
                 const bool            hidden=true,       // オブジェクトのリストに隠れる
                 const long            z_order=0,         // マウスクリックの優先順位
                 const int             timeFrames=OBJ_ALL_PERIODS)//異なる周期でオブジェクトを表示する
  {
  if(ObjectFind(chart_ID, name)<0) {
//--- 水平線を作る
   ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price);
//--- ツールチップのテキストを設定する
   ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- 線の色を設定する 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- 行の表示スタイルを設定する
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- 線の太さを設定する
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- 前景(false)または背景(true)に表示する。
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- マウスライン移動モードを有効(true)にするか無効(false)にするか。
//--- ObjectCreate 関数でグラフィカル・オブジェクトを作成する場合、デフォルトではオブジェクト
//--- 選択して移動することはできない。このメソッドの内部では、選択パラメータ
//--- デフォルトはtrueで、このオブジェクトを選択して動かすことができる。
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- オブジェクトのリストで、グラフィカル・オブジェクトの名前を隠す (true) または表示する (false)
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- チャートのマウス・クリック・イベントを受け取る優先順位を設定する。
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- 異なる時間枠でオブジェクトの可視性を設定する 
   ObjectSetInteger(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
     }
//--- バインディング・メソッドを設定する
   ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
  }
 
Konstantin Seredkin:

よし、これですべて片付いた。

さて、ここでもうひとつ質問だ。

実装は以下の通りです


ビジュアル・テストを 開始すると、チャート上の線は描画されますが、静止し、その値の線はテスト中に変化しません。

コマンド
if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
この名前のオブジェクトがすでにある場合、実装されていない、結果として、既存のライン上のあなたの価格は変更されません。
あなたが正しく言われたように、それはコマンドで実行する必要があります。

ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);

必要なコマンドだけを適用してください。アクセスするたびに、すべての行のパラメータを調べる必要はありません。行の価格だけを変更すればよいのですから。

敬意を表します。
 

みんな、ありがとう。