176 lines
No EOL
14 KiB
Text
176 lines
No EOL
14 KiB
Text
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);
|
|
}
|
|
//+------------------------------------------------------------------+ |