EAを作ってみる
50種類以上の通貨ペア、各種CFD(金、株など)対応
今回は、EA(自動売買)のプログラムを作ってみたいと思います。 今回は、単純移動平均のラインをブレイクしたときに順張りするEAを作成します。
単純移動平均をブレイクしたときに、成行でオーダーし、テイク(利益確定)ポイントとロスカットポイントを指定します。
これは、通信できなかったときの保険で、実際の利益確定やロスカットはEAが値を確認して行います。
注意事項ですが、ここで作成したプログラムを実運用で利用してもかまいませんが、利益を保証するものではありません。
ご自分の判断で、利用してください。
損害等は、一切保証しません。
では、プログラムの作成を行いましょう。
MetaEditorを開き、Expert Advisor Wizardを開きます。
Expert Advisorを選択し、次へを押します。
NAMEに「MA_EA」と入力します。
パラメータを指定できますが、今回はコード上で指定しますので、そのまま完了を押してください。
スケルトンが作成されます。
前半の設定を行います。
//オーダーするときのロット数をパラメータとして指定します。
//0.1ロットが1万通貨となります。
extern double BuyLots=0.1;
//単純移動平均のサンプリングする足の数をパラメータとして指定します。
extern int MAPeriod=21;
//EAが利益確定するポイント数をパラメータとして指定します。
extern int TakeMA=20;
//EAがロスカットするポイント数をパラメータとして指定します。
extern int LossMA=10;
//オーダー時に保険として設定する利益確定ポイントを指定します。
extern int TakeEntry=25;
//オーダー時に保険として設定するロスカットポイントを指定します。
extern int LossEntry=25;
//オーダー番号を格納する変数を設定します。
int ticket=0;
//このEAのオーダーを判断するための番号を設定します。
int MagicNo=1;
今回は、初期処理と終了処理ではなにも行いません。
実行処理を指定します。
int start()
{
//ポジションを持っているか判断するフラグを設定します。
//0がポジションなし、1がポジションを持っていることにします。
int KeepPosition=0;
//現在持っているオーダー数を取得します。
int total=OrdersTotal();
int i;
//現在持っているオーダーの中からこのEAがポジションを持ったオーダーを探します。
for(i=0;i < total;i++){
//オーダーを選択します。
if(OrderSelect(i, SELECT_BY_POS)==true)
{
//オーダーの通貨ペアが同じで、このEAが指定したマジックNoが同じものを探します。
if(Symbol() == OrderSymbol() && OrderMagicNumber() == MagicNo)
{
//このEAがオーダーしたものが見つかったときはオーダーを持っていることにします。
KeepPosition = 1;
//チケット番号をセットします。
ticket=OrderTicket();
//ループを抜けます。
break;
}
}
}
//現在から過去の単純移動平均を5本分取得します。
double Ma0=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,0);
double Ma1=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,1);
double Ma2=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,2);
double Ma3=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,3);
double Ma4=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,4);
//ポジションを持っている場合、クローズするか確認します。
if(KeepPosition == 1)
{
//オーダーから何本足を描画したかを求めます。
//オーダーから最小値、最大値を求めるために利用します。
int ChkAshi = (OrderOpenTime()-TimeCurrent())/(Period()*60);
//売りポジションの場合
if(OrderType() == OP_SELL)
{
//オーダーしてから、TakeMAの2倍の値を出して、TakeMAまで戻ってきたときにクローズします。
//利益確定は、戻ってきたときとオーダー時に設定したポイントの2つが利益確定ポイントです。
if(OrderOpenPrice()-TakeMA*Point >= Ask && OrderOpenPrice()-TakeMA*2*Point >= Low[iLowest(NULL,0,MODE_LOW,0,ChkAshi)])
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);
}
//LossMAで指定したポイントを割ってしまったときにロスカットします。
if(OrderOpenPrice()+LossMA*Point <= Ask)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);
}
}
//買いポジションの場合
//売りポジションと同じことを行います。
//符号の向きが逆なのとAskではなくBidを利用しているところが違います。
else if(OrderType() == OP_BUY)
{
if(OrderOpenPrice()+TakeMA*Point <= Bid && OrderOpenPrice()+TakeMA*2*Point <= High[iHighest(NULL,0,MODE_HIGH,0,ChkAshi)])
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
}
if(OrderOpenPrice()-LossMA*Point >= Bid)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
}
}
}
//ポジションを持っていない場合、ポジションを持つかどうか確認します。
else if(KeepPosition == 0)
{
//下降トレンドの場合
if(Ma4 > Ma3 && Ma3 > Ma2 && Ma2 > Ma1 && Ma1 > Ma0)
{
//Ma4、Ma3、Ma2のクローズが大きくて、Ma1と現在値(Bid)が小さい場合売りポジションを持ちます。
if(Ma4 < Close[4] && Ma3 < Close[3] && Ma2 < Close[2] && Ma1 > Close[1] && Ma0 > Bid)
{
ticket=OrderSend(Symbol(),OP_SELL,BuyLots,Bid,3,Bid+LossEntry*Point,Bid-TakeEntry*Point,”MA_EA Sell”,MagicNo,0,Blue);
if(ticket==0) Print(”Error opening SellChk order : “,GetLastError());
}
}
//上昇トレンドの場合
else if(Ma4 < Ma3 && Ma3 < Ma2 && Ma2 < Ma1 && Ma1 < Ma0)
{
//Ma4、Ma3、Ma2のクローズが小さくて、Ma1と現在値(Bid)が小さい場合買いポジションを持ちます。
if(Ma4 > Close[4] && Ma3 > Close[3] && Ma2 > Close[2] && Ma1 < Close[1] && Ma0 < Ask)
{
ticket=OrderSend(Symbol(),OP_BUY,BuyLots,Ask,3,Ask-LossEntry*Point,Ask+TakeEntry*Point,”MA_EA Buy”,MagicNo,0,Red);
if(ticket==0) Print(”Error opening BuyChk order : “,GetLastError());
}
}
}
return(0);
}
OrderSelectで、選択しているオーダーはOrder???関数で値を取得することができます。
Low[iLowest(NULL,0,MODE_LOW,0,ChkAshi)、High[iHighest(NULL,0,MODE_HIGH,0,ChkAshi)]は、オーダーしてからの最安値、最高値を求めています。
OrderSendは売買注文を行う関数で、成行、IFD、OCOなどのオーダーを組み合わせて注文することができます。
今回の例では、成行+OCO注文を行っています。
また、ticketが0の場合は注文失敗で、GetLastErrorを利用してエラー番号を取得しています。
Printは、操作履歴に結果を出力する関数です。
操作を残したいときに利用すると便利です。
タグ
2009年05月12日 コメント&トラックバック(5) | トラックバックURL |
50種類以上の通貨ペア、各種CFD(金、株など)対応
トラックバック&コメント
トラックバック
-
[...] 前回のEAを作ってみるで説明不足のところを説明します。 [...]
ピングバック投稿者: EAを作ってみる2 | メタトレーダープログラミング めたぷろ — 2009年05月12日
-
[...] 前回のEAを作ってみるで作ったMA_EAを利用して、バックテストしてみたいと思います。 [...]
ピングバック投稿者: バックテストしてみる | メタトレーダープログラミング めたぷろ — 2009年05月13日
-
[...] 前回、EAを作ってみるでつくったEA(自動売買)、MA_EAをバックテストしてみました。 [...]
ピングバック投稿者: バックテストをしてみる2 | メタトレーダープログラミング めたぷろ — 2009年05月15日
-
[...] めたぷろで紹介した「EAを作ってみる」で作成したEA(自動売買)。 [...]
ピングバック投稿者: MA_EA 移動平均を利用したEA | MT4 めたぷろ ダウンロードセンター — 2009年05月16日
-
[...] EAを作ってみるを参考にEAを作ってください。 [...]
ピングバック投稿者: 週末にまとめてクローズするEA | メタトレーダープログラミング めたぷろ — 2009年05月26日
コメント
コメントを投稿する




![[image]投資で失敗しない7つの法則:無料CDプレゼント](http://www.affiliatecenter.jp/invest/img/FX_freeCD/banner165x100seven_rule5e.gif)
![[image]無料レポートプレゼント:ドルが紙くずになった時に資産を守る方法](http://www.affiliatecenter.jp/invest/img/dollar/MNL4_165x100.jpg)



MyBlog

[...] 前回のEAを作ってみるで説明不足のところを説明します。 [...]
[...] 前回のEAを作ってみるで作ったMA_EAを利用して、バックテストしてみたいと思います。 [...]
[...] 前回、EAを作ってみるでつくったEA(自動売買)、MA_EAをバックテストしてみました。 [...]
[...] めたぷろで紹介した「EAを作ってみる」で作成したEA(自動売買)。 [...]
[...] EAを作ってみるを参考にEAを作ってください。 [...]