2016年5月26日木曜日

【EAを作ろう】第六回 RSIのEA作成

RSIをEAを作ります。
ポジションを持たず、RSIが70を超えたら売り30を下回ったら買い建てです。


void OnTick(){            //ティック関数
  if(OrdersTotal()==0)  {     //ポジションが0の時で
    if(RSI()>70){EntryShort();} //RSIが70を超えていると買われすぎと判断しで売り建てをする。
    if(RSI()<30){EntryLong();} //RSIが30を下回っていると売られすぎと判断しで買い建てをする。
  }
}

double RSI(){                                                        //RSI関数作成
  double r=iRSI(Symbol(),PERIOD_CURRENT,20,PRICE_CLOSE,1); //rにRSIを入れる
  return(r);}                          //rを戻り値に返す。 

void EntryLong(){      //買い建て関数
  int d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask-0.01,Ask+0.01,"Long",747,0,clrNONE);
}

void EntryShort(){   //売り建て関数
  int d=OrderSend(Symbol(),OP_SELL,0.1,Bid,0,Bid+0.010,Bid-0.01,"Short",747,0,clrNONE);
}

OrdersTotal()は現在のポジション数が取得できます。sをよく忘れます。

条件分岐はifは if (条件) {実行} となります。
ややこしいのは左右が同じであればという時は==となります。
違う時は!=です。 >小なり,>=以下,<大なり,<=以上などよく使います。

if(OrdersTotal()==0){ は もしポジションを持っていない時は・・・という事です。

続いて
if(RSI()>70){EntryShort();} もしRSI()が70より多きい時はEntryShort()を実行します。
その下は30未満の時にはEntryLong()を実行です。

RSI()関数はiRSI関数でRSIの値を取り出しています。
iRSI(通貨ペア、足、期間、使用する価格データ、バーの位置)

Symbol()は今回のチャートの通貨ペアを表し、PEROD_CURRENTはチャートの時間軸です。
期間は20、終値の一本前となります。

最後は
int d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask-0.01,Ask+0.01,"Long",747,0,clrNONE);

OrderSendは発注する関数なのですが戻り値がありますので、
int d=とつけています。コンパイル時の注意を避けるためでdの中身は使いません。

OrderSend(通貨ペア、コマンド、ロット、注文価格、スリッページ、ストップロス、テイクプロフィット、コメント、マジックナンバー、有効期限、矢印の色)

コマンドはOP_BUY、OP_SELLが成り行き買い、売りです。
注文価格は成り行きの時は買いAsk,売りBidです。
スリッページは0
ストップロス、テイクプロフィットは0.01円です。
コメントはLong Shortを入れマジックナンバーは747にしています。
有効期限は0 なしです。





6 件のコメント:

  1. TACA さま素敵×10 !

    大変なことになっております!
    EA初心者専用ブログに!
    永久保存版バイブルにさせていただきます!

    返信削除
  2. 興奮して要件を書くのをわすれておりました。
    色んなとこからコピペしてつなぎ合わせてみました。
    私の作ろうとしたのは、8と12のLWMAの交差で途転売買するものです。
    短い時間足ではきついですが、1時間足の裁量取引で使っているものです。
    ゆくゆくはstop,limit,トレール機能もつけてやろうと思ってるのですがまだまだ先の話です。
    ブローカーはオアンダを使ってます

    #property copyright "Copyright 2014, MetaQuotes Software Corp."
    #property link "http://www.mql5.com"
    #property version "1.00"
    #property strict

    extern int Magic = 4649;
    extern int FMA_Period = 8;
    extern int SMA_Period = 12;
    extern int MA_Mode = 3;
    extern int Applied_Price = 0;
    extern double Lots = 0.01;
    extern string Comments = "2MA Cross";

    double FMA_1,FMA_2,SMA_1,SMA_2;

    int Ticket;

    datetime Bar_Time;

    bool Closed = false;


    int start()
    {
    if(Bars < SMA_Period)
    {return(0);}

    if(Bar_Time == Time[0])
    {return(0);}
    else if(Bar_Time != Time[0])
    {Bar_Time = Time[0];}


    FMA_1 = iMA(Symbol(),0,FMA_Period,0,MA_Mode,Applied_Price,1);
    FMA_2 = iMA(Symbol(),0,FMA_Period,0,MA_Mode,Applied_Price,2);
    SMA_1 = iMA(Symbol(),0,SMA_Period,0,MA_Mode,Applied_Price,1);
    SMA_2 = iMA(Symbol(),0,SMA_Period,0,MA_Mode,Applied_Price,2);

    //ロングポジションクローズ
    if(Ticket > 0 && FMA_2 >= SMA_2 && FMA_1 < SMA_1)
    {Closed = OrderClose(Ticket,Lots,Bid,10,Magenta);
    if(Closed == true){Ticket = 0;}
    }
    //ショートポジションクローズ
    else if(Ticket > 0 && FMA_2 <= SMA_2 && FMA_1 > SMA_1)
    {Closed = OrderClose(Ticket,Lots,Ask,10,Aqua);
    if(Closed == true){Ticket = 0;}
    }

    //ロングエントリー
    if(OrdersTotal() == 0 && FMA_2 <= SMA_2 && FMA_1 > SMA_1)
    {Ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,Comments,Magic,0,Magenta);}
    //ショートエントリー
    if(OrdersTotal() == 0 && FMA_2 >= SMA_2 && FMA_1 < SMA_1)
    {Ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,Comments,Magic,0,Aqua);}

    return(0);
    }

    返信削除
  3. ぶりこさん
    ソースコード拝見しました。
    綺麗で見やすいコード書きますね!私も初心に帰って見習わないといけません><
    中もパーフェクトです!
    発注頻度も一日2~3回ありますので動きそうですが・・・
    よくあるバグなのですが自動売買ONのままEAをセットすると笑顔のまま動かない時があります。
    自動売買OFF ⇒ EA削除 ⇒ 自動売買ON ⇒ EAセットで直るかもしれません。

    そして小技を一つ 
    extern int MA_Mode = 3; を extern ENUM_MA_METHOD MAMode=MODE_LWMA; これにすると
    設定がプルタブで選べるようになります!


    返信削除
    返信
    1. 小技ありがとうございます!早速書き換えました。

      しかし、EAが取引きをしません><
      昨日の HappySet も取引きせず、コメントだけが楽しそうにしております。
      もしかして一つの口座で他にポジションがあるとダメなのでしょうか?
      と思ってエントリー処理の OrdersTotal() == 0 を外してみたらポジションを取り始めたのですが、
      トンデモないことになってしまうところでした^^; ビックリしたw
      もうちょっといじくりまわしてみます。

      削除
  4. 複数EAを同一口座で走らせていたのですね
    OrdersTotalの代わりにTicket <= 0にすると解決しますよ。OANDAでしたらサブ口座を作るのがベストです。競合は回避できますよ
    https://m.youtube.com/watch?list=UUJfPnv6gyjiDxCMBsdz8WJQ&v=TNTaUF14D8M

    返信削除
  5. 神様 仏様 TACA様!ありがとうございます!
    OrdersTotalの代わりにTicket <= 0にするとあっさり解決しました。
    サブ口座作ったので HappySetを動かせてみます。
    そして【EAを作ろう】シリーズ、(第3回でつまづいておりますが^^;)大変な労力とお時間を費やしたことでしょう。本当にありがとうございます!
    ブログを読んでいる方たちがEAを作れるようになることが恩返しになるのではないかととも思っております。

    返信削除