🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

解決済

2回答

1779閲覧

MQL4で最初の矢印のみ表示させたい。

spa

総合スコア52

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2021/03/14 09:52

編集2021/04/04 07:43

前提・実現したいこと

インジケータをMQL4で制作していますが、シグナルが切り替わったときにバツ印を表示させたいと思っているのですが、
最初の1個だけを表示させたいのでアドバイスよろしくお願いします。
いろいろ調べましたがわかりませんでした。

該当のソースコード

MQL4

1 2#property indicator_chart_window 3#property indicator_buffers 2 4#property indicator_color1 SteelBlue 5#property indicator_color2 Crimson 6#property indicator_color3 SteelBlue 7#property indicator_color4 Crimson 8#property indicator_color5 Aqua 9#property indicator_color6 Red 10 11extern double BoxSize = 10.0; 12double G_ibuf_84[]; 13double G_ibuf_88[]; 14double G_ibuf_92[]; 15double G_ibuf_96[]; 16double Arrow_Up[]; 17double Arrow_Down[]; 18 19int init() { 20 IndicatorBuffers(4); 21 SetIndexStyle(0, DRAW_HISTOGRAM); 22 SetIndexBuffer(0, G_ibuf_84); 23 SetIndexStyle(1, DRAW_HISTOGRAM); 24 SetIndexBuffer(1, G_ibuf_88); 25 SetIndexStyle(2, DRAW_NONE); 26 SetIndexBuffer(2, G_ibuf_92); 27 SetIndexStyle(3, DRAW_NONE); 28 SetIndexBuffer(3, G_ibuf_96); 29 SetIndexStyle(4, DRAW_ARROW,0,4); 30 SetIndexBuffer(4, Arrow_Up); 31 SetIndexStyle(5, DRAW_ARROW,0,4); 32 SetIndexBuffer(5, Arrow_Down); 33 SetIndexLabel(0, "Up"); 34 SetIndexLabel(1, "Dn"); 35 IndicatorDigits(Digits); 36 Comment("ScalSignal |" + BoxSize); 37 return (0); 38} 39 40int deinit() { 41 Comment(""); 42 return (0); 43} 44 45int start() { 46 double Ld_0; 47 double Ld_8; 48 double Ld_24; 49 double Ld_32; 50 double pips_44; 51 int Li_52 = IndicatorCounted(); 52 if (Li_52 < 0) return (-1); 53 if (Li_52 > 0) Li_52--; 54 G_ibuf_84[Bars] = Close[Bars]; 55 G_ibuf_88[Bars] = Close[Bars]; 56 G_ibuf_92[Bars] = Close[Bars]; 57 G_ibuf_96[Bars] = Close[Bars]; 58 if (Digits == 5 || Digits == 3) pips_44 = NormalizeDouble(10.0 * BoxSize, Digits); 59 else pips_44 = NormalizeDouble(BoxSize, Digits); 60 double Ld_16 = NormalizeDouble(Point * pips_44, Digits); 61 int Li_40 = Bars - Li_52; 62 63 64 65 //i が使用可能 66 67 for (int i = Li_40; i >= 0; i--) { 68 Ld_0 = NormalizeDouble(High[i] - (G_ibuf_92[i + 1]) - Ld_16, Digits); 69 Ld_8 = NormalizeDouble(Low[i] - (G_ibuf_96[i + 1]) + Ld_16, Digits); 70 71 //修正前 72 // Ld_0 = NormalizeDouble(High[i] - (G_ibuf_92[i + 1]) - Ld_16, Digits); 73 // Ld_8 = NormalizeDouble(Low[i] - (G_ibuf_96[i + 1]) + Ld_16, Digits); 74 75 76 77 if (Ld_0 >= 0.0) { 78 Ld_32 = NormalizeDouble((High[i] - (G_ibuf_92[i + 1])) / Ld_16, Digits); 79 Ld_24 = NormalizeDouble(MathFloor(Ld_32), Digits); 80 81 G_ibuf_92[i] = iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,i+1) + Ld_16 * 1*Point; 82 //G_ibuf_92[i] = G_ibuf_92[i + 1] + Ld_16 * Ld_24; 83 84 G_ibuf_96[i] = G_ibuf_92[i] - Ld_16 ; 85 G_ibuf_84[i] = G_ibuf_92[i]; 86 G_ibuf_88[i] = G_ibuf_96[i]; 87 G_ibuf_96[i] = G_ibuf_92[i] - Ld_16; 88 89 90 Arrow_Up[i] = Low[i] ; 91 92 93 94 95 } else { 96 if (Ld_8 <= 0.0 ) { 97 Ld_32 = NormalizeDouble((G_ibuf_96[i + 1] - Low[i]) / Ld_16, Digits); 98 Ld_24 = NormalizeDouble(MathFloor(Ld_32), Digits); 99 100 G_ibuf_96[i] = iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_UPPER,i+1)- Ld_16 * 1*Point; 101 //G_ibuf_96[i] = G_ibuf_96[i + 1] - Ld_16 * Ld_24; 102 103 104 G_ibuf_92[i] = G_ibuf_96[i] + Ld_16 ; 105 G_ibuf_88[i] = G_ibuf_92[i]; 106 G_ibuf_84[i] = G_ibuf_96[i]; 107 G_ibuf_92[i] = G_ibuf_96[i] + Ld_16; 108 109 Arrow_Down[i] = High[i] ; 110 111 112 } else { 113 G_ibuf_92[i] = G_ibuf_92[i + 1]; 114 G_ibuf_96[i] = G_ibuf_96[i + 1]; 115 if (G_ibuf_84[i + 1] > G_ibuf_88[i + 1]) { 116 G_ibuf_84[i] = G_ibuf_84[i + 1]; 117 G_ibuf_88[i] = G_ibuf_84[i] - Ld_16; 118 } 119 if (G_ibuf_88[i + 1] > G_ibuf_84[i + 1]) { 120 G_ibuf_84[i] = G_ibuf_84[i + 1]; 121 G_ibuf_88[i] = G_ibuf_84[i] + Ld_16; 122 } 123 124 125 126 } 127 } 128 } 129 return (0); 130}

