534 lines
33 KiB
MQL4
534 lines
33 KiB
MQL4
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#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);
|
|
}
|
|
//+------------------------------------------------------------------+
|