gryps2/UI-code/T-045_AutoSpread.txt
super.admin ae3f0ebf03 convert
2025-05-30 14:58:21 +02:00

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);
}
//+------------------------------------------------------------------+