gryps2/EA-code/Yoritsugu/MT_LS_GBPJPY_M5_v09.mq4
super.admin ae3f0ebf03 convert
2025-05-30 14:58:21 +02:00

2681 lines
182 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.

//+------------------------------------------------------------------+
//| MT_LS_GBPJPY_M5.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
//瞬間的なエントリー・決済エラーへの対応
//ロジック3の変更
//複利設定・年末年始のトレード制限の追加
//ロジック3の時間足変更 M5⇒M30
//1~10秒のエントリーずらしを導入
//トレンド判定を追加
//TP・SLを調整
//トレーリングストップのロジック変更
#property strict
#include <stdlib.mqh>
#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_M5,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 = 5; //Slippage_Point
input int MaxSpreadPips = 5; //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 = 59732401;
input double Lots1 = 0.01;
int TakeProfit_pips1 = 500;
int StopLoss_pips1 = 160;
int Rikaku_pips1 = 200;
int Songiri_pips1 = 160;
//トレイリングストップのパラメータ
int TrailingStopStartPips1 = 30;
int TrailingStopPips1 = 150;
int BarCountSL1 = 120; // 何本前までのローソク足をチェックするか?
int xBarsEntry1 = 0, xBarsExit1 = 0, xBarsTrailing1 = 0;
int xxBars1 = 0;
//最大ポジション数を、下記で入力指定して下さい。
int maxposition1 = 1;
//エントリールールの各変数を下記に貼りつけます。
int RSI_Gyakubari_period = 35; // RSIの計算期間
int RSI_Gyakubari_Line = 55; // 逆張りエントリーの基準となるライン
//エントリーフィルターの各変数を下記に貼りつけます。
int MA_Break_period = 180; // 移動平均線の計算期間
int F_BB_Period = 15; // ボリンジャーバンドの計算期間
double F_BB_Hensa = 2.2; // ボリンジャーバンドの偏差
int ADX_Period = 80; // ADXの計算期間
int ADX_Filter_Line = 25; // ADXがこの数値以下の時のみエントリー出来る
double Kairi_Judge_percent11 = 2.25; // 【順張りエントリー可】長期MAに対する乖離〇%以内
double Kairi_Judge_percent21 = 10; // 【逆張りエントリー可】長期MAに対して乖離〇%以上
int Trend_period11 = 80; // 短期移動平均線
int Trend_period21 = 420; // 長期移動平均線
//決済ルールの各変数を下記に貼りつけます。
int K_RSI_Gyakubari_period = 5; // RSIの計算期間
int K_RSI_Gyakubari_Line = 80; // 逆張りエントリーの基準となるライン
int BB_Period = 420; // ボリンジャーバンドの計算期間
double BB_Hensa = 2.8; // ボリンジャーバンドの偏差
int Envelopes_Period = 100; // エンベロープの計算期間
double Envelopes_Deviation = 0.1; // エンベロープの幅偏差
int RSI_Junbari_Filter_period = 60; // RSIの計算期間
int RSI_Junbari_Filter_Line = 85; // 順張りエントリーの基準となるライン
// ロジック2
input string __Logic2__ = "Logic2 Parameters"; // ロジック2のパラメータ
input int MagicNumber2 = 59732402;
input double Lots2 = 0.01;
int TakeProfit_pips2 = 150;
int StopLoss_pips2 = 120;
int Rikaku_pips2 = 70;
int Songiri_pips2 = 90;
//トレイリングストップのパラメータ
int TrailingStopStartPips2 = 20;
int TrailingStopPips2 = 60;
int BarCountSL2 = 90; // 何本前までのローソク足をチェックするか?
int xBarsEntry2 = 0, xBarsExit2 = 0, xBarsTrailing2 = 0;
int xxBars2 = 0;
//最大ポジション数を、下記で入力指定して下さい。
int maxposition2 = 1;
//エントリールールの各変数を下記に貼りつけます。
int RSI_Gyakubari_period2 = 20; // RSIの計算期間
int RSI_Gyakubari_Line2 = 65; // 逆張りエントリーの基準となるライン
double Kairi_Judge_percent12 = 3; // 【順張りエントリー可】長期MAに対する乖離〇%以内
double Kairi_Judge_percent22 = 10; // 【逆張りエントリー可】長期MAに対して乖離〇%以上
int Trend_period12 = 80; // 短期移動平均線
int Trend_period22 = 240; // 長期移動平均線
//エントリーフィルターの各変数を下記に貼りつけます。
int F_MA_Break_period2 = 250; // 移動平均線の計算期間
int ADX_Period2 = 30; // ADXの計算期間
int ADX_Filter_Line2 = 40; // ADXがこの数値以下の時のみエントリー出来る
//決済ルールの各変数を下記に貼りつけます。
int K_RSI_Gyakubari_period2 = 30; // RSIの計算期間
int K_RSI_Gyakubari_Line2 = 55; // 逆張りエントリーの基準となるライン
int BB_Period2 = 300; // ボリンジャーバンドの計算期間
double BB_Hensa2 = 2.5; // ボリンジャーバンドの偏差
int Envelopes_Period2 = 50; // エンベロープの計算期間
double Envelopes_Deviation2 = 0.1; // エンベロープの幅偏差
int RSI_Junbari_Filter_period2 = 65; // RSIの計算期間
int RSI_Junbari_Filter_Line2 = 90; // 順張りエントリーの基準となるライン
// ロジック3
input string __Logic3__ = "Logic3 Parameters"; // ロジック3のパラメータ
input int MagicNumber3 = 59732403;
input double Lots3 = 0.01;
int TakeProfit_pips3 = 520;
int StopLoss_pips3 = 140;
int Rikaku_pips3 = 400;
int Songiri_pips3 = 100;
//トレイリングストップのパラメータ
int TrailingStopStartPips3 = 140;
int TrailingStopPips3 = 230;
int BarCountSL3 = 70; // 何本前までのローソク足をチェックするか?
int xBarsEntry3 = 0, xBarsExit3 = 0, xBarsTrailing3 = 0;
int xxBars3 = 0;
//最大ポジション数を、下記で入力指定して下さい。
int maxposition3 = 1;
//エントリールールの各変数を下記に貼りつけます。
double Open_Kairi_percent3 = 0.02; // ローソク足の大きさパーセント
//エントリーフィルターの各変数を下記に貼りつけます。
int F_BB_Period3 = 21; // ボリンジャーバンドの計算期間
double F_BB_Hensa3 = 2.0; // ボリンジャーバンドの偏差
int F_MA_period3 = 160; // 移動平均線のLong計算期間
int F_BB_Period23 = 30; // ボリンジャーバンドのLong計算期間
double F_BB_Hensa23 = 1.0; // ボリンジャーバンドの偏差
double F_BB_HabaFilter_percent23 = 1.8; // Long_ボリンジャーバンドの幅%(幅フィルター)
int F_BB_Period33 = 14; // ボリンジャーバンドのLong計算期間
double F_BB_Hensa33 = 2.0; // ボリンジャーバンドの偏差
double F_BB_HabaFilter_percent33 = 1.8; // Long_ボリンジャーバンドの幅%(幅フィルター)
int F_MA_period23 = 120; // 移動平均線のLong計算期間
double Kairi_Judge_percent13 = 2.5; // 【順張りエントリー可】長期MAに対する乖離〇%以内
double Kairi_Judge_percent23 = 0.75; // 【逆張りエントリー可】長期MAに対して乖離〇%以上
int Trend_period13 = 80; // 短期移動平均線
int Trend_period23 = 320; // 長期移動平均線
//決済ルールの各変数を下記に貼りつけます。
int K_BB_Period3 = 21; // ボリンジャーバンドの計算期間
double K_BB_Hensa3 = 2.6; // ボリンジャーバンドの偏差
double SAR_Entry_Step3 = 0.01; // パラボリックSARのステップ(パラメータ)
double SAR_Entry_Maximum3 = 0.2; // パラボリックSARの上限値(パラメータ)
int K_BB_Period123 = 28; // ボリンジャーバンドのLong計算期間1
double K_BB_Hensa123 = 1; // ボリンジャーバンドの偏差1
int K_BB_Period223 = 70; // ボリンジャーバンドのLong計算期間2
double K_BB_Hensa223 = 1.0; // ボリンジャーバンドの偏差2
int MA_Cross_period13 = 21; // 短期移動平均線
int MA_Cross_period23 = 40; // 長期移動平均線
// ロジック4
input string __Logic4__ = "Logic4 Parameters"; // ロジック4のパラメータ
input int MagicNumber4 = 59732404;
input double Lots4 = 0.01;
int TakeProfit_pips4 = 620;
int StopLoss_pips4 = 140;
int Rikaku_pips4 = 550;
int Songiri_pips4 = 120;
//トレイリングストップのパラメータ
int TrailingStopStartPips4 = 50;
int TrailingStopPips4 = 130;
int BarCountSL4 = 130; // 何本前までのローソク足をチェックするか?
int xBarsEntry4 = 0, xBarsExit4 = 0, xBarsTrailing4 = 0;
int xxBars4 = 0;
//最大ポジション数を、下記で入力指定して下さい。
int maxposition4 = 1;
//エントリールールの各変数を下記に貼りつけます。
int BB_Period14 = 20; // ボリンジャーバンドのLong計算期間1
double BB_Hensa14 = 1.65; // ボリンジャーバンドの偏差1
int BB_Period24 = 50; // ボリンジャーバンドのLong計算期間2
double BB_Hensa24 = 1.65; // ボリンジャーバンドの偏差2
//エントリーフィルターの各変数を下記に貼りつけます。
int F_MA_period4 = 5; // 移動平均線のLong計算期間
int F_BB_Period4 = 24; // ボリンジャーバンドのLong計算期間
double F_BB_Hensa4 = 0.8; // ボリンジャーバンドの偏差
double F_BB_HabaFilter_percent4 = 0.4; // Long_ボリンジャーバンドの幅%(幅フィルター)
double Kairi_Judge_percent14 = 10; // 【順張りエントリー可】長期MAに対する乖離〇%以内
double Kairi_Judge_percent24 = -10; // 【逆張りエントリー可】長期MAに対して乖離〇%以上
int Trend_period14 = 80; // 短期移動平均線
int Trend_period24 = 320; // 長期移動平均線
//決済ルールの各変数を下記に貼りつけます。
double SAR_Entry_Step4 = 0.009; // パラボリックSARのステップ(パラメータ)
double SAR_Entry_Maximum4 = 0.2; // パラボリックSARの上限値(パラメータ)
double Open_Kairi_percent24 = 0.9; // ローソク足の大きさパーセント(最大点での利食い)
int K_BB_Period14 = 20; // ボリンジャーバンドのLong計算期間1
double K_BB_Hensa14 = 3; // ボリンジャーバンドの偏差1
int K_BB_Period24 = 50; // ボリンジャーバンドのLong計算期間2
double K_BB_Hensa24 = 4.5; // ボリンジャーバンドの偏差2
int K_ADX_Period = 28; // ADXの計算期間
int K_ADX_Filter_Line = 40; // ADXがこの数値以下の時のみエントリー出来る
//+------------------------------------------------------------------+
//| 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()
{
// 次のリトライまで1000msec+0~10000msec待つ(rand関数は0~32767の範囲内で疑似乱数整数を返す)
Sleep(1000+rand()/3);
// ロジック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_M5,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_M5,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_LS_GBPJPY_M5",
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,
"MT_LS_GBPJPY_M5",
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 = 3;
}
// ロジック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 = Entry_Filter3_6();
}
// ロジック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);
} // 買い
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 ( Kairi_Judge(Trend_period21) <= Kairi_Judge_percent11)
{
return(1);
} // 買い
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を差し替える時は、下記を差し替えて下さい。
//RSIが指定値以下になったら「買い」、指定値以上になったら「売り」
double RSI0 = iRSI(NULL,PERIOD_M5, RSI_Gyakubari_period2, PRICE_CLOSE, 1);
double RSI1 = iRSI(NULL,PERIOD_M5, RSI_Gyakubari_period2, PRICE_CLOSE, 2);
//「RSI_Gyakubari_Entry_Entry_Line=70」の場合、RSIが30以下になったら買い
if (RSI0 <= 100 - RSI_Gyakubari_Line2 && RSI1 > 100 - RSI_Gyakubari_Line2)
// if (RSI0 >= 100 - RSI_Gyakubari_Line && RSI1 < 100 - RSI_Gyakubari_Line)
{
return(0);
} // 買い
// 「RSI_Gyakubari_Entry_Entry_Line=70」の場合、RSIが70以上になったら売り
else if (RSI0 >= RSI_Gyakubari_Line2 && RSI1 < RSI_Gyakubari_Line2)
// else if (RSI0 <= RSI_Gyakubari_Line && RSI1 > RSI_Gyakubari_Line)
{
return(2);
} // 売り
else
{
return(0);
}
//エントリールール1を差し替える時は、ココマデを差し替えて下さい。
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター1 (ロジック2) |
//+------------------------------------------------------------------+
int Entry_Filter2_1()
{
//エントリーフィルター1を差し替える時は、下記を差し替えて下さい。
//ローソク足が、移動平均線を上抜いたら「買い」、下抜いたら「売り」
double MA1 = iMA(NULL, PERIOD_M5, F_MA_Break_period2, 0, MODE_SMA, PRICE_CLOSE, 1);
double MA2 = iMA(NULL, PERIOD_M5, F_MA_Break_period2, 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 (ロジック2) |
//+------------------------------------------------------------------+
int Entry_Filter2_2()
{
//エントリーフィルター2を差し替える時は、下記を差し替えて下さい。
// ADXがこの数値以下の時のみエントリー出来る
double ADX = iADX(NULL,PERIOD_M5, ADX_Period2, PRICE_CLOSE, MODE_MAIN, 1);
if (ADX <= ADX_Filter_Line2)
{
return(3);
} // エントリー出来る
else
{
return(0);
} // エントリー出来ない
//エントリーフィルター2を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター3 (ロジック2) |
//+------------------------------------------------------------------+
int Entry_Filter2_3()
{
//エントリーフィルター3を差し替える時は、下記を差し替えて下さい。
// ダウントレンドで「売り」
if (Kairi_Judge(Trend_period22)>= -Kairi_Judge_percent12 )
{
return(2);
} // 売り
else
{
return(0);
}
//エントリーフィルター3を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター4 (ロジック2) |
//+------------------------------------------------------------------+
int Entry_Filter2_4()
{
//エントリーフィルター4を差し替える時は、下記を差し替えて下さい。
//エントリーフィルター4を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター5 (ロジック2) |
//+------------------------------------------------------------------+
int Entry_Filter2_5()
{
//エントリーフィルター5を差し替える時は、下記を差し替えて下さい。
//エントリーフィルター5を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール1 (ロジック2) |
//+------------------------------------------------------------------+
int Exit_Rule2_1()
{
// 決済ルール1を差し替える時は、下記を差し替えて下さい。
//RSIが指定値以下になったら「買い」、指定値以上になったら「売り」
double RSI0 = iRSI(NULL,PERIOD_M5, K_RSI_Gyakubari_period2, PRICE_CLOSE, 1);
double RSI1 = iRSI(NULL,PERIOD_M5, K_RSI_Gyakubari_period2, PRICE_CLOSE, 2);
//「RSI_Gyakubari_Entry_Entry_Line=70」の場合、RSIが30以下になったら買い
if (RSI0 <= 100 - K_RSI_Gyakubari_Line2 && RSI1 > 100 - K_RSI_Gyakubari_Line2)
{
return(1);
} // 買い
// 「RSI_Gyakubari_Entry_Entry_Line=70」の場合、RSIが70以上になったら売り
else if (RSI0 >= K_RSI_Gyakubari_Line2 && RSI1 < K_RSI_Gyakubari_Line2)
{
return(2);
} // 売り
else
{
return(0);
}
// 決済ルール1を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール2 (ロジック2) |
//+------------------------------------------------------------------+
int Exit_Rule2_2()
{
// 決済ルール2を差し替える時は、下記を差し替えて下さい。
//ローソク足が、下側のボリンジャーバンドを下抜いたら「買い」、上側のボリンジャーバンドを上抜いたら「売り」
double UpperBB1 = iBands(NULL,PERIOD_M5, BB_Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_UPPER, 1);
double LowerBB1 = iBands(NULL,PERIOD_M5, BB_Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_LOWER, 1);
double UpperBB2 = iBands(NULL,PERIOD_M5, BB_Period2, BB_Hensa2, 0, PRICE_CLOSE, MODE_UPPER, 2);
double LowerBB2 = iBands(NULL,PERIOD_M5 ,BB_Period2, BB_Hensa2, 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 (ロジック2) |
//+------------------------------------------------------------------+
int Exit_Rule2_3()
{
// 決済ルール3を差し替える時は、下記を差し替えて下さい。
//下側エンベロープに終値がタッチで「買い」、上側にタッチで「売り」
double UpperEnvelopes1 = iEnvelopes(NULL,PERIOD_M5, Envelopes_Period2, MODE_SMA, 0, PRICE_CLOSE, Envelopes_Deviation2, MODE_UPPER, 1);
double LowerEnvelopes1 = iEnvelopes(NULL,PERIOD_M5, Envelopes_Period2, MODE_SMA, 0, PRICE_CLOSE, Envelopes_Deviation2, MODE_LOWER, 1);
double UpperEnvelopes2 = iEnvelopes(NULL,PERIOD_M5, Envelopes_Period2, MODE_SMA, 0, PRICE_CLOSE, Envelopes_Deviation2, MODE_UPPER, 2);
double LowerEnvelopes2 = iEnvelopes(NULL,PERIOD_M5, Envelopes_Period2, MODE_SMA, 0, PRICE_CLOSE, Envelopes_Deviation2, 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 (ロジック2) |
//+------------------------------------------------------------------+
int Exit_Rule2_4()
{
// 決済ルール4を差し替える時は、下記を差し替えて下さい。
// RSIが指定値以上にいる間は「買い」、指定値以下にいる間は「売り」
double RSI0 = iRSI(NULL,PERIOD_M5, RSI_Junbari_Filter_period2, PRICE_CLOSE, 1);
// RSIが指定値以上にいる間は「買い」
if (RSI0 >= RSI_Junbari_Filter_Line2)
{
return(1);
} // 買い
// RSIが指定値以下にいる間は「売り」
else if (RSI0 <= 100 - RSI_Junbari_Filter_Line2)
{
return(2);
} // 売り
else
{
return(0);
}
// 決済ルール4を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール5 (ロジック2) |
//+------------------------------------------------------------------+
int Exit_Rule2_5()
{
// 決済ルール5を差し替える時は、下記を差し替えて下さい。
// 決済ルール5を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ロジック2 ここまで |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ロジック3 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリールール1 (ロジック3) |
//+------------------------------------------------------------------+
int Entry_Rule3_1()
{
//エントリールール1を差し替える時は、下記を差し替えて下さい。
//ローソク足が陰線で買い
if (iClose(NULL,PERIOD_M30,1) < iOpen(NULL,PERIOD_M30,1) && (iOpen(NULL,PERIOD_M30,1) - iClose(NULL,PERIOD_M30,1))> iClose(NULL,PERIOD_M30,1) * Open_Kairi_percent3 / 100.0)
{
return(1);
} // 売り
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(iOpen(NULL,PERIOD_M30,1) < LowerBB1)
{
return(2);
} // 買い
else if(iOpen(NULL,PERIOD_M30,1) > UpperBB1)
{
return(1);
} // 売り
else
{
return(0);
}
//エントリーフィルター1を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター2 (ロジック3) |
//+------------------------------------------------------------------+
int Entry_Filter3_2()
{
//エントリーフィルター2を差し替える時は、下記を差し替えて下さい。
// 移動平均線の傾きが上方向の時は「買い」、下方向の時は「売り」
double MA2 = iMA(NULL,PERIOD_M5, F_MA_period3, 0, MODE_SMA, PRICE_CLOSE, 2);
double MA1 = iMA(NULL,PERIOD_M5, F_MA_period3, 0, MODE_SMA, PRICE_CLOSE, 1);
// 移動平均線の傾きが上方向の時は「買い」
if (MA2 < MA1)
{
return(1);
} // 買い
// 移動平均線の傾きが下方向の時は「売り」
else if (MA2 > MA1)
{
return(2);
} // 売り
else
{
return(0);
}
//エントリーフィルター2を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター3 (ロジック3) |
//+------------------------------------------------------------------+
int Entry_Filter3_3()
{
//エントリーフィルター3を差し替える時は、下記を差し替えて下さい。
//ボリンジャーバンドの幅(上側ボリンジャーバンド―下側ボリンジャーバンドの値)が、指定%以下の時にエントリーすることが可能
double UpperBB1 = iBands(NULL,PERIOD_M5, F_BB_Period23, F_BB_Hensa23, 0, PRICE_CLOSE, MODE_UPPER, 1);
double LowerBB1 = iBands(NULL,PERIOD_M5, F_BB_Period23, F_BB_Hensa23, 0, PRICE_CLOSE, MODE_LOWER, 1);
//ボリンジャーバンドの幅(上側ボリンジャーバンド―下側ボリンジャーバンドの値)が、指定%以下の時にエントリーすることが可能
if( (UpperBB1 - LowerBB1) / iClose(NULL,PERIOD_M5,1) * 100.0 <= F_BB_HabaFilter_percent23)
{
return(3);
} // エントリー出来る(フィルター)
else
{
return(0);
}
//エントリーフィルター3を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター4 (ロジック3) |
//+------------------------------------------------------------------+
int Entry_Filter3_4()
{
//エントリーフィルター4を差し替える時は、下記を差し替えて下さい。
//ボリンジャーバンドの幅(上側ボリンジャーバンド―下側ボリンジャーバンドの値)が、指定%以下の時にエントリーすることが可能
double UpperBB1 = iBands(NULL,PERIOD_M30, F_BB_Period33, F_BB_Hensa33, 0, PRICE_CLOSE, MODE_UPPER, 1);
double LowerBB1 = iBands(NULL,PERIOD_M30, F_BB_Period33, F_BB_Hensa33, 0, PRICE_CLOSE, MODE_LOWER, 1);
//ボリンジャーバンドの幅(上側ボリンジャーバンド―下側ボリンジャーバンドの値)が、指定%以下の時にエントリーすることが可能
if( (UpperBB1 - LowerBB1) / iClose(NULL,PERIOD_M30,1) * 100.0 <= F_BB_HabaFilter_percent33)
{
return(3);
} // エントリー出来る(フィルター)
else
{
return(0);
}
//エントリーフィルター4を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター5 (ロジック3) |
//+------------------------------------------------------------------+
int Entry_Filter3_5()
{
//エントリーフィルター5を差し替える時は、下記を差し替えて下さい。
// 移動平均線の傾きが上方向の時は「買い」、下方向の時は「売り」
double MA2 = iMA(NULL,PERIOD_M30, F_MA_period23, 0, MODE_SMA, PRICE_CLOSE, 2);
double MA1 = iMA(NULL,PERIOD_M30, F_MA_period23, 0, MODE_SMA, PRICE_CLOSE, 1);
// 移動平均線の傾きが上方向の時は「買い」
if (MA2 < MA1)
{
return(1);
} // 買い
// 移動平均線の傾きが下方向の時は「売り」
else if (MA2 > MA1)
{
return(2);
} // 売り
else
{
return(0);
}
//エントリーフィルター5を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター6 (ロジック3) |
//+------------------------------------------------------------------+
int Entry_Filter3_6()
{
//エントリーフィルター3を差し替える時は、下記を差し替えて下さい。
// アップトレンドで「買い」
if ((Trend_Judge(Trend_period13,Trend_period23) >=2 && Kairi_Judge(Trend_period23) <= Kairi_Judge_percent13)|| Kairi_Judge(Trend_period23) <= -Kairi_Judge_percent23)
{
return(1);
} // 買い
else
{
return(0);
}
//エントリーフィルター3を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール1 (ロジック3) |
//+------------------------------------------------------------------+
int Exit_Rule3_1()
{
// 決済ルール1を差し替える時は、下記を差し替えて下さい。
//ローソク足が、下側のボリンジャーバンドを下抜いたら「買い」、上側のボリンジャーバンドを上抜いたら「売り」
double UpperBB1 = iBands(NULL,PERIOD_M30, K_BB_Period3, K_BB_Hensa3, 0, PRICE_CLOSE, MODE_UPPER, 1);
double LowerBB1 = iBands(NULL,PERIOD_M30, K_BB_Period3, K_BB_Hensa3, 0, PRICE_CLOSE, MODE_LOWER, 1);
double UpperBB2 = iBands(NULL,PERIOD_M30, K_BB_Period3, K_BB_Hensa3, 0, PRICE_CLOSE, MODE_UPPER, 2);
double LowerBB2 = iBands(NULL,PERIOD_M30 ,K_BB_Period3, K_BB_Hensa3, 0, PRICE_CLOSE, MODE_LOWER, 2);
//ローソク足が、下側のボリンジャーバンドを下抜いたら「買い」
if (iClose(NULL,PERIOD_M30,1) < LowerBB1 && iClose(NULL,PERIOD_M30,2) > LowerBB2)
{
return(2);
} // 買い
//ローソク足が、上側のボリンジャーバンドを上抜いたら「売り」
else if (iClose(NULL,PERIOD_M30,1) > UpperBB1 && iClose(NULL,PERIOD_M30,2) < UpperBB2)
{
return(1);
} // 売り
else
{
return(0);
}
// 決済ルール1を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール2 (ロジック3) |
//+------------------------------------------------------------------+
int Exit_Rule3_2()
{
// 決済ルール2を差し替える時は、下記を差し替えて下さい。
// パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」
// パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」
double SAR1 = iSAR(NULL,PERIOD_H4, SAR_Entry_Step3, SAR_Entry_Maximum3, 1);
double SAR2 = iSAR(NULL,PERIOD_H4, SAR_Entry_Step3, SAR_Entry_Maximum3, 2);
//パラボリックSARが、ローソク足の下側にきたら(上向きの傾きになったら)「買い」
if (SAR1 < iClose(NULL,PERIOD_H4,1) && iClose(NULL,PERIOD_H4,2) < SAR2)
{
return(1);
} // 買い
// パラボリックSARが、ローソク足の上側にきたら(下向きの傾きになったら)「売り」
else if (SAR1 > iClose(NULL,PERIOD_H4,1) && iClose(NULL,PERIOD_H4,2) > SAR2)
{
return(2);
} // 売り
else
{
return(0);
}
// 決済ルール2を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール3 (ロジック3) |
//+------------------------------------------------------------------+
int Exit_Rule3_3()
{
// 決済ルール3を差し替える時は、下記を差し替えて下さい。
//ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「買い」
//ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「売り」
double UpperBB11 = iBands(NULL,PERIOD_M30, K_BB_Period123, K_BB_Hensa123, 0, PRICE_CLOSE, MODE_UPPER, 1);
double LowerBB11 = iBands(NULL,PERIOD_M30, K_BB_Period123, K_BB_Hensa123, 0, PRICE_CLOSE, MODE_LOWER, 1);
double UpperBB12 = iBands(NULL,PERIOD_M30, K_BB_Period123, K_BB_Hensa123, 0, PRICE_CLOSE, MODE_UPPER, 2);
double LowerBB12 = iBands(NULL,PERIOD_M30 ,K_BB_Period123, K_BB_Hensa123, 0, PRICE_CLOSE, MODE_LOWER, 2);
double UpperBB21 = iBands(NULL,PERIOD_M30, K_BB_Period223, K_BB_Hensa223, 0, PRICE_CLOSE, MODE_UPPER, 1);
double LowerBB21 = iBands(NULL,PERIOD_M30, K_BB_Period223, K_BB_Hensa223, 0, PRICE_CLOSE, MODE_LOWER, 1);
double UpperBB22 = iBands(NULL,PERIOD_M30, K_BB_Period223, K_BB_Hensa223, 0, PRICE_CLOSE, MODE_UPPER, 2);
double LowerBB22 = iBands(NULL,PERIOD_M30 ,K_BB_Period223, K_BB_Hensa223, 0, PRICE_CLOSE, MODE_LOWER, 2);
//ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「売り」
if (UpperBB12 < UpperBB22 && UpperBB11 >= UpperBB21)
{
return(1);
} // 買い
//ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「買い」
else if (LowerBB12 > LowerBB22 && LowerBB11 <= LowerBB21)
{
return(2);
} // 売り
else
{
return(0);
}
// 決済ルール3を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール4 (ロジック3) |
//+------------------------------------------------------------------+
int Exit_Rule3_4()
{
// 決済ルール4を差し替える時は、下記を差し替えて下さい。
// 移動平均線のゴールデンクロスとデッドクロス
double MA11 = iMA(NULL,PERIOD_H1, MA_Cross_period13, 0, MODE_SMA, PRICE_CLOSE, 2);
double MA10 = iMA(NULL,PERIOD_H1, MA_Cross_period13, 0, MODE_SMA, PRICE_CLOSE, 1);
double MA21 = iMA(NULL,PERIOD_H1, MA_Cross_period23, 0, MODE_SMA, PRICE_CLOSE, 2);
double MA20 = iMA(NULL,PERIOD_H1, MA_Cross_period23, 0, MODE_SMA, PRICE_CLOSE, 1);
// 短期移動平均線が長期移動平均線を上抜け(ゴールデンクロス)で「買い」
if (MA11 < MA21 && MA10 >= MA20)
{
return(1);
} // 買い
// 短期移動平均線が長期移動平均線を下抜け(デッドクロス)で「売り」
else if(MA11 > MA21 && MA10 <= MA20)
{
return(2);
} // 売り
else
{
return(0);
}
// 決済ルール4を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール5 (ロジック3) |
//+------------------------------------------------------------------+
int Exit_Rule3_5()
{
// 決済ルール5を差し替える時は、下記を差し替えて下さい。
// 決済ルール5を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ロジック3 ここまで |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ロジック4 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリールール1 (ロジック4) |
//+------------------------------------------------------------------+
int Entry_Rule4_1()
{
//エントリールール1を差し替える時は、下記を差し替えて下さい。
//ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「買い」
//ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「売り」
double UpperBB11 = iBands(NULL,PERIOD_H1, BB_Period14, BB_Hensa14, 0, PRICE_CLOSE, MODE_UPPER, 1);
double LowerBB11 = iBands(NULL,PERIOD_H1, BB_Period14, BB_Hensa14, 0, PRICE_CLOSE, MODE_LOWER, 1);
double UpperBB12 = iBands(NULL,PERIOD_H1, BB_Period14, BB_Hensa14, 0, PRICE_CLOSE, MODE_UPPER, 2);
double LowerBB12 = iBands(NULL,PERIOD_H1 ,BB_Period14, BB_Hensa14, 0, PRICE_CLOSE, MODE_LOWER, 2);
double UpperBB21 = iBands(NULL,PERIOD_H1, BB_Period24, BB_Hensa24, 0, PRICE_CLOSE, MODE_UPPER, 1);
double LowerBB21 = iBands(NULL,PERIOD_H1, BB_Period24, BB_Hensa24, 0, PRICE_CLOSE, MODE_LOWER, 1);
double UpperBB22 = iBands(NULL,PERIOD_H1, BB_Period24, BB_Hensa24, 0, PRICE_CLOSE, MODE_UPPER, 2);
double LowerBB22 = iBands(NULL,PERIOD_H1 ,BB_Period24, BB_Hensa24, 0, PRICE_CLOSE, MODE_LOWER, 2);
//ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「買い」
if (UpperBB12 < UpperBB22 && UpperBB11 >= UpperBB21)
{
return(0);
} // 買い
//ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「売り」
else if (LowerBB12 > LowerBB22 && LowerBB11 <= LowerBB21)
{
return(2);
} // 売り
else
{
return(0);
}
//エントリールール1を差し替える時は、ココマデを差し替えて下さい。
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター1 (ロジック4) |
//+------------------------------------------------------------------+
int Entry_Filter4_1()
{
//エントリーフィルター1を差し替える時は、下記を差し替えて下さい。
// 移動平均線の傾きが上方向の時は「買い」、下方向の時は「売り」
double MA2 = iMA(NULL,PERIOD_H1, F_MA_period4, 0, MODE_SMA, PRICE_CLOSE, 2);
double MA1 = iMA(NULL,PERIOD_H1, F_MA_period4, 0, MODE_SMA, PRICE_CLOSE, 1);
// 移動平均線の傾きが上方向の時は「買い」
if (MA2 < MA1)
{
return(1);
} // 買い
// 移動平均線の傾きが下方向の時は「売り」
else if (MA2 > MA1)
{
return(2);
} // 売り
else
{
return(0);
}
//エントリーフィルター1を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター2 (ロジック4) |
//+------------------------------------------------------------------+
int Entry_Filter4_2()
{
//エントリーフィルター2を差し替える時は、下記を差し替えて下さい。
//ボリンジャーバンドの幅(上側ボリンジャーバンド―下側ボリンジャーバンドの値)が、指定%以下の時にエントリーすることが可能
double UpperBB1 = iBands(NULL,PERIOD_H1, F_BB_Period4, F_BB_Hensa4, 0, PRICE_CLOSE, MODE_UPPER, 1);
double LowerBB1 = iBands(NULL,PERIOD_H1, F_BB_Period4, F_BB_Hensa4, 0, PRICE_CLOSE, MODE_LOWER, 1);
//ボリンジャーバンドの幅(上側ボリンジャーバンド―下側ボリンジャーバンドの値)が、指定%以下の時にエントリーすることが可能
if( (UpperBB1 - LowerBB1) / iClose(NULL,PERIOD_H1,1) * 100.0 <= F_BB_HabaFilter_percent4)
{
return(3);
} // エントリー出来る(フィルター)
else
{
return(0);
}
//エントリーフィルター2を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| エントリーフィルター3 (ロジック4) |
//+------------------------------------------------------------------+
int Entry_Filter4_3()
{
//エントリーフィルター3を差し替える時は、下記を差し替えて下さい。
// ダウントレンドで「売り」
if (Kairi_Judge(Trend_period24)>= -Kairi_Judge_percent14 )
{
return(2);
} // 売り
else
{
return(0);
}
//エントリーフィルター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を差し替える時は、下記を差し替えて下さい。
//ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「買い」
//ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「売り」
double UpperBB11 = iBands(NULL,PERIOD_H1, BB_Period14, BB_Hensa14, 0, PRICE_CLOSE, MODE_UPPER, 1);
double LowerBB11 = iBands(NULL,PERIOD_H1, BB_Period14, BB_Hensa14, 0, PRICE_CLOSE, MODE_LOWER, 1);
double UpperBB12 = iBands(NULL,PERIOD_H1, BB_Period14, BB_Hensa14, 0, PRICE_CLOSE, MODE_UPPER, 2);
double LowerBB12 = iBands(NULL,PERIOD_H1 ,BB_Period14, BB_Hensa14, 0, PRICE_CLOSE, MODE_LOWER, 2);
double UpperBB21 = iBands(NULL,PERIOD_H1, BB_Period24, BB_Hensa24, 0, PRICE_CLOSE, MODE_UPPER, 1);
double LowerBB21 = iBands(NULL,PERIOD_H1, BB_Period24, BB_Hensa24, 0, PRICE_CLOSE, MODE_LOWER, 1);
double UpperBB22 = iBands(NULL,PERIOD_H1, BB_Period24, BB_Hensa24, 0, PRICE_CLOSE, MODE_UPPER, 2);
double LowerBB22 = iBands(NULL,PERIOD_H1 ,BB_Period24, BB_Hensa24, 0, PRICE_CLOSE, MODE_LOWER, 2);
//ボリンジャーバンド1の+2σがボリンジャーバンド2の+2σを上抜けで「買い」
if (UpperBB12 < UpperBB22 && UpperBB11 >= UpperBB21)
{
return(1);
} // 買い
//ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「売り」
else if (LowerBB12 > LowerBB22 && LowerBB11 <= LowerBB21)
{
return(2);
} // 売り
else
{
return(0);
}
// 決済ルール1を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール2 (ロジック4) |
//+------------------------------------------------------------------+
int Exit_Rule4_2()
{
// 決済ルール2を差し替える時は、下記を差し替えて下さい。
// パラボリック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(2);
} // 売り
else
{
return(0);
}
// 決済ルール2を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール3 (ロジック4) |
//+------------------------------------------------------------------+
int Exit_Rule4_3()
{
// 決済ルール3を差し替える時は、下記を差し替えて下さい。
//ローソク足が大陽線で売り
if (iClose(NULL,PERIOD_H1,1) > iOpen(NULL,PERIOD_H1,1) &&(iClose(NULL,PERIOD_H1,1) - iOpen(NULL,PERIOD_H1,1))> iClose(NULL,PERIOD_H1,1) * Open_Kairi_percent24 / 100.0)
{
return(2);
} // 買い
//ローソク足が大陰線で買い
else if (iClose(NULL,PERIOD_H1,1) < iOpen(NULL,PERIOD_H1,1) && (iOpen(NULL,PERIOD_H1,1) - iClose(NULL,PERIOD_H1,1))> iClose(NULL,PERIOD_H1,1) * Open_Kairi_percent24 / 100.0)
{
return(1);
} // 売り
else
{
return(0);
}
// 決済ルール3を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール4 (ロジック4) |
//+------------------------------------------------------------------+
int Exit_Rule4_4()
{
// 決済ルール4を差し替える時は、下記を差し替えて下さい。
//ボリンジャーバンド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(1);
} // 買い
//ボリンジャーバンド1の-2σがボリンジャーバンド2の-2σを下抜けで「買い」
else if (LowerBB12 > LowerBB22 && LowerBB11 <= LowerBB21)
{
return(2);
} // 売り
else
{
return(0);
}
// 決済ルール4を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール5 (ロジック4) |
//+------------------------------------------------------------------+
int Exit_Rule4_5()
{
// 決済ルール5を差し替える時は、下記を差し替えて下さい。
// ADXがこの数値以下の時のみエントリー出来る
double ADX1 = iADX(NULL,PERIOD_M5, K_ADX_Period, PRICE_CLOSE, MODE_MAIN, 1);
double ADX2 = iADX(NULL,PERIOD_M5, K_ADX_Period, PRICE_CLOSE, MODE_MAIN, 2);
if (ADX1 <= K_ADX_Filter_Line && ADX2 > K_ADX_Filter_Line)
{
return(1);
} // Short損切
else
{
return(0);
}
// 決済ルール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<MAX_ORDER_REPEAT; i++ )
{
res = OrderSend(symbol,
cmd,
volume,
Ask,
slippage,
NormalizeDouble(stoploss, Digits()),
NormalizeDouble(takeprofit, Digits()),
comment,
magic,
expiration,
arrow_color);
// オーダー発注に成功した場合、チケットNo.を返し関数を終了する
if ( res != -1 ) return(res);
// オーダー発注に失敗した場合、エラーを表示したのちリトライする
if ( res == -1 )
{
err = GetLastError();
Print("OrderSend return error: code=",err, ", Error=", ErrorDescription(err));
// 次のリトライまで700msec待つ
Sleep(700);
RefreshRates();
}
}
return(res);
}
int WrapperOrderSend_S(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<MAX_ORDER_REPEAT; i++ )
{
res = OrderSend(symbol,
cmd,
volume,
Bid,
slippage,
NormalizeDouble(stoploss, Digits()),
NormalizeDouble(takeprofit, Digits()),
comment,
magic,
expiration,
arrow_color);
// オーダー発注に成功した場合、チケットNo.を返し関数を終了する
if ( res != -1 ) return(res);
// オーダー発注に失敗した場合、エラーを表示したのちリトライする
if ( res == -1 )
{
err = GetLastError();
Print("OrderSend return error: code=",err, ", Error=", ErrorDescription(err));
// 次のリトライまで700msec待つ
Sleep(700);
RefreshRates();
}
}
return(res);
}
// OrderModifyのラッパー関数
//  マーケットの制約に合う形にSL、TPを修正したのち発注し
// OederModifyのエラー時のリトライおよびエラー処理を実施する
bool WrapperOrderModify(int ticket, // チケットナンバー
double price, // 注文価格
double stoploss, // StopLoss
double takeprofit, // TakeProfit
datetime expiration, // 有効期限
color arrow_color // 矢印のカラー
)
{
int i;
int err = 0; // エラーNo.
bool res = false; // OrderModifyの戻り値
// MAX_ORDER_REPEAT回数だけリトライする
for ( i=0; i<MAX_ORDER_REPEAT; i++ )
{
res = OrderModify(ticket,
NormalizeDouble(price, Digits()),
NormalizeDouble(stoploss, Digits()),
NormalizeDouble(takeprofit, Digits()),
expiration,
arrow_color);
// オーダー発注に成功した場合、終了フラグを返す
if (res) return(res);
// オーダー発注に失敗した場合、エラーを表示したのちリトライする
if ( !res )
{
err = GetLastError();
Print("OrderModify return error: code=",err, ", Error=", ErrorDescription(err));
// 次のリトライまで700msec待つ
Sleep(700);
RefreshRates();
}
}
return(res);
}
// OrderCloseのラッパー関数
//  マーケットの制約に合う形にSL、TPを修正したのち発注し
// OederCloseのエラー時のリトライおよびエラー処理を実施する
bool WrapperOrderClose_L(int ticket, // チケットナンバー
double lots, // ロットサイズ
double price, // 注文価格
int slippage, // スリッページ
color arrow_color // 矢印のカラー
)
{
int i;
int err = 0; // エラーNo.
bool res = false; // OrderCloseの戻り値
// MAX_ORDER_REPEAT回数だけリトライする
for ( i=0; i<MAX_ORDER_REPEAT; i++ )
{
res = OrderClose(ticket,
lots,
Bid,
slippage*100,
arrow_color);
// オーダー発注に成功した場合、終了フラグを返す
if ( res ) return(res);
// オーダー発注に失敗した場合、エラーを表示したのちリトライする
if ( !res )
{
err = GetLastError();
Print("OrderModify return error: code=",err, ", Error=", ErrorDescription(err));
// 次のリトライまで700msec待つ
Sleep(700);
RefreshRates();
}
}
return(res);
}
bool WrapperOrderClose_S(int ticket, // チケットナンバー
double lots, // ロットサイズ
double price, // 注文価格
int slippage, // スリッページ
color arrow_color // 矢印のカラー
)
{
int i;
int err = 0; // エラーNo.
bool res = false; // OrderCloseの戻り値
// MAX_ORDER_REPEAT回数だけリトライする
for ( i=0; i<MAX_ORDER_REPEAT; i++ )
{
res = OrderClose(ticket,
lots,
Ask,
slippage*100,
arrow_color);
// オーダー発注に成功した場合、終了フラグを返す
if ( res ) return(res);
// オーダー発注に失敗した場合、エラーを表示したのちリトライする
if ( !res )
{
err = GetLastError();
Print("OrderModify return error: code=",err, ", Error=", ErrorDescription(err));
// 次のリトライまで700msec待つ
Sleep(700);
RefreshRates();
}
}
return(res);
}
//+------------------------------------------------------------------+
//| ロット数自動計算 |
//+------------------------------------------------------------------+
double CalcAutoLot(double LotsIncreaceStep){
double AutoLot = 0; // 自動算出ロット数
double DivideAmt = 0;
// 残高とクレジットの合算金額を取得
double ZCAmount = AccountBalance() + AccountCredit();
// ロット数を算出
if(ZCAmount > 0 && LotsIncreaceAmt > 0){
AutoLot = RoundDown(ZCAmount/LotsIncreaceAmt,0)*LotsIncreaceStep;
}else{
AutoLot = 0;
}
// 算出したロット数の調整
AutoLot = NormalizeDouble(AutoLot,LotStepDigit);
if(AutoLot <= MinLot){
AutoLot = MinLot;
}else if(AutoLot >= MaxLot){
AutoLot = MaxLot;
}
return AutoLot;
}
//+------------------------------------------------------------------+
//| 切り捨てファンクション |
//+------------------------------------------------------------------+
double RoundDown(double val,int digit){
return ((double)(int)(val * MathPow(10,digit))) / MathPow(10,digit);
}
int Trend_Judge(int period1,int period2)
{
double MA_Middle1 = iMA(NULL,PERIOD_H1, period1, 0, MODE_SMA, PRICE_CLOSE, 1);
double MA_Long1 = iMA(NULL,PERIOD_H1,period2, 0, MODE_SMA, PRICE_CLOSE, 1);
double MA_Middle2 = iMA(NULL,PERIOD_H1, period1, 0, MODE_SMA, PRICE_CLOSE, 3);
double MA_Long2 = iMA(NULL,PERIOD_H1,period2, 0, MODE_SMA, PRICE_CLOSE, 3);
int UP_Trend = 0; //アップトレンドを0~3段階評価
if (MA_Middle1 > MA_Long1)
{
UP_Trend = UP_Trend+1;
}
if (MA_Middle1-MA_Middle2 > 0)
{
UP_Trend = UP_Trend+1;
}
if (MA_Long1-MA_Long2 > 0)
{
UP_Trend = UP_Trend+1;
}
return(UP_Trend);
}
double Kairi_Judge(int period2)
{
// 長期移動平均線に対し短期移動平均線が、指定%以上、上に乖離したら「売り」、下に乖離したら「買い」。
double MA1 = iMA(NULL,PERIOD_M5, 3, 0, MODE_SMA, PRICE_CLOSE, 1);
double MA2 = iMA(NULL,PERIOD_H1, period2, 0, MODE_SMA, PRICE_CLOSE, 1);
double Long_Kairi = (MA1-MA2)/iClose(NULL,PERIOD_M5,1)*100;
return(Long_Kairi);
}