システムの概要
ストキャステックはジョージ・レーンによって1950年代に考案されたテクニカル指標です。
MT4、MT5では、シグナルは%Kと%Dを組み合わせたファースト・ストキャスティクスです。
計算式は下記のようになります。
%K=(CLOSE-MIN(LOW(%K)))/(MAX(HIGHT(%K))-MIN(LOW(%K)))
%D=SMA(%K、N)
CLOSE=今日の終わり値
MIN(LOW(%K))=%K 期間の最小の最低値
MAX(HIGHT(%K))=%K 期間の最大の最高値
%Kが%Dを上抜けたときが買いシグナル、
逆に%Kが%Dを下抜けたときが売りシグナルになります。
人によってはゾーンを設け、買いシグナルは20%以下、
売りシグナルは80%以上とする事もあるようです。
今回作ったエキスパートアドバイザーではゾーンは設けておりません。
ストキャステックのシグナルと合わせ、
指数移動平均をクロスしたとき売買を行うようになります。
EM06_Stochastic.mq5 のプログラムは下のダウンロードから行ってください。
ソースファイルですので、ダウンロードした後コンパイルが必要です。
ダウンロード
ソースファイルはExpertsフォルダーに格納します。
Expertsフォルダーの開き方は、メタエディタのナビゲータでExpertsを選択し、
マウスの右ボタンをクリックします。
そして「フォルダーを開く」を選択します。
Expertsフォルダーを開いた後、ファイルをコピー&ペーストします。
コンパイルすると問題がなければ次のように表示されます。
0 error(s), 0 warning(s), compile time: 15976 msec 1 1
プログラムの変更箇所
コードは以前作ったEMA_EA02.mq5を変更していますが、
変更箇所は次のようになっています。
----------
追加コード
input int Kperiod=5;
input int Dperiod=3;
input int slowing=3;
int S_Handle;
double Stochastic[3];
double Signal[3];
----------
int OnInit()の追加コード
S_Handle=iStochastic(_Symbol,_Period,Kperiod,
Dperiod,slowing,MODE_SMA,STO_LOWHIGH);
if(S_Handle==INVALID_HANDLE)
{
Print("SIGNAL ERROR2");
return(INIT_FAILED);
}
----------
void OnDeinit(const int reason)の追加コード
IndicatorRelease(S_Handle);
----------
void OnTick()の追加コード
if(CopyBuffer(S_Handle,MAIN_LINE,0,3,Stochastic)<0) return;
if(CopyBuffer(S_Handle,SIGNAL_LINE,0,3,Signal)<0) return;
Comment(" Stochastic = ",Stochastic[1]," Signal = ",Signal[1]);
int sig=0;
if(Stochastic[1]>= Signal[1] ) sig = 1;
if(Stochastic[1]<= Signal[1] ) sig =-1;
-----------
void OnTick()の変更箇所
if(Buy_S1 && sig==1)
if(Sell_S1 && sig==-1)
//-------------------
iStochasticの使用方法
int iStochastic(
string symbol,
ENUM_TIMEFRAMES period,
int Kperiod,
int Dperiod,
int slowing,
ENUM_MA_METHOD ma_method,
ENUM_STO_PRICE price_field
);
Symbol:通貨ペア設定(_Symbol)
period:通貨ペアの時間足設定(_Period)
Kperiod:%Kの計算期間
Dperiod:%D の計算期間
slowing:平均値計算期間
ma_method:スムージングタイプ(SMA)
price_field:ストキャステック計算方法
プログラムコード
EA06_Stochastic.mq5 のプログラムコードは以下のようになります。
赤字の部分は変更箇所です。
#property copyright "T.S"
#property link "http://mt5myprogrammingts.blogspot.com"
#property version "1.00"
#include <Trade/Trade.mqh>
//--- input parameters
input int Stop=50;
input int Take=100;
input int Magic=1001;
input double Lots=0.01;
input int Slipage=10;
//---------------------------
input int MA_Period=3;
input int Kperiod=5;
input int Dperiod=3;
input int slowing=3;
int maH;
double maV[3];
int S_Handle;
double Stochastic[3];
double Signal[3];
double sclose;
int STP,TKP,SL;
//+---------------------------+
// Expert initialization function
//+---------------------------+
int OnInit()
{
//---
maH=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
S_Handle=iStochastic(_Symbol,_Period,Kperiod,
Dperiod,slowing,MODE_SMA,STO_LOWHIGH);
//--- What if handle returns Invalid Handle
if(maH==INVALID_HANDLE)
{
Print("Indicators error1 ");
return(INIT_FAILED);
}
//---
if(S_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(S_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;
if(CopyBuffer(S_Handle,MAIN_LINE,0,3,Stochastic)<0) return;
if(CopyBuffer(S_Handle,SIGNAL_LINE,0,3,Signal)<0) return;
Comment(" Stochastic = ",Stochastic[1]," Signal = ",Signal[1]);
//-----
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[1]);
int sig=0;
if(Stochastic[1]>= Signal[1] ) sig = 1;
if(Stochastic[1]<= Signal[1] ) sig =-1;
if(Buy_S1 && 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[1]);
if(Sell_S1 && 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売買プログラミングの情報提供を目的としております。
プログラムによる運用結果につきましては、自己責任であることをご了承ください。
パラメータの設定、最適化は読者自ら行ってください。
リアルトレードではテストしておりません。)