2016年5月27日金曜日

【EAを作ろう】第七回 設定編

前回RSIのシンプルなEAを作成しましたが設定がありません。

よくあるニーズとしてはRSIの期間、終値以外を使いたい、30,70のラインを変更したい。
MAGICナンバーを変えたい。ストップロス、テイクプロフィットを動かしたいというところでしょう。

定数を宣言に int や double を使っていましたがその前に extern もしくは input を付けると設定画面で設定できるようになります。

inputで設定した値はプログラムの中で変更することはできません。
externで設定したものはプログラム中の変更ができます。

前回のEAを変更します。変更点は下線のところです。

extern int UpperLine=70;
extern int LowerLine=30;
extern int RSIPeriod=20;
extern double StopLoss=0.01;
extern double TakeProfit=0.01;
extern ENUM_APPLIED_PRICE AppliedPrice=0;
extern int Magic=747;

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

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

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

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

先日コメント欄で話していた小技を一つ
extern ENUM_APPLIED_PRICE ~ あまり見慣れない記述かと思います。

設定で終値は0 始値は1・・・ という数字で設定する方法もありますが、
ENUM_APPLIED_PRICEと入力すると設定画面が文字表示されわかりやすくなります。


mql4には初めからClosePriceは0 OpenPriceは1・・・と定義されているのです。



メタエディターでENUMと入力するといろいろ候補が出てきますのでチャレンジしてみてください。
ENUM~で定義された定数はint形式になります。



MAGICについて
いろいろソースをみるとMAGICナンバーの宣言は三種類ほど見られます。
#define Magic 4649
int Magic = 4645;
extern int Magic =4646;

上の二つは競合してもユーザ側で選べません。そもそもex4だけだと番号もわかりません><;
extern もしくはinputで選択できるようにしましょう。

 

0 件のコメント:

コメントを投稿