イメージ説明

補足情報(FW/ツールのバージョンなど)

変更したソースコードを追記

#property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 SteelBlue #property indicator_color2 Crimson #property indicator_color3 SteelBlue #property indicator_color4 Crimson #property indicator_color5 Aqua #property indicator_color6 Red #property indicator_color7 Orange extern double BoxSize = 10.0; double G_ibuf_84[]; double G_ibuf_88[]; double G_ibuf_92[]; double G_ibuf_96[]; double Arrow_Up[]; double Arrow_Down[]; double Trend[]; int init() { IndicatorBuffers(4); SetIndexStyle(0, DRAW_HISTOGRAM); SetIndexBuffer(0, G_ibuf_84); SetIndexStyle(1, DRAW_HISTOGRAM); SetIndexBuffer(1, G_ibuf_88); SetIndexStyle(2, DRAW_NONE); SetIndexBuffer(2, G_ibuf_92); SetIndexStyle(3, DRAW_NONE); SetIndexBuffer(3, G_ibuf_96); SetIndexStyle(4, DRAW_ARROW,0,4); SetIndexBuffer(4, Arrow_Up); SetIndexStyle(5, DRAW_ARROW,0,4); SetIndexBuffer(5, Arrow_Down); SetIndexStyle(6, DRAW_ARROW,0,4); SetIndexBuffer(6,Trend); SetIndexLabel(0, "Up"); SetIndexLabel(1, "Dn"); IndicatorDigits(Digits); Comment("ScalSignal |" + BoxSize); return (0); } int deinit() { Comment(""); return (0); } int start() { double Ld_0; double Ld_8; double Ld_02; double Ld_82; double Ld_24; double Ld_32; double pips_44; int Li_52 = IndicatorCounted(); if (Li_52 < 0) return (-1); if (Li_52 > 0) Li_52--; G_ibuf_84[Bars] = Close[Bars]; G_ibuf_88[Bars] = Close[Bars]; G_ibuf_92[Bars] = Close[Bars]; G_ibuf_96[Bars] = Close[Bars]; if (Digits == 5 || Digits == 3) pips_44 = NormalizeDouble(10.0 * BoxSize, Digits); else pips_44 = NormalizeDouble(BoxSize, Digits); double Ld_16 = NormalizeDouble(Point * pips_44, Digits); int Li_40 = Bars - Li_52; //i が使用可能 for (int i = Li_40; i >= 0; i--) { Ld_0 = NormalizeDouble(High[i] - (G_ibuf_92[i + 1]) - Ld_16, Digits); Ld_8 = NormalizeDouble(Low[i] - (G_ibuf_96[i + 1]) + Ld_16, Digits); //矢印用追加条件 まえの足の状態? Ld_02 = NormalizeDouble(High[i+1] - (G_ibuf_92[i + 2]) - Ld_16, Digits); Ld_82 = NormalizeDouble(Low[i+1] - (G_ibuf_96[i + 2]) + Ld_16, Digits); //修正前 // Ld_0 = NormalizeDouble(High[i] - (G_ibuf_92[i + 1]) - Ld_16, Digits); // Ld_8 = NormalizeDouble(Low[i] - (G_ibuf_96[i + 1]) + Ld_16, Digits); if (Ld_0 >= 0.0 ) { Ld_32 = NormalizeDouble((High[i] - (G_ibuf_92[i + 1])) / Ld_16, Digits); Ld_24 = NormalizeDouble(MathFloor(Ld_32), Digits); G_ibuf_92[i] = iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,i+1) + Ld_16 * 1*Point; //G_ibuf_92[i] = G_ibuf_92[i + 1] + Ld_16 * Ld_24; G_ibuf_96[i] = G_ibuf_92[i] - Ld_16 ; G_ibuf_84[i] = G_ibuf_92[i]; G_ibuf_88[i] = G_ibuf_96[i]; G_ibuf_96[i] = G_ibuf_92[i] - Ld_16; //矢印のみの条件(上昇) if (Ld_0 >= 0.0 ){ Trend[i] =1; if(Trend[i] != Trend[i+1] && Trend[i] ==1) Arrow_Up[i] = Low[i]; } } else { if (Ld_8 <= 0.0 ) { Ld_32 = NormalizeDouble((G_ibuf_96[i + 1] - Low[i]) / Ld_16, Digits); Ld_24 = NormalizeDouble(MathFloor(Ld_32), Digits); G_ibuf_96[i] = iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_UPPER,i+1)- Ld_16 * 1*Point; //G_ibuf_96[i] = G_ibuf_96[i + 1] - Ld_16 * Ld_24; G_ibuf_92[i] = G_ibuf_96[i] + Ld_16 ; G_ibuf_88[i] = G_ibuf_92[i]; G_ibuf_84[i] = G_ibuf_96[i]; G_ibuf_92[i] = G_ibuf_96[i] + Ld_16; //矢印のみの条件(下落) if (Ld_8 <= 0.0 ){ Trend[i] =-1; if(Trend[i] != Trend[i+1] && Trend[i] ==-1 ) Arrow_Down[i] =High[i]; } } else { Trend[i] =0; //重要な箇所 削ると表示されない G_ibuf_92[i] = G_ibuf_92[i + 1]; G_ibuf_96[i] = G_ibuf_96[i + 1]; if (G_ibuf_84[i + 1] > G_ibuf_88[i + 1]) { G_ibuf_84[i] = G_ibuf_84[i + 1]; G_ibuf_88[i] = G_ibuf_84[i] - Ld_16; Trend[i] =0; } if (G_ibuf_88[i + 1] > G_ibuf_84[i + 1]) { G_ibuf_84[i] = G_ibuf_84[i + 1]; G_ibuf_88[i] = G_ibuf_84[i] + Ld_16; Trend[i] =0; } } } } return (0); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

自分の書き方だと足りない部分がありましたので追記しました。
一部修正もしました。

自分の環境で確認済です。
上昇トレンドと下降トレンドの切り替わりで矢印表示されるようになってます。
今度は大丈夫なはずです。御健闘をお祈りしております。

#property indicator_chart_window #property indicator_chart_window #property indicator_buffers 6 //変更 #property indicator_color1 SteelBlue #property indicator_color2 Crimson #property indicator_color3 SteelBlue #property indicator_color4 Crimson #property indicator_color5 Aqua #property indicator_color6 Red extern double BoxSize = 10.0; double G_ibuf_84[]; double G_ibuf_88[]; double G_ibuf_92[]; double G_ibuf_96[]; double Arrow_Up[]; double Arrow_Down[]; double Trend[]; int init() { IndicatorBuffers(7); //変更 SetIndexStyle(0, DRAW_HISTOGRAM); SetIndexBuffer(0, G_ibuf_84); SetIndexStyle(1, DRAW_HISTOGRAM); SetIndexBuffer(1, G_ibuf_88); SetIndexStyle(2, DRAW_NONE); SetIndexBuffer(2, G_ibuf_92); SetIndexStyle(3, DRAW_NONE); SetIndexBuffer(3, G_ibuf_96); SetIndexStyle(4, DRAW_ARROW,0,4); SetIndexBuffer(4, Arrow_Up); SetIndexStyle(5, DRAW_ARROW,0,4); SetIndexBuffer(5, Arrow_Down); SetIndexStyle(6, DRAW_NONE); SetIndexBuffer(6,Trend); SetIndexLabel(0, "Up"); SetIndexLabel(1, "Dn"); IndicatorDigits(Digits); Comment("ScalSignal |" + BoxSize); return (0); } int deinit() { Comment(""); return (0); } int start() { double Ld_0; double Ld_8; double Ld_02; double Ld_82; double Ld_24; double Ld_32; double pips_44; int Li_52 = IndicatorCounted(); if (Li_52 < 0) return (-1); if (Li_52 > 0) Li_52--; G_ibuf_84[Bars-1] = Close[Bars-1];//変更 最過去のBarはBars-1です  G_ibuf_88[Bars-1] = Close[Bars-1]; G_ibuf_92[Bars-1] = Close[Bars-1]; G_ibuf_96[Bars-1] = Close[Bars-1]; if (Digits == 5 || Digits == 3) pips_44 = NormalizeDouble(10.0 * BoxSize, Digits); else pips_44 = NormalizeDouble(BoxSize, Digits); double Ld_16 = NormalizeDouble(Point * pips_44, Digits); int Li_40 = Bars - Li_52; //i が使用可能 for (int i = Li_40; i >= 0; i--) { Ld_0 = NormalizeDouble(High[i] - (G_ibuf_92[i + 1]) - Ld_16, Digits); Ld_8 = NormalizeDouble(Low[i] - (G_ibuf_96[i + 1]) + Ld_16, Digits); //矢印用追加条件 まえの足の状態? Ld_02 = NormalizeDouble(High[i+1] - (G_ibuf_92[i + 2]) - Ld_16, Digits); Ld_82 = NormalizeDouble(Low[i+1] - (G_ibuf_96[i + 2]) + Ld_16, Digits); //修正前 // Ld_0 = NormalizeDouble(High[i] - (G_ibuf_92[i + 1]) - Ld_16, Digits); // Ld_8 = NormalizeDouble(Low[i] - (G_ibuf_96[i + 1]) + Ld_16, Digits); Trend[i] =Trend[i+1]; //追加 if (Ld_0 >= 0.0 ) { Ld_32 = NormalizeDouble((High[i] - (G_ibuf_92[i + 1])) / Ld_16, Digits); Ld_24 = NormalizeDouble(MathFloor(Ld_32), Digits); G_ibuf_92[i] = iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,i+1) + Ld_16 * 1*Point; //G_ibuf_92[i] = G_ibuf_92[i + 1] + Ld_16 * Ld_24; G_ibuf_96[i] = G_ibuf_92[i] - Ld_16 ; G_ibuf_84[i] = G_ibuf_92[i]; G_ibuf_88[i] = G_ibuf_96[i]; G_ibuf_96[i] = G_ibuf_92[i] - Ld_16; //矢印のみの条件(上昇) //ifあってもいいけど必要なし Trend[i] =1; if(Trend[i] != Trend[i+1] && Trend[i] ==1) Arrow_Up[i] = Low[i]; } else { if (Ld_8 <= 0.0 ) { Ld_32 = NormalizeDouble((G_ibuf_96[i + 1] - Low[i]) / Ld_16, Digits); Ld_24 = NormalizeDouble(MathFloor(Ld_32), Digits); G_ibuf_96[i] = iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_UPPER,i+1)- Ld_16 * 1*Point; //G_ibuf_96[i] = G_ibuf_96[i + 1] - Ld_16 * Ld_24; G_ibuf_92[i] = G_ibuf_96[i] + Ld_16 ; G_ibuf_88[i] = G_ibuf_92[i]; G_ibuf_84[i] = G_ibuf_96[i]; G_ibuf_92[i] = G_ibuf_96[i] + Ld_16; //矢印のみの条件(下落) //if 必要なし Trend[i] =-1; if(Trend[i] != Trend[i+1] && Trend[i] ==-1 ) Arrow_Down[i] =High[i]; } else { //削除 //Trend[i] =0; //重要な箇所 削ると表示されない G_ibuf_92[i] = G_ibuf_92[i + 1]; G_ibuf_96[i] = G_ibuf_96[i + 1]; if (G_ibuf_84[i + 1] > G_ibuf_88[i + 1]) { G_ibuf_84[i] = G_ibuf_84[i + 1]; G_ibuf_88[i] = G_ibuf_84[i] - Ld_16; } if (G_ibuf_88[i + 1] > G_ibuf_84[i + 1]) { G_ibuf_84[i] = G_ibuf_84[i + 1]; G_ibuf_88[i] = G_ibuf_84[i] + Ld_16; } } } } return (0); }

