ここから本文です

MQL4でバイナリーオプションの逆張りサインツールを作成中です。

muk********さん

2019/2/2619:17:08

MQL4でバイナリーオプションの逆張りサインツールを作成中です。

(条件)
RSI>70以上 &&
RSIが偏差2以上 &&
終値が偏差3以上 &&
(またその反対)

上記の条件でアローを出したいのですが出ません。
何故でしょうか。

素人で初歩的なミスだと思いますがよろしくお願いします。

//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2

double dnarrow[];
double uparrow[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
SetIndexBuffer(0,dnarrow);
SetIndexBuffer(1,uparrow);

SetIndexStyle(0,DRAW_ARROW);
SetIndexStyle(1,DRAW_ARROW);

SetIndexDrawBegin(0,9);
SetIndexDrawBegin(1,9);

SetIndexArrow(0, 234);
SetIndexArrow(1, 233);

return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(省略)
{

int limit = Bars-IndicatorCounted();

double rsi_current[],
rsi_upper[],rsi_lower[],
price_upper[],price_lower[];

for(int i=limit-1; i>=0; i--)
{

rsi_current[i] = iRSI(NULL,0,9,PRICE_CLOSE,i);
rsi_upper[i] = iBandsOnArray(rsi_current,0,20,3,0,MODE_UPPER,i);
rsi_lower[i] = iBandsOnArray(rsi_current,0,20,3,0,MODE_LOWER,i);
price_upper[i] = iBands(NULL,0,20,3,0,PRICE_CLOSE,MODE_UPPER,i);
price_lower[i] = iBands(NULL,0,20,3,0,PRICE_CLOSE,MODE_LOWER,i);

//ローエントリー
if(
rsi_current[i] > rsi_upper[i] &&
rsi_current[i] > 70 &&
close[i] > price_upper[i]
)
{dnarrow[i] = high[i]+10*Point;}

//ハイエントリー
else if(
rsi_current[i] < rsi_lower[i] &&
rsi_current[i] < 30 &&
close[i] < price_lower[i]
)
{uparrow[i] = low[i]-10*Point;}

}

return(0);
}
//+------------------------------------------------------------------+

補足関係ないけどrsi_upper,lowerの偏差が間違ってました。

あと下記のように配列に計算値を代入せずに条件入れるとアローちゃんと出るんですよね~

//ローエントリー
if(
iRSI(NULL,0,9,PRICE_CLOSE,i) > iBandsOnArray(rsi_current,0,20,2,0,MODE_UPPER,i) &&
iRSI(NULL,0,9,PRICE_CLOSE,i) > 70 &&
close[i] > iBands(NULL,0,20,3,0,PRICE_CLOSE,MODE_UPPER,i)
)
{dnarrow[i] = high[i]+10*Point;}

//ハイエントリー
if(
//★iRSI(NULL,0,9,PRICE_CLOSE,i) < iBandsOnArray(rsi_current,0,20,2,0,MODE_LOWER,i) &&
iRSI(NULL,0,9,PRICE_CLOSE,i) < 30 &&
close[i] < iBands(NULL,0,20,3,0,PRICE_CLOSE,MODE_LOWER,i)
)
{uparrow[i] = low[i]-10*Point;}


ただ★のところがいまいち効かないです。
ちゃんと下抜いてるのは確認できてるのにな~
まあここは別にいいんですが。

閲覧数:
188
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

2019/2/2623:24:12

ご提示頂いたコードでアローが出ない主な原因として、定義されている複数の配列が一切要素を持っていない(空の配列のまま使用されている)ことが挙げられます。この事は、コードの先頭に下記の記述を追加してから動作確認して頂くことによってご理解頂けるかと思います。


[コードの先頭に追加する記述]
// 厳格なコンパイルモード用のコンパイラ指令
#property strict


また、下記のように追加・変更することによってアローが出るようになります。


[1:変更]指標バッファ数

(変更前)
#property indicator_buffers 2

(変更後)
#property indicator_buffers 3


[2:追加]アローの色設定

(追加位置)
上記[1:変更]の下辺り

(追加内容)
#property indicator_color1 clrBlue
#property indicator_color2 clrRed


[3:追加]RSI配列の定義

(追加位置)
double uparrow[];の下辺り

(追加内容)
double rsi[];


[4:追加]RSIのバッファ割り当て

(追加位置)
SetIndexBuffer(1,uparrow);の下辺り

(追加内容)
SetIndexBuffer(2,rsi);


[4:追加]RSIのスタイル設定

(追加位置)
SetIndexStyle(1,DRAW_ARROW);の下辺り

(追加内容)
SetIndexStyle(2,DRAW_NONE);


[5:変更]指標関連の変数定義

(変更前)
double rsi_current[],
rsi_upper[],rsi_lower[],
price_upper[],price_lower[];

(変更後)
double rsi_current[20]; // バー20本分のRSI値
double rsi_upper,rsi_lower,
price_upper,price_lower;


[6:変更]RSI関連の値取得

(変更前)
rsi_current[i] = iRSI(NULL,0,9,PRICE_CLOSE,i);
rsi_upper[i] = iBandsOnArray(rsi_current,0,20,2,0,MODE_UPPER,i);
rsi_lower[i] = iBandsOnArray(rsi_current,0,20,2,0,MODE_LOWER,i);

(変更後)
rsi[i]=iRSI(NULL,0,9,PRICE_CLOSE,i);
// 変数iに位置するバーから過去20本分のRSI値をrsi_current配列にコピー
ArrayCopy(rsi_current, rsi, 0, i, 20);

rsi_upper = iBandsOnArray(rsi_current,0,20,2,0,MODE_UPPER,0);
rsi_lower = iBandsOnArray(rsi_current,0,20,2,0,MODE_LOWER,0);


[7:変更]ローエントリー条件

(変更前)
if(
rsi_current[i] > rsi_upper[i] &&
rsi_current[i] > 70 &&
close[i] > price_upper[i]
)

(変更後)
if(
rsi[i]>rsi_upper &&
rsi[i]>70 &&
close[i]>price_upper
)


[8:変更]ハイエントリー条件

(変更前)
else if(
rsi_current[i] < rsi_lower[i] &&
rsi_current[i] < 30 &&
close[i] < price_lower[i]
)

(変更後)
else if(
rsi[i]<rsi_lower &&
rsi[i]<30 &&
close[i]<price_lower
)



(備考:上記の追加・変更をした結果の添付画像)

ご提示頂いたコードでアローが出ない主な原因として、定義されている複数の配列が一切要素を持っていない(空の配列のまま...

質問した人からのコメント

2019/2/27 10:09:26

配列の箇所は確かにおかしかったですね。

DRAW_NONEでRSIのバッファを設けてArrayCopyするとこは勉強させていただきました!
辻褄が合いました!

すごく丁寧に教えていただいてありがとうございます 人

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

2019/2/2619:43:16

SetIndexArrow()ですが,
SetIndexArrow(0, 234);
SetIndexArrow(1, 233);
となっています。

SYMBOL_ARROWUP 241 矢印アップ
SYMBOL_ARROWDOWN 242 矢印ダウン
のはずですが?

pba********さん

2019/2/2619:31:23

インジケータあんまつくったことないですけど、
#property indicator_color1 clrBlue
#property indicator_color2 clrPink
ってとりあえずカラー指定してみるとか?

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる