gryps2/EA-code/TNK/MSZ-006_Asasukya_Logic.mq4
super.admin ae3f0ebf03 convert
2025-05-30 14:58:21 +02:00

1486 lines
No EOL
100 KiB
MQL4
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//+------------------------------------------------------------------+
//| MSZ-006.mq4 |
//| Copyright 2021, TNK.Co.,Ltd.|
//| https://note.com/tnk_system |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, TNK"
#property link "https://note.com/tnk_system"
#property version "3.1" //複利機能残高追加チャートコメント変更
#property strict
#include <stdlib.mqh>
//ユーザー入力用パラメーター
//基本設定
string Basic_setting = "基本設定"; // ■■■ 基本設定 ■■■
input double Lots = 0.2; // ロット(単利運用時)
enum MM_Select{
Fixed, // 0:単利/固定
FreeMargin, // 1:複利/余剰証拠金
Balance, // 2:複利/残高
};
input MM_Select MM_ON = Fixed; // 複利機能(0:単利/1:余剰証拠金/2:残高)
input double MM_Risk = 1.0; // リスク%(余剰証拠金/残高の何%か)
input double MaxSpread_pips = 5.5; // 許容スプレッド(Pips)
input int Slippage = 10; // 許容スリッページ(Point)
input int TakeProfit_pips = 20; // 利確指値(Pips)
input int StopLoss_pips = 50; // 損切逆指値(Pips)
input bool WR_MODE = true; // トレンド耐性強化モード
enum Week_Select{
Nomal, // 0:通常(月~木)
Wednesday, // 1:水曜日無
Thursday, // 2:木曜日無
Wednesday_Thursday, // 3:水,木曜日無
};
input Week_Select WS_MODE = Nomal; // 23時台曜日制御(0:月~木/1:水無/2:木無/3:水木無)
input bool NG0_MODE = false; // 0時台トレード無しモード
//input bool WS_MODE = true; // 0時台・木曜日トレード無しモード
input int MagicNumber = 1980617; // マジックナンバー(他EAと重複不可)
input int GMT = 2; // GMT(冬時間)
input int Summertime = 1; // サマータイム(1:米/2:英/0:無し)
input string _Comment = "MSZ-006"; // 通知用コメント
//内部設定
int Maxposition = 1; // 最大ポジション
int CandleMargin_Pips = 1; // 1本前ローソク足終値と現在価格の差pips
int CandleCloseHour = 9; // 強制決済するポジション保有時間
bool Buy_Entry = true; // 買いエントリー
bool Sell_Entry = true; // 売りエントリー
bool WeekendClose = true; // 週末クローズ
bool YearendClose = true; // 12/25~1/3クローズ
//ローソク足始値のみで稼働:「true」
bool CandleStartStartingEntry = false; // エントリー
bool CandleStartStartingTrailing = true; // トレイリング
bool CandleStartStartingExit = false; // 決済
//バーカウント・桁合わせ・時間制御用
int xBarsEntry = 0, xBarsExit = 0, xBarsTrailing = 0;
int xBars=0, xxBars=0;
double xpoint;
int xTime, xxTime, yTime;
//エントリー・決済ベースルールの各変数
int WilliamsPR_Gyakubari_period = 42; // EnEx_ウィリアムズ%Rの計算期間
int WilliamsPR_Line1 = -95; // 逆張りエントリーの基準となるライン(買い)
int WilliamsPR_Line2 = -5; // 逆張りエントリーの基準となるライン(売り)
int WilliamsPR_BuyExit_Line = -10; // 逆張り決済の基準となるライン(買い)
int WilliamsPR_SellExit_Line = -90; // 逆張り決済の基準となるライン(売り)
int RSI_period = 9; // EnEx_RSIの計算期間
int RSI_Gyakubari_Line1 = 30; // 逆張りエントリーの基準となるライン(買い) / 25~35 / 1
int RSI_Gyakubari_Line2 = 70; // 逆張りエントリーの基準となるライン(売り) / 65~75 / 1
int RSI_BuyExit_Line = 70; // RSI決済ライン(買い)
int RSI_SellExit_Line = 30; // RSI決済ライン(売り)
//エントリーフィルター
double BBMargin = 8.0; // F7_BB幅pips
int CandleCheckCount = 48; // F8_HLマージンチェック/ローソク足何本前まで?
int HL_Margin_pips = 100; // F8_高値安値の差pips
int RSI_JUNBARI_TF = 2;
int RSI_Junbari_Filter_Line = 30; // F10_RSI順張りエントリーの基準となるライン
int MACD_TF = 5;
int ADX_TF = 7; // ADXタイムフレーム
int ADX_value = 50; // ADXライン
//決済ルールの各変数
//成行決済
int Rikaku_pips1 = 4; // Ex_成行利確シグナルPips
//int Songiri_pips = 1000; // 成行損切シグナルPips / 50~300 / 10
//トレーリング
//bool Modify = false;
//int TrailingTakeProfitStart_pips = -40; // トレール開始損益Pips / -80~-10 / 10
//int TrailingTakeProfit_pips = -10; // トレール時の短期MAからの値幅Pips / -10~20 / 5
//週末決済(日本時間)
bool GMT_Kadou_NG = false; // 週末稼働
bool PositionClose = false; // 週末決済
int EntryNG_StartTime1 = 1; // エントリー中止時間(開始) / 0~4(<Time_W) / 1
int EntryNG_EndTime1 = 7; // エントリー中止時間(終了)
int EntryNG_DayOfWeek1 = 6; // エントリー中止曜日
int PositionClose_Time_W = 5; // ポジション決済時間 / 0~5 / 1
int PositionClose_DayOfWeek1 = 6; // ポジション決済曜日
//ロジック毎の時間割り振り(サーバー時間)
bool Logic1_Time = true; // ロジック1時間帯
int EntryOK_StartTime1 = 0; // ロジック1開始時間1
int EntryOK_EndTime1 = 0; // ロジック1終了時間1
int EntryOK_StartTime2 = 23; // ロジック1開始時間2
int EntryOK_EndTime2 = 23; // ロジック1終了時間2
//バックテスト用モード切替
bool BacktestMode = false; // 0時台決済無し
bool ROTime = false; // ロールオーバー・メンテナンス時間
//計測用パラメータ
bool Measurement = true; // 計測スイッチ
int err, fp, j;
double Yakujyou_Price;
double Open_Spread, Close_Spread;
double Open_Slippage, Close_Slippage;
uint OpenLatency, CloseLatency;
string filename;
double profitpips;
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| tester function |
//+------------------------------------------------------------------+
/*double OnTester()
{
// リカバリーファクター
return(NormalizeDouble(TesterStatistics(STAT_PROFIT) / TesterStatistics(STAT_EQUITY_DD), 2));
// 勝率
// return(NormalizeDouble(100*TesterStatistics(STAT_PROFIT_TRADES) / TesterStatistics(STAT_TRADES), 2));
}*/
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (StringSubstr(Symbol(), 0, 6) == "AUDCAD")
{
ADX_value = 70; // ADX値
}
if (StringSubstr(Symbol(), 0, 6) == "CHFJPY")
{
ADX_value = 35; // ADX値
}
if (StringSubstr(Symbol(), 0, 6) == "EURAUD")
{
ADX_value = 40; // ADX値
}
if (StringSubstr(Symbol(), 0, 6) == "EURCAD")
{
ADX_value = 60; // ADX値
}
if (StringSubstr(Symbol(), 0, 6) == "EURJPY")
{
ADX_value = 45; // ADX値
}
if (StringSubstr(Symbol(), 0, 6) == "GBPAUD")
{
ADX_value = 70; // ADX値
}
if (StringSubstr(Symbol(), 0, 6) == "GBPCAD")
{
ADX_value = 65; // ADX値
}
if (StringSubstr(Symbol(), 0, 6) == "GBPCHF")
{
ADX_value = 40; // ADX値
}
if (StringSubstr(Symbol(), 0, 6) == "GBPJPY")
{
ADX_value = 70; // ADX値
}
if (StringSubstr(Symbol(), 0, 6) == "GBPUSD")
{
ADX_value = 70; // ADX値
}
if (StringSubstr(Symbol(), 0, 6) == "USDCHF")
{
ADX_value = 40; // ADX値
}
if (StringSubstr(Symbol(), 0, 6) == "USDJPY")
{
ADX_value = 65; // ADX値
}
// 小数点以下の桁数に応じてPipsの値を調整する
xpoint = Point();
if (Digits() == 3 || Digits() == 5)
{
xpoint = xpoint * 10;
}
// チャート表示コメント
string LotsComment;
if (MM_ON == Fixed) LotsComment = DoubleToStr(Lots,2);
else LotsComment = //DoubleToStr(CalculateLots(MM_Risk, StopLoss_pips),1)
" (" + DoubleToStr(MM_Risk,1) +"%)";
Comment(DoubleToStr(MagicNumber,0) +
" Lots:" + LotsComment +
" MM:" + (string)MM_ON +
"\n" +
"Sp:" + DoubleToStr(MaxSpread_pips, 1) +
" TP/SL:" + DoubleToStr(TakeProfit_pips,0) + "/" + DoubleToStr(StopLoss_pips,0) +
"\n" +
"WR:" + (string)WR_MODE +
" WS:" + (string)WS_MODE +
" NG0:" + (string)NG0_MODE
);
// バックテストモード
if (BacktestMode == true)
{
EntryOK_StartTime1 = 23;
EntryOK_EndTime1 = 23;
}
// 使用しているインジケータを非表示にする
HideTestIndicators(true);
// ファイル出力初期化処理
if (Measurement == true)
{
filename = AccountCompany() + "_SlippageLog.csv";// ファイル名を決める
fp = FileOpen(filename, FILE_READ|FILE_WRITE|FILE_CSV, ',');// ファイルオープン(csv)
if(fp==INVALID_HANDLE)
{
err = GetLastError();
printf("Error occured: [%d] %s", err, ErrorDescription(err));
return(0.0);
}
FileWrite(fp, "OpenTime", "CloseTime", "OpenPrice", "ClosePrice", "OrderType", "ProfitPips",
"OpenSpread", "OpenSlippage", "OpenLatency",
"CloseSpread", "CloseSlippage", "CloseLatency", "CurrencyPair", "ExpertName");
// ファイルを閉じる
FileClose(fp);
}
return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// サマータイム調整・時間制御
GetSummertimeShift();
// ポジションをクローズ
PositionClose();
// トレーリング
// Trailing();
// ポジションのエントリー
PositionOpen();
// TP, SLの再設定
SetTPSL();
// チャート表示コメント
string LotsComment;
if (MM_ON == Fixed) LotsComment = DoubleToStr(Lots,2);
else LotsComment = DoubleToStr(CalculateLots(MM_Risk, StopLoss_pips),2)
+ " (" + DoubleToStr(MM_Risk,1) +"%)";
Comment(DoubleToStr(MagicNumber,0) +
" Lots:" + LotsComment +
" MM:" + (string)MM_ON +
"\n" +
"Sp:" + DoubleToStr(MaxSpread_pips, 1) +
" TP/SL:" + DoubleToStr(TakeProfit_pips,0) + "/" + DoubleToStr(StopLoss_pips,0) +
"\n" +
"WR:" + (string)WR_MODE +
" WS:" + (string)WS_MODE +
" NG0:" + (string)NG0_MODE
);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 補正関数 |
//+------------------------------------------------------------------+
void GetSummertimeShift()
{
int MON, SUN_day, xGMT;
//int xTime, xxTime, yTime;
int summertime_shift = 0;
datetime gmtadjusted;
// GMT+9を基準に、どれだけずれているかを算出する------------------------
MON = TimeMonth(TimeCurrent()); // 何月?
SUN_day = TimeDay(TimeCurrent()) - TimeDayOfWeek(TimeCurrent()); // その週の日曜日は何日?
if (Summertime == 2) // 英国式の場合
{
if ((MON == 3 && SUN_day >= 25) || (MON >= 4 && MON <= 9) || (MON == 10 && SUN_day <= 24))
//3月で、その週の日曜日が25日以上/4月~9月/10月で、その週の日曜日が23日以下
{
summertime_shift = 1;
}
else
{
summertime_shift = 0;
}
}
else if (Summertime == 1) // 米国式の場合
{
if ((MON == 3 && SUN_day >= 8) || (MON >= 4 && MON <= 10) || (MON == 11 && SUN_day <= 0))
//3月で、その週の日曜日が8日以上/4月~10月/11月で、その週の日曜日が存在しない
{
summertime_shift = 1;
}
else
{
summertime_shift = 0;
}
}
else // サマータイム無しの場合
{
summertime_shift = 0;
}
xGMT = GMT - 9 + summertime_shift;//GMT+9を基準に
//GMT+9基準でどれだけずれているかを算出する(ココマデ)--------------------
//+------------------------------------------------------------------+
//| 時間制御 |
//+------------------------------------------------------------------+
//---- トレード許可時間の判定 ----
xTime = TimeHour(TimeCurrent()) - xGMT; // 日本時間
xxTime = TimeHour(TimeCurrent()) - (GMT - 2); // サーバー時間(サマータイム計算なし)
yTime = TimeMinute(TimeCurrent()); // サーバーの分
gmtadjusted = TimeCurrent() - 60 * 60 * xGMT;
if (xTime < 0)
{
xTime = xTime + 24;
}
else if (xTime > 23)
{
xTime = xTime - 24;
}
if (xxTime < 0)
{
xxTime = xxTime + 24;
}
else if (xxTime > 23)
{
xxTime = xxTime - 24;
}
// 週末ポジションクローズ
if ((xTime == PositionClose_Time_W
&& TimeDayOfWeek(gmtadjusted) == PositionClose_DayOfWeek1
&& WeekendClose == true)
)
{
PositionClose = true;
}
else
{
PositionClose = false;
}
// エントリーNG時間
if ( // 週末決済(日本時間)
(xTime >= EntryNG_StartTime1 && xTime <= EntryNG_EndTime1 // 週末決済用(日本時間)
&& TimeDayOfWeek(gmtadjusted) >= EntryNG_DayOfWeek1 // 週末決済曜日(日本時間)
&& WeekendClose == true)
)
{
GMT_Kadou_NG = true;
}
else
{
GMT_Kadou_NG = false;
}
// ロールオーバー・メンテナンス時間
if (((xxTime == 23 && yTime >= 55 && TimeDayOfWeek(TimeCurrent()) != 5)
|| (xxTime == 23 && yTime >= 50 && TimeDayOfWeek(TimeCurrent()) == 5)
|| (xxTime == 0 && yTime <= 9))
&& BacktestMode == true)
{
ROTime = true;
}
else
{
ROTime = false;
}
// エントリーOK時間
if ( (xxTime >= EntryOK_StartTime1 && xxTime <= EntryOK_EndTime1) // エントリー可能時間1(サーバー時間)
|| (xxTime >= EntryOK_StartTime2 && xxTime <= EntryOK_EndTime2)) // エントリー可能時間2(サーバー時間)
{
Logic1_Time = true;
}
else
{
Logic1_Time = false;
}
// ここまで、エグジットとトレーリングは、取引時間に関係なく実施する
//---- トレード許可時間の判定(ココマデ) ----
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ポジションのクローズ |
//+------------------------------------------------------------------+
void PositionClose()
{
int i;
double profit;
bool res;
int OrderOpenCandleCount;
//ローソク足始値のみ稼働(選択式)の場合、ココカラ
if(Bars != xBars || CandleStartStartingExit == 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;
OrderOpenCandleCount = iBarShift(NULL, 0, OrderOpenTime()); // エントリーからのローソク足本数
if (OrderType() == OP_BUY)
{
profit = Bid - OrderOpenPrice(); // 買いポジションだった場合の、含み損益を計算する
// オーダーを成り行き決済する
if
(ROTime == false &&
(profit >= Rikaku_pips1 * xpoint
|| (Exit2(false) == 2 && Ask - Bid <= MaxSpread_pips * xpoint)
|| (Exit2(false) == 2 && Ask - Bid > MaxSpread_pips * xpoint && profit > 0)
|| PositionClose == true
|| OrderOpenCandleCount >= CandleCloseHour * 12)
)
{
double CSpread = Ask - Bid;// スプレッド計測
uint OrderCloseTimestamp = GetTickCount();// レイテンシー計測
double Close_Price = Bid;// 決済売り注文を入れる価格
res = OrderClose(OrderTicket(), OrderLots(), Bid, NULL, Green);
if (res == true && Measurement == true)
{
CloseLatency = GetTickCount() - OrderCloseTimestamp; // レイテンシー計測
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY)==false) //履歴を選択
{
Print("Access to history failed with error (",GetLastError(),")");
return;
}
//オーダー確認(通貨ペアが一致した場合は、次の処理へ進む
if (OrderSymbol() == Symbol())
{
//マジックナンバー確認(マジックナンバーが一致した場合は、次の処理へ進む
if (OrderMagicNumber() == MagicNumber)
{
Close_Price = NormalizeDouble(Close_Price, Digits); // 売り注文価格を正規化
Yakujyou_Price = NormalizeDouble(OrderClosePrice(), Digits); // 実際約定した価格
Close_Slippage = NormalizeDouble(Yakujyou_Price - Close_Price, Digits) / xpoint; // スリッページ、桁合わせ
Close_Spread = NormalizeDouble(CSpread, Digits) / xpoint; // スプレッド、桁合わせ
profitpips = NormalizeDouble((OrderClosePrice() - OrderOpenPrice()) / xpoint, 1);
/*Print("Slippage = ", DoubleToString(Close_Slippage, Digits),
" Latency = ", CloseLatency,
" OOT = ", OrderOpenTime(),
" OCT = ", OrderCloseTime(),
" OOP = ", OrderOpenPrice(),
" YJP = ", Yakujyou_Price,
" OSp = ", Open_Spread,
" OSl = ", Open_Slippage,
" CSp = ", Close_Spread,
" CSl = ", Close_Slippage);
*/
fp = FileOpen(filename, FILE_READ|FILE_WRITE|FILE_CSV, ',');// ファイルオープン(csv)
if (fp != INVALID_HANDLE)
{
FileSeek(fp, 0, SEEK_END);
FileWrite(fp, OrderOpenTime(), OrderCloseTime(), OrderOpenPrice(), Yakujyou_Price,
"buy", profitpips, Open_Spread, Open_Slippage, OpenLatency,
Close_Spread, Close_Slippage, CloseLatency, Symbol(), WindowExpertName());
FileClose(fp);
}
}
}
}
}
}
if (OrderType() == OP_SELL)
{
profit = OrderOpenPrice() - Ask; // 売りポジションだった場合の、含み損益を計算する
// オーダーを成り行き決済する
if
(ROTime == false &&
(profit >= Rikaku_pips1 * xpoint
|| (Exit1(true) == 1 && Ask - Bid <= MaxSpread_pips * xpoint)
|| (Exit1(true) == 1 && Ask - Bid > MaxSpread_pips * xpoint && profit > 0)
|| PositionClose == true
|| OrderOpenCandleCount >= CandleCloseHour * 12)
)
{
double CSpread = Ask - Bid;// スプレッド計測
uint OrderCloseTimestamp = GetTickCount();// レイテンシー計測
double Close_Price = Ask;// 決済買い注文を入れる価格
res = OrderClose(OrderTicket(), OrderLots(), Ask, NULL, Green);
if (res == true && Measurement == true)
{
CloseLatency = GetTickCount() - OrderCloseTimestamp; // レイテンシー計測
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY)==false) //履歴を選択
{
Print("Access to history failed with error (",GetLastError(),")");
return;
}
//オーダー確認(通貨ペアが一致した場合は、次の処理へ進む
if (OrderSymbol() == Symbol())
{
//マジックナンバー確認(マジックナンバーが一致した場合は、次の処理へ進む
if (OrderMagicNumber() == MagicNumber)
{
Close_Price = NormalizeDouble(Close_Price , Digits); // 買い注文価格を正規化
Yakujyou_Price = NormalizeDouble(OrderClosePrice(), Digits); // 実際約定した価格
Close_Slippage = NormalizeDouble(Close_Price - Yakujyou_Price, Digits) / xpoint; // スリッページ、桁合わせ
Close_Spread = NormalizeDouble(CSpread, Digits) / xpoint; // スプレッド、桁合わせ
profitpips = NormalizeDouble((OrderOpenPrice() - OrderClosePrice()) / xpoint, 1);
/*Print("Slippage = ", DoubleToString(Close_Slippage, Digits),
" Latency = ", CloseLatency,
" OOT = ", OrderOpenTime(),
" OCT = ", OrderCloseTime(),
" OOP = ", OrderOpenPrice(),
" YJP = ", Yakujyou_Price,
" OSp = ", Open_Spread,
" OSl = ", Open_Slippage,
" CSp = ", Close_Spread,
" CSl = ", Close_Slippage);
*/
fp = FileOpen(filename, FILE_READ|FILE_WRITE|FILE_CSV, ',');// ファイルオープン(csv)
if (fp != INVALID_HANDLE)
{
FileSeek(fp, 0, SEEK_END);
FileWrite(fp, OrderOpenTime(), OrderCloseTime(), OrderOpenPrice(), OrderClosePrice(),
"sell", profitpips, Open_Spread, Open_Slippage, OpenLatency,
Close_Spread, Close_Slippage, CloseLatency, Symbol(), WindowExpertName());
FileClose(fp);
}
}
}
}
}
}
} // 所有しているポジションをクローズする(ココマデ)
} //ローソク足始値のみ稼働(ココマデ)
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| トレーリング |
//+------------------------------------------------------------------+
/*void Trailing()
{
int i;
double profit;
bool res;
double MA_fast1 = iMA(NULL, MA_TF, MA_period_fast, 0, MODE_EMA, PRICE_CLOSE, 1); // 1本前の短期MA
// トレーリングのローソク足始値のみ稼働(選択式)
if(Bars != xBarsTrailing || CandleStartStartingTrailing == false)
{
xBarsTrailing = 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(); // 買いポジションだった場合の含み損益を計算する
// トレイルON、OFF
if (Modify == true)
{
// 含み損が一定以上かつ短期MAを割り込んだ場合、TPを引き下げる
if (profit <= TrailingTakeProfitStart_pips * xpoint
&& OrderTakeProfit() > NormalizeDouble(MA_fast1 + TrailingTakeProfit_pips * xpoint, Digits())
&& Close[1] < MA_fast1)
{
res = OrderModify(OrderTicket(), OrderOpenPrice(),
OrderStopLoss(),
MA_fast1 + TrailingTakeProfit_pips * xpoint,
0, MediumSeaGreen);
}
}
}
if (OrderType() == OP_SELL)
{
profit = OrderOpenPrice() - Ask; // 売りポジションだった場合の含み損益を計算する
// トレイルON、OFF
if (Modify == true)
{
// 含み損が一定以上かつ短期MAを上抜けた場合、TPを引き下げる
if (profit <= TrailingTakeProfitStart_pips * xpoint
&& OrderTakeProfit() < NormalizeDouble(MA_fast1 - TrailingTakeProfit_pips * xpoint, Digits())
&& Close[1] > MA_fast1)
{
res = OrderModify(OrderTicket(), OrderOpenPrice(),
OrderStopLoss(),
MA_fast1 - TrailingTakeProfit_pips * xpoint,
0, MediumSeaGreen);
}
}
}
} // 所有しているポジションのストップをトレールする(ココマデ)
} // トレーリングのローソク足始値のみ稼働(ココマデ)
}*/
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ポジションのオープン |
//+------------------------------------------------------------------+
void PositionOpen()
{
int i;
int ticket;
int CountBuy = 0,CountSell = 0;
bool res;
// エントリー判断のローソク足始値のみ稼働(選択式)
if(Bars != xBarsEntry || CandleStartStartingEntry == false)
{
xBarsEntry = 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)
{
CountBuy = CountBuy + 1;
}
if (OrderType() == OP_SELL)
{
CountSell = CountSell + 1;
}
} // ポジションの数をカウントする(ココマデ)
// エントリー条件を確認し、成立していればエントリーを行う
if (Entry(true) == 1 // 買いエントリー
&& CountSell == 0
&& CountBuy < Maxposition
&& xxBars != Bars
&& GMT_Kadou_NG == false
&& Logic1_Time == true
&& Buy_Entry == true)
{
double OSpread = Ask - Bid;// スプレッド計測
uint StartOrderTimestamp = GetTickCount();// レイテンシー計測
double Order_Price = Ask;// 買い注文を入れる価格
ticket = OrderSend(Symbol(),
OP_BUY,
CalculateLots(MM_Risk, StopLoss_pips),
Ask,
Slippage,
0,
0,
_Comment,
MagicNumber,
0,
Blue);
// エントリーに成功していれば、TP, SLをセットする
if (ticket != -1)
{
// チケットを使ってオーダーを選択(エラーを生じた場合、何もしない)
if( OrderSelect( ticket, SELECT_BY_TICKET ) == true )
{
OpenLatency = GetTickCount() - StartOrderTimestamp; // レイテンシー計測
Order_Price = NormalizeDouble(Order_Price , Digits); // 買い注文価格を正規化
Yakujyou_Price = NormalizeDouble(OrderOpenPrice(), Digits); // 実際約定した価格、正規化
Open_Slippage = NormalizeDouble(Order_Price - Yakujyou_Price, Digits) / xpoint; // スリッページ、桁合わせ
Open_Spread = NormalizeDouble(OSpread, Digits) / xpoint; // スプレッド、桁合わせ
res = OrderModify(OrderTicket(),
OrderOpenPrice(),
OrderOpenPrice() - StopLoss_pips * xpoint,
OrderOpenPrice() + TakeProfit_pips * xpoint,
0, MediumSeaGreen);
//Print("Slippage = ", DoubleToString(Open_Slippage,Digits),
// " Latency= ", OpenLatency);
}
}
xxBars = Bars;
}
else if (Entry(false) == 2 // 売りエントリー
&& CountBuy == 0
&& CountSell < Maxposition
&& xxBars != Bars
&& GMT_Kadou_NG == false
&& Logic1_Time == true
&& Sell_Entry == true)
{
double OSpread = Ask - Bid;// スプレッド計測
uint StartOrderTimestamp = GetTickCount();// レイテンシー計測
double Order_Price = Bid;// 売り注文を入れる価格
ticket = OrderSend(Symbol(),
OP_SELL,
CalculateLots(MM_Risk, StopLoss_pips),
Bid,
Slippage,
0,
0,
_Comment,
MagicNumber,
0,
Red);
// エントリーに成功していれば、TP, SLをセットする
if (ticket != -1)
{
// チケットを使ってオーダーを選択(エラーを生じた場合、何もしない)
if( OrderSelect( ticket, SELECT_BY_TICKET ) == true )
{
OpenLatency = GetTickCount() - StartOrderTimestamp; // レイテンシー計測
Order_Price = NormalizeDouble(Order_Price , Digits); // 買い注文価格を正規化
Yakujyou_Price = NormalizeDouble(OrderOpenPrice(), Digits); // 実際約定した価格、正規化
Open_Slippage = NormalizeDouble(Yakujyou_Price - Order_Price, Digits) / xpoint; // スリッページ、桁合わせ
Open_Spread = NormalizeDouble(OSpread, Digits) / xpoint; // スプレッド、桁合わせ
res = OrderModify(OrderTicket(),
OrderOpenPrice(),
OrderOpenPrice() + StopLoss_pips * xpoint,
OrderOpenPrice() - TakeProfit_pips * xpoint,
0, MediumSeaGreen);
//Print("Slippage = ", DoubleToString(Open_Slippage,Digits),
// " Latency= ", OpenLatency);
}
}
xxBars = Bars;
}
} // エントリー判断のローソク足始値のみ稼働(ココマデ)
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| TakeProfit, StopLoss |
//+------------------------------------------------------------------+
void SetTPSL()
{
int i;
double profit;
bool res;
// ポジションに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);
}
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 複利機能 |
//+------------------------------------------------------------------+
// 複利機能のロット数を計算する
double CalculateLots(double risk, // 許容するリスク
int sl_pips) // ストップロス
{
// バックテスト時は、バックテスト用の複利機能を使用する
if (IsTesting())
return(CalculateLots_forTest(risk, sl_pips));
else
return(CalculateLots_forReal(risk, sl_pips));
}
// 複利機能のロット数を計算する(実トレード用)
double CalculateLots_forReal(double risk, // 許容するリスク
int sl_pips) // ストップロス
{
double freemargin; // アカウントの余剰証拠金
double balance; // アカウントの口座残高
double tickvalue; // 1ロット1pip当たりの証拠金通貨相当額
double lotstep; // サーバのロット数の最小刻み制限
double maxlots; // サーバの最大ロット数制限
double minlots; // サーバの最小ロット数制限
double lotsize = Lots; // ロットサイズ
// 複利機能を使わない場合、Lotsを返す
if (MM_ON == Fixed) return(Lots);
freemargin = AccountFreeMargin();
balance = AccountBalance();
tickvalue = MarketInfo(NULL, MODE_TICKVALUE);
lotstep = MarketInfo(NULL, MODE_LOTSTEP);
maxlots = MarketInfo(NULL, MODE_MAXLOT);
minlots = MarketInfo(NULL, MODE_MINLOT);
// tickvalueはpipsではなくpointなので、小数点以下の桁数に応じて補正する
if (Digits() == 3 || Digits() == 5)
tickvalue = tickvalue * 10;
// 許容するリスクとSLの幅から、ロットサイズを計算する。
if (MM_ON == FreeMargin) // 余剰証拠金方式
{
lotsize = (freemargin * risk / 100.0) // 許容するリスク (余剰証拠金のrisk%)
/ (sl_pips * tickvalue); // 1ロットでSLにかかった時の金額
}
else if (MM_ON == Balance) // 残高方式
{
lotsize = (balance * risk / 100.0) // 許容するリスク (余剰証拠金のrisk%)
/ (sl_pips * tickvalue); // 1ロットでSLにかかった時の金額
}
// サーバのロット数の刻みに合わせてロット数を修正
lotsize = MathFloor(lotsize / lotstep) * lotstep;
// サーバの最小ロット数・最大ロット数で補正をかける
lotsize = MathMax(lotsize, minlots);
lotsize = MathMin(lotsize, maxlots);
return(lotsize);
}
// 複利機能のロット数を計算する(バックテスト用)
double CalculateLots_forTest(double risk, // 許容するリスク
int sl_pips) // ストップロス
{
double freemargin; // アカウントの余剰証拠金
double balance; // アカウントの口座残高
double tickvalue; // 1ロット1pip当たりの証拠金通貨相当額
double lotstep; // サーバのロット数の最小刻み制限
double maxlots; // サーバの最大ロット数制限
double minlots; // サーバの最小ロット数制限
double lotamount; // 1ロットの通貨数
double lotsize = Lots; // ロットサイズ
double conv; // 口座通貨種類による補正係数
// 複利機能を使わない場合、Lotsを返す
if (MM_ON == Fixed) return(Lots);
freemargin = AccountFreeMargin();
balance = AccountBalance();
tickvalue = MarketInfo(NULL, MODE_TICKVALUE);
lotstep = MarketInfo(NULL, MODE_LOTSTEP);
maxlots = MarketInfo(NULL, MODE_MAXLOT);
minlots = MarketInfo(NULL, MODE_MINLOT);
lotamount = MarketInfo(NULL, MODE_LOTSIZE);
// 1万通貨*1pips = $1 = 100円と仮定し、1ロット1pipの変動が口座通貨でいくらに相当するか計算
// 1 lot = 10万通貨
// 口座通貨 = JPY : tickvalue = 1000円/(lot・pip)
// 口座通貨 = USD : tickvalue = $10/(lot・pip)
conv = 1;
if (AccountCurrency() == "JPY")
conv = 100;
tickvalue = lotamount / 10000 * conv;
// 許容するリスクとSLの幅から、ロットサイズを計算する。
if (MM_ON == FreeMargin) // 余剰証拠金方式
{
lotsize = (freemargin * risk / 100.0) // 許容するリスク (余剰証拠金のrisk%)
/ (sl_pips * tickvalue); // 1ロットでSLにかかった時の金額
}
else if (MM_ON == Balance) // 残高方式
{
lotsize = (balance * risk / 100.0) // 許容するリスク (余剰証拠金のrisk%)
/ (sl_pips * tickvalue); // 1ロットでSLにかかった時の金額
}
// サーバのロット数の刻みに合わせてロット数を修正
lotsize = MathFloor(lotsize / lotstep) * lotstep;
// サーバの最小ロット数・最大ロット数で補正をかける
lotsize = MathMax(lotsize, minlots);
lotsize = MathMin(lotsize, maxlots);
return(lotsize);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリー総括 |
//+------------------------------------------------------------------+
int Entry(bool isbuy)
{
if (Entry_Rule1(isbuy) == 1 && (Entry_Filter1(isbuy) == 1 || Entry_Filter1(isbuy) == 3)
&& (Entry_Filter2(isbuy) == 1 || Entry_Filter2(isbuy) == 3)
&& (Entry_Filter3(isbuy) == 1 || Entry_Filter3(isbuy) == 3)
&& (Entry_Filter4(isbuy) == 1 || Entry_Filter4(isbuy) == 3)
&& (Entry_Filter5(isbuy) == 1 || Entry_Filter5(isbuy) == 3)
&& (Entry_Filter6(isbuy) == 1 || Entry_Filter6(isbuy) == 3)
&& (Entry_Filter7(isbuy) == 1 || Entry_Filter7(isbuy) == 3)
&& (Entry_Filter8(isbuy) == 1 || Entry_Filter8(isbuy) == 3)
)
{
return(1);
}
else if (Entry_Rule1(isbuy) == 2 && (Entry_Filter1(isbuy) == 2 || Entry_Filter1(isbuy) == 3)
&& (Entry_Filter2(isbuy) == 2 || Entry_Filter2(isbuy) == 3)
&& (Entry_Filter3(isbuy) == 2 || Entry_Filter3(isbuy) == 3)
&& (Entry_Filter4(isbuy) == 2 || Entry_Filter4(isbuy) == 3)
&& (Entry_Filter5(isbuy) == 2 || Entry_Filter5(isbuy) == 3)
&& (Entry_Filter6(isbuy) == 2 || Entry_Filter6(isbuy) == 3)
&& (Entry_Filter7(isbuy) == 2 || Entry_Filter7(isbuy) == 3)
&& (Entry_Filter8(isbuy) == 2 || Entry_Filter8(isbuy) == 3)
)
{
return(2);
}
else
{
return(0);
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 売りポジションの決済総括 |
//+------------------------------------------------------------------+
int Exit1(bool isbuy)
{
if (Exit_Rule1(isbuy) == 3 && Exit_Rule2(isbuy) == 3 && Exit_Rule3(isbuy) == 3
&& Exit_Rule4(isbuy) == 3 && Exit_Rule5(isbuy) == 3)
{
return(0);
}
else if (Exit_Rule1(isbuy) == 1)
{
return(1);
}
else if (Exit_Rule2(isbuy) == 1)
{
return(1);
}
else if (Exit_Rule3(isbuy) == 1)
{
return(1);
}
else if (Exit_Rule4(isbuy) == 1)
{
return(1);
}
else if (Exit_Rule5(isbuy) == 1)
{
return(1);
}
else
{
return(0);
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 買いポジションの決済総括 |
//+------------------------------------------------------------------+
int Exit2(bool isbuy)
{
if (Exit_Rule1(isbuy) == 3 && Exit_Rule2(isbuy) == 3 && Exit_Rule3(isbuy) == 3
&& Exit_Rule4(isbuy) == 3 && Exit_Rule5(isbuy) == 3)
{
return(0);
}
else if (Exit_Rule1(isbuy) == 2)
{
return(2);
}
else if (Exit_Rule2(isbuy) == 2)
{
return(2);
}
else if (Exit_Rule3(isbuy) == 2)
{
return(2);
}
else if (Exit_Rule4(isbuy) == 2)
{
return(2);
}
else if (Exit_Rule5(isbuy) == 2)
{
return(2);
}
else
{
return(0);
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリールール1 |
//+------------------------------------------------------------------+
int Entry_Rule1(bool isbuy)
{
//エントリールール1
//RSIが指定値以下になったら「買い」、指定値以上になったら「売り」
//かつ、1本前と2本前のRSI値差が指定範囲以内ならエントリー可(価格変動の速度制御)
double RSI1 = iRSI(NULL, PERIOD_M5, RSI_period, PRICE_CLOSE, 1);
double RSI2 = iRSI(NULL, PERIOD_M5, RSI_period, PRICE_CLOSE, 2);
//ウィリアムズ%Rが指定値以下にいる間は「買い」、指定値以上にいる間は「売り」
double WPR1 = iWPR(NULL, PERIOD_M5, WilliamsPR_Gyakubari_period, 1);
double WPR2 = iWPR(NULL, PERIOD_M5, WilliamsPR_Gyakubari_period, 2);
if (isbuy == true && Logic1_Time == true) // ポジション0のときは、テクニカルが指定範囲内でエントリー
{
if ((RSI1 <= RSI_Gyakubari_Line1 && WPR1 < WilliamsPR_BuyExit_Line) ||
(WPR1 <= WilliamsPR_Line1 && RSI1 < RSI_BuyExit_Line))
{
return(1);
} // 買い
}
if (isbuy == false && Logic1_Time == true) // ポジション0のときは、テクニカルが指定範囲内でエントリー
{
if ((RSI1 >= RSI_Gyakubari_Line2 && WPR1 > WilliamsPR_SellExit_Line) ||
(WPR1 >= WilliamsPR_Line2 && RSI1 > RSI_SellExit_Line))
{
return(2);
} // 売り
}
return(0);
// エントリー出来ない
//エントリールール1ココマデ
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター1 |
//+------------------------------------------------------------------+
int Entry_Filter1(bool isbuy)
{
//エントリーフィルター1
//スプレッド&マージンフィルター
double spread = MarketInfo(NULL, MODE_SPREAD);
if(Digits == 3 || Digits == 5)
spread /= 10.0;
double Close0 = iClose(NULL, PERIOD_M5, 0);
double Close1 = iClose(NULL, PERIOD_M5, 1);
if(spread > MaxSpread_pips)
return(0); // スプレッドが指定pips以上でトレード不許可
if(isbuy == true && Close0 - Close1 >= CandleMargin_Pips * xpoint)
return(0); // (現在価格-1本足終値)が、指定pips以上だったら買い禁止
if(isbuy == false && Close1 - Close0 >= CandleMargin_Pips * xpoint)
return(0); // (1本足終値-現在価格)が、指定pips以上だったら売り禁止
else
return(3); // トレード許可
//エントリーフィルター1ココマデ
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター2 |
//+------------------------------------------------------------------+
int Entry_Filter2(bool isbuy)
{
//エントリーフィルター2
//12/24~1/3まではエントリーしない
int NGMonth = Month();
int NGDay = Day();
if (YearendClose == true
&& ((NGMonth == 12 && NGDay >= 24) || (NGMonth == 1 && NGDay <= 3))
)
{
return(0);
} // エントリー出来ない
//エントリーフィルター2ココマデ
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター3 |
//+------------------------------------------------------------------+
int Entry_Filter3(bool isbuy)
{
//エントリーフィルター3
// バンド幅が、指定pips以上ならエントリー可
double UpperBB2 = iBands(NULL, PERIOD_M5, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, 1);
double LowerBB2 = iBands(NULL, PERIOD_M5, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, 1);
if (UpperBB2 - LowerBB2 >= BBMargin * xpoint)
{
return(3);
} // トレード許可
else
{
return(0);
} // トレード不許可
//エントリーフィルター3ココマデ
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター4 |
//+------------------------------------------------------------------+
int Entry_Filter4(bool isbuy)
{
//エントリーフィルター4
// 過去◯本の高値安値の値を取得
double MostHigh;
double MostLow;
int HighestIndex = iHighest(NULL, PERIOD_M5, MODE_HIGH, CandleCheckCount, 1);
int LowestIndex = iLowest(NULL, PERIOD_M5, MODE_LOW , CandleCheckCount, 1);
MostHigh = iHigh(NULL, PERIOD_M5, HighestIndex);
MostLow = iLow(NULL, PERIOD_M5, LowestIndex);
// 過去〇本に〇〇pips以上値動きがあったらエントリー禁止
if (MostHigh - MostLow > HL_Margin_pips * xpoint)
{
return(0);
} // エントリー出来ない
//エントリーフィルター4ココマデ
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター5 |
//+------------------------------------------------------------------+
int Entry_Filter5(bool isbuy)
{
//エントリーフィルター5
int F5_PERIOD = PERIOD_M5;
if (RSI_JUNBARI_TF == 1) F5_PERIOD = PERIOD_M1;
if (RSI_JUNBARI_TF == 2) F5_PERIOD = PERIOD_M5;
if (RSI_JUNBARI_TF == 3) F5_PERIOD = PERIOD_M15;
if (RSI_JUNBARI_TF == 4) F5_PERIOD = PERIOD_M30;
if (RSI_JUNBARI_TF == 5) F5_PERIOD = PERIOD_H1;
if (RSI_JUNBARI_TF == 6) F5_PERIOD = PERIOD_H4;
if (RSI_JUNBARI_TF == 7) F5_PERIOD = PERIOD_D1;
if (RSI_JUNBARI_TF == 8) F5_PERIOD = PERIOD_W1;
if (RSI_JUNBARI_TF == 9) F5_PERIOD = PERIOD_MN1;
// RSIが指定値以上にいる間は「買い」、指定値以下にいる間は「売り」
double RSI0 = iRSI(NULL, F5_PERIOD, 14, PRICE_CLOSE, 1);
// RSIが指定値以上にいる間は「買い」
if (isbuy == true && RSI0 >= RSI_Junbari_Filter_Line)
{
return(1);
} // 買い
// RSIが指定値以下にいる間は「売り」
if (isbuy == false && RSI0 <= 100 - RSI_Junbari_Filter_Line)
{
return(2);
} // 売り
else
{
return(0);
} // エントリー不可
//エントリーフィルター5ココマデ
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター6 |
//+------------------------------------------------------------------+
int Entry_Filter6(bool isbuy)
{
//エントリーフィルター6
int F6_PERIOD = PERIOD_H1;
if (MACD_TF == 1) F6_PERIOD = PERIOD_M1;
if (MACD_TF == 2) F6_PERIOD = PERIOD_M5;
if (MACD_TF == 3) F6_PERIOD = PERIOD_M15;
if (MACD_TF == 4) F6_PERIOD = PERIOD_M30;
if (MACD_TF == 5) F6_PERIOD = PERIOD_H1;
if (MACD_TF == 6) F6_PERIOD = PERIOD_H4;
if (MACD_TF == 7) F6_PERIOD = PERIOD_D1;
if (MACD_TF == 8) F6_PERIOD = PERIOD_W1;
if (MACD_TF == 9) F6_PERIOD = PERIOD_MN1;
// MACD線がゼロ0より上の間は「買い」/ゼロより下の間は「売り」
double MACD_MAIN1 = iMACD(NULL, F6_PERIOD, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1); // 1本前のMACD線
// MACD線がゼロ0より上の間は「買い」
if (isbuy == true && MACD_MAIN1 > 0)
{
return(1);
} // 買い
// MACD線がゼロ0より下の間は「売り」
if (isbuy == false && MACD_MAIN1 < 0)
{
return(2);
} // 売り
else
{
return(0);
}
//エントリーフィルター6ココマデ
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター7 |
//+------------------------------------------------------------------+
int Entry_Filter7(bool isbuy)
{
if (WR_MODE == true)
{
//エントリーフィルター7
int ADX_PERIOD = 240;
if (ADX_TF == 1) ADX_PERIOD = PERIOD_M1;
if (ADX_TF == 2) ADX_PERIOD = PERIOD_M5;
if (ADX_TF == 3) ADX_PERIOD = PERIOD_M15;
if (ADX_TF == 4) ADX_PERIOD = PERIOD_M30;
if (ADX_TF == 5) ADX_PERIOD = PERIOD_H1;
if (ADX_TF == 6) ADX_PERIOD = PERIOD_H4;
if (ADX_TF == 7) ADX_PERIOD = PERIOD_D1;
if (ADX_TF == 8) ADX_PERIOD = PERIOD_W1;
if (ADX_TF == 9) ADX_PERIOD = PERIOD_MN1;
// ADXが指定値以上の時のみエントリー出来る
double ADX1 = iADX(NULL, ADX_PERIOD, 14, PRICE_CLOSE, MODE_MAIN, 1);
double ADX2 = iADX(NULL, ADX_PERIOD, 14, PRICE_CLOSE, MODE_MAIN, 2);
if (ADX1 > ADX_value)// && ADX1 > ADX2 )
{
return(0);
} // エントリー不可
else
{
return(3);
} // エントリー可
}
//エントリーフィルター7ココマデ
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター8 |
//+------------------------------------------------------------------+
int Entry_Filter8(bool isbuy)
{
//エントリーフィルター8
// 各種モード切替
int Week = TimeDayOfWeek(TimeCurrent());
if (WS_MODE == Wednesday && Week == 3 && xxTime == 23)
{
return(0);
}
if (WS_MODE == Thursday && Week == 4 && xxTime == 23)
{
return(0);
}
if (WS_MODE == Wednesday_Thursday && (Week == 3 || Week == 4) && xxTime == 23)
{
return(0);
}
if (NG0_MODE == true && xxTime == 0)
{
return(0);
}
else
{
return(3);
}
//エントリーフィルター8ココマデ
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール1 |
//+------------------------------------------------------------------+
int Exit_Rule1(bool isbuy)
{
// 決済ルール1
//RSIが指定値以上になったら「買いポジション決済」、指定値以下になったら「売りポジション決済」
double WPR1 = iWPR(NULL, PERIOD_M5, WilliamsPR_Gyakubari_period, 1);
// RSIが指定以上になったら買いポジション決済
if (WPR1 >= WilliamsPR_BuyExit_Line)
{
return(2);
}
else if (WPR1 <= WilliamsPR_SellExit_Line)
{
return(1);
}
else
{
return(0);
}
// 決済ルール1ココマデ
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール2 |
//+------------------------------------------------------------------+
int Exit_Rule2(bool isbuy)
{
// 決済ルール2
//RSIが指定値以上になったら「買いポジション決済」、指定値以下になったら「売りポジション決済」
double RSI1 = iRSI(NULL, PERIOD_M5, RSI_period, PRICE_CLOSE, 1);
// RSIが指定以上になったら買いポジション決済
if (RSI1 >= RSI_BuyExit_Line)
{
return(2);
}
else if (RSI1 <= RSI_SellExit_Line)
{
return(1);
}
else
{
return(0);
}
// 決済ルール2ココマデ
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール3 |
//+------------------------------------------------------------------+
int Exit_Rule3(bool isbuy)
{
// 決済ルール3
// 決済ルール3ココマデ
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール4 |
//+------------------------------------------------------------------+
int Exit_Rule4(bool isbuy)
{
// 決済ルール4
// 決済ルール4ココマデ
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール5 |
//+------------------------------------------------------------------+
int Exit_Rule5(bool isbuy)
{
// 決済ルール5
// 決済ルール5ココマデ
return(3);
}
//+------------------------------------------------------------------+