質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
MQL4

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

1681閲覧

MT4 自作サインツールのサインが出ない。。。

metakong

総合スコア5

MQL4

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2021/01/17 15:46

お世話になっております。
プログラミングに関してはど素人です。

以下手順のサインツールを作成中ですが、サインが一つも出ませんでした。。。
どのように直せばいいかをお教えいただきたくお願いいたします。。。

≪手順≫
1 ボリンジャーバンドにタッチしたときに、注意のサイン(アラート含む)を出し、準備中であることを示すフラグを立てる。
2 準備中であることを示すフラグが立っている場合、次にボリンジャーバンドにタッチしたとしても、注意のサイン(アラート含む)を出さない。
3 1の後、以下の条件を満たしたときに本サイン(アラート含む)を出し、同時に準備中であることを示すフラグを消す。

≪条件≫
上サインの条件
1 1本前足のRVIメイン線が、2本前足のRVIメイン線より小さい
2 現在足のRVIメイン線が、1本前足のRVIメイン線より大きい

下サインの条件
1 1本前足のRVIメイン線が、2本前足のRVIメイン線より大きい
2 現在足のRVIメイン線が、1本前足のRVIメイン線より小さい

なにとぞ、よろしくお願いいたします。

ソースコードは以下の通りです。

//| temp.mq4 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Orange #property indicator_color2 DodgerBlue #property indicator_color3 Gray #property indicator_color4 Gray #property indicator_width1 1 #property indicator_width2 1 #property indicator_width3 1 #property indicator_width4 1 //本サイン double up[]; double down[]; //注意のサイン double preup[]; double predown[]; extern int Bands_Period = 20; extern int Bands_deviation = 2; extern int RVI_Period = 10; extern int ArrowOffset = 5; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping IndicatorBuffers(4); SetIndexBuffer(0, up); SetIndexBuffer(1, down); SetIndexBuffer(2, preup); SetIndexBuffer(3, predown); SetIndexStyle(0, DRAW_ARROW); SetIndexStyle(1, DRAW_ARROW); SetIndexStyle(2, DRAW_ARROW); SetIndexStyle(3, DRAW_ARROW); SetIndexArrow(0, 228); SetIndexArrow(1, 230); SetIndexArrow(2, 217); SetIndexArrow(3, 218); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ bool AlertFlag1 = false; bool AlertFlag2 = false; //↓準備中であることを示すフラグ bool BandsLFlag = false; bool BandsUFlag = false; 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; int limit; if (prev_calculated == 0) { limit = rates_total - 1; } else { limit = rates_total - prev_calculated; } for (i=limit; i>=0; i--) { double Bands_U1 = iBands(NULL, 0, Bands_Period, Bands_deviation, 0, PRICE_CLOSE, MODE_UPPER, i); double Bands_L1 = iBands(NULL, 0, Bands_Period, Bands_deviation, 0, PRICE_CLOSE, MODE_LOWER, i); double RVI1 = iRVI(NULL, 0, RVI_Period, MODE_MAIN, i); double RVI2 = iRVI(NULL, 0, RVI_Period, MODE_MAIN, i+1); double RVI3 = iRVI(NULL, 0, RVI_Period, MODE_MAIN, i+2); string msg1 = Symbol(); string msg2 = "M"+IntegerToString(Period()); string msg3 = "High sign"; string msg4 = "Low sign"; string msg5 = "Bands touch"; if (i + Bands_Period <= Bars) { preup[i] = EMPTY_VALUE; predown[i] = EMPTY_VALUE; //準備中のフラグが「false」であり if(BandsLFlag == false || BandsUFlag == false) {        //ボリンジャーバンド(Lower)に安値がタッチしたら if(Bands_L1 > Low[i]) {         //注意のサインを出し、準備中のフラグに「true」をセットする。 preup[i] = Low[i] - ArrowOffset; BandsLFlag = true; if(i==0) { if(AlertFlag1 == false) { Alert(msg1,",",msg2,":",msg5); AlertFlag1 = true; } } }        //ボリンジャーバンド(Upper)に高値がタッチしたら if(Bands_U1 < High[i]) {         //注意のサインを出し、準備中のフラグに「true」をセットする。 predown[i] = High[i] + ArrowOffset; BandsUFlag = true; if(i==0) { if(AlertFlag1 == false) { Alert(msg1,",",msg2,":",msg5); AlertFlag1 = true; } } } } else { AlertFlag1 = false; }      //準備中のフラグが「true」であったなら if(BandsLFlag == true || BandsUFlag == true) {        //RVIの以下条件を満たしたときに if(RVI3 > RVI2 && RVI1 >= RVI2) {         //上方向の本サインを出し、準備中のフラグに「false」をセットする。 up[i] = Low[i] - ArrowOffset; BandsLFlag = false; if(i==0) { if(AlertFlag2 == false) { Alert(msg1,",",msg2,":",msg3); AlertFlag2 = true; } } } //または、RVIの以下条件を満たしたときに else if(RVI3 < RVI2 && RVI1 <= RVI2) {         //上方向の本サインを出し、準備中のフラグに「false」をセットする。 down[i] = High[i] - ArrowOffset; bandsUFlag = false; if(i==0) { if(AlertFlag2 == false) { Alert(msg1,",",msg2,":",msg4); AlertFlag2 = true; } } } else { AlertFlag2 = false; } } else { BandsLFlag = false; BandsUFlag = false; } } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ コード

以上、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

矢印が出ない原因はArrowOffsetでそのまま計算しているからです。
(矢印がとんでもなく離れた位置に出てしまっている)

Pointなどを乗算して調整しましょう。

diff

1-preup[i] = Low[i] - ArrowOffset; 2+preup[i] = Low[i] - ArrowOffset * Point;

投稿2021/01/17 19:06

mah

総合スコア591

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問