MQL4 実践1

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;
}

ポジションを持っているときは売るように場合分けしました。