//+------------------------------------------------------------------+ //| MT_Long_USDJPY_M5.mq4 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ //瞬間的なエントリー・決済エラーへの対応 //チャートが途中で停止する可能性がある個所を修正 //複利設定・年末年始のトレード制限の追加 //トレンド判定を追加 //トレーリングストップのロジック変更 #property strict #include #define MAX_ORDER_REPEAT 10 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, //月足 }; enum ENUM_POSITION{ Max_Position_1 = 1, //最大1ポジション Max_Position_2 = 2, //最大2ポジション Max_Position_3 = 3, //最大3ポジション Max_Position_4 = 4 //最大4ポジション }; // 列挙型宣言 enum ENUM_ONOFF{ off = 0, //OFF on = 1 //ON }; //チャート表示部分 datetime EarnPipsTime=0; int HistoryTotal=0; //始値動作部分 static datetime time1 = iTime(NULL,PERIOD_M5,0); static datetime time2 = iTime(NULL,PERIOD_M15,0); static datetime time3 = iTime(NULL,PERIOD_M30,0); static datetime time4 = iTime(NULL,PERIOD_H1,0); // 共通部分 extern string _Common = ""; //▼共通設定 extern ENUM_POSITION Max_position = Max_Position_4; input int Slippage = 10; //Slippage_Point input int MaxSpreadPips = 3; //Spread_Pips double xpoint; double xspread; input int Yearend = 24; // 12/〇~はエントリーなし input int Yearstart = 3; // ~1/〇はエントリーなし extern string _BASIC = ""; //▼複利設定 extern ENUM_ONOFF FukuriOnOff = off; //┣ 複利ロット設定 extern double LotsIncreaceAmt = 1000000.0; //┗ ON時ロット増加証拠金単位 // グローバル変数 double MinLot = 0; // 最小ロット数 double MaxLot = 0; // 最大ロット数 int LotStepDigit = 0; // ロットステップ小数点桁数 //ローソク足始値のみに稼働させる場合は、trueにして下さい。 bool CandleStartStartingEntry = true; bool CandleStartStartingTrailing = true; bool CandleStartStartingExit = true; extern string _Logic = ""; //▼各ロジック設定 // ロジック1 input string __Logic1__ = "Logic1 Parameters"; // ロジック1のパラメータ input int MagicNumber1 = 24071101; input double Lots1 = 0.01; int TakeProfit_pips1 = 100; int StopLoss_pips1 = 160; int Rikaku_pips1 = 30; int Songiri_pips1 = 150; //トレイリングストップのパラメータ int TrailingStopStartPips1 = 20; int TrailingStopPips1 = 30; int BarCountSL1 = 16; // 何本前までのローソク足をチェックするか? int xBarsEntry1 = 0, xBarsExit1 = 0, xBarsTrailing1 = 0; int xxBars1 = 0; //最大ポジション数を、下記で入力指定して下さい。 int maxposition1 = 1; //エントリールールの各変数を下記に貼りつけます。 int RSI_Gyakubari_period = 18; // RSIの計算期間 int RSI_Gyakubari_Line = 60; // 逆張りエントリーの基準となるライン //エントリーフィルターの各変数を下記に貼りつけます。 int MA_Break_period = 220; // 移動平均線の計算期間 int F_BB_Period = 15; // ボリンジャーバンドの計算期間 double F_BB_Hensa = 2.4; // ボリンジャーバンドの偏差 int ADX_Period = 65; // ADXの計算期間 int ADX_Filter_Line = 25; // ADXがこの数値以下の時のみエントリー出来る double Kairi_Judge_percent11 = 2; // 【順張りエントリー可】長期MAに対する乖離〇%以内 double Kairi_Judge_percent21 = 2; // 【逆張りエントリー可】長期MAに対して乖離〇%以上 // double Kairi_Judge_percent21 = 10; // 【逆張りエントリー可】長期MAに対して乖離〇%以上 //決済ルールの各変数を下記に貼りつけます。 int K_RSI_Gyakubari_period = 26; // RSIの計算期間 int K_RSI_Gyakubari_Line = 60; // 逆張りエントリーの基準となるライン int BB_Period = 275; // ボリンジャーバンドの計算期間 double BB_Hensa = 4.2; // ボリンジャーバンドの偏差 int Envelopes_Period = 60; // エンベロープの計算期間 double Envelopes_Deviation = 0.1; // エンベロープの幅偏差 int RSI_Junbari_Filter_period = 35; // RSIの計算期間 int RSI_Junbari_Filter_Line = 75; // 順張りエントリーの基準となるライン // ロジック2 input string __Logic2__ = "Logic2 Parameters"; // ロジック2のパラメータ input int MagicNumber2 = 24071102; input double Lots2 = 0.01; int TakeProfit_pips2 = 400; int StopLoss_pips2 = 50; int Rikaku_pips2 = 390; int Songiri_pips2 = 50; //トレイリングストップのパラメータ int TrailingStopStartPips2 = 200; int TrailingStopPips2 = 100; int BarCountSL2 = 75; // 何本前までのローソク足をチェックするか? int xBarsEntry2 = 0, xBarsExit2 = 0, xBarsTrailing2 = 0; int xxBars2 = 0; //最大ポジション数を、下記で入力指定して下さい。 int maxposition2 = 1; //エントリールールの各変数を下記に貼りつけます。 int MA_Cross_period1 = 15; // 短期移動平均線 int MA_Cross_period2 = 100; // 長期移動平均線 //エントリーフィルターの各変数を下記に貼りつけます。 int F_BB_Period2 = 45; // ボリンジャーバンドの計算期間 double F_BB_Hensa2 = 1.9; // ボリンジャーバンドの偏差 int RSI_Filter_period = 9; // RSIの計算期間 int RSI_Filter_Line = 28; // 逆張りエントリーの基準となるライン int F_MA_Cross_period1 = 10; // 短期移動平均線 int F_MA_Cross_period2 = 30; // 長期移動平均線 int ADX_Period2 = 70; // ±DIの計算期間 int ADX_Filter_Line2 = 25; // ±DIの指定値以上ライン int ATR_Period = 25; // ATRの計算期間 double ATR_Filter_Line = 1; // ATRがこの数値以下の時のみエントリー出来る double Kairi_Judge_percent12 = 3.2; // 【順張りエントリー可】長期MAに対する乖離〇%以内 double Kairi_Judge_percent22 = 3; // 【逆張りエントリー可】長期MAに対して乖離〇%以上 // double Kairi_Judge_percent22 = 10; // 【逆張りエントリー可】長期MAに対して乖離〇%以上 //決済ルールの各変数を下記に貼りつけます。 int BB_Period2 = 120; // ボリンジャーバンドの計算期間 double BB_Hensa2 = 2.5; // ボリンジャーバンドの偏差 // ロジック3 input string __Logic3__ = "Logic3 Parameters"; // ロジック3のパラメータ input int MagicNumber3 = 24071103; input double Lots3 = 0.01; int TakeProfit_pips3 = 220; int StopLoss_pips3 = 90; int Rikaku_pips3 = 210; int Songiri_pips3 = 70; //トレイリングストップのパラメータ int TrailingStopStartPips3 = 90; int TrailingStopPips3 = 20; int BarCountSL3 = 15; // 何本前までのローソク足をチェックするか? int xBarsEntry3 = 0, xBarsExit3 = 0, xBarsTrailing3 = 0; int xxBars3 = 0; //最大ポジション数を、下記で入力指定して下さい。 int maxposition3 = 1; //エントリールールの各変数を下記に貼りつけます。 int Fast_EMA_period = 14; // 短期EMA期間(MACD) int Slow_EMA_period = 22; // 短期EMA期間(MACD) int Signal_period = 16; // シグナル期間(MACD) //エントリーフィルターの各変数を下記に貼りつけます。 int F_BB_Period3 = 70; // ボリンジャーバンドの計算期間 double F_BB_Hensa3 = 0.9; // ボリンジャーバンドの偏差 double F_BB_HabaFilter_percent3 = 1.1; // ボリンジャーバンドの幅%(幅フィルター) int CCI_period = 60; // CCIの計算期間 double Kairi_Judge_percent13 = 3; // 【順張りエントリー可】長期MAに対する乖離〇%以内 // double Kairi_Judge_percent23 = 0.8; // 【逆張りエントリー可】長期MAに対して乖離〇%以上 double Kairi_Judge_percent23 = 1.5; // 【逆張りエントリー可】長期MAに対して乖離〇%以上 //決済ルールの各変数を下記に貼りつけます。 double SAR_Entry_Step = 0.001; // パラボリックSARのステップ(パラメータ) double SAR_Entry_Maximum = 0.2; // パラボリックSARの上限値(パラメータ) // ロジック4 input string __Logic4__ = "Logic4 Parameters"; // ロジック4のパラメータ input int MagicNumber4 = 24071104; input double Lots4 = 0.01; int TakeProfit_pips4 = 320; int StopLoss_pips4 = 120; int Rikaku_pips4 = 320; int Songiri_pips4 = 60; //トレイリングストップのパラメータ int TrailingStopStartPips4 = 100; int TrailingStopPips4 = 70; int BarCountSL4 = 1000; // 何本前までのローソク足をチェックするか? int xBarsEntry4 = 0, xBarsExit4 = 0, xBarsTrailing4 = 0; int xxBars4 = 0; //最大ポジション数を、下記で入力指定して下さい。 int maxposition4 = 1; //エントリールールの各変数を下記に貼りつけます。 double SAR_Entry_Step4 = 0.005; // パラボリックSARのステップ(パラメータ) double SAR_Entry_Maximum4 = 0.2; // パラボリックSARの上限値(パラメータ) //エントリーフィルターの各変数を下記に貼りつけます。 int BB_Period4 = 50; // ボリンジャーバンドの計算期間 double BB_Hensa4 = 1.0; // ボリンジャーバンドの偏差 double BB_HabaFilter_percent4 = 1; // ボリンジャーバンドの幅%(幅フィルター) double Kairi_Judge_percent14 = 3.75; // 【順張りエントリー可】長期MAに対する乖離〇%以内 double Kairi_Judge_percent24 = 2; // 【逆張りエントリー可】長期MAに対して乖離〇%以上 //決済ルールの各変数を下記に貼りつけます。 double K_SAR_Entry_Step4 = 0.005; // パラボリックSARのステップ(パラメータ) int K_BB_Period14 = 24; // ボリンジャーバンドの計算期間 double K_BB_Hensa14 = 0.8; // ボリンジャーバンドの偏差 int K_BB_Period24 = 10; // ボリンジャーバンドの計算期間 double K_BB_Hensa24 = 1.0; // ボリンジャーバンドの偏差 //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int OnInit() { ObjectsDeleteAll(0, "TotalEarnPips"); label("TotalEarnPips"," Total Profit(Pips) ",0,25,0,10,CORNER_RIGHT_UPPER,ANCHOR_RIGHT); ObjectSetInteger(0,"TotalEarnPips", OBJPROP_COLOR, clrWhite); label("TotalEarnPips"+IntegerToString(MagicNumber1),"----",0,40,0,10,CORNER_RIGHT_UPPER,ANCHOR_RIGHT); label("TotalEarnPips"+IntegerToString(MagicNumber2),"----",0,55,0,10,CORNER_RIGHT_UPPER,ANCHOR_RIGHT); label("TotalEarnPips"+IntegerToString(MagicNumber3),"----",0,70,0,10,CORNER_RIGHT_UPPER,ANCHOR_RIGHT); label("TotalEarnPips"+IntegerToString(MagicNumber4),"----",0,85,0,10,CORNER_RIGHT_UPPER,ANCHOR_RIGHT); HistoryEarnPips(MagicNumber1); HistoryEarnPips(MagicNumber2); HistoryEarnPips(MagicNumber3); HistoryEarnPips(MagicNumber4); SetChart(); // 小数点以下の桁数に応じてPipsの値を調整する xpoint = Point(); if (Digits() == 3 || Digits() == 5) { xpoint = xpoint * 10; } // ロットステップを取得 double LotStep = MarketInfo(Symbol(),MODE_LOTSTEP); if(LotStep == 1) LotStepDigit = 0; else if(LotStep == 0.1) LotStepDigit = 1; else LotStepDigit = 2; // 口座の最小・最大ロット数を取得 MinLot = MarketInfo(Symbol(),MODE_MINLOT); MaxLot = MarketInfo(Symbol(),MODE_MAXLOT); //使用しているインジケータを非表示にする HideTestIndicators(true); return(0); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // ロジック1 //バー始値制限処理 if(iTime(NULL,PERIOD_M5,0) != time1){ if (Lots1 > 0 && (Count_Position(MagicNumber2)+Count_Position(MagicNumber3)+Count_Position(MagicNumber4)<= Max_position-1 || Count_Position(MagicNumber1)==1)){ Logic(MagicNumber1, // マジックナンバー 1, // ロジック番号 Songiri_pips1, // 損切りpips Rikaku_pips1, // 利確pips CandleStartStartingExit, // 決済を始値動作とするか xBarsExit1, // 最後に決済を確認した足 Lots1, // エントリーロット数 StopLoss_pips1, // 損切りpips(逆指値) TakeProfit_pips1, // 利確pips(指値) maxposition1, // 最大ポジション数 CandleStartStartingEntry, // エントリーを始値動作とするか xBarsEntry1, // 最後にエントリーを確認した足 xxBars1, // 最後にエントリーを実施した足 TrailingStopStartPips1, // トレーリングストップを開始するpips TrailingStopPips1, // トレーリングストップの幅(pips) BarCountSL1, // 何本前までのローソク足をチェックするか? CandleStartStartingTrailing, // トレーリングを始値動作とするか xBarsTrailing1 // 最後にトレーリングを確認した足 ); } //今回のバー形成開始時刻記憶 time1 = iTime(NULL,PERIOD_M5,0); } // ロジック2 //バー始値制限処理 if(iTime(NULL,PERIOD_M15,0) != time2){ if (Lots2 > 0 && (Count_Position(MagicNumber1)+Count_Position(MagicNumber3)+Count_Position(MagicNumber4)<= Max_position-1 || Count_Position(MagicNumber2)==1)){ Logic(MagicNumber2, // マジックナンバー 2, // ロジック番号 Songiri_pips2, // 損切りpips Rikaku_pips2, // 利確pips CandleStartStartingExit, // 決済を始値動作とするか xBarsExit2, // 最後に決済を確認した足 Lots2, // エントリーロット数 StopLoss_pips2, // 損切りpips(逆指値) TakeProfit_pips2, // 利確pips(指値) maxposition2, // 最大ポジション数 CandleStartStartingEntry, // エントリーを始値動作とするか xBarsEntry2, // 最後にエントリーを確認した足 xxBars2, // 最後にエントリーを実施した足 TrailingStopStartPips2, // トレーリングストップを開始するpips TrailingStopPips2, // トレーリングストップの幅(pips) BarCountSL2, // 何本前までのローソク足をチェックするか? CandleStartStartingTrailing, // トレーリングを始値動作とするか xBarsTrailing2 // 最後にトレーリングを確認した足 ); } //今回のバー形成開始時刻記憶 time2 = iTime(NULL,PERIOD_M15,0); } // ロジック3 //バー始値制限処理 if(iTime(NULL,PERIOD_M30,0) != time3){ if (Lots3 > 0 && (Count_Position(MagicNumber1)+Count_Position(MagicNumber2)+Count_Position(MagicNumber4)<= Max_position-1 || Count_Position(MagicNumber3)==1)){ Logic(MagicNumber3, // マジックナンバー 3, // ロジック番号 Songiri_pips3, // 損切りpips Rikaku_pips3, // 利確pips CandleStartStartingExit, // 決済を始値動作とするか xBarsExit3, // 最後に決済を確認した足 Lots3, // エントリーロット数 StopLoss_pips3, // 損切りpips(逆指値) TakeProfit_pips3, // 利確pips(指値) maxposition3, // 最大ポジション数 CandleStartStartingEntry, // エントリーを始値動作とするか xBarsEntry3, // 最後にエントリーを確認した足 xxBars3, // 最後にエントリーを実施した足 TrailingStopStartPips3, // トレーリングストップを開始するpips TrailingStopPips3, // トレーリングストップの幅(pips) BarCountSL3, // 何本前までのローソク足をチェックするか? CandleStartStartingTrailing, // トレーリングを始値動作とするか xBarsTrailing3 // 最後にトレーリングを確認した足 ); } //今回のバー形成開始時刻記憶 time3 = iTime(NULL,PERIOD_M30,0); } // ロジック4 //バー始値制限処理 if(iTime(NULL,PERIOD_H1,0) != time4){ if (Lots4 > 0 && (Count_Position(MagicNumber1)+Count_Position(MagicNumber2)+Count_Position(MagicNumber3)<= Max_position-1 || Count_Position(MagicNumber4)==1)){ Logic(MagicNumber4, // マジックナンバー 4, // ロジック番号 Songiri_pips4, // 損切りpips Rikaku_pips4, // 利確pips CandleStartStartingExit, // 決済を始値動作とするか xBarsExit4, // 最後に決済を確認した足 Lots4, // エントリーロット数 StopLoss_pips4, // 損切りpips(逆指値) TakeProfit_pips4, // 利確pips(指値) maxposition4, // 最大ポジション数 CandleStartStartingEntry, // エントリーを始値動作とするか xBarsEntry4, // 最後にエントリーを確認した足 xxBars4, // 最後にエントリーを実施した足 TrailingStopStartPips4, // トレーリングストップを開始するpips TrailingStopPips4, // トレーリングストップの幅(pips) BarCountSL4, // 何本前までのローソク足をチェックするか? CandleStartStartingTrailing, // トレーリングを始値動作とするか xBarsTrailing4 // 最後にトレーリングを確認した足 ); } //今回のバー形成開始時刻記憶 time4 = iTime(NULL,PERIOD_H1,0); } if(EarnPipsTime != iTime(NULL,PERIOD_M5,0) && Seconds() > 30){ HistoryEarnPips(MagicNumber1); HistoryEarnPips(MagicNumber2); HistoryEarnPips(MagicNumber3); HistoryEarnPips(MagicNumber4); EarnPipsTime = iTime(NULL,PERIOD_M5,0); } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Logic | //+------------------------------------------------------------------+ void Logic(int magic, // マジックナンバー int logic, // ロジック番号 // 決済用パラメータ int songiri_pips, // 損切りpips int rikaku_pips, // 利確pips bool candlestartingexit, // 決済を始値動作とするか int& xbarsexit, // 最後に決済を確認した足 // エントリー用パラメータ double lots, // エントリーロット数 int stoploss_pips, // 損切りpips(逆指値) int takeprofit_pips, // 利確pips(指値) int maxpos, // 最大ポジション数 bool candlestartingentry, // エントリーを始値動作とするか int& xbarsentry, // 最後にエントリーを確認した足 int& xxbars, // 最後にエントリーを実施した足 // トレーリングストップ用パラメータ int trailingstopstartpips, // トレーリングストップを開始するpips int trailingstoppips, // トレーリングストップの幅(pips) int BarCountSL, // 何本前までのローソク足をチェックするか? bool candlestartingtrailing, // トレーリングを始値動作とするか int& xbarstrailing // 最後にトレーリングを確認した足 ) { // ポジションをクローズ PositionClose(magic, logic, songiri_pips, rikaku_pips, candlestartingexit, xbarsexit ); // ポジションのエントリー PositionOpen(magic, logic, lots, stoploss_pips, takeprofit_pips, maxpos, candlestartingentry, xbarsentry, xxbars ); // トレーリング Trailing(magic, logic, trailingstopstartpips, trailingstoppips, BarCountSL, candlestartingtrailing, xbarstrailing ); // TP, SLの再設定 SetTPSL(magic, stoploss_pips, takeprofit_pips ); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ポジションのクローズ | //+------------------------------------------------------------------+ void PositionClose(int magic, // マジックナンバー int logic, // ロジック番号 int songiri_pips, // 損切りpips int rikaku_pips, // 利確pips bool candlestartingexit, // 決済を始値動作とするか int& xbarsexit // 最後に決済を確認した足 ) { int i; double profit; bool res; // 決済判断のローソク足始値のみ稼働(選択式) if(Bars != xbarsexit || candlestartingexit == false) { xbarsexit = 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() != magic) continue; if (OrderType() == OP_BUY) { profit = Bid - OrderOpenPrice(); // 買いポジションだった場合の、含み損益を計算する // オーダーを成り行き決済する if (profit >= rikaku_pips * xpoint || profit <= -songiri_pips * xpoint || Exit2(logic) == 2) { res = WrapperOrderClose_L(OrderTicket(), OrderLots(), Bid, Slippage*100, Green); } } if (OrderType() == OP_SELL) { profit = OrderOpenPrice() - Ask; // 売りポジションだった場合の、含み損益を計算する // オーダーを成り行き決済する if (profit >= rikaku_pips * xpoint || profit <= -songiri_pips * xpoint || Exit1(logic) == 1) { res = WrapperOrderClose_S(OrderTicket(), OrderLots(), Ask, Slippage*100, Green); } } } } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ポジションのオープン | //+------------------------------------------------------------------+ void PositionOpen(int magic, // マジックナンバー int logic, // ロジック番号 double lots, // エントリーロット数 int stoploss_pips, // 損切りpips(逆指値) int takeprofit_pips, // 利確pips(指値) int maxpos, // 最大ポジション数 bool candlestartingentry, // エントリーを始値動作とするか int& xbarsentry, // 最後にエントリーを確認した足 int& xxbars // 最後にエントリーを実施した足 ) { int i; int ticket; int CountBuy = 0,CountSell = 0; bool res; // エントリー判断のローソク足始値のみ稼働(選択式) if(Bars != xbarsentry || candlestartingentry == 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() != magic) continue; if (OrderType() == OP_BUY) { CountBuy = CountBuy + 1; } if (OrderType() == OP_SELL) { CountSell = CountSell + 1; } } //スプレッド確認 xspread = (Ask - Bid) / xpoint; //12/〇~1/〇はエントリーなし int NGMonth = Month(); int NGDay = Day(); if ((NGMonth == 12 && NGDay >= Yearend ) || (NGMonth == 1 && NGDay <= Yearstart)) { return; } // エントリー出来ない // オーダーロット数を算出 if(FukuriOnOff == on){ lots = CalcAutoLot(lots); } // エントリー条件を確認し、成立していればエントリーを行う if (Entry(logic) == 1 && CountBuy < maxpos && xxbars != Bars && xspread <= MaxSpreadPips ) { ticket = WrapperOrderSend_L(Symbol(), OP_BUY, lots, Ask, Slippage, 0, 0, "MT_Long_USDJPY", magic, 0, Blue); // エントリーに成功していれば、TP, SLをセットする if (ticket != -1) { // チケットを使ってオーダーを選択(エラーを生じた場合、何もしない) if( OrderSelect( ticket, SELECT_BY_TICKET ) == true ) { res = WrapperOrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - stoploss_pips * xpoint, OrderOpenPrice() + takeprofit_pips * xpoint, 0, MediumSeaGreen); } } xxbars = Bars; } else if (Entry(logic) == 2 && CountSell < maxpos && xxbars != Bars && xspread <= MaxSpreadPips ) { ticket = WrapperOrderSend_S(Symbol(), OP_SELL, lots, Bid, Slippage, 0, 0, "Sell", magic, 0, Red); // エントリーに成功していれば、TP, SLをセットする if (ticket != -1) { // チケットを使ってオーダーを選択(エラーを生じた場合、何もしない) if( OrderSelect( ticket, SELECT_BY_TICKET ) == true ) { res = WrapperOrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + stoploss_pips * xpoint, OrderOpenPrice() - takeprofit_pips * xpoint, 0, MediumSeaGreen); } } xxbars = Bars; } } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| トレーリング | //+------------------------------------------------------------------+ void Trailing(int magic, // マジックナンバー int logic, // ロジック番号 int trailingstopstartpips, // トレーリングストップを開始するpips int trailingstoppips, // トレーリングストップの幅(pips) int BarCountSL, // 何本前までのローソク足をチェックするか? bool candlestartingtrailing, // トレーリングを始値動作とするか int& xbarstrailing // 最後にトレーリングを確認した足 ) { int i; double profit; bool res; // トレーリングのローソク足始値のみ稼働(選択式) if(Bars != xbarstrailing || candlestartingtrailing == 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() != magic) continue; if (OrderType() == OP_BUY) { profit = Bid - OrderOpenPrice(); // 買いポジションだった場合の含み損益を計算する double LowSL = iLow(NULL, 0, (iLowest(NULL, 0, MODE_LOW, BarCountSL, 1))); double SL_step = MathMax(LowSL, NormalizeDouble(Bid - trailingstoppips * xpoint, Digits())); SL_step = NormalizeDouble(SL_step, Digits()); // TrailingStopを確認する if (profit >= trailingstopstartpips * xpoint && OrderStopLoss() < SL_step) { res = WrapperOrderModify(OrderTicket(), OrderOpenPrice(), SL_step, OrderTakeProfit(), 0, Green); } } if (OrderType() == OP_SELL) { profit = OrderOpenPrice() - Ask; // 売りポジションだった場合の含み損益を計算する double HighSL = iHigh(NULL, 0, (iHighest(NULL, 0, MODE_HIGH, BarCountSL, 1))); double SL_step = MathMin(HighSL, NormalizeDouble(Ask + trailingstoppips * xpoint, Digits())); SL_step = NormalizeDouble(SL_step, Digits()); // TrailingStopを確認する if (profit >= trailingstopstartpips * xpoint && OrderStopLoss() > SL_step ) { res = WrapperOrderModify(OrderTicket(), OrderOpenPrice(), SL_step, OrderTakeProfit(), 0, Green); } } } } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| TakeProfit, StopLoss | //+------------------------------------------------------------------+ void SetTPSL(int magic, // マジックナンバー int stoploss_pips, // 損切りpips(逆指値) int takeprofit_pips // 利確pips(指値) ) { 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() != magic) continue; // 買いポジションの場合 if (OrderType() == OP_BUY) { profit = Bid - OrderOpenPrice(); // 買いポジションだった場合の、含み損益を計算する // TP, SLがどちらも設定されていなければ、TP, SLを設定する if (OrderStopLoss() == 0 && OrderTakeProfit() == 0) { res = WrapperOrderModify(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 = WrapperOrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + stoploss_pips * xpoint, OrderOpenPrice() - takeprofit_pips * xpoint, 0, MediumSeaGreen); } } } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリー総括 | //+------------------------------------------------------------------+ int Entry(int logic) { int rule; int filter1, filter2, filter3, filter4, filter5, filter6; // ロジック1 if (logic == 1) { rule = Entry_Rule1_1(); filter1 = Entry_Filter1_1(); filter2 = Entry_Filter1_2(); filter3 = Entry_Filter1_3(); filter4 = Entry_Filter1_4(); filter5 = Entry_Filter1_5(); filter6 = 3; } // ロジック2 else if (logic == 2) { rule = Entry_Rule2_1(); filter1 = Entry_Filter2_1(); filter2 = Entry_Filter2_2(); filter3 = Entry_Filter2_3(); filter4 = Entry_Filter2_4(); filter5 = Entry_Filter2_5(); filter6 = Entry_Filter2_6(); } // ロジック3 else if (logic == 3) { rule = Entry_Rule3_1(); filter1 = Entry_Filter3_1(); filter2 = Entry_Filter3_2(); filter3 = Entry_Filter3_3(); filter4 = Entry_Filter3_4(); filter5 = Entry_Filter3_5(); filter6 = 3; } // ロジック4 else if (logic == 4) { rule = Entry_Rule4_1(); filter1 = Entry_Filter4_1(); filter2 = Entry_Filter4_2(); filter3 = Entry_Filter4_3(); filter4 = Entry_Filter4_4(); filter5 = Entry_Filter4_5(); filter6 = 3; } // それ以外を指定した場合、ロジック1 else { rule = Entry_Rule1_1(); filter1 = Entry_Filter1_1(); filter2 = Entry_Filter1_2(); filter3 = Entry_Filter1_3(); filter4 = Entry_Filter1_4(); filter5 = Entry_Filter1_5(); filter6 = 3; } // エントリー判断 if (rule == 1 && (filter1 == 1 || filter1 == 3) && (filter2 == 1 || filter2 == 3) && (filter3 == 1 || filter3 == 3) && (filter4 == 1 || filter4 == 3) && (filter5 == 1 || filter5 == 3) && (filter6 == 1 || filter6 == 3) ) { return(1); } else if (rule == 2 && (filter1 == 2 || filter1 == 3) && (filter2 == 2 || filter2 == 3) && (filter3 == 2 || filter3 == 3) && (filter4 == 2 || filter4 == 3) && (filter5 == 2 || filter5 == 3) && (filter6 == 2 || filter6 == 3) ) { return(2); } else { return(0); } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 売りポジションの決済総括 | //+------------------------------------------------------------------+ int Exit1(int logic) { int rule1, rule2, rule3, rule4, rule5; // ロジック1 if (logic == 1) { rule1 = Exit_Rule1_1(); rule2 = Exit_Rule1_2(); rule3 = Exit_Rule1_3(); rule4 = Exit_Rule1_4(); rule5 = Exit_Rule1_5(); } // ロジック2 else if (logic == 2) { rule1 = Exit_Rule2_1(); rule2 = Exit_Rule2_2(); rule3 = Exit_Rule2_3(); rule4 = Exit_Rule2_4(); rule5 = Exit_Rule2_5(); } // ロジック3 else if (logic == 3) { rule1 = Exit_Rule3_1(); rule2 = Exit_Rule3_2(); rule3 = Exit_Rule3_3(); rule4 = Exit_Rule3_4(); rule5 = Exit_Rule3_5(); } // ロジック4 else if (logic == 4) { rule1 = Exit_Rule4_1(); rule2 = Exit_Rule4_2(); rule3 = Exit_Rule4_3(); rule4 = Exit_Rule4_4(); rule5 = Exit_Rule4_5(); } // それ以外を指定した場合、ロジック1 else { rule1 = Exit_Rule1_1(); rule2 = Exit_Rule1_2(); rule3 = Exit_Rule1_3(); rule4 = Exit_Rule1_4(); rule5 = Exit_Rule1_5(); } // エントリールールが無い if (rule1 == 3 && rule2 == 3 && rule3 == 3 && rule4 == 3 && rule5 == 3) { return(0); } // エントリールール成立 else if (rule1 == 1 || rule2 == 1 || rule3 == 1 || rule4 == 1 || rule5 == 1) { return(1); } // エントリールール不成立 else { return(0); } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 買いポジションの決済総括 | //+------------------------------------------------------------------+ int Exit2(int logic) { int rule1, rule2, rule3, rule4, rule5; // ロジック1 if (logic == 1) { rule1 = Exit_Rule1_1(); rule2 = Exit_Rule1_2(); rule3 = Exit_Rule1_3(); rule4 = Exit_Rule1_4(); rule5 = Exit_Rule1_5(); } // ロジック2 else if (logic == 2) { rule1 = Exit_Rule2_1(); rule2 = Exit_Rule2_2(); rule3 = Exit_Rule2_3(); rule4 = Exit_Rule2_4(); rule5 = Exit_Rule2_5(); } // ロジック3 else if (logic == 3) { rule1 = Exit_Rule3_1(); rule2 = Exit_Rule3_2(); rule3 = Exit_Rule3_3(); rule4 = Exit_Rule3_4(); rule5 = Exit_Rule3_5(); } // ロジック4 else if (logic == 4) { rule1 = Exit_Rule4_1(); rule2 = Exit_Rule4_2(); rule3 = Exit_Rule4_3(); rule4 = Exit_Rule4_4(); rule5 = Exit_Rule4_5(); } // それ以外を指定した場合、ロジック1 else { rule1 = Exit_Rule1_1(); rule2 = Exit_Rule1_2(); rule3 = Exit_Rule1_3(); rule4 = Exit_Rule1_4(); rule5 = Exit_Rule1_5(); } // エントリールールが無い if (rule1 == 3 && rule2 == 3 && rule3 == 3 && rule4 == 3 && rule5 == 3) { return(0); } // エントリールール成立 else if (rule1 == 2 || rule2 == 2 || rule3 == 2 || rule4 == 2 || rule5 == 2) { return(2); } // エントリールール不成立 else { return(0); } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ロジック1 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリールール1 (ロジック1) | //+------------------------------------------------------------------+ int Entry_Rule1_1() { //エントリールール1を差し替える時は、下記を差し替えて下さい。 //RSIが指定値以下になったら「買い」、指定値以上になったら「売り」 double RSI0 = iRSI(NULL,PERIOD_M5, RSI_Gyakubari_period, PRICE_CLOSE, 1); double RSI1 = iRSI(NULL,PERIOD_M5, RSI_Gyakubari_period, PRICE_CLOSE, 2); //「RSI_Gyakubari_Entry_Entry_Line=70」の場合、RSIが30以下になったら買い if (RSI0 <= 100 - RSI_Gyakubari_Line && RSI1 > 100 - RSI_Gyakubari_Line) // if (RSI0 >= 100 - RSI_Gyakubari_Line && RSI1 < 100 - RSI_Gyakubari_Line) { return(1); } // 買い // 「RSI_Gyakubari_Entry_Entry_Line=70」の場合、RSIが70以上になったら売り else if (RSI0 >= RSI_Gyakubari_Line && RSI1 < RSI_Gyakubari_Line) // else if (RSI0 <= RSI_Gyakubari_Line && RSI1 > RSI_Gyakubari_Line) { return(0); } // 売り else { return(0); } //エントリールール1を差し替える時は、ココマデを差し替えて下さい。 } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター1 (ロジック1) | //+------------------------------------------------------------------+ int Entry_Filter1_1() { //エントリーフィルター1を差し替える時は、下記を差し替えて下さい。 //ローソク足が、移動平均線を上抜いたら「買い」、下抜いたら「売り」 double MA1 = iMA(NULL, PERIOD_M5, MA_Break_period, 0, MODE_SMA, PRICE_CLOSE, 1); double MA2 = iMA(NULL, PERIOD_M5, MA_Break_period, 0, MODE_SMA, PRICE_CLOSE, 2); // ローソク足が、移動平均線を上抜いたら「買い」 if (MA1 < iClose(NULL,PERIOD_M5,1)) { return(1); } // 買い // ローソク足が、移動平均線を下抜いたら「売り」 else if (MA1 > iClose(NULL,PERIOD_M5,1)) { return(2); } // 売り else { return(0); } //エントリーフィルター1を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター2 (ロジック1) | //+------------------------------------------------------------------+ int Entry_Filter1_2() { //エントリーフィルター2を差し替える時は、下記を差し替えて下さい。 //ローソク足の終値が、ボリンジャーバンドより内側にある時のみ、エントリーすることが可能 double UpperBB1 = iBands(NULL,PERIOD_M5, F_BB_Period, F_BB_Hensa, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB1 = iBands(NULL,PERIOD_M5, F_BB_Period, F_BB_Hensa, 0, PRICE_CLOSE, MODE_LOWER, 1); //ローソク足の終値が、ボリンジャーバンドより内側にある時のみ、エントリーすることが可能 if(iClose(NULL,PERIOD_M5,1) < UpperBB1 && iClose(NULL,PERIOD_M5,1) > LowerBB1) { return(3); } // エントリー出来る(フィルター) else { return(0); } //エントリーフィルター2を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター3 (ロジック1) | //+------------------------------------------------------------------+ int Entry_Filter1_3() { //エントリーフィルター3を差し替える時は、下記を差し替えて下さい。 // ADXがこの数値以下の時のみエントリー出来る double ADX = iADX(NULL,PERIOD_M5, ADX_Period, PRICE_CLOSE, MODE_MAIN, 1); if (ADX <= ADX_Filter_Line) { return(3); } // エントリー出来る else { return(0); } // エントリー出来ない //エントリーフィルター3を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター4 (ロジック1) | //+------------------------------------------------------------------+ int Entry_Filter1_4() { //エントリーフィルター4を差し替える時は、下記を差し替えて下さい。 // アップトレンドで「買い」 if ((Trend_Judge() >=2 && Kairi_Judge() <= Kairi_Judge_percent11)|| Kairi_Judge() <= -Kairi_Judge_percent21) { return(1); } // 買い // ダウントレンドで「売り」 else if ((Trend_Judge()<=1 && Trend_Judge()>= -Kairi_Judge_percent11 )|| Trend_Judge()>= Kairi_Judge_percent21) { return(2); } // 売り else { return(0); } //エントリーフィルター4を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター5 (ロジック1) | //+------------------------------------------------------------------+ int Entry_Filter1_5() { //エントリーフィルター5を差し替える時は、下記を差し替えて下さい。 //エントリーフィルター5を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール1 (ロジック1) | //+------------------------------------------------------------------+ int Exit_Rule1_1() { // 決済ルール1を差し替える時は、下記を差し替えて下さい。 //RSIが指定値以下になったら「買い」、指定値以上になったら「売り」 double RSI0 = iRSI(NULL,PERIOD_M5, K_RSI_Gyakubari_period, PRICE_CLOSE, 1); double RSI1 = iRSI(NULL,PERIOD_M5, K_RSI_Gyakubari_period, PRICE_CLOSE, 2); //「RSI_Gyakubari_Entry_Entry_Line=70」の場合、RSIが30以下になったら買い if (RSI0 <= 100 - K_RSI_Gyakubari_Line && RSI1 > 100 - K_RSI_Gyakubari_Line) { return(1); } // 買い // 「RSI_Gyakubari_Entry_Entry_Line=70」の場合、RSIが70以上になったら売り else if (RSI0 >= K_RSI_Gyakubari_Line && RSI1 < K_RSI_Gyakubari_Line) { return(2); } // 売り else { return(0); } // 決済ルール1を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール2 (ロジック1) | //+------------------------------------------------------------------+ int Exit_Rule1_2() { // 決済ルール2を差し替える時は、下記を差し替えて下さい。 //ローソク足が、下側のボリンジャーバンドを下抜いたら「買い」、上側のボリンジャーバンドを上抜いたら「売り」 double UpperBB1 = iBands(NULL,PERIOD_M5, BB_Period, BB_Hensa, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB1 = iBands(NULL,PERIOD_M5, BB_Period, BB_Hensa, 0, PRICE_CLOSE, MODE_LOWER, 1); double UpperBB2 = iBands(NULL,PERIOD_M5, BB_Period, BB_Hensa, 0, PRICE_CLOSE, MODE_UPPER, 2); double LowerBB2 = iBands(NULL,PERIOD_M5 ,BB_Period, BB_Hensa, 0, PRICE_CLOSE, MODE_LOWER, 2); //ローソク足が、下側のボリンジャーバンドを下抜いたら「買い」 if (iClose(NULL,PERIOD_M5,1) < LowerBB1 && iClose(NULL,PERIOD_M5,2) > LowerBB2) { return(2); } // 買い //ローソク足が、上側のボリンジャーバンドを上抜いたら「売り」 else if (iClose(NULL,PERIOD_M5,1) > UpperBB1 && iClose(NULL,PERIOD_M5,2) < UpperBB2) { return(1); } // 売り else { return(0); } // 決済ルール2を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール3 (ロジック1) | //+------------------------------------------------------------------+ int Exit_Rule1_3() { // 決済ルール3を差し替える時は、下記を差し替えて下さい。 //下側エンベロープに終値がタッチで「買い」、上側にタッチで「売り」 double UpperEnvelopes1 = iEnvelopes(NULL,PERIOD_M5, Envelopes_Period, MODE_SMA, 0, PRICE_CLOSE, Envelopes_Deviation, MODE_UPPER, 1); double LowerEnvelopes1 = iEnvelopes(NULL,PERIOD_M5, Envelopes_Period, MODE_SMA, 0, PRICE_CLOSE, Envelopes_Deviation, MODE_LOWER, 1); double UpperEnvelopes2 = iEnvelopes(NULL,PERIOD_M5, Envelopes_Period, MODE_SMA, 0, PRICE_CLOSE, Envelopes_Deviation, MODE_UPPER, 2); double LowerEnvelopes2 = iEnvelopes(NULL,PERIOD_M5, Envelopes_Period, MODE_SMA, 0, PRICE_CLOSE, Envelopes_Deviation, MODE_LOWER, 2); //下側エンベロープに終値がタッチで「買い」 // if(iClose(NULL,EA_PERIOD,1) > LowerEnvelopes1 && iClose(NULL,EA_PERIOD,2) < LowerEnvelopes2) if(iClose(NULL,PERIOD_M5,1) > LowerEnvelopes1 && iClose(NULL,PERIOD_M5,2) < LowerEnvelopes2) { return(1); } // 買い //上側エンベロープに終値がタッチで「売り」 else if(iClose(NULL,PERIOD_M5,1) < UpperEnvelopes1 && iClose(NULL,PERIOD_M5,2) > UpperEnvelopes2) { return(2); } // 売り else { return(0); } // 決済ルール3を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール4 (ロジック1) | //+------------------------------------------------------------------+ int Exit_Rule1_4() { // 決済ルール4を差し替える時は、下記を差し替えて下さい。 // RSIが指定値以上にいる間は「買い」、指定値以下にいる間は「売り」 double RSI0 = iRSI(NULL, PERIOD_M5, RSI_Junbari_Filter_period, PRICE_CLOSE, 1); // RSIが指定値以上にいる間は「買い」 if (RSI0 >= RSI_Junbari_Filter_Line) { return(1); } // 買い // RSIが指定値以下にいる間は「売り」 else if (RSI0 <= 100 - RSI_Junbari_Filter_Line) { return(2); } // 売り else { return(0); } // 決済ルール4を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール5 (ロジック1) | //+------------------------------------------------------------------+ int Exit_Rule1_5() { // 決済ルール5を差し替える時は、下記を差し替えて下さい。 // 決済ルール5を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ロジック1 ここまで | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ロジック2 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリールール1 (ロジック2) | //+------------------------------------------------------------------+ int Entry_Rule2_1() { //エントリールール1を差し替える時は、下記を差し替えて下さい。 // 移動平均線のゴールデンクロスとデッドクロス double MA11 = iMA(NULL,PERIOD_M15, MA_Cross_period1, 0, MODE_SMA, PRICE_CLOSE, 2); double MA10 = iMA(NULL,PERIOD_M15, MA_Cross_period1, 0, MODE_SMA, PRICE_CLOSE, 1); double MA21 = iMA(NULL,PERIOD_M15, MA_Cross_period2, 0, MODE_SMA, PRICE_CLOSE, 2); double MA20 = iMA(NULL,PERIOD_M15, MA_Cross_period2, 0, MODE_SMA, PRICE_CLOSE, 1); // 短期移動平均線が長期移動平均線を上抜け(ゴールデンクロス)で「買い」 if (MA11 < MA21 && MA10 >= MA20) { return(1); } // 買い // 短期移動平均線が長期移動平均線を下抜け(デッドクロス)で「売り」 else if(MA11 > MA21 && MA10 <= MA20) { return(0); } // 売り else { return(0); } //エントリールール1を差し替える時は、ココマデを差し替えて下さい。 } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター1 (ロジック2) | //+------------------------------------------------------------------+ int Entry_Filter2_1() { //エントリーフィルター1を差し替える時は、下記を差し替えて下さい。 //ローソク足の終値が、ボリンジャーバンドより内側にある時のみ、エントリーすることが可能 double UpperBB1 = iBands(NULL,PERIOD_M15, F_BB_Period2, F_BB_Hensa2, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB1 = iBands(NULL,PERIOD_M15, F_BB_Period2, F_BB_Hensa2, 0, PRICE_CLOSE, MODE_LOWER, 1); //ローソク足の終値が、ボリンジャーバンドより内側にある時のみ、エントリーすることが可能 if(iClose(NULL,PERIOD_M15,1) < UpperBB1 && iClose(NULL,PERIOD_M15,1) > LowerBB1) { return(3); } // エントリー出来る(フィルター) else { return(0); } //エントリーフィルター1を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター2 (ロジック2) | //+------------------------------------------------------------------+ int Entry_Filter2_2() { //エントリーフィルター2を差し替える時は、下記を差し替えて下さい。 //RSIが指定値以下にいる間は「買い」、指定値以上にいる間は「売り」 double RSI0 = iRSI(NULL,PERIOD_M15, RSI_Filter_period, PRICE_CLOSE, 1); // RSIが指定値以下にいる間は「買い」 if (RSI0 <= 100 - RSI_Filter_Line) { return(1); } // 買い // RSIが指定値以上にいる間は「売り」 else if (RSI0 >= RSI_Filter_Line) { return(2); } // 売り else { return(0); } //エントリーフィルター2を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター3 (ロジック2) | //+------------------------------------------------------------------+ int Entry_Filter2_3() { //エントリーフィルター3を差し替える時は、下記を差し替えて下さい。 //短期移動平均線が長期移動平均線の上にいる間は「買い」、下にいる間は「売り」 double MA10 = iMA(NULL,PERIOD_M15, F_MA_Cross_period1, 0, MODE_SMA, PRICE_CLOSE, 1); double MA20 = iMA(NULL,PERIOD_M15, F_MA_Cross_period2, 0, MODE_SMA, PRICE_CLOSE, 1); // 短期移動平均線が長期移動平均線の上にいる間は「買い」 if (MA10 >= MA20) { return(1); } // 買い // 短期移動平均線が長期移動平均線の下にいる間は「売り」 else if (MA10 <= MA20) { return(2); } // 売り else { return(0); } //エントリーフィルター3を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター4 (ロジック2) | //+------------------------------------------------------------------+ int Entry_Filter2_4() { //エントリーフィルター4を差し替える時は、下記を差し替えて下さい。 // ADXがこの数値以下の時のみエントリー出来る double ADX = iADX(NULL,PERIOD_M15, ADX_Period2, PRICE_CLOSE, MODE_MAIN, 1); if (ADX <= ADX_Filter_Line2) { return(3); } // エントリー出来る else { return(0); } // エントリー出来ない //エントリーフィルター4を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター5 (ロジック2) | //+------------------------------------------------------------------+ int Entry_Filter2_5() { //エントリーフィルター5を差し替える時は、下記を差し替えて下さい。 // ATRが指定値以下の時のみエントリー出来る double ATR = iATR(NULL,PERIOD_M15, ATR_Period, 1); if (ATR <= ATR_Filter_Line) { return(3); } // エントリー出来る else { return(0); } // エントリー出来ない //エントリーフィルター5を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター6 (ロジック2) | //+------------------------------------------------------------------+ int Entry_Filter2_6() { //エントリーフィルター4を差し替える時は、下記を差し替えて下さい。 // アップトレンドで「買い」 if ((Trend_Judge() >=2 && Kairi_Judge() <= Kairi_Judge_percent12)|| Kairi_Judge() <= -Kairi_Judge_percent22) { return(1); } // 買い // ダウントレンドで「売り」 else if ((Trend_Judge()<=1 && Trend_Judge()>= -Kairi_Judge_percent12 )|| Trend_Judge()>= Kairi_Judge_percent22) { return(2); } // 売り else { return(0); } //エントリーフィルター4を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール1 (ロジック2) | //+------------------------------------------------------------------+ int Exit_Rule2_1() { // 決済ルール1を差し替える時は、下記を差し替えて下さい。 // 移動平均線のゴールデンクロスとデッドクロス double MA11 = iMA(NULL,PERIOD_M15, MA_Cross_period1, 0, MODE_SMA, PRICE_CLOSE, 2); double MA10 = iMA(NULL,PERIOD_M15, MA_Cross_period1, 0, MODE_SMA, PRICE_CLOSE, 1); double MA21 = iMA(NULL,PERIOD_M15, MA_Cross_period2, 0, MODE_SMA, PRICE_CLOSE, 2); double MA20 = iMA(NULL,PERIOD_M15, 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); } // 決済ルール1を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール2 (ロジック2) | //+------------------------------------------------------------------+ int Exit_Rule2_2() { // 決済ルール2を差し替える時は、下記を差し替えて下さい。 //ローソク足が、下側のボリンジャーバンドを下抜いたら「買い」、上側のボリンジャーバンドを上抜いたら「売り」 double UpperBB1 = iBands(NULL,PERIOD_M15, BB_Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB1 = iBands(NULL,PERIOD_M15, BB_Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_LOWER, 1); double UpperBB2 = iBands(NULL,PERIOD_M15, BB_Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_UPPER, 2); double LowerBB2 = iBands(NULL,PERIOD_M15 ,BB_Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_LOWER, 2); //ローソク足が、下側のボリンジャーバンドを下抜いたら「買い」 if (iClose(NULL,PERIOD_M15,1) < LowerBB1 && iClose(NULL,PERIOD_M15,2) > LowerBB2) { return(2); } // 買い //ローソク足が、上側のボリンジャーバンドを上抜いたら「売り」 else if (iClose(NULL,PERIOD_M15,1) > UpperBB1 && iClose(NULL,PERIOD_M15,2) < UpperBB2) { return(1); } // 売り else { return(0); } // 決済ルール2を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール3 (ロジック2) | //+------------------------------------------------------------------+ int Exit_Rule2_3() { // 決済ルール3を差し替える時は、下記を差し替えて下さい。 // 決済ルール3を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール4 (ロジック2) | //+------------------------------------------------------------------+ int Exit_Rule2_4() { // 決済ルール4を差し替える時は、下記を差し替えて下さい。 // 決済ルール4を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール5 (ロジック2) | //+------------------------------------------------------------------+ int Exit_Rule2_5() { // 決済ルール5を差し替える時は、下記を差し替えて下さい。 // 決済ルール5を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ロジック2 ここまで | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ロジック3 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリールール1 (ロジック3) | //+------------------------------------------------------------------+ int Entry_Rule3_1() { //エントリールール1を差し替える時は、下記を差し替えて下さい。 // MACD線がシグナル線より下の間は「買い」/上の間は「売り」 double MACD_MAIN0 = iMACD(NULL,PERIOD_M30, Fast_EMA_period, Slow_EMA_period, Signal_period, PRICE_CLOSE, MODE_MAIN, 1); // 現在のMACD線 double MACD_SIGN0 = iMACD(NULL,PERIOD_M30, Fast_EMA_period, Slow_EMA_period, Signal_period, PRICE_CLOSE, MODE_SIGNAL, 1); // 現在のシグナル線 double MACD_SIGN1 = iMACD(NULL,PERIOD_M30, Fast_EMA_period, Slow_EMA_period, Signal_period, PRICE_CLOSE, MODE_SIGNAL, 2); // 過去のシグナル線 // MACD線がシグナル線より下の間は「買い」 if ( 0 < MACD_SIGN0 && 0 > MACD_SIGN1) { return(1); } // 買い // MACD線がシグナル線より上の間は「売り」 else if (0 > MACD_SIGN0 && 0 < MACD_SIGN1) { return(0); } // 売り else { return(0); } //エントリールール1を差し替える時は、ココマデを差し替えて下さい。 } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター1 (ロジック3) | //+------------------------------------------------------------------+ int Entry_Filter3_1() { //エントリーフィルター1を差し替える時は、下記を差し替えて下さい。 //ボリンジャーバンドの幅(上側ボリンジャーバンド―下側ボリンジャーバンドの値)が、指定%以下の時にエントリーすることが可能 double UpperBB1 = iBands(NULL,PERIOD_M30, F_BB_Period3, F_BB_Hensa3, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB1 = iBands(NULL,PERIOD_M30, F_BB_Period3, F_BB_Hensa3, 0, PRICE_CLOSE, MODE_LOWER, 1); //ボリンジャーバンドの幅(上側ボリンジャーバンド―下側ボリンジャーバンドの値)が、指定%以下の時にエントリーすることが可能 if( (UpperBB1 - LowerBB1) / iClose(NULL,PERIOD_M30,1) * 100.0 <= F_BB_HabaFilter_percent3) { return(3); } // エントリー出来る(フィルター) else { return(0); } //エントリーフィルター1を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター2 (ロジック3) | //+------------------------------------------------------------------+ int Entry_Filter3_2() { //エントリーフィルター2を差し替える時は、下記を差し替えて下さい。 // CCIの傾き方向に順張りエントリー double CCI0 = iCCI(NULL,PERIOD_M30, CCI_period, PRICE_CLOSE, 1); double CCI1 = iCCI(NULL,PERIOD_M30, CCI_period, PRICE_CLOSE, 2); // CCIが上向きで買い if (CCI0 > CCI1) { return(2); } // 買い // CCIが下向きで売り else if (CCI0 < CCI1) { return(1); } // 売り else { return(0); } //エントリーフィルター2を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター3 (ロジック3) | //+------------------------------------------------------------------+ int Entry_Filter3_3() { //エントリーフィルター3を差し替える時は、下記を差し替えて下さい。 // アップトレンドで「買い」 if ((Trend_Judge() >=2 && Kairi_Judge() <= Kairi_Judge_percent13)|| Kairi_Judge() <= -Kairi_Judge_percent23) // if ((Trend_Judge() >=1 && Kairi_Judge() <= Kairi_Judge_percent13)|| Kairi_Judge() <= -Kairi_Judge_percent23) { return(1); } // 買い // ダウントレンドで「売り」 else if ((Trend_Judge()<=1 && Trend_Judge()>= -Kairi_Judge_percent13 )|| Trend_Judge()>= Kairi_Judge_percent23) { return(2); } // 売り else { return(0); } //エントリーフィルター3を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター4 (ロジック3) | //+------------------------------------------------------------------+ int Entry_Filter3_4() { //エントリーフィルター4を差し替える時は、下記を差し替えて下さい。 //エントリーフィルター4を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター5 (ロジック3) | //+------------------------------------------------------------------+ int Entry_Filter3_5() { //エントリーフィルター5を差し替える時は、下記を差し替えて下さい。 //エントリーフィルター5を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール1 (ロジック3) | //+------------------------------------------------------------------+ int Exit_Rule3_1() { // 決済ルール1を差し替える時は、下記を差し替えて下さい。 // MACD線がシグナル線より下の間は「買い」/上の間は「売り」 double MACD_MAIN0 = iMACD(NULL,PERIOD_M30, Fast_EMA_period, Slow_EMA_period, Signal_period, PRICE_CLOSE, MODE_MAIN, 1); // 現在のMACD線 double MACD_SIGN0 = iMACD(NULL,PERIOD_M30, Fast_EMA_period, Slow_EMA_period, Signal_period, PRICE_CLOSE, MODE_SIGNAL, 1); // 現在のシグナル線 double MACD_SIGN1 = iMACD(NULL,PERIOD_M30, Fast_EMA_period, Slow_EMA_period, Signal_period, PRICE_CLOSE, MODE_SIGNAL, 2); // 過去のシグナル線 // MACD線がシグナル線より下の間は「買い」 if ( 0 < MACD_SIGN0 && 0 > MACD_SIGN1) { return(1); } // 買い // MACD線がシグナル線より上の間は「売り」 else if (0 > MACD_SIGN0 && 0 < MACD_SIGN1) { return(2); } // 売り else { return(0); } // 決済ルール1を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール2 (ロジック3) | //+------------------------------------------------------------------+ int Exit_Rule3_2() { // 決済ルール2を差し替える時は、下記を差し替えて下さい。 // パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」 // パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」 double SAR1 = iSAR(NULL,PERIOD_M30, SAR_Entry_Step, SAR_Entry_Maximum, 1); double SAR2 = iSAR(NULL,PERIOD_M30, SAR_Entry_Step, SAR_Entry_Maximum, 2); //パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」 if (SAR1 < iClose(NULL,PERIOD_M30,1) && iClose(NULL,PERIOD_M30,2) < SAR2) { return(1); } // 買い // パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」 else if (SAR1 > iClose(NULL,PERIOD_M30,1) && iClose(NULL,PERIOD_M30,2) > SAR2) { return(2); } // 売り else { return(0); } // 決済ルール2を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール3 (ロジック3) | //+------------------------------------------------------------------+ int Exit_Rule3_3() { // 決済ルール3を差し替える時は、下記を差し替えて下さい。 // 決済ルール3を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール4 (ロジック3) | //+------------------------------------------------------------------+ int Exit_Rule3_4() { // 決済ルール4を差し替える時は、下記を差し替えて下さい。 // 決済ルール4を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール5 (ロジック3) | //+------------------------------------------------------------------+ int Exit_Rule3_5() { // 決済ルール5を差し替える時は、下記を差し替えて下さい。 // 決済ルール5を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ロジック3 ここまで | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ロジック4 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリールール1 (ロジック4) | //+------------------------------------------------------------------+ int Entry_Rule4_1() { //エントリールール1を差し替える時は、下記を差し替えて下さい。 // パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」 // パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」 double SAR1 = iSAR(NULL,PERIOD_H1, SAR_Entry_Step4, SAR_Entry_Maximum4, 1); double SAR2 = iSAR(NULL,PERIOD_H1, SAR_Entry_Step4, SAR_Entry_Maximum4, 2); //パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」 if (SAR1 < iClose(NULL,PERIOD_H1,1) && iClose(NULL,PERIOD_H1,2) < SAR2) { return(1); } // 買い // パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」 else if (SAR1 > iClose(NULL,PERIOD_H1,1) && iClose(NULL,PERIOD_H1,2) > SAR2) { return(0); } // 売り else { return(0); } //エントリールール1を差し替える時は、ココマデを差し替えて下さい。 } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター1 (ロジック4) | //+------------------------------------------------------------------+ int Entry_Filter4_1() { //エントリーフィルター1を差し替える時は、下記を差し替えて下さい。 // アップトレンドで「買い」 if ((Trend_Judge() >=2 && Kairi_Judge() <= Kairi_Judge_percent14)|| Kairi_Judge() <= -Kairi_Judge_percent24) { return(1); } // 買い // ダウントレンドで「売り」 else if ((Trend_Judge()<=1 && Trend_Judge()>= -Kairi_Judge_percent14 )|| Trend_Judge()>= Kairi_Judge_percent24) { return(2); } // 売り else { return(0); } //エントリーフィルター1を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター2 (ロジック4) | //+------------------------------------------------------------------+ int Entry_Filter4_2() { //エントリーフィルター2を差し替える時は、下記を差し替えて下さい。 //ボリンジャーバンドの幅(上側ボリンジャーバンド―下側ボリンジャーバンドの値)が、指定%以下の時にエントリーすることが可能 double UpperBB1 = iBands(NULL,PERIOD_H1, BB_Period4, BB_Hensa4, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB1 = iBands(NULL,PERIOD_H1, BB_Period4, BB_Hensa4, 0, PRICE_CLOSE, MODE_LOWER, 1); //ボリンジャーバンドの幅(上側ボリンジャーバンド―下側ボリンジャーバンドの値)が、指定%以下の時にエントリーすることが可能 if( (UpperBB1 - LowerBB1) / iClose(NULL,PERIOD_H1,1) * 100.0 <= BB_HabaFilter_percent4) { return(3); } // エントリー出来る(フィルター) else { return(0); } //エントリーフィルター2を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター3 (ロジック4) | //+------------------------------------------------------------------+ int Entry_Filter4_3() { //エントリーフィルター3を差し替える時は、下記を差し替えて下さい。 //エントリーフィルター3を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター4 (ロジック4) | //+------------------------------------------------------------------+ int Entry_Filter4_4() { //エントリーフィルター4を差し替える時は、下記を差し替えて下さい。 //エントリーフィルター4を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| エントリーフィルター5 (ロジック4) | //+------------------------------------------------------------------+ int Entry_Filter4_5() { //エントリーフィルター5を差し替える時は、下記を差し替えて下さい。 //エントリーフィルター5を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール1 (ロジック4) | //+------------------------------------------------------------------+ int Exit_Rule4_1() { // 決済ルール1を差し替える時は、下記を差し替えて下さい。 // パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」 // パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」 double SAR1 = iSAR(NULL,PERIOD_H1, K_SAR_Entry_Step4, SAR_Entry_Maximum4, 1); double SAR2 = iSAR(NULL,PERIOD_H1, K_SAR_Entry_Step4, SAR_Entry_Maximum4, 2); //パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」 if (SAR1 < iClose(NULL,PERIOD_H1,1) && iClose(NULL,PERIOD_H1,2) < SAR2) { return(1); } // 買い // パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」 else if (SAR1 > iClose(NULL,PERIOD_H1,1) && iClose(NULL,PERIOD_H1,2) > SAR2) { return(2); } // 売り else { return(0); } // 決済ルール1を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール2 (ロジック4) | //+------------------------------------------------------------------+ int Exit_Rule4_2() { // 決済ルール2を差し替える時は、下記を差し替えて下さい。 //ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「売り」 //ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「買い」 double UpperBB11 = iBands(NULL,PERIOD_H1, K_BB_Period14, K_BB_Hensa14, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB11 = iBands(NULL,PERIOD_H1, K_BB_Period14, K_BB_Hensa14, 0, PRICE_CLOSE, MODE_LOWER, 1); double UpperBB12 = iBands(NULL,PERIOD_H1, K_BB_Period14, K_BB_Hensa14, 0, PRICE_CLOSE, MODE_UPPER, 2); double LowerBB12 = iBands(NULL,PERIOD_H1 ,K_BB_Period14, K_BB_Hensa14, 0, PRICE_CLOSE, MODE_LOWER, 2); double UpperBB21 = iBands(NULL,PERIOD_H1, K_BB_Period24, K_BB_Hensa24, 0, PRICE_CLOSE, MODE_UPPER, 1); double LowerBB21 = iBands(NULL,PERIOD_H1, K_BB_Period24, K_BB_Hensa24, 0, PRICE_CLOSE, MODE_LOWER, 1); double UpperBB22 = iBands(NULL,PERIOD_H1, K_BB_Period24, K_BB_Hensa24, 0, PRICE_CLOSE, MODE_UPPER, 2); double LowerBB22 = iBands(NULL,PERIOD_H1 ,K_BB_Period24, K_BB_Hensa24, 0, PRICE_CLOSE, MODE_LOWER, 2); //ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「売り」 if (UpperBB12 < UpperBB22 && UpperBB11 >= UpperBB21) { return(2); } // 買い //ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「買い」 else if (LowerBB12 < LowerBB22 && LowerBB11 >= LowerBB21) { return(1); } // 売り else { return(0); } // 決済ルール2を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール3 (ロジック4) | //+------------------------------------------------------------------+ int Exit_Rule4_3() { // 決済ルール3を差し替える時は、下記を差し替えて下さい。 // 決済ルール3を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール4 (ロジック4) | //+------------------------------------------------------------------+ int Exit_Rule4_4() { // 決済ルール4を差し替える時は、下記を差し替えて下さい。 // 決済ルール4を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 決済ルール5 (ロジック4) | //+------------------------------------------------------------------+ int Exit_Rule4_5() { // 決済ルール5を差し替える時は、下記を差し替えて下さい。 // 決済ルール5を差し替える時は、ココマデを差し替えて下さい。 return(3); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ロジック4 ここまで | //+------------------------------------------------------------------+ //Label関数 void label(string name, string text, int x, int y, int font, int fontsize,ENUM_BASE_CORNER corner,ENUM_ANCHOR_POINT anchor){ ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0); ObjectSetString(0, name, OBJPROP_TEXT, text); ObjectSetInteger(0, name, OBJPROP_COLOR, clrLightGray); ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); ObjectSetString(0, name, OBJPROP_FONT, font == 1 ? "Times New Roman" : "MS 明朝"); ObjectSetInteger(0, name, OBJPROP_FONTSIZE, fontsize ); ObjectSetInteger(0, name, OBJPROP_CORNER, corner); ObjectSetInteger(0, name, OBJPROP_ANCHOR, anchor); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x ); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y ); ObjectSetInteger(0, name, OBJPROP_STATE, false); ObjectSetInteger(0, name, OBJPROP_BACK, false); return; } void HistoryEarnPips(int magicnumber){ double totalpips1 = 0; double totalpips2 = 0; bool flag = false; int res; //ObjectsDeleteAll(0, "EarnPips"); // datetime MT1=iTime(NULL,PERIOD_MN1,0); for(int i = OrdersHistoryTotal() - 1; i >= 0; i--){ res = OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); if(res == false)continue; //if(OrderCloseTime()< MT1)continue; if(OrderSymbol() != Symbol() || OrderType() > 1 || OrderMagicNumber() != magicnumber)continue; totalpips1 += EarnPipsLine(OrderTicket(),OrderOpenTime(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice(),OrderType()); } ObjectSetString(0,"TotalEarnPips"+IntegerToString(magicnumber),OBJPROP_TEXT, IntegerToString(magicnumber)+" : "+DoubleToString(totalpips1, 1)); ObjectSetInteger(0,"TotalEarnPips"+IntegerToString(magicnumber), OBJPROP_COLOR, clrWhite); for(int i = OrdersTotal() - 1; i >= 0; i--){ res = OrderSelect(i, SELECT_BY_POS); if(res == false)continue; if(OrderSymbol() != Symbol() || OrderType() > 1 || OrderMagicNumber() != magicnumber)continue; totalpips2 += EarnPipsLine(OrderTicket(),OrderOpenTime(),OrderOpenPrice(),Time[0], OrderType() == 0 ? Bid : Ask,OrderType()); flag = true; } if(flag){ ObjectSetString(0,"TotalEarnPips"+IntegerToString(magicnumber),OBJPROP_TEXT,"Holding position "+IntegerToString(magicnumber)+" : "+DoubleToString(totalpips1, 1)); ObjectSetInteger(0,"TotalEarnPips"+IntegerToString(magicnumber), OBJPROP_COLOR, clrYellow); } } double EarnPipsLine(int ticket, datetime opentime, double openprice, datetime closetime, double closeprice, int type){ double pips = (type == 0 ? closeprice - openprice : openprice - closeprice) / Point() * 0.1 ; ObjectDelete("EarnPipsLine" + IntegerToString(ticket)); ObjectCreate(0,"EarnPipsLine" + IntegerToString(ticket), OBJ_TREND, 0, opentime, openprice, closetime, closeprice); ObjectSetInteger(0, "EarnPipsLine" + IntegerToString(ticket), OBJPROP_RAY_RIGHT, false); ObjectSetInteger(0, "EarnPipsLine" + IntegerToString(ticket), OBJPROP_COLOR, type == 0 ? clrAqua : clrAqua); ObjectSetInteger(0, "EarnPipsLine" + IntegerToString(ticket), OBJPROP_SELECTABLE, false); ObjectDelete("EarnPipsText" + IntegerToString(ticket)); ObjectCreate(0, "EarnPipsText" + IntegerToString(ticket), OBJ_TEXT, 0, (datetime)(((double)closetime - (double)opentime) * 0.8+(double)opentime), (closeprice-openprice) * 0.8+(openprice) ); ObjectSetInteger(0, "EarnPipsText" + IntegerToString(ticket), OBJPROP_COLOR, pips < 0 ? clrYellow : type == 0 ? clrAqua : clrAqua); ObjectSetInteger(0, "EarnPipsText" + IntegerToString(ticket), OBJPROP_SELECTABLE, false); ObjectSetInteger(0, "EarnPipsText" + IntegerToString(ticket), OBJPROP_FONTSIZE, 11); ObjectSetInteger(0, "EarnPipsText" + IntegerToString(ticket), OBJPROP_ANCHOR, ANCHOR_CENTER); ObjectSetString(0, "EarnPipsText" + IntegerToString(ticket), OBJPROP_TEXT, DoubleToString(pips, 1)); ObjectSetString(0, "EarnPipsText" + IntegerToString(ticket), OBJPROP_FONT, "Arial Black"); return(pips); } void SetChart(){ ChartSetInteger(0, CHART_SHOW_DATE_SCALE, true); ChartSetInteger(0, CHART_SHOW_PRICE_SCALE, true); ChartSetInteger(0, CHART_FOREGROUND, false); ChartSetInteger(0, CHART_SHOW_GRID, false); ChartSetInteger(0, CHART_SHOW_ONE_CLICK, false); ChartSetInteger(0, CHART_SHOW_OHLC, true); ChartSetInteger(0, CHART_COLOR_FOREGROUND, clrLightGray); ChartSetInteger(0, CHART_COLOR_BACKGROUND, clrBlack); ChartSetInteger(0, CHART_COLOR_CANDLE_BEAR, clrBlack); ChartSetInteger(0, CHART_COLOR_CANDLE_BULL, clrDarkGray); ChartSetInteger(0, CHART_COLOR_CHART_DOWN, clrDimGray); ChartSetInteger(0, CHART_COLOR_CHART_UP, clrDimGray); ChartSetInteger(0, CHART_COLOR_CHART_LINE, clrDimGray); ChartSetInteger(0, CHART_SHIFT, true); ChartSetInteger(0, CHART_SCALE, 2); ChartSetInteger(0, CHART_MODE, CHART_CANDLES); } int Count_Position(int magic){ int CountBuy = 0; int CountSell = 0; // ポジションの数をカウントする for(int 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() != magic) continue; if (OrderType() == OP_BUY) { CountBuy = CountBuy + 1; } if (OrderType() == OP_SELL) { CountSell = CountSell + 1; } } return(CountBuy+CountSell);} //+------------------------------------------------------------------+ //| トレード関数群  | //+------------------------------------------------------------------+ // OrderSendのラッパー関数 //  マーケットの制約に合う形にSL、TPを修正したのち発注し // OederSendのエラー時のリトライおよびエラー処理を実施する int WrapperOrderSend_L(string symbol, // シンボル int cmd, // 注文の種類 double volume, // ロット double price, // 注文価格 int slippage, // スリッページ double stoploss, // StopLoss double takeprofit, // TakeProfit string comment=NULL, // コメント int magic=0, // マジックナンバー datetime expiration=0, // 有効期限 color arrow_color=clrNONE // 矢印のカラー ) { int i; int err = 0; // エラーNo. int res = 0; // OrderSendの戻り値 // MAX_ORDER_REPEAT回数だけリトライする for ( i=0; i