2016年5月27日金曜日

【EAを作ろう】第十回 RSI判定を1分と5分の二重判定に

作成しているEAはチャートの時間のRSIでエントリーを決めていましたが、
複数時間のRSIで判定します。
関数を活用したい為のすこし強引な展開ですw

extern int UpperLine=70,LowerLine=30,RSIPeriod=20,StopLoss=10,TakeProfit=90,Magic=747;
extern ENUM_APPLIED_PRICE AppliedPrice=0;
extern ENUM_TIMEFRAMES ShortTimeFrames=1;
extern ENUM_TIMEFRAMES LongTimeFrames=5;
double SL,TP;
int OnInit(){
if (Digits == 2|| Digits == 4)
{
SL=StopLoss  * Point * 0.1;
TP=TakeProfit* Point * 0.1;
}
else
{
SL=StopLoss*Point;
TP=TakeProfit*Point;
}
return(INIT_SUCCEEDED);}

void OnTick(){        
  if(OrdersTotal()==0)  {
    if(RSI(ShortTimeFrames)>UpperLine&&RSI(LongTimeFrames)>UpperLine){EntryShort();}
    if(RSI(ShortTimeFrames)<LowerLine&&RSI(LongTimeFrames)>UpperLine){EntryLong();}
    Comment(TP,SL);
  }
}

double RSI(int Periods){return(iRSI(Symbol(),Periods,RSIPeriod,AppliedPrice,1));}
void EntryLong(){int d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask-SL,Ask+TP,"Long",Magic,0,clrNONE);}
void EntryShort(){int d=OrderSend(Symbol(),OP_SELL,0.1,Bid,0,Bid+SL,Bid-TP,"Short",Magic,0,clrNONE);}

利益が出ないと面白くないのでTakeProfitを90にしました♪

(最適値募集中ですよ!)

いままではRSI()でしたがRSI(ShortTimeFrames)もしくはLong~となっています。
初期設定ではShort~は1 Long~は5ですので
RSI(1) と RSI(5) という意味合いになります。

オレンジ色の&&はAND 両方の条件が真の時という意味です。

水色は受け取り用にint Periodsを宣言 iRSIの期間をPeriodsにしています。



RSI(ShortTimeFrames)を追っかけてみましょう

RSI(ShortTimeFrames)はTimeFramesはデフォルトで1ですのでRSI(1)と言う意味になります。

この1は水色のところでPeriodsに格納されます。Periodsは1です。

iRSIの期間のところもPeriodsになっています。iRSIの期間1の値がRSI(ShortTimeFrames)に入ります。

同様にRSI(LongTimeFrames)はiRSIの期間5の値が入ります。

RSI(ShortTimeFrames)とRSI(LongTimeFrames)の両方がUpperLineより大きい時にEntryShort()を呼び出します。

※RSIを二重にすることで精度が上がりますが取引回数は下がります。

損益は一回取引の平均利益 x 取引回数ですので、平均と取引回数をうまくコントロールしないと利益はでません

そしてこの設定の場合 勝率10%ちょいですが利益が出ますw





0 件のコメント:

コメントを投稿