1度だけ買い注文を入れる
動作:EA起動直後に0.1ロット買う
#property strict //以降この文は省略します int OnInit() { int ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"",1234,0,Red); return(0); }
通常OnInit()の戻り値はINIT_SUCCEEDEDですが0を返しても意味は同じです。
赤矢印の位置がローソクに対して若干に上にずれているのは、チャートがBid表示なのに対して矢印はAsk表示のためです。
ティックごとに買い注文を入れる
動作:ティック毎に0.1ロット買う
void OnTick() { int ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"",1234,0,Red); }
先ほどと同じ文でも、OnTick()の中に入れると一つの足の中で大量に発注する動作に変わります。
ローソク足が確定するごとに買い注文を入れる
動作:ローソク足が確定するごとに次の足の始値で0.1ロット買う
int oldBars = 0; int OnInit() { oldBars = Bars; //EA起動時、現在の本数をoldBarsに代入 return(0); } void OnTick() { if(oldBars == Bars)return; //ローソクの本数が前のティックと同じなら処理終了 int ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"",1234,0,Red); oldBars = Bars; //現在のローソクの本数に更新 }
注文を分散できました。
ちなみに、私はなんとなくBarsを使用していますが、Barsには欠点が2つあります。
1つはBarsの値は「チャートの最大バー数」を超えることができないという問題です。
「チャートの最大バー数」はツール>オプション>チャートで設定できるので最大にしておきます。
また、EA動作中にチャートを左の方に動かすと、新しい(過去の)バーが生成されるので、ローソクが確定したと誤判断してしまいます。
これを防ぐにはEA動作前に一度Homeキーでチャートを左端まで移動させておく必要があります。
実際に稼働させるEAを作るのであれば、Volume[]を使った方が安全です。
long oldVolume = 0; void OnTick() { if(Volume[0] < oldVolume){ oldVolume = 0; int ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"",1234,0,Red); } oldVolume = Volume[0]; }
Volume[]はそのローソク内での出来高(取引量)を表します。
Volume[0]は現在のローソクの出来高なので、前のティックの出来高より小さい=ローソクが変わったと判断できます。
ポジションを持っていれば決済する
動作:ポジションが0のとき、ローソク確定時に0.1ロット買う
ポジションが1のとき、ローソク確定時に0.1ロット決済する
int oldBars = 0; int ticket = 0; int OnInit() { oldBars = Bars; return(0); } void OnTick() { if(oldBars == Bars)return; if(OrdersTotal()==0) //ポジションが0個なら ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"",1234,0,Red); else bool close = OrderClose(ticket,0.1,Bid,10,Blue); oldBars = Bars; }
ポジションを持っているときは売るように場合分けしました。