MQL4のGetTickCount関数についての疑問

このQ&Aのポイント
  • MQL4でGetTickCount関数を使用している際に、if(GetTickCount() - s_time)の意味が理解できずに困っています。
  • GetTickCount()関数は現在の時間をミリ秒単位で返す関数ですが、ここではその戻り値と変数s_timeの差分を計算しています。
  • if(GetTickCount() - s_time > WaitTime*1000)は、指定したWaitTime秒後に処理を実行するための条件式です。差分が指定した秒数を超えた場合に処理が実行され、それ以外の場合は処理が終了します。
回答を見る
  • ベストアンサー

MQL4を勉強中なのですが

MQL4を勉強中でソースを読んでいるのですが int s_time = GetTickCount();   int WaitTime = 10; while(true) { if(GetTickCount() - s_time > WaitTime*1000) { Alert("OrderClose time out."); return(false); } これの if(GetTickCount() - s_time がわからずつまづいております。 GetTickCount()がs_timeに格納されているのに GetTickCount() - GetTickCount()では 常にif( 0 > WaitTime*1000)   と言う意味になるのと思うのですが。 そう言う意味で合っているのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • Saitar
  • ベストアンサー率41% (192/464)
回答No.1

GetTickCount()関数はシステム起動時からその時点の経過時間を表します。 従って、最初のGetTickCount()はwhile文に入る前の時刻?で、それをs_timeに代入しています。 そして、while文の中でもGetTickCount()は刻々と時間によりカウントアップされるわけで、その値(時刻)と初期値(s_time)の差分がWaitTime*1000以上になったら、"OrderClose time out."とアラームを出すプログラムですね。 もし、このようなプログラムでどのような動きをしているか分からない場合は、Comment()やPrint()でリアルタイムにGetTickCount()を表示させてみれば、一目瞭然です。プログラム分析の一つの常道です。

ssindayo
質問者

お礼

頭の中でこねくり回してどんどん訳が分からなくなってました。次からPrintなど活用したいと思います。 システム起動時ってMT4立ち上げてからの時間かと思ってました。  理解できましたありがとうございます。

関連するQ&A

  • return trueとreturn falseの用途・違いは・・・?

    functionやifなどで「return true」「return false」というのを見かけますが、これの違いを教えてください。あと最近 if(!obj){ return true; } という文を見かけました。 これがifじゃなくてfunctionなら、ブール値が返るのでtrueとfalseの違いがありますが、このifではなぜreturn trueを使っているのか分かりません。「return false」を書くと、ifやfunctionを強制的に抜ける「break」と同じ役割を果たすと聞いた事がありますが、trueは知りません。 ・・・というより、ifでreturnを使う意味もよく分からなくなってきました。 if文は何も返りませんし、返したところで受け取る方法がありませんよね? これもどういう意味なのか、教えてください。 よろしくお願いします。

  • MT4(MQL4)プログラミングで動きません。教えて下さい。

    MT4(MQL4)プログラミングで動きません。教えて下さい。 下記のようなプログラムを勉強中なのですが、マウスをクリックしても何しても価格を取得してくれません。 ネットに検索すれば、下記のようなサンプルプログラムが幾つも紹介されてますが、全く動きません。 私のやりたいことは、マウスでクリックした場所の価格を取得しそれを元に水平線を描きたいのです。 ご存じの方がおられましたら、ご教授下さいませ。 宜しくお願い致します。 //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { double drop_price=WindowPriceOnDropped(); datetime drop_time=WindowTimeOnDropped(); //---- may be undefined (zero) if(drop_time>0) { ObjectCreate("Dropped price line", OBJ_HLINE, 0, drop_price,0); ObjectCreate("Dropped time line", OBJ_VLINE, 0, drop_time,0); } //---- return(0); } //+------------------------------------------------------------------+

  • 関数から一気に抜ける

    お世話になります。 不適切なデータを送らないためのスクリプトを書いています。 <form onsubmit="return func1(this);"> (省略) </form> func1 (frm1){   if (frm1.elements[0]~~~) {     alert(msg0);     return false;   } (省略)   if (frm1.elements[99]~~~) {     alert(msg99);     return false;   }   return true; } このように書く代わりに func1 (frm1){   if (frm1.elements[0]~~~) {     exodus(msg0);   } (省略)   if (frm1.elements[99]~~~) {     exodus(msg99);   }   return true; } function exodus(msg) {   alert(msg);   xxxx false; } とかこんな風に書けたらいいなと思うのですが この「xxxx」に相当するような機能はJavaScriptにあるのでしょうか? よろしくお願いします。

  • 豊島久道著「FXメタトレーダー実践プログラミング」

    お世話になります。 この著書の207ページの真ん中あたりに出てくる内容なんですが・・・ if (OrderSend (Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0) ! = -1 return (true) ; int err = GetLastError() ; Print("[OrderSendError] : ", err , "", ErrorDescription(err) ); こうしておくと、もし注文が約定した場合にはreturn文で関数を終了させてエラーメッセージが表示されないとのことです。 このreturn(true)というのはどこに返るんですか? start()関数はint型なので、「true」を返されても困りますよね? 「関数を終了させて」の「関数」とはどれなんでしょうか? 私の周囲にプログラムに詳しい方が皆無で、私自身もプログラムは初めてで、この箇所で悩みまくってしまいました>< どうぞよろしくお願いいたします。 ↓下は、著者のサイトで無料で公開されているライブラリ化されたトレード関数の一部なんですが、下から10行目あたりにも同じ表現があります。 // 注文を送信する bool MyOrderSend(int type, double lots, double price, int slippage, double sl, double tp, string comment, int magic) { price = NormalizeDouble(price, Digits); sl = NormalizeDouble(sl, Digits); tp = NormalizeDouble(tp, Digits); int starttime = GetTickCount(); while(true) { if(GetTickCount() - starttime > MyOrderWaitingTime*1000) { Alert("OrderSend timeout. Check the experts log."); return(false); } if(IsTradeAllowed() == true) { RefreshRates(); if(OrderSend(Symbol(), type, lots, price, slippage, sl, tp, comment, magic, 0, ArrowColor[type]) != -1) return(true); int err = GetLastError(); Print("[OrderSendError] : ", err, " ", ErrorDescription(err)); if(err == ERR_INVALID_PRICE) break; if(err == ERR_INVALID_STOPS) break; } Sleep(100); } return(false); }

  • 一括で入力のチェックをしたいのです!

    どなたか教えてください・・・ フツー入力チェックを行う場合 <SCRIPT language="JavaScript"> <!-- function Check(){ if(document.myform.Name.value==""){ alert("名前を入力してください。"); return false; } if(document.myform.Email.value==""){ alert("Eメールアドレスを入力してください。"); return false; } if(document.myform.Email.value.indexOf("@")<=0){ alert("Eメールアドレスが正しくありません。"); return false; } if(document.myform.Comment.value==""){ alert("コメントを入力してください。"); return false; } return true; } // --> </SCRIPT> こんなカンジで各フォーム毎にチェックを行い メッセージを出したりすると思うのですが、 フォーム数が多いため、入力のチェックを 一括で行いたいのですが・・・ JavaScriptを始めて間もないため とんちんかんな質問をしている様でしたら すみません。 どなたか入力チェックを一括で出来る方法を 教えて頂けないでしょうか・・・ お願いします。

  • radioボタンでも、うまくアラート処理したいのですが・・・

    <SCRIPT LANGUAGE="JavaScript"> <!-- // ヌル及び空欄のチェックを行う function isFilled(elm) { if (elm.value == "" || elm.value == null) return false; else return true; } function isReady(form) { // 名前の空欄のチェックを行う if (isFilled(form.name) == false) { alert("お名前を入力して下さい。"); form.name.focus(); return false; } return true; } //--> </SCRIPT> フォームによるアンケートページを作成しているのですが、 textボックスで回答が書かれていなく、空欄の部分があったら アラートを出し、そのtextボックス部分に戻す、というような 上記プログラムの流れにしています。 textボックスではうまくいくのですが、radioボタンのとき、 うまくいきません(アラートは出るが、フォームに戻らない)。 回避策を教えてください。

  • 2重軌道防止のサイトの説明

    に従って以下のようにしましたが 2重起動を発見してやめるために return false; としていますが return true; としたり booleanをやめて return int(0) とするとどうなるのでしょうか? WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; HWND hW,hPW; MSG ms; unsigned pos; HANDLE hMutex; hPW=FindWindow("goo","I am good."); hMutex=CreateMutex(NULL,TRUE,"UniqueName"); if(!hMutex)return FALSE; if (GetLastError()==ERROR_ALREADY_EXISTS) { ShowWindow(hPW,SW_RESTORE); SetForegroundWindow(hPW); return FALSE; } ・・・・・・・・・・・・・・・・・・・・

  • javascriptの関数につきまして

    javascriptの関数につきまして javascriptの関数につきましての質問です。 Daycheck()関数 function Daycheck(year, mon, day){ maxDayOfMonth = Array( 31,29,31,30,31,30,31,31,30,31,30,31 ); if (year < 1901 || 2200 < year) return false; if( mon < 1 || mon > 12 ) return false; if( day < 1 || day > maxDayOfMonth[mon-1] ) return false; if( mon != 2 ) return true; if( day < 29 ) return true; if( ( year % 4 ) == 0 && ( year % 100 ) != 0 ) return true; if( ( year % 400 ) == 0 ) return true; return false; } というサンプルソースを見たのですが、Daycheck()の中のif( mon != 2 ) return true;とは2月以外が選択されていた場合trueを返す。 つまり、2月は選択できないということでしょうか? プログラミングについて詳しい方がいらっしゃりましたらご指導お願いします。 宜しくお願い致します。

  • K&Rのp.95のgetop(char s[])

    こんにちは K&Rを読んでいるのですが、p.95のgetop(char s[])について質問します。 (1)関数本体の4行めにある    s[1] = '\0'; は、何のためにあるのでしょうか? (2)9行めと12行めで、    while( isdigit(s[++i] = c = getch()) ) とあるのですが、なぜs[i++]とせずにs[++i]として、cを格納するs[i]を、s[0]ではなくてs[1]から始めているのでしょうか? /* getop: 次の演算子あるいは数値の被演算数をとってくる */ int getop(char s[]) { int i, c; while( (s[0] = c = getch()) == ' ' || c == '\t') ; s[1] = '\0';       /* ← (1) */ if( !isdigit(c) && c != '.') return c;        /* 数ではない */ i = 0; if(isdigit(c))      /* 整数部を集める */ while( isdigit(s[++i] = c = getch()) )     /* ← (2) */ ; if(c == '.')       /* 小数部を集める */ while( isdigit(s[++i] = c = getch()) )     /* ← (2) */ ; s[i] = '\0'; if(c != EOF) ungetch(c); return NUMBER; }

  • isdigitの挙動について

    #include <iostream> #include <ctype.h> using namespace std; int main() { int i = 100; if (isdigit(i)){ cout << "true"; }else{ cout << "false"; } return 0; } というプログラムを実行したのですが、falseが標準出力に表示されます。 i=100なので、isdigitでtrueが返ってくるのだと思っていたのですが、なぜfalseが帰ってくるのでしょうか?? どなたか詳しい方いらっしゃったらご教示いただけると幸いです。