750 lines
51 KiB
MQL4
750 lines
51 KiB
MQL4
//+------------------------------------------------------------------+
|
|
//| 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 xspread;
|
|
|
|
input int MagicNumber = 12345;
|
|
input double Lots = 0.1;
|
|
input int TakeProfit_pips = 350;
|
|
input int StopLoss_pips = 150;
|
|
input int Rikaku_pips = 300;
|
|
input int Songiri_pips = 150;
|
|
extern ENUM_PERIOD EA_PERIOD = Period_M30;
|
|
|
|
|
|
//トレイリングストップのパラメータ
|
|
input int TrailingStopStartPips = 20;
|
|
input int TrailingStopPips = 160;
|
|
|
|
//指値切り下げのパラメータ
|
|
input int ReLimitActionPips = 1000;
|
|
input int ReLimitPips = 1000;
|
|
|
|
int xBars=0, xxBars=0;
|
|
|
|
//最大ポジション数を、下記で入力指定して下さい。
|
|
int maxposition = 1;
|
|
//ローソク足始値のみに稼働させる場合は、trueにして下さい。
|
|
bool CandleStartStarting = true;
|
|
|
|
//エントリールールの各変数を下記に貼りつけます。
|
|
input double Open_Kairi_percent = 0.1; // ローソク足の大きさパーセント
|
|
|
|
|
|
//エントリーフィルターの各変数を下記に貼りつけます。
|
|
input int F_BB_Period_L = 20; // ボリンジャーバンドの計算期間
|
|
input double F_BB_Hensa_L = 2.0; // ボリンジャーバンドの偏差
|
|
input int F_BB_Period_S = 28; // ボリンジャーバンドの計算期間
|
|
input double F_BB_Hensa_S = 2.2; // ボリンジャーバンドの偏差
|
|
|
|
input ENUM_PERIOD F_PERIOD = Period_H1;
|
|
input int F_MA_period_L = 275; // 移動平均線の計算期間
|
|
input int F_MA_period_S = 300; // 移動平均線の計算期間
|
|
|
|
//決済ルールの各変数を下記に貼りつけます。
|
|
input int K_BB_Period_L = 26; // ボリンジャーバンドの計算期間
|
|
input double K_BB_Hensa_L = 2.2; // ボリンジャーバンドの偏差
|
|
input int K_BB_Period_S = 40; // ボリンジャーバンドの計算期間
|
|
input double K_BB_Hensa_S = 1.5; // ボリンジャーバンドの偏差
|
|
|
|
input int K_BB_Period_2_L = 14; // ボリンジャーバンドの計算期間
|
|
input double K_BB_Hensa_2_L = 3; // ボリンジャーバンドの偏差
|
|
input int K_BB_Period_2_S = 21; // ボリンジャーバンドの計算期間
|
|
input double K_BB_Hensa_2_S = 4.4; // ボリンジャーバンドの偏差
|
|
|
|
input int CCI_period_L = 6; // CCIの計算期間
|
|
input int CCI_Line_L = 160; // エントリーの基準となるライン
|
|
input int CCI_period_S = 21; // CCIの計算期間
|
|
input int CCI_Line_S = 175; // エントリーの基準となるライン
|
|
|
|
input int MA_Cross_period1_L = 40; // 短期移動平均線
|
|
input int MA_Cross_period2_L = 130; // 長期移動平均線
|
|
input int MA_Cross_period1_S = 35; // 短期移動平均線
|
|
input int MA_Cross_period2_S = 80; // 長期移動平均線
|
|
|
|
input ENUM_PERIOD K_PERIOD = Period_M15;
|
|
input double K_Open_Kairi_percent = 0.45; // ローソク足の大きさパーセント
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| 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);
|
|
}
|
|
}
|
|
}
|
|
//-------- ポジションのクローズ(ココマデ) --------
|
|
|
|
//-------- ポジションのトレーリング --------
|
|
// 所有しているポジションの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,
|
|
"G_LS_EURUSD",
|
|
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,
|
|
"G_LS_EURUSD",
|
|
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() == 1 && (Entry_Filter1(F_BB_Period_L,F_BB_Hensa_L) == 1 || Entry_Filter1(F_BB_Period_L,F_BB_Hensa_L) == 3)
|
|
&& (Entry_Filter2(F_MA_period_L) == 1 || Entry_Filter2(F_MA_period_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() == 2 && (Entry_Filter1(F_BB_Period_S,F_BB_Hensa_S) == 2 || Entry_Filter1(F_BB_Period_S,F_BB_Hensa_S) == 3)
|
|
&& (Entry_Filter2(F_MA_period_S) == 2 || Entry_Filter2(F_MA_period_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(K_BB_Period_S,K_BB_Hensa_S) == 3 && Exit_Rule2(K_BB_Period_2_S,K_BB_Hensa_2_S) == 3 && Exit_Rule3(CCI_period_S,CCI_Line_S) == 3 && Exit_Rule4(MA_Cross_period1_S,MA_Cross_period2_S) == 3 && Exit_Rule5() == 3)
|
|
{
|
|
return(0);
|
|
}
|
|
else if (Exit_Rule1(K_BB_Period_S,K_BB_Hensa_S) == 1)
|
|
{
|
|
return(1);
|
|
}
|
|
else if( Exit_Rule2(K_BB_Period_2_S,K_BB_Hensa_2_S) == 1)
|
|
{
|
|
return(1);
|
|
}
|
|
else if (Exit_Rule3(CCI_period_S,CCI_Line_S) == 1)
|
|
{
|
|
return(1);
|
|
}
|
|
else if( Exit_Rule4(MA_Cross_period1_S,MA_Cross_period2_S) == 1)
|
|
{
|
|
return(1);
|
|
}
|
|
else if (Exit_Rule5() == 1)
|
|
{
|
|
return(1);
|
|
}
|
|
else
|
|
{
|
|
return(0);
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| 買いポジションの決済総括 |
|
|
//+------------------------------------------------------------------+
|
|
int Exit2()
|
|
{
|
|
if (Exit_Rule1(K_BB_Period_L,K_BB_Hensa_L) == 3 && Exit_Rule2(K_BB_Period_2_L,K_BB_Hensa_2_L) == 3 && Exit_Rule3(CCI_period_L,CCI_Line_L) == 3 && Exit_Rule4(MA_Cross_period1_L,MA_Cross_period2_L) == 3 && Exit_Rule5() == 3)
|
|
{
|
|
return(0);
|
|
}
|
|
else if (Exit_Rule1(K_BB_Period_L,K_BB_Hensa_L) == 2)
|
|
{
|
|
return(2);
|
|
}
|
|
else if (Exit_Rule2(K_BB_Period_2_L,K_BB_Hensa_2_L) == 2)
|
|
{
|
|
return(2);
|
|
}
|
|
else if (Exit_Rule3(CCI_period_L,CCI_Line_L) == 2)
|
|
{
|
|
return(2);
|
|
}
|
|
else if (Exit_Rule4(MA_Cross_period1_L,MA_Cross_period2_L) == 2)
|
|
{
|
|
return(2);
|
|
}
|
|
else if (Exit_Rule5() == 2)
|
|
{
|
|
return(2);
|
|
}
|
|
else
|
|
{
|
|
return(0);
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//+------------------------------------------------------------------+
|
|
//| エントリールール1 |
|
|
//+------------------------------------------------------------------+
|
|
int Entry_Rule1()
|
|
{
|
|
//エントリールール1を差し替える時は、下記を差し替えて下さい。
|
|
//ローソク足が陽線で買い
|
|
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);
|
|
}
|
|
//エントリールール1を差し替える時は、ココマデを差し替えて下さい。
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| エントリーフィルター1 |
|
|
//+------------------------------------------------------------------+
|
|
int Entry_Filter1(int F_BB_Period,double F_BB_Hensa)
|
|
{
|
|
//エントリーフィルター1を差し替える時は、下記を差し替えて下さい。
|
|
// ローソク足の始値が、ボリンジャーバンドより外側にある時のみ、エントリーすることが可能
|
|
double UpperBB1 = iBands(NULL,EA_PERIOD, F_BB_Period, F_BB_Hensa, 0, PRICE_CLOSE, MODE_UPPER, 1);
|
|
double LowerBB1 = iBands(NULL,EA_PERIOD, F_BB_Period, F_BB_Hensa, 0, PRICE_CLOSE, MODE_LOWER, 1);
|
|
|
|
// ローソク足の始値が、ボリンジャーバンドより外側にある時のみ、エントリーすることが可能
|
|
if(iOpen(NULL,EA_PERIOD,1) < LowerBB1)
|
|
{
|
|
return(1);
|
|
} // 買い
|
|
else if(iOpen(NULL,EA_PERIOD,1) > UpperBB1)
|
|
{
|
|
return(2);
|
|
} // 売り
|
|
else
|
|
{
|
|
return(0);
|
|
}
|
|
//エントリーフィルター1を差し替える時は、ココマデを差し替えて下さい。
|
|
return(3);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| エントリーフィルター2 |
|
|
//+------------------------------------------------------------------+
|
|
int Entry_Filter2(int F_MA_period)
|
|
{
|
|
//エントリーフィルター2を差し替える時は、下記を差し替えて下さい。
|
|
//ローソク足が、移動平均線より上にいる間は「売り」、下にいる間は「買い」
|
|
double MA1 = iMA(NULL,F_PERIOD, F_MA_period, 0, MODE_SMA, PRICE_CLOSE, 1);
|
|
|
|
// ローソク足が、移動平均線より上にいる間は「売り」
|
|
if (MA1 < iClose(NULL,F_PERIOD,1))
|
|
{
|
|
return(2);
|
|
} // 買い
|
|
//ローソク足が、移動平均線より下にいる間は「買い」
|
|
else if (MA1 > iClose(NULL,F_PERIOD,1))
|
|
{
|
|
return(1);
|
|
} // 売り
|
|
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 K_BB_Period,double K_BB_Hensa)
|
|
{
|
|
// 決済ルール1を差し替える時は、下記を差し替えて下さい。
|
|
//ローソク足が、下側のボリンジャーバンドを下抜いたら「買い」、上側のボリンジャーバンドを上抜いたら「売り」
|
|
double UpperBB1 = iBands(NULL,EA_PERIOD, K_BB_Period, K_BB_Hensa, 0, PRICE_CLOSE, MODE_UPPER, 1);
|
|
double LowerBB1 = iBands(NULL,EA_PERIOD, K_BB_Period, K_BB_Hensa, 0, PRICE_CLOSE, MODE_LOWER, 1);
|
|
double UpperBB2 = iBands(NULL,EA_PERIOD, K_BB_Period, K_BB_Hensa, 0, PRICE_CLOSE, MODE_UPPER, 2);
|
|
double LowerBB2 = iBands(NULL,EA_PERIOD ,K_BB_Period, K_BB_Hensa, 0, PRICE_CLOSE, MODE_LOWER, 2);
|
|
|
|
//ローソク足が、下側のボリンジャーバンドを下抜いたら「買い」
|
|
if (iClose(NULL,EA_PERIOD,1) < LowerBB1 && iClose(NULL,EA_PERIOD,2) > LowerBB2)
|
|
{
|
|
return(1);
|
|
} // 買い
|
|
//ローソク足が、上側のボリンジャーバンドを上抜いたら「売り」
|
|
else if (iClose(NULL,EA_PERIOD,1) > UpperBB1 && iClose(NULL,EA_PERIOD,2) < UpperBB2)
|
|
{
|
|
return(2);
|
|
} // 売り
|
|
else
|
|
{
|
|
return(0);
|
|
}
|
|
// 決済ルール1を差し替える時は、ココマデを差し替えて下さい。
|
|
return(3);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| 決済ルール2 |
|
|
//+------------------------------------------------------------------+
|
|
int Exit_Rule2(int K_BB_Period_2,double K_BB_Hensa_2)
|
|
{
|
|
// 決済ルール2を差し替える時は、下記を差し替えて下さい。
|
|
//ローソク足が、下側のボリンジャーバンドを下抜いたら「売り」、上側のボリンジャーバンドを上抜いたら「買い」
|
|
double UpperBB1 = iBands(NULL,EA_PERIOD, K_BB_Period_2, K_BB_Hensa_2, 0, PRICE_CLOSE, MODE_UPPER, 1);
|
|
double LowerBB1 = iBands(NULL,EA_PERIOD, K_BB_Period_2, K_BB_Hensa_2, 0, PRICE_CLOSE, MODE_LOWER, 1);
|
|
double UpperBB2 = iBands(NULL,EA_PERIOD, K_BB_Period_2, K_BB_Hensa_2, 0, PRICE_CLOSE, MODE_UPPER, 2);
|
|
double LowerBB2 = iBands(NULL,EA_PERIOD ,K_BB_Period_2, K_BB_Hensa_2, 0, PRICE_CLOSE, MODE_LOWER, 2);
|
|
|
|
//ローソク足が、下側のボリンジャーバンドを下抜いたら「売り」
|
|
if (iClose(NULL,EA_PERIOD,1) < LowerBB1 && iClose(NULL,EA_PERIOD,2) > LowerBB2)
|
|
{
|
|
return(2);
|
|
} // 買い
|
|
//ローソク足が、上側のボリンジャーバンドを上抜いたら「買い」
|
|
else if (iClose(NULL,EA_PERIOD,1) > UpperBB1 && iClose(NULL,EA_PERIOD,2) < UpperBB2)
|
|
{
|
|
return(1);
|
|
} // 売り
|
|
else
|
|
{
|
|
return(0);
|
|
}
|
|
// 決済ルール2を差し替える時は、ココマデを差し替えて下さい。
|
|
return(3);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| 決済ルール3 |
|
|
//+------------------------------------------------------------------+
|
|
int Exit_Rule3(int CCI_period,int CCI_Line)
|
|
{
|
|
// 決済ルール3を差し替える時は、下記を差し替えて下さい。
|
|
// CCIが-100(パラメータで変更可)以下になったら買い/100以上になったら売り
|
|
double CCI0 = iCCI(NULL,EA_PERIOD, CCI_period, PRICE_CLOSE, 1);
|
|
double CCI1 = iCCI(NULL,EA_PERIOD, CCI_period, PRICE_CLOSE, 2);
|
|
|
|
// CCIが-100(パラメータで変更可)以下になったら買い
|
|
if (CCI0 <= -CCI_Line && CCI1 > -CCI_Line)
|
|
{
|
|
return(1);
|
|
} // 買い
|
|
// CCIが100(パラメータで変更可)以上になったら売り
|
|
else if (CCI0 >= CCI_Line && CCI1 < CCI_Line)
|
|
{
|
|
return(2);
|
|
} // 売り
|
|
else
|
|
{
|
|
return(0);
|
|
}
|
|
// 決済ルール3を差し替える時は、ココマデを差し替えて下さい。
|
|
return(3);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| 決済ルール4 |
|
|
//+------------------------------------------------------------------+
|
|
int Exit_Rule4(int MA_Cross_period1,int MA_Cross_period2)
|
|
{
|
|
// 決済ルール4を差し替える時は、下記を差し替えて下さい。
|
|
// 移動平均線のゴールデンクロスとデッドクロス
|
|
double MA11 = iMA(NULL,PERIOD_H1, MA_Cross_period1, 0, MODE_SMA, PRICE_CLOSE, 2);
|
|
double MA10 = iMA(NULL,PERIOD_H1, MA_Cross_period1, 0, MODE_SMA, PRICE_CLOSE, 1);
|
|
double MA21 = iMA(NULL,PERIOD_H1, MA_Cross_period2, 0, MODE_SMA, PRICE_CLOSE, 2);
|
|
double MA20 = iMA(NULL,PERIOD_H1, MA_Cross_period2, 0, MODE_SMA, PRICE_CLOSE, 1);
|
|
|
|
// 短期移動平均線が長期移動平均線を上抜け(ゴールデンクロス)で「買い」
|
|
if (MA11 < MA21 && MA10 >= MA20)
|
|
{
|
|
return(1);
|
|
} // 買い
|
|
// 短期移動平均線が長期移動平均線を下抜け(デッドクロス)で「売り」
|
|
else if(MA11 > MA21 && MA10 <= MA20)
|
|
{
|
|
return(2);
|
|
} // 売り
|
|
else
|
|
{
|
|
return(0);
|
|
}
|
|
// 決済ルール4を差し替える時は、ココマデを差し替えて下さい。
|
|
return(3);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| 決済ルール5 |
|
|
//+------------------------------------------------------------------+
|
|
int Exit_Rule5()
|
|
{
|
|
// 決済ルール5を差し替える時は、下記を差し替えて下さい。
|
|
//ローソク足が陽線で買い
|
|
if (iClose(NULL,K_PERIOD,1) > iOpen(NULL,K_PERIOD,1) &&(iClose(NULL,K_PERIOD,1) - iOpen(NULL,K_PERIOD,1))> iClose(NULL,K_PERIOD,1) * K_Open_Kairi_percent / 100.0)
|
|
{
|
|
return(1);
|
|
} // 買い
|
|
//ローソク足が陰線で売り
|
|
else if (iClose(NULL,K_PERIOD,1) < iOpen(NULL,K_PERIOD,1) && (iOpen(NULL,K_PERIOD,1) - iClose(NULL,K_PERIOD,1))> iClose(NULL,K_PERIOD,1) * K_Open_Kairi_percent / 100.0)
|
|
{
|
|
return(2);
|
|
} // 売り
|
|
else
|
|
{
|
|
return(0);
|
|
}
|
|
// 決済ルール5を差し替える時は、ココマデを差し替えて下さい。
|
|
return(3);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
|