mql4とやらは使ったことないですが。
まず、条件は何ですか?
C
1int i = rates_total - prev_calculated;
2
3if(High[1] < Label1Buffer[1] &&
4High[2] < Label1Buffer[2] &&
5High[3] < Label1Buffer[3] &&
6High[4] < Label1Buffer[4] &&
7High[5] < Label1Buffer[5] &&
8High[6] < Label1Buffer[6] &&
9High[7] < Label1Buffer[7] &&
10High[8] < Label1Buffer[8] &&
11High[9] < Label1Buffer[9] &&
12High[10] > Label1Buffer[10] &&
13
14High[1] < Label2Buffer[1] &&
15High[2] < Label2Buffer[2] &&
16High[3] < Label2Buffer[3] &&
17High[4] < Label2Buffer[4] &&
18High[5] < Label2Buffer[5] &&
19High[6] < Label2Buffer[6] &&
20High[7] < Label2Buffer[7] &&
21High[8] < Label2Buffer[8] &&
22High[9] < Label2Buffer[9] &&
23High[10] < Label2Buffer[10] &&
24iIchimoku(NULL,0,9,26,52,3,-26) < iIchimoku(NULL,0,9,26,52,4,-26))
25{
26
27BarsUp[i] = low[i] - 100*Point;
28
29}
っていうのを見ると、
High[10] > Label1Buffer[10] だけ 向きが逆になっています。これって当たっていますか?
そして、これらの向きは常に high < label1Buffer になるのでしょうか?
(例えば文脈によって向きが逆になるのか)
もし、向きがほぼ固定で、要素番号10のときの向きが間違っているとするなら、私なら「関数」にしてまとめます。
C++としてであれば bool型がありますので、「すべて条件を満たすときはtrueを返す」という風にします。
C言語ではbool型がない( typedefしたものならあるっぽいが ) ので intで代用。
すべての条件を満たす場合は 1 を返し、一つ以上満たしていないのがあれば 0 を返す...みたいにします。
そして、プロトタイプ宣言的には
C
1// 使い方: if( isFulfilledCondition( high, highのサイズ, label1Buffer, label1Bufferのサイズ ) )...
2int isFulfilledCondition( int high[], size_t sizeofHigh, int label1Buffer[], sizeofLabel1Buffer );
という風に配列 high と label1Buffer を受け取り、内部でforもしくはwhileを使って調べる。
こうすれば、isFulfilledCondition関数内で「条件を満たさないのが出るまでループする」みたいな処理が書ける。
「すべての条件を満たす」のは言い換えると「満たしていない条件が一つもない」ですよね。
さらに言い換えると「一つでも条件を満たさないものがあれば"条件を満たしていない"ことになる」のですよね。
こういう風に関数にしてまとめたりするだけでもスタイリッシュになりますよ。
もし関数がわからないのであれば入門書(サイトでもいい)を読んでください。
[追記1]
過去にVBAやGASなどを少しかじったことがあったので、for文くらいならすぐ理解できるかと思ったのですが、せっかく回答いただいた内容が少し調べたくらいでは全く理解できませんでした…。
えーっと、そういう基礎的なものは入門書を読んでください。
一応、サンプル程度のものを載せておきます。
C
1int isFulfilledCondition( int high[], size_t sizeofHigh, int label1Buffer[], sizeofLabel1Buffer ){
2 int i;
3 // 0から sizeofHigh までループ ( つまり highの個数分チェック )
4 for( i = 0; i < sizeofHigh; i++ ){
5 // 一個でも条件に該当しないのがあるなら"条件を満たしていない"とする
6 if( high[i] != label1Buffer[i] ) return 0;
7 }
8// ここまで来たらすべての条件が満たされているとする
9return 1;
10}
少なくとも
- 配列
- for文
- (自作)関数
- (関数に渡すデータが配列のとき)
- if文
の項目は必須です。(今回の場合)
[追記2]
kazuma-sさんとのやり取りで
この構文だとhigh[]やLabelBuffer[]の1~9までがif文の中にないようにみえるのですが、対象として扱われているのでしょうか?
とありますが、「ちゃんと扱われています」です。
kazuma-sさんのコードでは while内で j++ とされています。
これによって forでの 三番目のアレ ( i++ ) みたいな状態と一応同じです。
「配列」「while」「for」「変数」...そういう基礎が分かっていればわかる内容ですよ。
また、コードがなぜそういう風になっているのかを考えるときは、「一行レベルでコメントをつける」のを癖付けるのが望ましいかと。
C
1// バブルソートの場合
2
3// 変数宣言
4int i, j, work;
5
6// 対象
7int arr[4] = { 2, 4, 1, 9 };
8
9// arrの最初から最後まで検索するため?
10for( i = 0; i < 4; i++ ){
11 // えーっと、後ろから検索してんのかな...?
12 for( j = 4 - 1; j > i; j-- ){
13 // 昇順になっていないなら?
14 if( arr[j] < arr[j-1] ){
15 // 入れ替え...なのかな?
16 work = arr[j];
17 arr[j] = arr[j-1];
18 arr[j-1] = work;
19 }
20 }
21}
っていう風に「その行が何をしているのか」を考えながらコメントをつけて考えてみるとか、名前は忘れました(趣味でやっているので)が、〇〇シート だった気がしますが、変数の値がどのように変化していっているのか、またif文での条件式を満たす・満たさないとかの「流れを考える」ためのものがあった気がします。
そういうのを使ってみる。
変数a | 変数b | if |
---|
a = 10 | b = 20 | |
a + b = 10 + 20 = 30 | b = 20 | |
a = 30 | b = 20 | a > 11 で条件を満たす |
みたいな書き方だった気が...
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/19 05:58
2019/10/19 07:36
2019/10/19 07:51