double MaxSpread_pips = 4.0; // 許容スプレッド(Pips) input double AllowSpread = 10.0; // 許容スプレッドPips(0:自動) // スプレッド計測用 double MeasureSpread, SpreadMin = 1000, SpreadMax = 0, SpreadSum = 0, SpreadAve = 0; double SpreadMin1 = 100, SpreadMax1 = 0, SpreadSum1 = 0, SpreadAve1 = 0; int TickCount = 0, TickCount1 = 0, lastBars; // オートスプレッド用 double Adjustspread = 5.0; // 平均スプレッド加算用宣言 double AllowMaxSpread = 8.0; // 自動最大許容スプレッド double Adjustspread_Margin = 2.0; // 自動スプレッド調整幅 double Adjustspread_Margin1 = 1.0; // 自動スプレッド調整幅(1:00) int OnInit() { // 初期化スプレッド(バックテスト時または手動時、それ以外や自動) if (IsTesting() || AllowSpread != 0) MaxSpread_pips = AllowSpread; if (AllowSpread == 0) MaxSpread_pips = AllowMaxSpread; } void OnTick() { // スプレッド値取得 if (!IsTesting() && AllowSpread == 0) { MeasureSpread = MarketInfo(Symbol(),MODE_SPREAD) / 10; MeasureSP(); //PipsObject(); // チャートにスプレッドデータ表示 } } //+------------------------------------------------------------------+ //| スプレッド計測・オートスプレッド | //+------------------------------------------------------------------+ void MeasureSP() { TickCount++; SpreadSum += MeasureSpread; SpreadMin = SpreadMin == 0 ? SpreadMin = MeasureSpread : SpreadMin; if (TickCount > 0 && SpreadSum > 0) SpreadAve = SpreadSum / TickCount; if (SpreadMax < MeasureSpread) SpreadMax = MeasureSpread; if (SpreadMin > MeasureSpread) SpreadMin = MeasureSpread; // 月足のバー更新時に累積値リセット if (lastBars != iBars(NULL, PERIOD_MN1)) { lastBars = iBars(NULL, PERIOD_MN1); SpreadSum = 0; TickCount = 0; } // オートスプレッド計算 Adjustspread = SpreadAve + Adjustspread_Margin; // 平均にマージン加算 MaxSpread_pips = MathMin(Adjustspread, AllowMaxSpread); // 内部設定の最大値とマージン加算を比較し小さい方を採用 } //+------------------------------------------------------------------+ // コメント部にスプレッドデータ表示 void PipsObject() { // 1:00スプ考慮しない場合 string Data1 = "Tradeable limit : " + DoubleToStr(MaxSpread_pips,1) + " "; string Data2 = "MarketInfo : "+DoubleToStr(MeasureSpread,1) + " "; string Data3 = "Average : " + DoubleToStr(SpreadAve,1) + " "; string Data4 = "Max : " + DoubleToStr(SpreadMax,1) + " "; string Data5 = "Min : " + (SpreadMin==1000? "---" : DoubleToStr(SpreadMin,1)) + " "; label("SP0", "[Spread data (pips)]" + " ", 0, 114, 11, clrWhite); label("SP1", Data1, 0, 88, 11, clrYellow); label("SP2", Data2, 0, 66, 11, clrWhite); label("SP3", Data3, 0, 44, 11, clrWhite); label("SP4", Data4, 0, 22, 11, clrWhite); label("SP5", Data5, 0, 0, 11, clrWhite); } //+------------------------------------------------------------------+ void label(string name, string label_text, int pos_x, int pos_y, int s, color clr= clrBlack) { name = name; ObjectCreate(name, OBJ_LABEL, 0, 0, 0); ObjectSetString (0, name, OBJPROP_TEXT, label_text); ObjectSetInteger(0, name, OBJPROP_FONTSIZE, s); ObjectSetString (0, name, OBJPROP_FONT, "Segoe UI"); ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_RIGHT_LOWER); ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_RIGHT_LOWER); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, pos_x); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, pos_y); ObjectSetInteger(0, name, OBJPROP_COLOR, clr); ObjectSetInteger(0, name, OBJPROP_BACK, true); ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| スプレッド計測・オートスプレッド(1:00計測バージョン) | //+------------------------------------------------------------------+ // 各スプレッド値計算 void MeasureSP() { TickCount++; SpreadSum += MeasureSpread; SpreadMin = SpreadMin == 0 ? SpreadMin = MeasureSpread : SpreadMin; if (TickCount > 0 && SpreadSum > 0) SpreadAve = SpreadSum / TickCount; if (SpreadMax < MeasureSpread) SpreadMax = MeasureSpread; if (SpreadMin > MeasureSpread) SpreadMin = MeasureSpread; // MT4時間1:00のスプレッド yTime = TimeMinute(TimeCurrent()); if (xxTime == 1 && yTime == 0) { TickCount1++; SpreadSum1 += MeasureSpread; SpreadMin1 = SpreadMin1 == 0 ? SpreadMin1 = MeasureSpread : SpreadMin1; if (TickCount1 > 0 && SpreadSum1 > 0) SpreadAve1 = SpreadSum1 / TickCount1; if (SpreadMax1 < MeasureSpread) SpreadMax1 = MeasureSpread; if (SpreadMin1 > MeasureSpread) SpreadMin1 = MeasureSpread; } // 月足のバー更新時に累積値リセット if (lastBars != iBars(NULL, PERIOD_MN1)) { lastBars = iBars(NULL, PERIOD_MN1); SpreadSum = 0; TickCount = 0; SpreadSum1 = 0; TickCount1 = 0; } // オートスプレッド設定機能 Adjustspread = SpreadAve + Adjustspread_Margin; // 平均にマージン加算 MaxSpread_pips = MathMin(Adjustspread, AllowMaxSpread); // 内部設定の最大値とマージン加算を比較し小さい方を採用 if (SpreadAve1 != 0) // 1:00エントリーEA用 { Adjustspread = SpreadAve1 + Adjustspread_Margin1; // 平均にマージン加算 MaxSpread_pips = MathMax(MathMin(Adjustspread, AllowMaxSpread), MaxSpread_pips); // 最大値とマージン加算、全体平均を比較 } } //+------------------------------------------------------------------+ // コメント部にスプレッドデータ表示 void PipsObject() { // 1:00スプ考慮しない場合 string Data1 = "Tradeable limit : " + DoubleToStr(MaxSpread_pips,1) + " "; string Data2 = "MarketInfo : "+DoubleToStr(MeasureSpread,1) + " "; string Data3 = "Average : " + DoubleToStr(SpreadAve,1) + " "; string Data4 = "Max : " + DoubleToStr(SpreadMax,1) + " "; string Data5 = "Min : " + (SpreadMin==1000? "---" : DoubleToStr(SpreadMin,1)) + " "; label("SP0", "[Spread data (pips)]" + " ", 0, 114, 11, clrWhite); label("SP1", Data1, 0, 88, 11, clrYellow); label("SP2", Data2, 0, 66, 11, clrWhite); label("SP3", Data3, 0, 44, 11, clrWhite); label("SP4", Data4, 0, 22, 11, clrWhite); label("SP5", Data5, 0, 0, 11, clrWhite); } //+------------------------------------------------------------------+ void label(string name, string label_text, int pos_x, int pos_y, int s, color clr= clrBlack) { name = name; ObjectCreate(name, OBJ_LABEL, 0, 0, 0); ObjectSetString (0, name, OBJPROP_TEXT, label_text); ObjectSetInteger(0, name, OBJPROP_FONTSIZE, s); ObjectSetString (0, name, OBJPROP_FONT, "Segoe UI"); ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_RIGHT_LOWER); ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_RIGHT_LOWER); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, pos_x); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, pos_y); ObjectSetInteger(0, name, OBJPROP_COLOR, clr); ObjectSetInteger(0, name, OBJPROP_BACK, true); ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); } //+------------------------------------------------------------------+