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

 
Alexey Viktorov:
NewsArr配列の 2次元目の次元 数は?

残念ながら、理解できない。2次元とは?

ああ、なるほど、NewsArrは0,1,2,3の値をとりますね。これか?

文字列 NewsArr[4][1000] とする必要があります。

 
novichok2018:

残念ながら、理解できない。2次元とは?

ああ、なるほど、NewsArrは0,1,2,3の値をとりますね。これか?

文字列 NewsArr[4][1000] とする必要があります。

一次元と 二次元

でも、それはたぶん間違った答えなんです。
 
Alexey Viktorov:

1次元と 2次元

でも、何か答えが間違っているのでは?

2次元の次元はどこを見ればいいのでしょうか?

それとも、1次元目が4で2次元目が1000なのでしょうか?
 
novichok2018:

そして、2次元の次元はどこを見ればいいのでしょうか?

それとも、1次元目が4で、2次元目が1000なのでしょうか?

しかし、この投稿は何かが狂っています。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MQL4に関する初心者の質問、アルゴリズムやコードに関するヘルプやディスカッションを行います。

novichok2018, 2019.01.16 15:52

誰も答えていないので、おそらく愚かな質問だと思いますが、コンパイル後にEAが停止したり再開したりすることに、他にどのように対処すればよいのでしょうか?

プラットフォームでは、「配列が範囲外です(284,17)」というメッセージが表示されます。

行284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh);位置17はNomNewsで角括弧を開き、0によってグローバルに開始さ れます。

0を1に変えても無駄だった。
if(NomNews==300)break; 300を360000に変更 しましたが、効果はありませんでした。

コンパイルしてみると、数分間は正常に動作する。そして、どうすればいいのか?

2次元目の値数が1000のときと

if(NomNews==300)break;
2次元目で配列オーバーランはありえない。


 
psyman:

アンカーポイントを設けず、縦の動きだけにして、横は画面の幅に一度だけ設定しました。向こうから数えてくる分には問題ないのですが、同じ動作でも機能によって違うというのは意外です。


また、もう一つの質問ですが、Bidをラベルテキストとして出力したい場合、OnChartEventとOnCalculateの どちらの関数を使えば最適なのでしょうか?

OBJ_LABELは、アンカー ポイントを設定していなくても、デフォルトでは左上隅に設定されています。BidはOnCalculateで変更されるので、そこでラベルのテキストを変更することができます。

 
Alexey Viktorov:

はい、でもこのメッセージは何かおかしいです。

2次元目の値数が1000のときと

2次元目に範囲外の配列が存在することはありえない。


いいえ、混乱はしていないようです。以下はコピーしたメッセージです: 2019.01.16 20:14:11.110 OnNews_M5_EURUSD EURUSD,M5: array out of range in 'OnNews_M5_EURUSD.mq4' (284,17).

上記284行目を示しました。
 
novichok2018:

いいえ、私は何も間違っていないと思います。以下はコピーしたメッセージです: 2019.01.16 20:14:11.110 OnNews_M5_EURUSD EURUSD,M5: array out of range in 'OnNews_M5_EURUSD.mq4' (284,17).

上記284行目を示しました。

ポジション17は、NomNewsで角括弧を開き0から グローバルに開始されます。

つまり、2次元目に0次元配列のセルサイズがあると......。

 
Artyom Trishkin:

つまり、2次元目のアレイのセルサイズは0です...。

ここがNomNewsの 場所です。

datetime TimeNewsFunck(int nomf)

{

文字列 s=NewsArr[0][nomf];

string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4)) のようになります。

return((datetime)(StringToTime(time) + GMTplus*3600))

}

void UpdateNews()

{

文字列 TEXT=ReadCBOE()。

int sh = StringFind(TEXT, "pageStartAt>")+12;

int sh2= StringFind(TEXT,"</tbody>");

TEXT=StringSubstr(TEXT,sh,sh2-sh)です。


sh=0とする。

while(!IsStopped())

{

sh = StringFind(TEXT, "event_timestamp",sh)+17;

sh2= StringFind(TEXT, "onclick",sh)-2;

if(sh<17 || sh2<0)break。

NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh);


sh = StringFind(TEXT,flagCur,sh)+10;

sh2= sh+3。

if(sh<10 || sh2<3)break。

NewsArr[1][NomNews]=StringSubstr(TEXT,sh,sh2-sh);

if(OnlySymbolNews && StringFind(ValStr,NewsArr[1][NomNews])<0)continue;


sh = StringFind(TEXT, "title",sh)+7;

sh2= StringFind(TEXT, "Volatility",sh)-1;

if(sh<7 || sh2<0)break。

NewsArr[2][NomNews]=StringSubstr(TEXT,sh,sh2-sh);

if(StringFind(NewsArr[2][NomNews], "High")>=0 && !HighNews)続行。

if(StringFind(NewsArr[2][NomNews], "Moderate")>=0 && !MidleNews)続行。

if(StringFind(NewsArr[2][NomNews], "Low")>=0 && !LowNews)continue;


sh=StringFind(TEXT, "left event",sh)+12;

int sh1=StringFind(TEXT, "Speaks",sh);

sh2=StringFind(TEXT,"<",sh)。

if(sh<12 || sh2<0)break。

if(sh1<0 || sh1>sh2)NewsArr[3][NomNews]=StringSubstr(TEXT,sh,sh2-sh);

else NewsArr[3][NomNews]=StringSubstr(TEXT,sh,sh1-sh);


NomNews++。

if(NomNews==300)break;

}

}

0~300 までの値。グローバルに設定する4?

 
novichok2018:


0~300 までの値。グローバルで4に設定したほうがいいのでしょうか?

12分になってもメッセージが出ます。

 
novichok2018:

動作開始12分でまだメッセージが出ます。

このことからわかるのは、NomNewsはすでに999より大きい状態でWhileループに入るということです。それなら、なぜそうなるのかを調べて、この変数をどこかでリセットする必要があります。

これを確認するには、ループの最初に書きます。

if(NomNews > 999)
{
   Print(NomNews);
   break;
}