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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MQL4

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

Q&A

解決済

3回答

3471閲覧

if文とfor文の組み合わせ mql4(c言語)

koyuki_bbz

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MQL4

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

0グッド

1クリップ

投稿2019/10/19 04:55

前提・実現したいこと

見ていただいてありがとうございます。

正直なところ現在のコードのままでも動きはするのですが、今後のためにもぜひご教授いただきたく投稿させていただきました。

[]内の数字をfor文で簡潔にしたいです。

よろしくお願いします。

発生している問題・エラーメッセージ

if文内の複数の条件を&&でつないでいますが[]内の数字をループで回す際のコードがわかりません。

該当のソースコード

int i = rates_total - prev_calculated;

    if(High[1] < Label1Buffer[1] &&
High[2] < Label1Buffer[2] &&
High[3] < Label1Buffer[3] &&
High[4] < Label1Buffer[4] &&
High[5] < Label1Buffer[5] &&
High[6] < Label1Buffer[6] &&
High[7] < Label1Buffer[7] &&
High[8] < Label1Buffer[8] &&
High[9] < Label1Buffer[9] &&
High[10] > Label1Buffer[10] &&

High[1] < Label2Buffer[1] && High[2] < Label2Buffer[2] && High[3] < Label2Buffer[3] && High[4] < Label2Buffer[4] && High[5] < Label2Buffer[5] && High[6] < Label2Buffer[6] && High[7] < Label2Buffer[7] && High[8] < Label2Buffer[8] && High[9] < Label2Buffer[9] && High[10] < Label2Buffer[10] && iIchimoku(NULL,0,9,26,52,3,-26) < iIchimoku(NULL,0,9,26,52,4,-26)) { BarsUp[i] = low[i] - 100*Point; }

試したこと

if(
for(int j = 1; j<=9; j++){

High[j] < Label1Buffer[j] && High[10] > Label1Buffer[10] && High[10] < Label2Buffer[10] && iIchimoku(NULL,0,9,26,52,3,-26) < iIchimoku(NULL,0,9,26,52,4,-26) } { BarsUp[i] = low[i] - 100*Point; }

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

経験が浅いため説明不足の点がありましたら申し訳ありません。

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

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

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

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

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

guest

回答3

0

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変数bif
a = 10b = 20
a + b = 10 + 20 = 30b = 20
a = 30b = 20a > 11 で条件を満たす

みたいな書き方だった気が...

投稿2019/10/19 05:18

編集2019/10/19 07:27
BeatStar

総合スコア4958

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

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

koyuki_bbz

2019/10/19 05:58

BearStarさん、回答ありがとうございます。 過去にVBAやGASなどを少しかじったことがあったので、for文くらいならすぐ理解できるかと思ったのですが、せっかく回答いただいた内容が少し調べたくらいでは全く理解できませんでした…。1からC言語を勉強しないとダメそうですね…。ここでつまずいていても後が続かなそうですし、自分で使うものなのでとりあえずはこのままのコードで使用し、後々に解決していこうと思います。すいません。 貴重なお時間を割いていただきありがとうございました。
koyuki_bbz

2019/10/19 07:36

すげぇ…。 BearStarさん、なにからなにまでありがとうございます。 なんとなく理解して拾ってきたコードの切り貼りをしていましたが、行っている事を自分に落とし込むためにもコメントの活用、やってみます。 本当にためになる事ばかりありがとうございます。 最初はたいして勉強もしないでこちらに投稿してよいものかとためらいましたが、いろいろとご教授いただけたことが今回の目的以上にためになり、今回は投稿してよかったと思いました。 基礎から身に着けそれでも行き詰まったらまた質問してみようと思います。 本当にありがとうございました!!
BeatStar

2019/10/19 07:51

コピペ自体は悪だとは申しませんが、 何も考えずにやっても、単なる作業でしかありません。 なので、一行一行なにをしているのかを考えたり、documentationと呼ばれる、 関数やクラスなんかが説明されているサイトなんかを使って調べたりしてみてください。 それだけでも、同じコピペでも相当違います。 そういう風に工夫をするだけでもかなり実力に差が出ます。 がんばってください! ( ´∀`)bグッ!
guest

0

ベストアンサー

C

1 int j = 1; 2 while (j < 10 && High[j] < Label1Buffer[j] && High[j] < Label2Buffer[j]) 3 j++; 4 if (j == 10 && High[10] > Label1Buffer[10] && High[10] < Label2Buffer[10] && 5 iIchimotu(NULL,0,9,26,52,3,-26) < iIchimotu(NULL,0,9,26,52,4,-26)) { 6 BarsUp[i] = low[i] - 100 * Point; 7 }

投稿2019/10/19 05:39

編集2019/10/19 06:24
kazuma-s

総合スコア8224

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

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

koyuki_bbz

2019/10/19 06:51

kazuma-sさん、回答ありがとうございます。 シンプルで初心者の私にもわかりやすかったのでBAにさせていただきました。 回答ありがとうございました。 もしこのコメントを見ていただいていたら、ひとつ質問があるのですが。 この構文だとhigh[]やLabelBuffer[]の1~9までがif文の中にないようにみえるのですが、対象として扱われているのでしょうか?
dodox86

2019/10/19 07:19

横からすみません。 > 対象として扱われているのでしょうか? if (j == 10 && ... に込めたkazuma-sさんの思いを汲まないといけません。jが10に達したということは、何を意味するか。前段のwhileでjを++しているのは何故か。 。。。ところで、ご提示のコードは突っ込み待ちでしょうか。仕込まれたリンクエラーがありますねw
guest

0

C

1bool flag = true; 2for (int i = 1; i <= 9; i++) 3 flag = flag && High[i] < Label1Buffer[i] && High[i] < Label2Buffer[i]; 4flag = flag && High[10] > Label1Buffer[10] && High[10] < Label2Buffer[10]; 5if (flag && iIchimoku(NULL,0,9,26,52,3,-26) < iIchimoku(NULL,0,9,26,52,4,-26)) { 6 int i = rates_total - prev_calculated; 7 BarsUp[i] = low[i] - 100*Point; 8}

動作未確認。C99以上必須。#include <stdbool.h>しておくこと。

投稿2019/10/19 05:37

raccy

総合スコア21735

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

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

koyuki_bbz

2019/10/19 06:45

raccyさん、回答ありがとうございます。 同じタイミングで回答いただいた方の構文がすごくしっくりきたのでそちらの方をベストアンサーにさせていただきました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問