MT4のIndicatorCounted()の挙動について

このQ&Aのポイント
  • MT4を応用した自動売買のシステムを作っている際に、MT4の関数であるIndicatorCounted()の挙動について悩んでいます。
  • IndicatorCounted()は、PTRループ内で時系列のデータを処理した後に処理済みの数を返す関数です。
  • しかし、初めて実行した時以外にも、IndicatorCounted()の値がゼロになることがあり、その条件について調査しています。
回答を見る
  • ベストアンサー

MT4のIndicatorCounted()

MT4を応用した自動売買のシステムを作っているのですが、どうも不可解なことがあり悩んでいます。 ct=IndicatorCounted()の関数ですが、PTRループ内で時系列のデータを処理した後に処理済みの数を返すことになっているのですが、 最初のstart関数が呼ばれた時点では、0が返り、最初の全PTRループでBarを調べる(例えiIMAの計算をする)た後では、Barの数が返ります。 以降は、start関数が呼ばれる度にはそのチックを前回処理した後なのでほぼBarの値が返ります。 ところがあるとき、IndicatorCounted()の値が、初めて実行したときのように、ゼロが返ることがあるのです。 これがどんな条件のときに起きるのかを調べたいのです。 これを考えていて、ふと疑問に思ったことは、ループ内で最小限どんな処理を行えば、IndicatorCounted()の値が更新されるのかなのです。 時系列バッファBuf[]と定義する値に何かセットしたときなのかなとも思いますが、明確な条件がわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんにちは  誰もお答えしていなかったため、お答えさせていただきました。 > ふと疑問に思ったことは、ループ内で最小限どんな処理を行えば、IndicatorCounted()の値が更新されるのかなのです。 時系列バッファBuf[]と定義する値に何かセットしたときなのかなとも思いますが、明確な条件がわかりません。  もし、ICustom関数で、インディケーターをそのまま取り込んでいる場合でしたら、そのインディケーター自体によるものかもしれません。  例えば、以下に”VQ”のcodeが載せられていますが、 http://codebase.mql4.com/source/8680   ここに、 extern int CountBars = 1485;  とのcodeがあります。  つまり、この”VQ”では、1485本ごとに再計算されているということになります。    お答えになっているかどうかはわかりませんが、お役に立てれば、幸いです。

qhtsige
質問者

お礼

お礼が遅くなりすみませんでした。 実は現象は、IndicatorBuffersの数(7個)がSetIndexBuffersの数(10個)より少なかったためで、同じに合わせると、現象はなくなりました。でもなぜ、違うとだめなのかは、わかりません。 IndicatorCounted()について ご提示いただいたコードを拝見しましたが、この関数は使っていませんでした。それで、この関数の更新時期についての知見は得られませんでした。しかし、このコードは走らせていませんが、IndicatoCounted()を使わない方法もあるのだなと参考になりました。 またこのコードも両者の値が違うので、わからなくなりました。 他人の作ったコードも参考にしたいので、検討して見ます。 ありがとうございました。