投稿2021/04/04 18:41

編集2021/04/04 19:02
siusus

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spa

2021/04/05 00:17

わざわざコードを見直していただきありがとうございます。 私の環境でも無事に動作しました。 ほんとうに助かりました。
guest

0

Arrow_Up[i] = Low[i] ;
Arrow_Down[i] = High[i];

この部分で毎回矢印を表示しているので、計算用のインジケーターバッファー(Trend[i])を追加してトレンド方向が切り替わったときだけ矢印を表示させる条件を追加するのはどうでしょうか?
もっとスマートな方法があるのかもしれませんけれど、私が思いつく限りだとこんな感じです。
お役に立てたら幸いです。

if (Ld_0 >= 0.0) { Trend[i] =1; if(Trend[i] != Trend[i+1] && Trend[i] ==1) Arrow_Up[i] = Low[i]; }else{ if (Ld_8 <= 0.0 ) { Trend[i] =-1; if(Trend[i] != Trend[i+1] && Trend[i] ==-1) Arrow_Down[i] =High[i]; }else{ Trend[i] =0; } コード

投稿2021/04/02 16:14

siusus

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spa

2021/04/04 07:47

回答いただきありがとうございます。 ソースコードを追記しました。 教えていただいたのでコード追加してみたのですが、途中のシグナルが表示されてしまいます。 コードの追加の仕方が間違っていましたら、またアドバイスいただけるとありがたいです。 (自分で、「現在足より1本前のインジケータの色が赤だった場合のみ、上昇のシグナルを出す」というような条件を作ってみたりもしましたが、知識不足でうまくいきませんでした。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問