//+------------------------------------------------------------------+ //| TEST.mq4 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property strict // 列挙型宣言 enum ENUM_ONOFF{ off = 0, //OFF on = 1 //ON }; enum ENUM_PERIOD{ Period_M1 = 1, //1分足 Period_M5 = 5, //5分足 Period_M15 = 15, //15分足 Period_M30 = 30, //30分足 Period_H1 = 60, //1時間足 Period_H4 = 240, //4時間足 Period_D1 = 1440, //日足 Period_W1 = 10080, //週足 Period_MN1 = 43200, //月足 }; input int Slippage = 3; //Slippage_Point input int MaxSpreadPips = 5; //Spread_Pips double xpoint; double xspread; input int MagicNumber = 12345; input double Lots = 0.1; input int TakeProfit_pips = 620; input int StopLoss_pips = 230; input int Rikaku_pips = 550; input int Songiri_pips = 210; extern ENUM_PERIOD EA_PERIOD = Period_H1; //トレイリングストップのパラメータ input int TrailingStopStartPips = 110; input int TrailingStopPips = 130; //指値切り下げのパラメータ input int ReLimitActionPips = 1000; input int ReLimitPips = 1000; int xBars=0, xxBars=0; //最大ポジション数を、下記で入力指定して下さい。 int maxposition = 1; //ローソク足始値のみに稼働させる場合は、trueにして下さい。 bool CandleStartStarting = true; //エントリールールの各変数を下記に貼りつけます。 input int BB_Period1_L = 8; // ボリンジャーバンドのLong計算期間1 input int BB_Period1_S = 20; // ボリンジャーバンドのShort計算期間1 input double BB_Hensa1 = 1.5; // ボリンジャーバンドの偏差1 input int BB_Period2_L = 80; // ボリンジャーバンドのLong計算期間2 input int BB_Period2_S = 50; // ボリンジャーバンドのShort計算期間2 input double BB_Hensa2 = 1.5; // ボリンジャーバンドの偏差2 //エントリーフィルターの各変数を下記に貼りつけます。 input int F_MA_period_L = 15; // 移動平均線のLong計算期間 input int F_MA_period_S = 5; // 移動平均線のShort計算期間 input int F_BB_Period_L = 30; // ボリンジャーバンドのLong計算期間 input int F_BB_Period_S = 20; // ボリンジャーバンドのShort計算期間 input double F_BB_Hensa = 1.0; // ボリンジャーバンドの偏差 input double F_BB_HabaFilter_percent_L = 1.2; // Long_ボリンジャーバンドの幅%(幅フィルター) input double F_BB_HabaFilter_percent_S = 0.6; // Short_ボリンジャーバンドの幅%(幅フィルター) //決済ルールの各変数を下記に貼りつけます。 input double SAR_Entry_Step = 0.009; // パラボリックSARのステップ(パラメータ) input double SAR_Entry_Maximum = 0.2; // パラボリックSARの上限値(パラメータ) input double Open_Kairi_percent = 0.7; // ローソク足の大きさパーセント(急落での損切) input double Open_Kairi_percent2 = 0.9; // ローソク足の大きさパーセント(最大点での利食い) input int K_BB_Period12 = 20; // ボリンジャーバンドのLong計算期間1 input double K_BB_Hensa12 = 3; // ボリンジャーバンドの偏差1 input int K_BB_Period22 = 50; // ボリンジャーバンドのLong計算期間2 input double K_BB_Hensa22 = 4.5; // ボリンジャーバンドの偏差2 //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int OnInit() { // 小数点以下の桁数に応じてPipsの値を調整する xpoint = Point(); if (Digits() == 3 || Digits() == 5) { xpoint = xpoint * 10; } //使用しているインジケータを非表示にする HideTestIndicators(true); return(0); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { int i; int ticket; int CountBuy = 0,CountSell = 0; double profit; bool res; //ローソク足始値のみ稼働(選択式)の場合、ココカラ if(Bars != xBars || CandleStartStarting == false) { xBars = Bars; //-------- ポジションのクローズ -------- // 所有しているポジションをクローズする for(i=OrdersTotal()-1; i>=0; i--) { //オーダー選択(エラーを生じた場合、ループから抜け出す) if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false) { Print("OrderSelect returned the error of ", GetLastError() ); break; } //オーダー確認(通貨ペアが一致しない場合は、for文の先頭に戻る) if (OrderSymbol() != Symbol()) continue; //マジックナンバー確認(マジックナンバーが一致しない場合は、for文の先頭に戻る) if (OrderMagicNumber() != MagicNumber) continue; if (OrderType() == OP_BUY) { profit = Bid - OrderOpenPrice(); // 買いポジションだった場合の、含み損益を計算する // オーダーを成り行き決済する if (profit >= Rikaku_pips * xpoint || profit <= -Songiri_pips * xpoint || Exit2() == 2) { res = OrderClose(OrderTicket(), OrderLots(), Bid, NULL, Green); } } if (OrderType() == OP_SELL) { profit = OrderOpenPrice() - Ask; // 売りポジションだった場合の、含み損益を計算する // オーダーを成り行き決済する if (profit >= Rikaku_pips * xpoint || profit <= -Songiri_pips * xpoint || Exit1() == 1) { res = OrderClose(OrderTicket(), OrderLots(), Ask, NULL, Green); } } } //-------- ポジションのクローズ(ココマデ) -------- //-------- ポジションのトレーリング -------- // 所有しているポジションのSL, TPをトレールする for(i=OrdersTotal()-1; i>=0; i--) { //オーダー選択(エラーを生じた場合、ループから抜け出す) if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false) { Print("OrderSelect returned the error of ", GetLastError() ); break; } //オーダー確認(通貨ペアが一致しない場合は、for文の先頭に戻る) if (OrderSymbol() != Symbol()) continue; //マジックナンバー確認(マジックナンバーが一致しない場合は、for文の先頭に戻る) if (OrderMagicNumber() != MagicNumber) continue; if (OrderType() == OP_BUY) { profit = Bid - OrderOpenPrice(); // 買いポジションだった場合の、含み損益を計算する // TrailingStopを確認する if (profit >= TrailingStopStartPips * xpoint && OrderStopLoss() < NormalizeDouble(Bid - TrailingStopPips * xpoint, Digits())) { res = OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - TrailingStopPips * xpoint, Digits()), OrderTakeProfit(), 0, Green); } // 指値の置きなおしを確認する else if (Bid <= NormalizeDouble(OrderOpenPrice() - ReLimitActionPips * xpoint, Digits()) && OrderTakeProfit() != NormalizeDouble(OrderOpenPrice() + ReLimitPips * xpoint, Digits())) { res = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), OrderOpenPrice() + ReLimitPips * xpoint, 0, Green); } } if (OrderType() == OP_SELL) { profit = OrderOpenPrice() - Ask; // 売りポジションだった場合の、含み損益を計算する // TrailingStopを確認する if (profit >= TrailingStopStartPips * xpoint && OrderStopLoss() > NormalizeDouble(Ask + TrailingStopPips * xpoint, Digits())) { res = OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStopPips * xpoint, Digits()), OrderTakeProfit(), 0, Green); } // 指値の置きなおしを確認する else if (Ask >= NormalizeDouble(OrderOpenPrice() + ReLimitActionPips * xpoint, Digits()) && OrderTakeProfit() != NormalizeDouble(OrderOpenPrice() - ReLimitPips * xpoint, Digits())) { res = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), OrderOpenPrice() - ReLimitPips * xpoint, 0, Green); } } } //-------- ポジションのトレーリング(ココマデ) -------- //-------- 新規ポジションのエントリー -------- // ポジションの数をカウントする for(i=OrdersTotal()-1; i>=0; i--) { //オーダー選択(エラーを生じた場合、ループから抜け出す) if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false) { Print("OrderSelect returned the error of ", GetLastError() ); break; } //オーダー確認(通貨ペアが一致しない場合は、for文の先頭に戻る) if (OrderSymbol() != Symbol()) continue; //マジックナンバー確認(マジックナンバーが一致しない場合は、for文の先頭に戻る) if (OrderMagicNumber() != MagicNumber) continue; if (OrderType() == OP_BUY) { CountBuy = CountBuy + 1; } if (OrderType() == OP_SELL) { CountSell = CountSell + 1; } } //スプレッド確認 xspread = (Ask - Bid) / xpoint; // エントリー条件を確認し、成立していればエントリーを行う if (Entry() == 1 && CountBuy < maxposition && xxBars != Bars && xspread <= MaxSpreadPips) { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Buy", MagicNumber, 0, Blue); // エントリーに成功していれば、TP, SLをセットする if (ticket != -1) { // チケットを使ってオーダーを選択(エラーを生じた場合、何もしない) if( OrderSelect( ticket, SELECT_BY_TICKET ) == true ) { res = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - StopLoss_pips * xpoint, OrderOpenPrice() + TakeProfit_pips * xpoint, 0, MediumSeaGreen); } } xxBars = Bars; } else if (Entry() == 2 && CountSell < maxposition && xxBars != Bars && xspread <= MaxSpreadPips) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sell", MagicNumber, 0, Red); // エントリーに成功していれば、TP, SLをセットする if (ticket != -1) { // チケットを使ってオーダーを選択(エラーを生じた場合、何もしない) if( OrderSelect( ticket, SELECT_BY_TICKET ) == true ) { res = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + StopLoss_pips * xpoint, OrderOpenPrice() - TakeProfit_pips * xpoint, 0, MediumSeaGreen); } } xxBars = Bars; } //-------- 新規ポジションのエントリー(ココマデ) -------- } // ローソク足始値のみ稼働(選択式)の範囲は、ココマデ //-------- ポジションのTP, SLのセット -------- // ポジションにTP, SLをセットする for(i=OrdersTotal()-1; i>=0; i--) { //オーダー選択(エラーを生じた場合、ループから抜け出す) if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false) { Print("OrderSelect returned the error of ", GetLastError() ); break; } //オーダー確認(通貨ペアが一致しない場合は、for文の先頭に戻る) if (OrderSymbol() != Symbol()) continue; //マジックナンバー確認(マジックナンバーが一致しない場合は、for文の先頭に戻る) if (OrderMagicNumber() != MagicNumber) continue; // 買いポジションの場合 if (OrderType() == OP_BUY) { profit = Bid - OrderOpenPrice(); // 買いポジションだった場合の、含み損益を計算する // TP, SLがどちらも設定されていなければ、TP, SLを設定する if (OrderStopLoss() == 0 && OrderTakeProfit() == 0) { res = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - StopLoss_pips * xpoint, OrderOpenPrice() + TakeProfit_pips * xpoint, 0, MediumSeaGreen); } } // 売りポジションの場合 if (OrderType() == OP_SELL) { profit = OrderOpenPrice() - Ask; // 売りポジションだった場合の、含み損益を計算する // TP, SLがどちらも設定されていなければ、TP, SLを設定する if (OrderStopLoss() == 0 && OrderTakeProfit() == 0) { res = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + StopLoss_pips * xpoint, OrderOpenPrice() - TakeProfit_pips * xpoint, 0, MediumSeaGreen); } } } //-------- ポジションのTP, SLのセット(ココマデ) -------- } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリー総括 | //+------------------------------------------------------------------+ int Entry() { if (Entry_Rule1(BB_Period1_L,BB_Period2_L) == 1 && (Entry_Filter1(F_MA_period_L) == 1 || Entry_Filter1(F_MA_period_L) == 3) && (Entry_Filter2(F_BB_Period_L,F_BB_HabaFilter_percent_L) == 1 || Entry_Filter2(F_BB_Period_L,F_BB_HabaFilter_percent_L) == 3) && (Entry_Filter3() == 1 || Entry_Filter3() == 3) && (Entry_Filter4() == 1 || Entry_Filter4() == 3) && (Entry_Filter5() == 1 || Entry_Filter5() == 3) ) { return(1); } else if (Entry_Rule1(BB_Period1_S,BB_Period2_S) == 2 && (Entry_Filter1(F_MA_period_S) == 2 || Entry_Filter1(F_MA_period_S) == 3) && (Entry_Filter2(F_BB_Period_S,F_BB_HabaFilter_percent_S) == 2 || Entry_Filter2(F_BB_Period_S,F_BB_HabaFilter_percent_S) == 3) && (Entry_Filter3() == 2 || Entry_Filter3() == 3) && (Entry_Filter4() == 2 || Entry_Filter4() == 3) && (Entry_Filter5() == 2 || Entry_Filter5() == 3) ) { return(2); } else { return(0); } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 売りポジションの決済総括 | //+------------------------------------------------------------------+ int Exit1() { if (Exit_Rule1(BB_Period1_S,BB_Period2_S) == 3 && Exit_Rule2() == 3 && Exit_Rule3() == 3 && Exit_Rule4() == 3 && Exit_Rule5() == 3) { return(0); } else if (Exit_Rule1(BB_Period1_S,BB_Period2_S) == 1) { return(1); } else if( Exit_Rule2() == 1) { return(1); } else if (Exit_Rule3() == 1) { return(1); } else if( Exit_Rule4() == 1) { return(1); } else if (Exit_Rule5() == 1) { return(1); } else { return(0); } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 買いポジションの決済総括 | //+------------------------------------------------------------------+ int Exit2() { if (Exit_Rule1(BB_Period1_L,BB_Period2_L) == 3 && Exit_Rule2() == 3 && Exit_Rule3() == 3 && Exit_Rule4() == 3 && Exit_Rule5() == 3) { return(0); } else if (Exit_Rule1(BB_Period1_L,BB_Period2_L) == 2) { return(2); } else if (Exit_Rule2() == 2) { return(2); } else if (Exit_Rule3() == 2) { return(2); } else if (Exit_Rule4() == 2) { return(2); } else if (Exit_Rule5() == 2) { return(2); } else { return(0); } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリールール1 | //+------------------------------------------------------------------+ int Entry_Rule1(int Period1,int Period2) { //エントリールール1を差し替える時は、下記を差し替えて下さい。 //ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「買い」 //ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「売り」 double UpperBB11 = iBands(NULL,EA_PERIOD, Period1, BB_Hensa1, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB11 = iBands(NULL,EA_PERIOD, Period1, BB_Hensa1, 0, PRICE_CLOSE, MODE_LOWER, 1); double UpperBB12 = iBands(NULL,EA_PERIOD, Period1, BB_Hensa1, 0, PRICE_CLOSE, MODE_UPPER, 2); double LowerBB12 = iBands(NULL,EA_PERIOD ,Period1, BB_Hensa1, 0, PRICE_CLOSE, MODE_LOWER, 2); double UpperBB21 = iBands(NULL,EA_PERIOD, Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB21 = iBands(NULL,EA_PERIOD, Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_LOWER, 1); double UpperBB22 = iBands(NULL,EA_PERIOD, Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_UPPER, 2); double LowerBB22 = iBands(NULL,EA_PERIOD ,Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_LOWER, 2); //ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「買い」 if (UpperBB12 < UpperBB22 && UpperBB11 >= UpperBB21) { return(1); } // 買い //ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「売り」 else if (LowerBB12 > LowerBB22 && LowerBB11 <= LowerBB21) { return(2); } // 売り else { return(0); } //エントリールール1を差し替える時は、ココマデを差し替えて下さい。 } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター1 | //+------------------------------------------------------------------+ int Entry_Filter1(int F_Period) { //エントリーフィルター1を差し替える時は、下記を差し替えて下さい。 // 移動平均線の傾きが上方向の時は「買い」、下方向の時は「売り」 double MA2 = iMA(NULL,EA_PERIOD, F_Period, 0, MODE_SMA, PRICE_CLOSE, 2); double MA1 = iMA(NULL,EA_PERIOD, F_Period, 0, MODE_SMA, PRICE_CLOSE, 1); // 移動平均線の傾きが上方向の時は「買い」 if (MA2 < MA1) { return(1); } // 買い // 移動平均線の傾きが下方向の時は「売り」 else if (MA2 > MA1) { return(2); } // 売り else { return(0); } //エントリーフィルター1を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター2 | //+------------------------------------------------------------------+ int Entry_Filter2(int F_Period,double F_Haba) { //エントリーフィルター2を差し替える時は、下記を差し替えて下さい。 //ボリンジャーバンドの幅(上側ボリンジャーバンド―下側ボリンジャーバンドの値)が、指定%以下の時にエントリーすることが可能 double UpperBB1 = iBands(NULL,EA_PERIOD, F_Period, F_BB_Hensa, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB1 = iBands(NULL,EA_PERIOD, F_Period, F_BB_Hensa, 0, PRICE_CLOSE, MODE_LOWER, 1); //ボリンジャーバンドの幅(上側ボリンジャーバンド―下側ボリンジャーバンドの値)が、指定%以下の時にエントリーすることが可能 if( (UpperBB1 - LowerBB1) / iClose(NULL,EA_PERIOD,1) * 100.0 <= F_Haba) { return(3); } // エントリー出来る(フィルター) else { return(0); } //エントリーフィルター2を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター3 | //+------------------------------------------------------------------+ int Entry_Filter3() { //エントリーフィルター3を差し替える時は、下記を差し替えて下さい。 //エントリーフィルター3を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター4 | //+------------------------------------------------------------------+ int Entry_Filter4() { //エントリーフィルター4を差し替える時は、下記を差し替えて下さい。 //エントリーフィルター4を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター5 | //+------------------------------------------------------------------+ int Entry_Filter5() { //エントリーフィルター5を差し替える時は、下記を差し替えて下さい。 //エントリーフィルター5を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール1 | //+------------------------------------------------------------------+ int Exit_Rule1(int Period1,int Period2) { // 決済ルール1を差し替える時は、下記を差し替えて下さい。 //ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「買い」 //ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「売り」 double UpperBB11 = iBands(NULL,EA_PERIOD, Period1, BB_Hensa1, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB11 = iBands(NULL,EA_PERIOD, Period1, BB_Hensa1, 0, PRICE_CLOSE, MODE_LOWER, 1); double UpperBB12 = iBands(NULL,EA_PERIOD, Period1, BB_Hensa1, 0, PRICE_CLOSE, MODE_UPPER, 2); double LowerBB12 = iBands(NULL,EA_PERIOD ,Period1, BB_Hensa1, 0, PRICE_CLOSE, MODE_LOWER, 2); double UpperBB21 = iBands(NULL,EA_PERIOD, Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB21 = iBands(NULL,EA_PERIOD, Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_LOWER, 1); double UpperBB22 = iBands(NULL,EA_PERIOD, Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_UPPER, 2); double LowerBB22 = iBands(NULL,EA_PERIOD ,Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_LOWER, 2); //ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「買い」 if (UpperBB12 < UpperBB22 && UpperBB11 >= UpperBB21) { return(1); } // 買い //ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「売り」 else if (LowerBB12 > LowerBB22 && LowerBB11 <= LowerBB21) { return(2); } // 売り else { return(0); } // 決済ルール1を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール2 | //+------------------------------------------------------------------+ int Exit_Rule2() { // 決済ルール2を差し替える時は、下記を差し替えて下さい。 // パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」 // パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」 double SAR1 = iSAR(NULL,EA_PERIOD, SAR_Entry_Step, SAR_Entry_Maximum, 1); double SAR2 = iSAR(NULL,EA_PERIOD, SAR_Entry_Step, SAR_Entry_Maximum, 2); //パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」 if (SAR1 < iClose(NULL,EA_PERIOD,1) && iClose(NULL,EA_PERIOD,2) < SAR2) { return(1); } // 買い // パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」 else if (SAR1 > iClose(NULL,EA_PERIOD,1) && iClose(NULL,EA_PERIOD,2) > SAR2) { return(2); } // 売り else { return(0); } // 決済ルール2を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール3 | //+------------------------------------------------------------------+ int Exit_Rule3() { // 決済ルール3を差し替える時は、下記を差し替えて下さい。 //ローソク足が陽線で買い if (iClose(NULL,EA_PERIOD,1) > iOpen(NULL,EA_PERIOD,1) &&(iClose(NULL,EA_PERIOD,1) - iOpen(NULL,EA_PERIOD,1))> iClose(NULL,EA_PERIOD,1) * Open_Kairi_percent / 100.0) { return(1); } // 買い //ローソク足が陰線で売り else if (iClose(NULL,EA_PERIOD,1) < iOpen(NULL,EA_PERIOD,1) && (iOpen(NULL,EA_PERIOD,1) - iClose(NULL,EA_PERIOD,1))> iClose(NULL,EA_PERIOD,1) * Open_Kairi_percent / 100.0) { return(2); } // 売り else { return(0); } // 決済ルール3を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール4 | //+------------------------------------------------------------------+ int Exit_Rule4() { // 決済ルール4を差し替える時は、下記を差し替えて下さい。 //ローソク足が大陽線で売り if (iClose(NULL,EA_PERIOD,1) > iOpen(NULL,EA_PERIOD,1) &&(iClose(NULL,EA_PERIOD,1) - iOpen(NULL,EA_PERIOD,1))> iClose(NULL,EA_PERIOD,1) * Open_Kairi_percent2 / 100.0) { return(2); } // 買い //ローソク足が大陰線で買い else if (iClose(NULL,EA_PERIOD,1) < iOpen(NULL,EA_PERIOD,1) && (iOpen(NULL,EA_PERIOD,1) - iClose(NULL,EA_PERIOD,1))> iClose(NULL,EA_PERIOD,1) * Open_Kairi_percent2 / 100.0) { return(1); } // 売り else { return(0); } // 決済ルール4を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール5 | //+------------------------------------------------------------------+ int Exit_Rule5() { // 決済ルール5を差し替える時は、下記を差し替えて下さい。 //ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「買い」 //ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「売り」 double UpperBB11 = iBands(NULL,EA_PERIOD, K_BB_Period12, K_BB_Hensa12, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB11 = iBands(NULL,EA_PERIOD, K_BB_Period12, K_BB_Hensa12, 0, PRICE_CLOSE, MODE_LOWER, 1); double UpperBB12 = iBands(NULL,EA_PERIOD, K_BB_Period12, K_BB_Hensa12, 0, PRICE_CLOSE, MODE_UPPER, 2); double LowerBB12 = iBands(NULL,EA_PERIOD ,K_BB_Period12, K_BB_Hensa12, 0, PRICE_CLOSE, MODE_LOWER, 2); double UpperBB21 = iBands(NULL,EA_PERIOD, K_BB_Period22, K_BB_Hensa22, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB21 = iBands(NULL,EA_PERIOD, K_BB_Period22, K_BB_Hensa22, 0, PRICE_CLOSE, MODE_LOWER, 1); double UpperBB22 = iBands(NULL,EA_PERIOD, K_BB_Period22, K_BB_Hensa22, 0, PRICE_CLOSE, MODE_UPPER, 2); double LowerBB22 = iBands(NULL,EA_PERIOD ,K_BB_Period22, K_BB_Hensa22, 0, PRICE_CLOSE, MODE_LOWER, 2); //ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「売り」 if (UpperBB12 < UpperBB22 && UpperBB11 >= UpperBB21) { return(1); } // 買い //ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「買い」 else if (LowerBB12 > LowerBB22 && LowerBB11 <= LowerBB21) { return(2); } // 売り else { return(0); } // 決済ルール5を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+