//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #property copyright "" #property link "" #property version "" #property strict // USDJPY(ロング)M30 : 0.0025/0.05 ADX_TF=PERIOD_M15 // GBPJPY(ロング)M30 : 0.0025/0.06 ADX_TF=PERIOD_M15 // GBPJPY(ロング)H1 : 0.014/0.2 ADX_TF=PERIOD_H1 // EURJPY_M30 : 0.0023/0.03 ADX_TF=PERIOD_MN1 // CADJPY_M30 : 0.0008/0.04 ADX_TF=PERIOD_D1 // AUDJPY_M30 : 0.0029/0.04 ADX_TF=PERIOD_W1 input int MagicNumber = 12345; input double Lots = 0.1; input int TakeProfit_pips = 10000; input int StopLoss_pips = 10000; input int Rikaku_pips = 10000; input int Songiri_pips = 10000; int Slippage = 3; int xBars=0, xxBars=0; //最大ポジション数を、下記で入力指定して下さい。 int maxposition = 1; //ローソク足始値のみに稼働させる場合は、trueにして下さい。 bool CandleStartStarting = true; //エントリールールの各変数を下記に貼りつけます。 input double SAR_Entry_Step = 0.01; // パラボリックSARのステップ(パラメータ) input double SAR_Entry_Maximum = 0.2; // パラボリックSARの上限値(パラメータ) //エントリーフィルターの各変数を下記に貼りつけます。 input ENUM_TIMEFRAMES ADX_TF = PERIOD_M15; input int ADX_Period = 14; // ADXの計算期間 //input int ADX_Filter_Line = 20; // ADXがこの数値以上の時のみエントリー出来る //決済ルールの各変数を下記に貼りつけます。 input bool Development = false; // 開発モードON/OFF(OnTester欄にRF表示、インジケータ表示) //+------------------------------------------------------------------+ //| tester function | //+------------------------------------------------------------------+ double OnTester() { // OnTesterに表示【リカバリーファクター|勝率】 if (Development == true) { // リカバリーファクター return(NormalizeDouble(TesterStatistics(STAT_PROFIT) / TesterStatistics(STAT_EQUITY_DD), 2)); // 勝率 // return(NormalizeDouble(100*TesterStatistics(STAT_PROFIT_TRADES) / TesterStatistics(STAT_TRADES), 2)); } return(0); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { int i; int ticket; int CountBuy = 0,CountSell = 0; double profit; bool res; double xpoint = Point; // 小数点以下の桁数に応じてPipsの値を調整する if (Digits() == 3 || Digits() == 5) { xpoint = xpoint * 10; } //ローソク足始値のみ稼働(選択式)の場合、ココカラ 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); } } } // ポジションの数をカウントする 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; } } // エントリー条件を確認し、成立していればエントリーを行う if (Entry() == 1 && CountBuy < maxposition && xxBars != Bars) { 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) { 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をセットする 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); } } } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリー総括 | //+------------------------------------------------------------------+ int Entry() { if (Entry_Rule1() == 1 && (Entry_Filter1() == 1 || Entry_Filter1() == 3) && (Entry_Filter2() == 1 || Entry_Filter2() == 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() == 2 && (Entry_Filter1() == 2 || Entry_Filter1() == 3) && (Entry_Filter2() == 2 || Entry_Filter2() == 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() == 3 && Exit_Rule2() == 3 && Exit_Rule3() == 3 && Exit_Rule4() == 3 && Exit_Rule5() == 3) { return(0); } else if (Exit_Rule1() == 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() == 3 && Exit_Rule2() == 3 && Exit_Rule3() == 3 && Exit_Rule4() == 3 && Exit_Rule5() == 3) { return(0); } else if (Exit_Rule1() == 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() { //エントリールール1を差し替える時は、下記を差し替えて下さい。 // パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」 // パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」 double SAR1 = iSAR(NULL, 0, SAR_Entry_Step, SAR_Entry_Maximum, 1); double SAR2 = iSAR(NULL, 0, SAR_Entry_Step, SAR_Entry_Maximum, 2); //パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」 if (SAR1 < Close[1] && Close[2] < SAR2) { return(1); } // 買い // パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」 else if (SAR1 > Close[1] && Close[2] > SAR2) { return(2); } // 売り else { return(0); } //エントリールール1を差し替える時は、ココマデを差し替えて下さい。 } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター1 | //+------------------------------------------------------------------+ int Entry_Filter1() { //エントリーフィルター1を差し替える時は、下記を差し替えて下さい。 // ADXが上向きでエントリーできる double ADX1 = iADX(NULL, ADX_TF, ADX_Period, PRICE_CLOSE, MODE_MAIN, 1); double ADX2 = iADX(NULL, ADX_TF, ADX_Period, PRICE_CLOSE, MODE_MAIN, 2); if (ADX2 <= ADX1) //ADX1 <= ADX_Filter_Line) { return(3); } // エントリー出来る else { return(0); } // エントリー出来ない //エントリーフィルター1を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター2 | //+------------------------------------------------------------------+ int Entry_Filter2() { //エントリーフィルター2を差し替える時は、下記を差し替えて下さい。 // ADXが指定値以上の時のみエントリー出来る /*double ADX = iADX(NULL, 0, ADX_Period, PRICE_CLOSE, MODE_MAIN, 1); if (ADX >= ADX_Filter_Line) { 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() { // 決済ルール1を差し替える時は、下記を差し替えて下さい。 // パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」 // パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」 double SAR1 = iSAR(NULL, 0, SAR_Entry_Step, SAR_Entry_Maximum, 1); double SAR2 = iSAR(NULL, 0, SAR_Entry_Step, SAR_Entry_Maximum, 2); //パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」 if (SAR1 < Close[1] && Close[2] < SAR2) { return(1); } // 買い // パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」 else if (SAR1 > Close[1] && Close[2] > SAR2) { return(2); } // 売り else { return(0); } // 決済ルール1を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール2 | //+------------------------------------------------------------------+ int Exit_Rule2() { // 決済ルール2を差し替える時は、下記を差し替えて下さい。 // 決済ルール2を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール3 | //+------------------------------------------------------------------+ int Exit_Rule3() { // 決済ルール3を差し替える時は、下記を差し替えて下さい。 // 決済ルール3を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール4 | //+------------------------------------------------------------------+ int Exit_Rule4() { // 決済ルール4を差し替える時は、下記を差し替えて下さい。 // 決済ルール4を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール5 | //+------------------------------------------------------------------+ int Exit_Rule5() { // 決済ルール5を差し替える時は、下記を差し替えて下さい。 // 決済ルール5を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+