git_mql5/git_mql5.mq5
super.admin 909887ef8f convert
2025-05-30 14:57:28 +02:00

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; //シグナルの出力
}