はじめに
MT4のEAで次のようなプログラムを組みました。
平均足の色が変わったら足が確定した瞬間に買い、売りの注文および決済を行う。ただし、スプレッドが許容範囲を超えていたら、現在の足が確定するまでにスプレッドの広がりが落ち着くまで待機するが、それでも落ち着かなかったら注文および決済を見送る。
平均足を使って足の確定した瞬間にだけ取引をしたい人は多いのではないでしょうか?
上のような取引を可能にするプログラムをMQL4で書いたので紹介します。
取引の様子
作成したプログラムの取引の様子は下のチャートのようになります。
平均足の色が赤から青に変わった時には買いポジションを決済し、売りポジションの注文をします。
青から赤に変わるときは、この逆です。
平均足を使って自動売買をする場合は、このように足が確定した瞬間にのみ取引を行いたいはずです。
ただ、スプレッドが広がっている時は取引したくないのでこれを回避するためのプログラムを組みました。
ソースコード
MQL4で書いたコードは下の通りです。
複雑ですが参考にしてください。
//パラメーター
extern int Slippage = 10; //スリッページ
int volumeima;
int volumemae=0;
bool TickTrade=False; //Trueは始値以外で取引するモード、Falseは始値でのみ取引をするモード
int MaxSpread=4; //このスプレッド以上の時は取引しない
bool initial=True;
extern double Lots=0.1; //ロット
//+------------------------------------------------------------------+
//| ポジションを決済する |
//+------------------------------------------------------------------
void ClosePositions()
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == false) break;
if(OrderMagicNumber() != MAGIC || OrderSymbol() != Symbol()) continue;
//オーダータイプのチェック
if(OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
break;
}
if(OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
break;
}
}
}
double Close1 ; //1本前の平均足の終値
double Open1 ; //1本前の平均足の始値
double Close2 ; //2本前の平均足の終値
double Open2 ; //2本前の平均足の始値
//平均足の始値、終値の計算
void Calc(){
Open2=Open1;
Close2=Close1;
Close1 = (Close[1]+Open[1]+High[1]+Low[1])/4;
Open1 = (Open2+Close2)/2;
}
//+------------------------------------------------------------------+
//| スタート関数 |
//+------------------------------------------------------------------+
int start()
{
//このEAが起動したときに一度だけ実行される
//1本目のみは平均足の計算方法が異なるため
if(initial==True){
Open1=(Open[3] + Close[3] + Low[3] + High[3]) / 4;
Close1=(Open[2] + Close[2] + Low[2] + High[2]) / 4;
initial=False;
}
//今のTickを取得
volumeima=Volume[0];
//始値の時は何がなんでも平均足の計算をする
if(volumeima<volumemae){
Calc();
}
//始値ではないかつ始値で取引するモードの時
if(volumeima>=volumemae&&TickTrade==false){
volumemae=volumeima;
return(0);
}
//許容スプレッドを超えていないかの判定
if(Ask-Bid >=MaxSpread*Point||IsTradeAllowed()==false){
if(TickTrade==false){
TickTrade=true;
}
volumemae=volumeima;
return(0);
}
//売りポジション決済
if(Close1 > Open1 ) ClosePositions();
//買いポジション決済
if(Close1 < Open1 ) ClosePositions();
//買いポジション注文
if(Close2 <= Open2 && Close1 > Open1 ) OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",MAGIC,0,Red );
//売りポジション注文
if(Close2 >= Open2 && Close1 < Open1 ) OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",MAGIC,0,Blue );
//始値以外で取引終わったらTickTradeフラグを下げる
if(TickTrade==true){
TickTrade=false;
}
//前のTick量に今のTick量を代入
volumemae=volumeima;
return(0);
}
コメント