関連するQ&A

  • MT4のインジゲータの仕組みについて

    MT4のインジゲータについて質問させてください。 現在インジゲータを作成してテストしているのですが、インジゲータの仕組みでわからない部分があります。 下記ソースの ↓↓↓↓↓↓↓ ソースここから ↓↓↓↓↓↓ ////////////////////////// // SMAを表示する ////////////////////////// #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Blue double BufSMA[]; extern int SMAPeriod = 21; int init() { SetIndexBuffer(0, BufSMA); SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 1); SetIndexLabel(0,"21SMA"); return(0); } int start() { int counted_bars=IndicatorCounted(); int limit=Bars-1-counted_bars; for(int i=limit-1; i>=0; i--) {   BufSMA[i] = iMA(NULL,0,SMAPeriod,0,MODE_SMA,PRICE_CLOSE,i); } return(0); } ↑↑↑↑↑↑↑ ソースここまで ↑↑↑↑↑↑ でSMAが描写されることは確認したのですが、BufSMA[0]が最新のバーのSMAの値だとすると、バーが切り替わったとき(増えた時)に、それまでBufSMA[i]だったものをBufSMA[i+1]にずらして(iは0以上配列の大きさ未満)BufSMA[]のサイズを増やし、BUfSMA[0]を新しく切り替わったバーのSMAの値に割り振る処理が必要だと思うのですが、その処理が見当たりません。 これはインジケータ用のバッファに結びつけたことで(SetIndexBuffer(0, BufSMA))自動的に処理してくれるのでしょうか? それとも根本的に考え方が間違っているのでしょうか? 質問内容がわかりにくいかもしれませんが、回答いただけると助かります。

  • swith文について

    こんにちは。 switch文を用いて分岐を行っています。 以下のプログラムは、whileの無限ループ内にswitch文の分岐を行っています。while内にrecvfrom関数(ソケット通信用関数)を用いています。recv_Buf配列内をヌル文字まで走査し、文字列の長さによって分岐をしています。 while内のrecvfromによって、他端末から文字列を逐次受信しているのですが、この場合、switch文ではなくif文による分岐を行うべきなのでしょうか? また、breakを行うことで、whileの無限ループまで抜けることになるのでしょうか? switchの場合、breakを用いないと、実行したくないところまで実行してしまう可能性があるので、breakは必要だと思い以下のプログラムにしました。 よろしくお願いいたします。 [プログラム] while(1){   recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen);   while(recv_Buf[len]!='\0')   len++;   switch(len){    case 3:     if(memcmp(recv_Buf,"END",3) == 0){      //処理     }     break;    case 5:     if(memcmp(recv_Buf,"START",5) == 0){      //処理     }     break;     case 12:     case 13:     case 14:     case 15:      if(memcmp(recv_Buf,"SEND_PACKET",11) == 0){       //処理      }      break;    } }

  • 開ループ伝達関数から交さ(コーナー)各周波数を求めたいのですが。。

    開ループ伝達関数から交さ(コーナー)各周波数を求めたいのですが、やり方が良くわからないので、教えていただきたいです。 第三者が解いた解法では、開ループ伝達関数をG(s)とすると、 |G(jω)|=1 のときのωが交さ各周波数となると書いているのですが、 ゲインはωによらず一定の場合もあるのでωは定まらない(例えば二次系)と思いますし、伝達関数によってゲインの値は変わる(0dBであるときもあれば20dBであるときもある)ので、条件はいえないと思うのです。 よろしくお願いします。

  • あと少しなんですが・・・

    入力: This is a pen. 入力文字列:[ This is a pen. ] 出力文字列;[ pen. a is This ] ――――――――――――――――――― 上に示したように単語の順番をさかさまにして表示するプログラムを作りました。しかし、今のプログラムでは、最初に空白が来たり、空白が連続すると正しく表示できません。どこを修正すればいいのか教えてください。 -------------------------- #include <stdio.h> #define BUF 1024 void out(int,char); int main(void){ char in[BUF]; /* 入力された文字列を保存する */ char out[BUF]; /* inoput の内容を単語逆順にして保存する*/ int wordcount; /* 文字カウント */ char *in_ptr,*out_ptr; /* それぞれの文字列の文字をさすポインタ */ int i,j,a,b; /* 繰り返し用カウンタ */ /* メッセージの表示+文字列の入力 */ printf("入力: "); fgets(in, sizeof(in), stdin); /* ポインタの初期化 */ in_ptr = in; out_ptr = out; /* 単語数の初期化 */ wordcount = 0; /* 単語数を数える作業 */ while(*in_ptr != '\n'){ if(*in_ptr!=' '&&(*(in_ptr+1)==' '||*(in_ptr+1)=='\n')){ wordcount++; } in_ptr++; } /* メッセージの表示+単語数の表示 */ printf("\n文字数のカウント開始\n"); printf("文字数のカウント終了: %d単語\n",wordcount); printf("\n入力文字列:[ %s ]\n", in); printf("出力文字列;[ "); /* 単語逆順処理作業 */ b=0; for(a=0;a<wordcount;a++){ j=0; b++; in_ptr = in; for(i=0;i<(wordcount-b);i++){ while(*in_ptr!=' '){ j++; in_ptr++; } in_ptr++; } /* ポインタを単語の頭に持っていく */ in_ptr= in + (j+(wordcount-b)); /* inをoutにコピー */ while(*in_ptr!='\0' && *in_ptr!=' ' && *in_ptr!='\n'){ *out_ptr = *in_ptr; in_ptr++; out_ptr++; } if(*in_ptr==' '||*in_ptr=='\n'||*in_ptr=='\0'){ *out_ptr = ' '; out_ptr++; } } printf("%s]\n",out); return 0; }

  • VBAで「1」、「01」等を同じ数字とみなすには?

    エクセル2003です。VBAは初心者です。 ある列(Aとして)にデータがあって、A列をキーに昇順に並べ替えます。(1行目が見出し。) その後、2行目の値を基準値として、 ループで3行目から4行目、5行目…と順に値を見ていき基準値と比較して、 値が異なったら基準値でフィルタをかけて印刷し、 現在の値を新たな基準値として次のループを行う、 という処理を行っていました。 上記の時は数字4文字(0001、0100等)という前提だった為、空白や4文字の数字以外は 事前にチェックしてエラーメッセージを出していたのですが、 新たに「01」や「00001」も「0001」と同じ値として扱うことにしました。 この場合オートフィルタで「01」や「00001」と「0001」を同時に抽出する事は可能でしょうか? また無理な場合、どのような処理にすればよろしいでしょうか? 今の所、2つの値の文字数を取得(Len関数)し、 RIGHT関数で1文字取得。 1文字を比較して異なれば別とみなし印刷、 同じなら次はRIGHTで2文字取得して2文字を比較… これを少ない方の文字数分行う。 その後、文字数が多い方の文字列からLEFT関数で差分の文字数分取得し、 オールゼロなら同じとみなし、オールゼロでなければ別とみなす…。 という様な処理を作っている途中なのですが、 まずCOBOLのように、不特定な文字数の文字列に対して「ALLZERO」かどうかを見る 方法はあるでしょうか? また、処理が長引いているような気もするのですが、 これ以外に有効な方法はあるでしょうか? 教えていただけると助かります。 よろしくお願い致します。

  • 単語逆順コピープログラム

    入力された文字列を逆から表示するというプログラムを作成しているのですがなかなかうまくいきません。僕の作成したプログラムを載せておくので間違いの指摘をお願いします。 出力例(一部) 入力文字列:[ pen. a is This ] 出力文字列:[This is a pen.] ---------コードここから--------- #include <stdio.h> #include <string.h> /* マクロの定義 */ #define BUF 1024 int main(void){ char in[BUF]; /* 入力された文字列を保存する */ char out[BUF]; /* input の内容を単語逆順にして保存する */ int wordcount = 0; /* 単語数 */ char *in_ptr, *out_ptr; /* それぞれの文字列の文字を指すポインタ */ int wsp[128], wep[128]; /* 単語の先頭の添え字と単語末の添え字を保存する配列 */ int i, j; printf("入力された英単語列を単語逆順にします\n"); printf("入力:"); fgets(in, sizeof(in), stdin); sscanf(in, "%c", &in); /* \nを\0に書き換える */ in_ptr = in + strlen(in) - 1; *in_ptr = '\0'; /* 単語数カウント */ printf("文字数のカウント開始\n"); in_ptr = in; if(*in_ptr != ' '){ wordcount++; } for(in_ptr = in; *in_ptr != '\0'; in_ptr++){ if(*in_ptr != ' ' && *(in_ptr - 1) == ' '){ wordcount++; } } printf("文字数のカウント終了: %d単語\n", wordcount); printf("\n単語逆順処理開始\n"); for(i = 0; i < wordcount; i++){ for(in_ptr = in; *in_ptr != '\0'; in_ptr++){ if(*in_ptr != ' ' && *(in_ptr - 1) == ' '){ wsp[i] = *in_ptr; } if((*in_ptr - 1) != ' ' && (*in_ptr == ' ' || *in_ptr == '\0')){ wep[i] = *in_ptr; } } } out_ptr = out; for(i = wordcount - 1; i <= 0; i--){ for(*in_ptr = wsp[i]; *in_ptr <= wep[i]; in_ptr++){ *out_ptr = *in_ptr; out_ptr++; } } printf("単語逆順処理終了\n"); printf("\n入力文字列:[%s]\n", in); printf("出力文字列:[%s]", out); return 0; } ---------コードここまで---------

  • 基本情報処理試験(午後)疑似言語について

    平成17年春 問4 http://情報処理試験.jp/FE17a-pm/t04.html 上記URLの問題に、HerpSort関数があり、その関数内に以下のループがあります。 ■Idx: Num, Idx > 1,-1 | ・Swap(1, Idx) | ・MarkHeap(1, Idx-1) ■ ループ条件式に「Idx: Num」とありますが、どういう意味でしょうか? 変数Idxの値が、何らかの条件でNumになるのでしょうか?

  • 基本情報処理試験・午後・疑似言語について

    平成17年春 問4 http://情報処理試験.jp/FE17a-pm/t04.html 上記URLの問題に、HerpSort関数があり、その関数内に以下のループがあります。 ■Idx: Num, Idx > 1,-1 | ・Swap(1, Idx) | ・MarkHeap(1, Idx-1) ■ ループ条件式に「Idx: Num」とありますが、どういう意味でしょうか? 変数Idxの値が、何らかの条件でNumになるのでしょうか?

  • プログラムがわかりません

    C言語の本を読んでいるんですが、詰まってしまいました。プログラム自体は単純なのですが #include<stdio.h> void hello(void) { fprintf(stderr,"hello!\n"); } void func(void) { void *buf[10]; static int i; for(i=0;i<10;i++) { buf[i] = hello; } } int main(void) { int buf[100]; func(); return 0; } のスタックオーバーフローのプログラムです。 1. 要素100のint型配列を宣言 2. 関数funcの呼び出し 3. void *buf[10]; まずここでがわかりません。なぜポインタが   でてきたのか?またbufの要素数は100では? 4. buf[i] = hello; のループ    これもわかりません。配列に関数を代入しているのでしょうか?     5.  fprintf(stderr,"hello!\n"); これもまたわかりません。    fprintfの最初の引数は出力先ですが、なぜ標準エラー出力なの   でしょうか? 時間のあるかた解説お願いします。

  • read()メソッドを使ったループの抜け方

    通信のプログラムを作っています。 送信側では、指定した数のバイトデータを作成し、送信します。 受信側では、そのバイトデータを受信して、受信にかかった時間を計測します。 送信側では、次のようにしてデータの最後の文字をsとして、作っています。 受信側では、sを読み込んだら、受信完了と見なし、受信処理を終了します。 送信と受信処理のコードを見てください。 送信側(Dataは指定したバイトデータの数値です) for (int i = 0; i < Data-1; i++) {   out.write(i);   out.flush(); } out.write('s'); out.flush(); 受信側 while((part = in.read(buf,0,buf.length)) != -1) {   total += part; } 受信側のコードだと、送信されたバイトがすべて読み込んだらループを抜けるのですが、 そうではなく、sを読み込んだらループを終了させたいのです。 read(buf,int,int)の戻り値を使って受信されたバイト数を確認したいため、 どうしてもread(buf,int,int)を使って受信したいのです。 read(buf,int,int)を使いつつ、送信バイトの最後の文字sを読み込んだら ループを抜けるようにするには、どうすればよいでしょうか? アドバイスをお願いします。 自分で考えたコードを載せます。 読み込んだバイトをbufに入れる。 そして読み込んだバイト数を合計する。 bufの最後の文字がsならループを抜けるというようにしたいのですが、 指定したデータ分を読み込みません。 for(;;){ part = in.read(buf); total += part; if(buf[total] == 's'){ break; } } こちらの方も、指導していただきたいです。

    • ベストアンサー
    • Java