ランダムにエントリーする
動作:ローソクが確定したタイミングでのみ動作する。
乱数を生成し、偶数なら買い、奇数なら売り注文を出す。
int oldBars = 0; int ticket = 0; int OnInit(){ oldBars = Bars; MathSrand(GetTickCount()); //Seed値を入れる return(0); } void OnTick(){ if(oldBars == Bars)return; if(MathRand()%2==0) //生成した乱数を2で割った余りが0(=偶数)なら ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"",1234,0,Red); else ticket = OrderSend(Symbol(),OP_SELL,0.1,Bid,10,0,0,"",1234,0,Blue); oldBars = Bars; }
乱数を生成するときはシード値を決めてから乱数生成関数を呼び出します。
MQL4の場合はMathSrand()にシード値を入れると、MathRand()を呼び出すたびに0~32767内の整数を1つランダムで返します。完全ランダムにしたい場合、MathSrand()に入れるシード値をGetTickCount()にすることが多いです。GetTickCount()はシステムが起動してからの経過時間を1/1000秒単位で数えている関数です。
指定した時間経過したら決済する
動作:ローソクが確定したタイミングでのみ動作する。
ポジションがなければ買いエントリーする。
ポジションがあるなら、約定してから指定秒数を経過後、次の足で決済する。
input int time = 3600; //秒 int oldBars = 0; int ticket = 0; int OnInit(){ oldBars = Bars; return(0); } void OnTick(){ if(oldBars == Bars)return; if(OrdersTotal()==0){ ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"",1234,0,Red); OrderSelect(ticket,SELECT_BY_TICKET); } else{ if(TimeCurrent() > OrderOpenTime() + time) //約定時間+指定秒数を超えたら ticket = OrderClose(ticket,0.1,Bid,10,Blue); } oldBars = Bars; }
何かが起こってからの時間を計測する方法は主に2つあります。
1つはローソクの本数を数える方法で、もう1つは上のようにシステムの時間を利用する方法です。
TImeCurrent()は現在の時刻(厳密には最後にサーバーと通信した時刻)を返します。
TimeCurrent()やOrderOpenTime()はdatetime型ですが、これにint型の値を加算すると加算した値が秒数として処理されます。
したがって約定から最低3600秒経過後に決済することができます。
指定した本数経過したら決済する
input int waitBars = 3; //本 int entryBars = 0; int oldBars = 0; int ticket = 0; int OnInit(){ oldBars = Bars; return(0); } void OnTick(){ if(oldBars == Bars)return; if(OrdersTotal()==0){ ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"",1234,0,Red); entryBars = Bars; //約定時のローソクの数を記憶 } else{ if(Bars > entryBars + waitBars) //約定時のローソクの数+指定数を超えたら ticket = OrderClose(ticket,0.1,Bid,10,Blue); } oldBars = Bars; }
今回はBarsを使ってローソクの本数を数えています。
約定時のBarsの数を記憶しておき、そこに任意の数を足した数をBarsが超えたら決済という仕組みです。
ローソクの本数を数える方法は他にもたくさんあるのでお好みのやり方でよいと思います。