EAを作ってみる

EAを作ってみる

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

にほんブログ村 為替ブログ FX システムトレード派へ

今回は、EA(自動売買)のプログラムを作ってみたいと思います。 今回は、単純移動平均のラインをブレイクしたときに順張りするEAを作成します。  

単純移動平均をブレイクしたときに、成行でオーダーし、テイク(利益確定)ポイントとロスカットポイントを指定します。

これは、通信できなかったときの保険で、実際の利益確定やロスカットはEAが値を確認して行います。  

 

注意事項ですが、ここで作成したプログラムを実運用で利用してもかまいませんが、利益を保証するものではありません。

ご自分の判断で、利用してください。

損害等は、一切保証しません。

 

では、プログラムの作成を行いましょう。  

MetaEditorを開き、Expert Advisor Wizardを開きます。  

Expert Advisor作成

Expert Advisor作成

Expert Advisorを選択し、次へを押します。

 

EAの名前を決める

EAの名前を決める

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は、操作履歴に結果を出力する関数です。

操作を残したいときに利用すると便利です。

次は、バックテストのやり方を説明したいと思います。

 

 

今回のプログラムは、以下からダウンロードできます。

ここから、ダウンロード

 

EA(自動売買)は、

インストールパス\MetaTrader\experts

に入れてください。

 

にほんブログ村 為替ブログ FX システムトレード派へ 人気ブログランキングへ

タグ

トラックバック&コメント

この記事のトラックバックURL:

トラックバック

  1. [...] 前回のEAを作ってみるで説明不足のところを説明します。 [...]

    ピングバック投稿者: EAを作ってみる2 | メタトレーダープログラミング めたぷろ — 2009年05月12日

  2. [...] 前回のEAを作ってみるで作ったMA_EAを利用して、バックテストしてみたいと思います。 [...]

    ピングバック投稿者: バックテストしてみる | メタトレーダープログラミング めたぷろ — 2009年05月13日

  3. [...] 前回、EAを作ってみるでつくったEA(自動売買)、MA_EAをバックテストしてみました。 [...]

    ピングバック投稿者: バックテストをしてみる2 | メタトレーダープログラミング めたぷろ — 2009年05月15日

  4. [...] めたぷろで紹介した「EAを作ってみる」で作成したEA(自動売買)。 [...]

    ピングバック投稿者: MA_EA 移動平均を利用したEA | MT4 めたぷろ ダウンロードセンター — 2009年05月16日

  5. [...] EAを作ってみるを参考にEAを作ってください。 [...]

    ピングバック投稿者: 週末にまとめてクローズするEA | メタトレーダープログラミング めたぷろ — 2009年05月26日


コメント

  1. [...] 前回のEAを作ってみるで説明不足のところを説明します。 [...]

  2. [...] 前回のEAを作ってみるで作ったMA_EAを利用して、バックテストしてみたいと思います。 [...]

  3. [...] 前回、EAを作ってみるでつくったEA(自動売買)、MA_EAをバックテストしてみました。 [...]

  4. [...] めたぷろで紹介した「EAを作ってみる」で作成したEA(自動売買)。 [...]


コメントを投稿する



この記事のコメントだけのRSSフィードを取得

Spam Protection by WP-SpamFree


トレンドラインを書いてみる3 »
« EAを作ってみる2