//共通ライブラリ #include //--- チャネルパラメータ 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,"