特定の時間にランダムな整数を出したい。

 

ランダムな整数は1or2の二つのみ。

1.指定の時刻Tickで動いている中、時刻が例えば日本時間16:00、MT的には10:00?の時だけイベント作動

2.ランダムな整数を表す1or2

この動きをさせたいのですが、どのような感じでコードを書けばいいでしょうか?


指定時刻に関してはinputで柔軟に変更できるようにしたいですが。hourだけじゃなくminutesまで

 

(1) 指定時刻の設定値は、時分を integer で取得。

(2) 現在時刻は MqlDateTime構造体を使って取得。

https://www.mql5.com/ja/docs/constants/structures/mqldatetime

(3) if文で(1)と(2)の時分を比較し、同じなら乱数を取得。

(4) 乱数の取得には MathRand を使う。

https://www.mql5.com/ja/docs/math/mathrand

ただし、MathRand は0〜32,767の値を返すので、次のように2で除算した余りに1を加える。これで1または2が返される。

int rand_index = MathRand() % 2 + 1;

MathRand を使用するときは、最初の呼び出しの前に MathSrand を呼び出して擬似乱数発生器を初期状態に設定する必要があるので注意が必要。

https://www.mql5.com/ja/docs/math/mathsrand

MQL5のドキュメンテーション: 標準的な定数、 列挙と構造体 / データ構造体 / データ型構造体
MQL5のドキュメンテーション: 標準的な定数、 列挙と構造体 / データ構造体 / データ型構造体
  • www.mql5.com
データ型構造体 - データ構造体 - 標準的な定数、 列挙と構造体 - MQL5 リファレンス - MetaTrader 5 のためのアルゴリズムの/自動化されたトレーディング言語のリファレンス
 

ちょっと、、、見様見真似で書いてみましたが、あと一歩、、、if文の判定の部分が

int select_hour = 10; //選択時刻

int OnInit()
 {
  MathSrand(GetTickCount());

  return(INIT_SUCCEEDED);
 }

void OnTick()
 {
  datetime tm = TimeCurrent();
  MqlDateTime stm;
  TimeToStruct(tm, stm);

  if(select_hour == stm.hour)
   {
    int rand_index = MathRand() % 2 + 1;
    Print("今回の乱数は " + rand_index + " です。");
   }
 }

とりあえず、if抜きでrand_indexとstm.hourってのをPrintしたら、なんか表示できてるかなっていう感じなんですが、if文の判定がうまくいっていないみたいです。

あと、今回のように10時になったらその時一回だけ乱数を表示するという形にしようと思うと追加どうなるでしょうか?

 
if(select_hour == StringToInterger(stm.hour))
 {
  int rand_index = MathRand() % 2 + 1;
  Print(rand_index);
 }

とすると、なんとなくできたのかな?

しかしこれだと、10時の間ずっとやってしまうので、10時になった段階(9時のローソク足が終値確定、10時のローソク足の始値確定)のみ判定させたいんですが、どういう考え方になるでしょうか?

 
input int      select_hour    = 10; //選択時
input int      select_minute  = 0;  //選択分
//--- 
datetime       time_limit     = 0;  //制限時刻
if(select_hour == stm.hour && select_minute == stm.min && time_limit < tm)
{
   int rand_index = MathRand() % 2 + 1;
   Print("今回の乱数は " + (string)rand_index + " です。");
   time_limit = tm + 120; //120秒
}


この場合乱数発生時から120秒間動作が制限される。

 

ありがとうございました!

きちんと、思った時間に一回のみ作動するようになりました。

別でオーダーに関してはできるようになっていたので、その処理も入れてみて動いていました!

理由: