システムの概要
今回使うエンベロープは移動平均からの乖離がどのくらいかを見るトレンド指標です。
日足で使います。Envelopesの値は上限を超えたときに買い、
下限を超えたときに売りのシグナルです。EM09_Envelopes.mq5 では、
これと併せRSIの値が上限値超えたとき買い、
下限値を下回ったとき売りシグナルとして売買を行うようにします。
RSIは買われすぎ、売られすぎのシグナルとするのが一般的な使われ方ですが、
今回は逆に使っています。三猿金泉録の記述には、
「高下とも5分1割は従い、2割3割向かう理と知れ」とあります。
FXでの乖離率はストラテジーテストから求める必要がありますが、
いずれににしても、自分の財産を使う以上相場の方向には自らの定見を持つべきです。
「定見なきは相場をやる資格なし。」とは戦前に相場で資産をなした相場師の言葉です。
Envelopesの計算式は次のようになります。Deviation(乖離率)はパーセント表示です。
maV_Up[1] =(1+Deviation/100.0)*maV[1];
maV_Down[1]=(1-Deviation/100.0)*maV[1];
maV[1]は前日の終値での移動平均の値
maV_Up[1]は上限の値
maV_Down[1]は下限の値です。
EURUSD日足では乖離率の値は0.1%が良い結果でした。0.1%の上限を超えたときに買い、
下限を超えたときに売りのレベルです。
EM09_Envelopes.mq5 のプログラムは下のダウンロードから行ってください。
ソースファイルですので、ダウンロードした後コンパイルが必要です。
ダウンロード
ソースファイルはExpertsフォルダーに格納します。Expertsフォルダーの開き方は、
メタエディタのナビゲータでExpertsを選択し、マウスの右ボタンをクリックします。
そして「フォルダーを開く」を選択します。
Expertsフォルダーを開いた後、ファイルをコピー&ペーストします。
コンパイルすると問題がなければ次のように表示されます。
0 error(s), 0 warning(s), compile time: 12979 msec 1 1
プログラムの変更箇所
コードは以前作ったEA03_RSI.mq5を参考にしています。
MQL5のテクニカル指標iEnvelopesは使用せず、iMAの結果から直接計算しています。
追加、変更コードは次のようになります。
----------
追加コード
input double Deviation=0.1; // (%)
double maV_Up[3];
double maV_Down[3];
void OnTick()での追加コード
maV_Up[1] =(1+Deviation/100.0)*maV[1];
maV_Down[1]=(1-Deviation/100.0)*maV[1];
----------
void OnTick()での変更コード
bool Buy_S1=(sclose >maV_Up[1]);
int rsi_sig = 0;
if(m_rsi[1] >=levh ) rsi_sig = 1;
if(m_rsi[1]<=levl ) rsi_sig =-1;
if(Buy_S1&& rsi_sig==1)
bool Sell_S1=(sclose<maV_Down[1]);
if(Sell_S1 && rsi_sig==-1)
//-------------------
プログラムコード
EA09_Envelopes..mq5 のプログラムコードは以下のようになります。
赤字の部分は変更箇所です。
#property copyright "T.S"
#property link "http://mt5myprogrammingts.blogspot.com"
#property version "1.00"
#include <Trade/Trade.mqh>
//--- input parameters
input int Stop=70;
input int Take=150;
input int Magic=1001;
input double Lots=0.01;
input int Slipage=10;
input double levh=82.0;
input double levl=28.0;
//---------------------------
input int RSI_Period=3;
input int MA_Period =6;
input double Deviation=0.1; // (%)
int maH,RSI_Handle;
double maV[3];
double maV_Up[3];
double maV_Down[3];
double m_rsi[3];
double sclose;
int STP,TKP,SL;
//+---------------------------+
// Expert initialization function
//+---------------------------+
int OnInit()
{
//---
maH=iMA(_Symbol,_Period,MA_Period,0,MODE_SMA,PRICE_CLOSE);
RSI_Handle=iRSI(_Symbol,_Period,RSI_Period,PRICE_CLOSE);
//------
if(maH==INVALID_HANDLE)
{
Print("SIGNAL ERROR1");
return(INIT_FAILED);
}
if(RSI_Handle==INVALID_HANDLE)
{
Print("SIGNAL ERROR2");
return(INIT_FAILED);
}
//---
STP = Stop;
TKP = Take;
SL = Slipage;
if(_Digits==5 || _Digits==3) //EURUSD=5
{
STP = STP*10;
TKP = TKP*10;
SL = Slipage*10;
}
//---
return(INIT_SUCCEEDED);
}
//+----------------------------+
// Expert deinitialization function
//+----------------------------+
void OnDeinit(const int reason)
{
//---
IndicatorRelease(maH);
IndicatorRelease(RSI_Handle);
Comment("");
}
//+-----------------------------+
// Expert tick function
//+-----------------------------+
void OnTick()
{
//------------------------------
MqlTick l_pr;
MqlRates mrate[2];
//------------------------------
if(!SymbolInfoTick(_Symbol,l_pr))
{
Print("the latest price error");
return;
}
if(CopyRates(_Symbol,_Period,0,2,mrate)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history");
return;
}
//-----
if(CopyBuffer(maH,0,0,3,maV)<0) return;
maV_Up[1] =(1+Deviation/100.0)*maV[1];
maV_Down[1]=(1-Deviation/100.0)*maV[1];
if(CopyBuffer(RSI_Handle,MAIN_LINE,0,3,m_rsi)<0) return;
//-----
bool Buy_sig =false;
bool Sell_sig=false;
if(PositionSelect(_Symbol)==true)
{
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
{
Buy_sig=true;
}
else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
{
Sell_sig=true;
}
}
sclose=mrate[0].close;
bool Buy_S1=(sclose>maV_Up[1]);
int rsi_sig = 0;
if(m_rsi[1]>=levh ) rsi_sig = 1;
if(m_rsi[1]<=levl ) rsi_sig =-1;
Comment("sig = ",m_rsi[1]);
if(Buy_S1&& rsi_sig==1)
{
if(Buy_sig) return;
if(Sell_sig) return;
double l= Lots;
double p=NormalizeDouble(l_pr.ask,_Digits);
double s = NormalizeDouble(l_pr.bid - STP*_Point,_Digits);
double t = NormalizeDouble(l_pr.ask + TKP*_Point,_Digits);
CTrade m_trade;
m_trade.SetExpertMagicNumber(Magic);
m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,l,p,s,t,"");
}
bool Sell_S1=(sclose<maV_Down[1]);
if(Sell_S1 && rsi_sig==-1)
{
if(Sell_sig) return;
if(Buy_sig) return;
double l = Lots;
double p = NormalizeDouble(l_pr.bid,_Digits);
double s = NormalizeDouble(l_pr.ask + STP*_Point,_Digits);
double t = NormalizeDouble(l_pr.bid - TKP*_Point,_Digits);
CTrade m_trade;
m_trade.SetExpertMagicNumber(Magic);
m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,l,p,s,t,"");
}
}
//END
(注意事項:プログラムはあくまでFX個人投資家の学習のための、デモ口座によるMQL5売買プログラミングの情報提供を目的としております。
プログラムによる運用結果につきましては、自己責任であることをご了承ください。
パラメータの設定、最適化は読者自ら行ってください。リアルトレードではテストしておりません。)