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

2270 lines
No EOL
151 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.

//+------------------------------------------------------------------+
//| TEST.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
//瞬間的なエントリー・決済エラーへの対応
#property strict
#include <stdlib.mqh>
#define MAX_ORDER_REPEAT 3
enum ENUM_POSITION{
Max_Position_1 = 1, //最大1ポジション
Max_Position_2 = 2, //最大2ポジション
Max_Position_3 = 3, //最大3ポジション
Max_Position_4 = 4 //最大4ポジション
};
//チャート表示部分
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 ENUM_POSITION Max_position = Max_Position_4;
input int Slippage = 3; //Slippage_Point
input int MaxSpreadPips = 3; //Spread_Pips
double xpoint;
double xspread;
//ローソク足始値のみに稼働させる場合は、trueにして下さい。
bool CandleStartStartingEntry = true;
bool CandleStartStartingTrailing = true;
bool CandleStartStartingExit = true;
// ロジック1
input string __Logic1__ = "Logic1 Parameters"; // ロジック1のパラメータ
input int MagicNumber1 = 24071101;
input double Lots1 = 0.01;
int TakeProfit_pips1 = 100;
int StopLoss_pips1 = 280;
int Rikaku_pips1 = 50;
int Songiri_pips1 = 270;
//トレイリングストップのパラメータ
int TrailingStopStartPips1 = 50;
int TrailingStopPips1 = 10;
int xBarsEntry1 = 0, xBarsExit1 = 0, xBarsTrailing1 = 0;
int xxBars1 = 0;
//最大ポジション数を、下記で入力指定して下さい。
int maxposition1 = 1;
//エントリールールの各変数を下記に貼りつけます。
int RSI_Gyakubari_period = 20; // RSIの計算期間
int RSI_Gyakubari_Line = 60; // 逆張りエントリーの基準となるライン
//エントリーフィルターの各変数を下記に貼りつけます。
int MA_Break_period = 220; // 移動平均線の計算期間
int F_BB_Period = 20; // ボリンジャーバンドの計算期間
double F_BB_Hensa = 2.6; // ボリンジャーバンドの偏差
int ADX_Period = 70; // ADXの計算期間
int ADX_Filter_Line = 25; // ADXがこの数値以下の時のみエントリー出来る
//決済ルールの各変数を下記に貼りつけます。
int K_RSI_Gyakubari_period = 25; // RSIの計算期間
int K_RSI_Gyakubari_Line = 60; // 逆張りエントリーの基準となるライン
int BB_Period = 280; // ボリンジャーバンドの計算期間
double BB_Hensa = 3.2; // ボリンジャーバンドの偏差
int Envelopes_Period = 90; // エンベロープの計算期間
double Envelopes_Deviation = 0.1; // エンベロープの幅偏差
int RSI_Junbari_Filter_period = 30; // RSIの計算期間
int RSI_Junbari_Filter_Line = 80; // 順張りエントリーの基準となるライン
// ロジック2
input string __Logic2__ = "Logic2 Parameters"; // ロジック2のパラメータ
input int MagicNumber2 = 24071102;
input double Lots2 = 0.01;
int TakeProfit_pips2 = 300;
int StopLoss_pips2 = 100;
int Rikaku_pips2 = 300;
int Songiri_pips2 = 100;
//トレイリングストップのパラメータ
int TrailingStopStartPips2 = 100;
int TrailingStopPips2 = 160;
int xBarsEntry2 = 0, xBarsExit2 = 0, xBarsTrailing2 = 0;
int xxBars2 = 0;
//最大ポジション数を、下記で入力指定して下さい。
int maxposition2 = 1;
//エントリールールの各変数を下記に貼りつけます。
int MA_Cross_period1 = 20; // 短期移動平均線
int MA_Cross_period2 = 80; // 長期移動平均線
//エントリーフィルターの各変数を下記に貼りつけます。
int F_BB_Period2 = 40; // ボリンジャーバンドの計算期間
double F_BB_Hensa2 = 1.6; // ボリンジャーバンドの偏差
int RSI_Filter_period = 3; // RSIの計算期間
int RSI_Filter_Line = 10; // 逆張りエントリーの基準となるライン
int F_MA_Cross_period1 = 10; // 短期移動平均線
int F_MA_Cross_period2 = 30; // 長期移動平均線
int ADX_Period2 = 70; // ±DIの計算期間
int ADX_Filter_Line2 = 15; // ±DIの指定値以上ライン
int ATR_Period = 50; // ATRの計算期間
double ATR_Filter_Line = 0.4; // ATRがこの数値以下の時のみエントリー出来る
//決済ルールの各変数を下記に貼りつけます。
int BB_Period2 = 140; // ボリンジャーバンドの計算期間
double BB_Hensa2 = 2; // ボリンジャーバンドの偏差
// ロジック3
input string __Logic3__ = "Logic3 Parameters"; // ロジック3のパラメータ
input int MagicNumber3 = 24071103;
input double Lots3 = 0.01;
int TakeProfit_pips3 = 200;
int StopLoss_pips3 = 60;
int Rikaku_pips3 = 120;
int Songiri_pips3 = 60;
//トレイリングストップのパラメータ
int TrailingStopStartPips3 = 70;
int TrailingStopPips3 = 30;
int xBarsEntry3 = 0, xBarsExit3 = 0, xBarsTrailing3 = 0;
int xxBars3 = 0;
//最大ポジション数を、下記で入力指定して下さい。
int maxposition3 = 1;
//エントリールールの各変数を下記に貼りつけます。
int Fast_EMA_period = 14; // 短期EMA期間(MACD)
int Slow_EMA_period = 26; // 短期EMA期間(MACD)
int Signal_period = 12; // シグナル期間(MACD)
//エントリーフィルターの各変数を下記に貼りつけます。
int F_BB_Period3 = 60; // ボリンジャーバンドの計算期間
double F_BB_Hensa3 = 1.0; // ボリンジャーバンドの偏差
double F_BB_HabaFilter_percent3 = 1; // ボリンジャーバンドの幅%(幅フィルター)
int CCI_period = 75; // CCIの計算期間
//決済ルールの各変数を下記に貼りつけます。
double SAR_Entry_Step = 0.003; // パラボリック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 = 400;
int StopLoss_pips4 = 100;
int Rikaku_pips4 = 320;
int Songiri_pips4 = 50;
//トレイリングストップのパラメータ
int TrailingStopStartPips4 = 30;
int TrailingStopPips4 = 70;
int xBarsEntry4 = 0, xBarsExit4 = 0, xBarsTrailing4 = 0;
int xxBars4 = 0;
//最大ポジション数を、下記で入力指定して下さい。
int maxposition4 = 1;
//エントリールールの各変数を下記に貼りつけます。
double SAR_Entry_Step4 = 0.01; // パラボリックSARのステップ(パラメータ)
double SAR_Entry_Maximum4 = 0.2; // パラボリックSARの上限値(パラメータ)
//エントリーフィルターの各変数を下記に貼りつけます。
int F_BB_Period4 = 56; // ボリンジャーバンドの計算期間
double F_BB_Hensa4 = 0.3; // ボリンジャーバンドの偏差
int BB_Period4 = 50; // ボリンジャーバンドの計算期間
double BB_Hensa4 = 1.5; // ボリンジャーバンドの偏差
double BB_HabaFilter_percent4 = 0.8; // ボリンジャーバンドの幅%(幅フィルター)
//決済ルールの各変数を下記に貼りつけます。
//+------------------------------------------------------------------+
//| 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;
}
//使用しているインジケータを非表示にする
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)
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)
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)
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)
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)
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,
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;
// エントリー条件を確認し、成立していればエントリーを行う
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)
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(); // 買いポジションだった場合の含み損益を計算する
// TrailingStopを確認する
if (profit >= trailingstopstartpips * xpoint
&& OrderStopLoss() < NormalizeDouble(Bid - trailingstoppips * xpoint, Digits()))
{
res = WrapperOrderModify(OrderTicket(),
OrderOpenPrice(),
Bid - trailingstoppips * xpoint,
OrderTakeProfit(),
0,
Green);
}
}
if (OrderType() == OP_SELL)
{
profit = OrderOpenPrice() - Ask; // 売りポジションだった場合の含み損益を計算する
// TrailingStopを確認する
if (profit >= trailingstopstartpips * xpoint
&& OrderStopLoss() > NormalizeDouble(Ask + trailingstoppips * xpoint, Digits()))
{
res = WrapperOrderModify(OrderTicket(),
OrderOpenPrice(),
Ask + trailingstoppips * xpoint,
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;
// ロジック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();
}
// ロジック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();
}
// ロジック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();
}
// ロジック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();
}
// それ以外を指定した場合、ロジック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();
}
// エントリー判断
if (rule == 1 && (filter1 == 1 || filter1 == 3)
&& (filter2 == 1 || filter2 == 3)
&& (filter3 == 1 || filter3 == 3)
&& (filter4 == 1 || filter4 == 3)
&& (filter5 == 1 || filter5 == 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)
)
{
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を差し替える時は、下記を差し替えて下さい。
//エントリーフィルター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);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール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を差し替える時は、下記を差し替えて下さい。
//エントリーフィルター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を差し替える時は、下記を差し替えて下さい。
// ローソク足の終値が、ボリンジャーバンドより外側にある時のみ、エントリーすることが可能
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(iClose(NULL,PERIOD_H1,1) > UpperBB1 || iClose(NULL,PERIOD_H1,1) < LowerBB1)
{
return(3);
} // エントリー出来る(フィルター)
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, 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);
}
// 決済ルール1を差し替える時は、ココマデを差し替えて下さい。
return(3);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 決済ルール2 (ロジック4) |
//+------------------------------------------------------------------+
int Exit_Rule4_2()
{
// 決済ルール2を差し替える時は、下記を差し替えて下さい。
// 決済ルール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(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(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));
// 次のリトライまで500msec待つ
Sleep(500);
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));
// 次のリトライまで500msec待つ
Sleep(500);
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));
// 次のリトライまで500msec待つ
Sleep(500);
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));
// 次のリトライまで500msec待つ
Sleep(500);
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));
// 次のリトライまで500msec待つ
Sleep(500);
RefreshRates();
}
}
return(res);
}