90 lines
6.3 KiB
MQL5
90 lines
6.3 KiB
MQL5
//共通ライブラリ
|
|
#include <LibEA.mqh>
|
|
|
|
//--- チャネルパラメータ
|
|
input int InpBBPeriod = 20; //ボリンジャーバンド期間
|
|
input double InpBBDeviation = 2.0; //偏差
|
|
//-- トレンド計算のEMA期間
|
|
input int FastMAPeriod = 20; //短期移動平均の期間
|
|
input int SlowMAPeriod = 50; //長期移動平均の期間
|
|
input ENUM_TIMEFRAMES InpMATF = PERIOD_D1; //移動平均線の時間足
|
|
//--- 時間枠のパラメータ
|
|
input ENUM_TIMEFRAMES InpBBTF = PERIOD_H1; //ボリンジャー値計算の時間足
|
|
input ENUM_TIMEFRAMES InpATRTF = PERIOD_H1; //ATRトレンド決定の時間足
|
|
//-- ATR パラメータ
|
|
input int InpATRPeriod =14; // ATR期間
|
|
input double InpATRCoeff =2.0; //レンジを決定するためのATR 係数
|
|
//---資本管理
|
|
sinput double Lots = 0.1; //売買ロット数
|
|
|
|
//テスト用
|
|
input int SLpips = 50; //損 切り 値幅( pips)
|
|
input int TPpips = 50; //利食い 値幅( pips)
|
|
|
|
//ティック時実行関数
|
|
void Tick()
|
|
{
|
|
//損切り・利食い決済
|
|
if(isNewBar(_Symbol, PERIOD_M1) //1分足の始値で判別
|
|
&& (MyOrderProfitPips() >= TPpips || MyOrderProfitPips() <= -SLpips)
|
|
) MyOrderClose();
|
|
|
|
int sig_entry = EntrySignal(); //仕掛けシグナル
|
|
//成行売買
|
|
MyOrderSendMarket(sig_entry, sig_entry, Lots);
|
|
}
|
|
|
|
//仕掛けシグナル関数
|
|
int EntrySignal()
|
|
{
|
|
//1本前と2本前の移動平均
|
|
double FastMA1 = iMA(_Symbol, InpMATF, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
|
|
// double FastMA2 = iMA(_Symbol, InpMATF, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
|
|
double SlowMA1 = iMA(_Symbol, InpMATF, SlowMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
|
|
// double SlowMA2 = iMA(_Symbol, InpMATF, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| チャネルが狭すぎる場合に true を返す (レンジ表示) |
|
|
//--- 最後に完了した足の ATR 値を取得
|
|
double atr = iATR(_Symbol,InpATRTF,InpATRPeriod, 1);
|
|
|
|
//+------------------------------------------------------------------+
|
|
//|ボリンジャーバンドのチャネル境界の値を取得する |
|
|
//+------------------------------------------------------------------+
|
|
double BB_UPPER1 = iBands(_Symbol, InpBBTF, InpBBPeriod, InpBBDeviation, 0, PRICE_CLOSE, MODE_UPPER,1);
|
|
double BB_UPPER2 = iBands(_Symbol, InpBBTF, InpBBPeriod, InpBBDeviation, 0, PRICE_CLOSE, MODE_UPPER,2);
|
|
double BB_LOWER1 = iBands(_Symbol, InpBBTF, InpBBPeriod, InpBBDeviation, 0, PRICE_CLOSE, MODE_LOWER,1);
|
|
double BB_LOWER2 = iBands(_Symbol, InpBBTF, InpBBPeriod, InpBBDeviation, 0, PRICE_CLOSE, MODE_LOWER,2);
|
|
//1本前の終値
|
|
double Close1 = iClose(_Symbol, PERIOD_M5, 1);
|
|
double Close2 = iClose(_Symbol, PERIOD_M5, 2);
|
|
|
|
int ret = 0; //シグナルの初期化
|
|
int trend = 0; //トレンド判定フラグ
|
|
|
|
//--- 短期EMAが長期EMAの上にある場合
|
|
if( FastMA1 > SlowMA1 )
|
|
trend=1; // 上昇トレンド
|
|
//--- 短期EMAが長期MAの下にある場合
|
|
if( FastMA1 < SlowMA1 )
|
|
trend=-1; // 下降トレンド
|
|
|
|
//買いシグナル
|
|
if( trend == 1 ){
|
|
// if(Close2 < BB_LOWER2 && Close1 > BB_LOWER1) ret = 1;
|
|
if(Close2 < BB_UPPER2 && Close1 > BB_UPPER1) ret = 1;
|
|
}
|
|
//売りシグナル
|
|
if( trend == -1 ){
|
|
// if(Close2 > BB_UPPER2 && Close1 < BB_UPPER1) ret = 1;
|
|
if(Close2 > BB_LOWER2 && Close1 < BB_LOWER1) ret = -1;
|
|
}
|
|
|
|
//--- チャネルの境界線を取得
|
|
double ExtChannelRange = BB_UPPER1 - BB_LOWER1;
|
|
//---チャネル幅が ATR*係数より小さい場合はレンジ
|
|
if( ExtChannelRange < (InpATRCoeff * atr )) ret = 0;
|
|
//デバッグ用
|
|
if( ret != 0 ) Print( "BB幅 ",ExtChannelRange,"<ATR",atr,"FastMA1",FastMA1,"SlowMA1",SlowMA1);
|
|
return ret; //シグナルの出力
|
|
}
|