面板进行了优化,搞了许久。。。这方面的功底有些欠缺啊。
面板源码修正:
//+------------------------------------------------------------------+
//| 更新面板数据(数值)——优化颜色和格式 |
//+------------------------------------------------------------------+
void UpdatePanelData()
{
if(!gInfoPanelCollapsed)
{
ObjectSetString(0, "info_balance", OBJPROP_TEXT, DoubleToString(GetAccountBalance(), 2));
ObjectSetString(0, "info_equity", OBJPROP_TEXT, DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY), 2));
ObjectSetString(0, "info_margin", OBJPROP_TEXT, DoubleToString(AccountInfoDouble(ACCOUNT_MARGIN), 2));
ObjectSetString(0, "info_freeMargin", OBJPROP_TEXT, DoubleToString(AccountInfoDouble(ACCOUNT_MARGIN_FREE), 2));
ObjectSetString(0, "info_totalOrders", OBJPROP_TEXT, IntegerToString(GetAllPositionsCount()));
double totalProfit = GetTotalProfit();
ObjectSetString(0, "info_totalProfit", OBJPROP_TEXT, DoubleToString(totalProfit, 2));
if(totalProfit >= 0)
ObjectSetInteger(0, "info_totalProfit", OBJPROP_COLOR, clrLime);
else
ObjectSetInteger(0, "info_totalProfit", OBJPROP_COLOR, clrRed);
for(int i = 0; i < totalPairs; i++)
{
double pairProfit = GetPairProfit(pairs.symbol);
string profitStr = DoubleToString(pairProfit, 2);
ObjectSetString(0, "info_profit"+IntegerToString(i), OBJPROP_TEXT, profitStr);
if(pairProfit >= 0)
ObjectSetInteger(0, "info_profit"+IntegerToString(i), OBJPROP_COLOR, clrLime);
else
ObjectSetInteger(0, "info_profit"+IntegerToString(i), OBJPROP_COLOR, clrRed);
}
}
if(!gTradePanelCollapsed)
{
ObjectSetString(0, "trade_selectedPair", OBJPROP_TEXT, pairs[gSelectedPairIndex].symbol);
double lot = CalculateLotSize(pairs[gSelectedPairIndex]);
ObjectSetString(0, "TRADEs_B", OBJPROP_TEXT, "买入 " + DoubleToString(lot, 2));
ObjectSetString(0, "TRADEs_S", OBJPROP_TEXT, "卖出 " + DoubleToString(lot, 2));
}
}
//+------------------------------------------------------------------+
//| 创建信息面板(中文)——加宽宽度并调整位置,保证所有信息完整显示 |
//+------------------------------------------------------------------+
void CreateInfoPanel()
{
int x = 370, y = 20, w = 420, h = 460; // 大幅加宽并右移,避免与交易面板重叠
if(!ObjectCreate(0, "info_background", OBJ_RECTANGLE_LABEL, 0, 0, 0))
Print("创建背景失败");
ObjectSetInteger(0, "info_background", OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, "info_background", OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, "info_background", OBJPROP_XSIZE, w);
ObjectSetInteger(0, "info_background", OBJPROP_YSIZE, h);
ObjectSetInteger(0, "info_background", OBJPROP_BGCOLOR, clrDarkSlateGray);
ObjectSetInteger(0, "info_background", OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "info_background", OBJPROP_BORDER_TYPE, BORDER_SUNKEN);
ObjectSetInteger(0, "info_background", OBJPROP_BORDER_COLOR, clrGoldenrod);
ObjectCreate(0, "info_toggle", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "info_toggle", OBJPROP_XDISTANCE, x + w - 70);
ObjectSetInteger(0, "info_toggle", OBJPROP_YDISTANCE, y + 8);
ObjectSetInteger(0, "info_toggle", OBJPROP_YSIZE, 24);
ObjectSetInteger(0, "info_toggle", OBJPROP_XSIZE, 60);
ObjectSetString(0, "info_toggle", OBJPROP_TEXT, "隐藏");
ObjectSetInteger(0, "info_toggle", OBJPROP_BGCOLOR, clrDimGray);
ObjectSetInteger(0, "info_toggle", OBJPROP_FONTSIZE, 11);
ObjectSetInteger(0, "info_toggle", OBJPROP_COLOR, clrWhite);
ObjectCreate(0, "info_title", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_title", OBJPROP_XDISTANCE, x + 15);
ObjectSetInteger(0, "info_title", OBJPROP_YDISTANCE, y + 15);
ObjectSetString(0, "info_title", OBJPROP_TEXT, "账户信息");
ObjectSetInteger(0, "info_title", OBJPROP_COLOR, clrCyan);
ObjectSetInteger(0, "info_title", OBJPROP_FONTSIZE, 16);
ObjectSetString(0, "info_title", OBJPROP_FONT, "Arial Bold");
int lineY = y + 50;
int step = 28;
int labelX = x + 20;
int valueX = x + 220; // 数值列右移,给长标签留足空间
// 余额
ObjectCreate(0, "info_balanceLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_balanceLabel", OBJPROP_XDISTANCE, labelX);
ObjectSetInteger(0, "info_balanceLabel", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_balanceLabel", OBJPROP_TEXT, "账户余额:");
ObjectSetInteger(0, "info_balanceLabel", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "info_balanceLabel", OBJPROP_FONTSIZE, 12);
ObjectCreate(0, "info_balance", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_balance", OBJPROP_XDISTANCE, valueX);
ObjectSetInteger(0, "info_balance", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_balance", OBJPROP_TEXT, "0.00");
ObjectSetInteger(0, "info_balance", OBJPROP_COLOR, clrYellow);
ObjectSetInteger(0, "info_balance", OBJPROP_FONTSIZE, 12);
lineY += step;
// 净值
ObjectCreate(0, "info_equityLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_equityLabel", OBJPROP_XDISTANCE, labelX);
ObjectSetInteger(0, "info_equityLabel", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_equityLabel", OBJPROP_TEXT, "账户净值:");
ObjectSetInteger(0, "info_equityLabel", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "info_equityLabel", OBJPROP_FONTSIZE, 12);
ObjectCreate(0, "info_equity", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_equity", OBJPROP_XDISTANCE, valueX);
ObjectSetInteger(0, "info_equity", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_equity", OBJPROP_TEXT, "0.00");
ObjectSetInteger(0, "info_equity", OBJPROP_COLOR, clrYellow);
ObjectSetInteger(0, "info_equity", OBJPROP_FONTSIZE, 12);
lineY += step;
// 已用保证金
ObjectCreate(0, "info_marginLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_marginLabel", OBJPROP_XDISTANCE, labelX);
ObjectSetInteger(0, "info_marginLabel", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_marginLabel", OBJPROP_TEXT, "已用保证金:");
ObjectSetInteger(0, "info_marginLabel", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "info_marginLabel", OBJPROP_FONTSIZE, 12);
ObjectCreate(0, "info_margin", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_margin", OBJPROP_XDISTANCE, valueX);
ObjectSetInteger(0, "info_margin", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_margin", OBJPROP_TEXT, "0.00");
ObjectSetInteger(0, "info_margin", OBJPROP_COLOR, clrYellow);
ObjectSetInteger(0, "info_margin", OBJPROP_FONTSIZE, 12);
lineY += step;
// 可用保证金
ObjectCreate(0, "info_freeMarginLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_freeMarginLabel", OBJPROP_XDISTANCE, labelX);
ObjectSetInteger(0, "info_freeMarginLabel", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_freeMarginLabel", OBJPROP_TEXT, "可用保证金:");
ObjectSetInteger(0, "info_freeMarginLabel", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "info_freeMarginLabel", OBJPROP_FONTSIZE, 12);
ObjectCreate(0, "info_freeMargin", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_freeMargin", OBJPROP_XDISTANCE, valueX);
ObjectSetInteger(0, "info_freeMargin", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_freeMargin", OBJPROP_TEXT, "0.00");
ObjectSetInteger(0, "info_freeMargin", OBJPROP_COLOR, clrYellow);
ObjectSetInteger(0, "info_freeMargin", OBJPROP_FONTSIZE, 12);
lineY += step;
// 持仓数
ObjectCreate(0, "info_totalOrdersLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_totalOrdersLabel", OBJPROP_XDISTANCE, labelX);
ObjectSetInteger(0, "info_totalOrdersLabel", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_totalOrdersLabel", OBJPROP_TEXT, "持仓总单数:");
ObjectSetInteger(0, "info_totalOrdersLabel", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "info_totalOrdersLabel", OBJPROP_FONTSIZE, 12);
ObjectCreate(0, "info_totalOrders", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_totalOrders", OBJPROP_XDISTANCE, valueX);
ObjectSetInteger(0, "info_totalOrders", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_totalOrders", OBJPROP_TEXT, "0");
ObjectSetInteger(0, "info_totalOrders", OBJPROP_COLOR, clrYellow);
ObjectSetInteger(0, "info_totalOrders", OBJPROP_FONTSIZE, 12);
lineY += step + 8;
// 分割线
ObjectCreate(0, "info_line1", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_line1", OBJPROP_XDISTANCE, x + 15);
ObjectSetInteger(0, "info_line1", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_line1", OBJPROP_TEXT, "────────────────────────────────────");
ObjectSetInteger(0, "info_line1", OBJPROP_COLOR, clrLightGray);
lineY += 25;
// 总盈亏
ObjectCreate(0, "info_totalProfitLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_totalProfitLabel", OBJPROP_XDISTANCE, labelX);
ObjectSetInteger(0, "info_totalProfitLabel", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_totalProfitLabel", OBJPROP_TEXT, "总盈亏:");
ObjectSetInteger(0, "info_totalProfitLabel", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "info_totalProfitLabel", OBJPROP_FONTSIZE, 12);
ObjectCreate(0, "info_totalProfit", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_totalProfit", OBJPROP_XDISTANCE, valueX);
ObjectSetInteger(0, "info_totalProfit", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_totalProfit", OBJPROP_TEXT, "0.00");
ObjectSetInteger(0, "info_totalProfit", OBJPROP_COLOR, clrYellow);
ObjectSetInteger(0, "info_totalProfit", OBJPROP_FONTSIZE, 12);
lineY += step + 8;
// 各货币对盈亏
for(int i = 0; i < totalPairs; i++)
{
ObjectCreate(0, "info_profitLabel"+IntegerToString(i), OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_profitLabel"+IntegerToString(i), OBJPROP_XDISTANCE, labelX);
ObjectSetInteger(0, "info_profitLabel"+IntegerToString(i), OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_profitLabel"+IntegerToString(i), OBJPROP_TEXT, pairs.symbol + ":");
ObjectSetInteger(0, "info_profitLabel"+IntegerToString(i), OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "info_profitLabel"+IntegerToString(i), OBJPROP_FONTSIZE, 11);
ObjectCreate(0, "info_profit"+IntegerToString(i), OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "info_profit"+IntegerToString(i), OBJPROP_XDISTANCE, valueX);
ObjectSetInteger(0, "info_profit"+IntegerToString(i), OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "info_profit"+IntegerToString(i), OBJPROP_TEXT, "0.00");
ObjectSetInteger(0, "info_profit"+IntegerToString(i), OBJPROP_COLOR, clrYellow);
ObjectSetInteger(0, "info_profit"+IntegerToString(i), OBJPROP_FONTSIZE, 11);
lineY += step;
}
}
//+------------------------------------------------------------------+
//| 创建交易面板(中文)——保持宽度不变,确保文字完整显示 |
//+------------------------------------------------------------------+
void CreateTradePanel()
{
int x = 10, y = 20, w = 350, h = 460; // 交易面板宽度保持350px
if(!ObjectCreate(0, "trade_background", OBJ_RECTANGLE_LABEL, 0, 0, 0))
Print("创建交易面板背景失败");
ObjectSetInteger(0, "trade_background", OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, "trade_background", OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, "trade_background", OBJPROP_XSIZE, w);
ObjectSetInteger(0, "trade_background", OBJPROP_YSIZE, h);
ObjectSetInteger(0, "trade_background", OBJPROP_BGCOLOR, clrDarkSlateGray);
ObjectSetInteger(0, "trade_background", OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "trade_background", OBJPROP_BORDER_TYPE, BORDER_SUNKEN);
ObjectSetInteger(0, "trade_background", OBJPROP_BORDER_COLOR, clrGoldenrod);
ObjectCreate(0, "trade_toggle", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "trade_toggle", OBJPROP_XDISTANCE, x + w - 70);
ObjectSetInteger(0, "trade_toggle", OBJPROP_YDISTANCE, y + 8);
ObjectSetInteger(0, "trade_toggle", OBJPROP_YSIZE, 24);
ObjectSetInteger(0, "trade_toggle", OBJPROP_XSIZE, 60);
ObjectSetString(0, "trade_toggle", OBJPROP_TEXT, "隐藏");
ObjectSetInteger(0, "trade_toggle", OBJPROP_BGCOLOR, clrDimGray);
ObjectSetInteger(0, "trade_toggle", OBJPROP_FONTSIZE, 11);
ObjectSetInteger(0, "trade_toggle", OBJPROP_COLOR, clrWhite);
ObjectCreate(0, "trade_title", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "trade_title", OBJPROP_XDISTANCE, x + 15);
ObjectSetInteger(0, "trade_title", OBJPROP_YDISTANCE, y + 15);
ObjectSetString(0, "trade_title", OBJPROP_TEXT, "交易控制");
ObjectSetInteger(0, "trade_title", OBJPROP_COLOR, clrCyan);
ObjectSetInteger(0, "trade_title", OBJPROP_FONTSIZE, 16);
ObjectSetString(0, "trade_title", OBJPROP_FONT, "Arial Bold");
int lineY = y + 50;
int step = 26;
int labelX = x + 20;
int valueX = x + 200;
// 当前货币对
ObjectCreate(0, "trade_selectedLabel", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "trade_selectedLabel", OBJPROP_XDISTANCE, labelX);
ObjectSetInteger(0, "trade_selectedLabel", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "trade_selectedLabel", OBJPROP_TEXT, "当前货币兑:");
ObjectSetInteger(0, "trade_selectedLabel", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "trade_selectedLabel", OBJPROP_FONTSIZE, 12);
ObjectCreate(0, "trade_selectedPair", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "trade_selectedPair", OBJPROP_XDISTANCE, valueX);
ObjectSetInteger(0, "trade_selectedPair", OBJPROP_YDISTANCE, lineY);
ObjectSetString(0, "trade_selectedPair", OBJPROP_TEXT, pairs[0].symbol);
ObjectSetInteger(0, "trade_selectedPair", OBJPROP_COLOR, clrYellow);
ObjectSetInteger(0, "trade_selectedPair", OBJPROP_FONTSIZE, 12);
lineY += step + 8;
// 货币对选择按钮
int btnY = lineY;
int btnW = 36;
for(int i = 0; i < totalPairs; i++)
{
ObjectCreate(0, "pair_btn_"+IntegerToString(i), OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "pair_btn_"+IntegerToString(i), OBJPROP_XDISTANCE, x + 18 + i*(btnW+6));
ObjectSetInteger(0, "pair_btn_"+IntegerToString(i), OBJPROP_YDISTANCE, btnY);
ObjectSetInteger(0, "pair_btn_"+IntegerToString(i), OBJPROP_XSIZE, btnW);
ObjectSetInteger(0, "pair_btn_"+IntegerToString(i), OBJPROP_YSIZE, 26);
ObjectSetString(0, "pair_btn_"+IntegerToString(i), OBJPROP_TEXT, IntegerToString(i+1));
ObjectSetInteger(0, "pair_btn_"+IntegerToString(i), OBJPROP_BGCOLOR, clrDarkGray);
ObjectSetInteger(0, "pair_btn_"+IntegerToString(i), OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "pair_btn_"+IntegerToString(i), OBJPROP_FONTSIZE, 11);
}
lineY = btnY + 36;
// 平仓按钮(宽度155px,文字完整)
ObjectCreate(0, "btn_closeProfit", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "btn_closeProfit", OBJPROP_XDISTANCE, x + 15);
ObjectSetInteger(0, "btn_closeProfit", OBJPROP_YDISTANCE, lineY);
ObjectSetInteger(0, "btn_closeProfit", OBJPROP_XSIZE, 155);
ObjectSetInteger(0, "btn_closeProfit", OBJPROP_YSIZE, 28);
ObjectSetString(0, "btn_closeProfit", OBJPROP_TEXT, "平盈利单");
ObjectSetInteger(0, "btn_closeProfit", OBJPROP_BGCOLOR, clrDarkGray);
ObjectSetInteger(0, "btn_closeProfit", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "btn_closeProfit", OBJPROP_FONTSIZE, 12);
ObjectCreate(0, "btn_closeLoss", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "btn_closeLoss", OBJPROP_XDISTANCE, x + 180);
ObjectSetInteger(0, "btn_closeLoss", OBJPROP_YDISTANCE, lineY);
ObjectSetInteger(0, "btn_closeLoss", OBJPROP_XSIZE, 155);
ObjectSetInteger(0, "btn_closeLoss", OBJPROP_YSIZE, 28);
ObjectSetString(0, "btn_closeLoss", OBJPROP_TEXT, "平亏损单");
ObjectSetInteger(0, "btn_closeLoss", OBJPROP_BGCOLOR, clrDarkGray);
ObjectSetInteger(0, "btn_closeLoss", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "btn_closeLoss", OBJPROP_FONTSIZE, 12);
lineY += 34;
ObjectCreate(0, "btn_closePair", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "btn_closePair", OBJPROP_XDISTANCE, x + 15);
ObjectSetInteger(0, "btn_closePair", OBJPROP_YDISTANCE, lineY);
ObjectSetInteger(0, "btn_closePair", OBJPROP_XSIZE, 155);
ObjectSetInteger(0, "btn_closePair", OBJPROP_YSIZE, 28);
ObjectSetString(0, "btn_closePair", OBJPROP_TEXT, "平该货币兑");
ObjectSetInteger(0, "btn_closePair", OBJPROP_BGCOLOR, clrDarkGray);
ObjectSetInteger(0, "btn_closePair", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "btn_closePair", OBJPROP_FONTSIZE, 12);
ObjectCreate(0, "btn_closeAll", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "btn_closeAll", OBJPROP_XDISTANCE, x + 180);
ObjectSetInteger(0, "btn_closeAll", OBJPROP_YDISTANCE, lineY);
ObjectSetInteger(0, "btn_closeAll", OBJPROP_XSIZE, 155);
ObjectSetInteger(0, "btn_closeAll", OBJPROP_YSIZE, 28);
ObjectSetString(0, "btn_closeAll", OBJPROP_TEXT, "平全部单");
ObjectSetInteger(0, "btn_closeAll", OBJPROP_BGCOLOR, clrDarkGray);
ObjectSetInteger(0, "btn_closeAll", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "btn_closeAll", OBJPROP_FONTSIZE, 12);
lineY += 38;
// 开关按钮(宽度155px,文字完整)
ObjectCreate(0, "sw_autoTrade", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "sw_autoTrade", OBJPROP_XDISTANCE, x + 15);
ObjectSetInteger(0, "sw_autoTrade", OBJPROP_YDISTANCE, lineY);
ObjectSetInteger(0, "sw_autoTrade", OBJPROP_XSIZE, 155);
ObjectSetInteger(0, "sw_autoTrade", OBJPROP_YSIZE, 26);
ObjectSetString(0, "sw_autoTrade", OBJPROP_TEXT, "自动交易: 开");
ObjectSetInteger(0, "sw_autoTrade", OBJPROP_BGCOLOR, clrGreen);
ObjectSetInteger(0, "sw_autoTrade", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "sw_autoTrade", OBJPROP_FONTSIZE, 11);
ObjectCreate(0, "sw_gridProfit", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "sw_gridProfit", OBJPROP_XDISTANCE, x + 180);
ObjectSetInteger(0, "sw_gridProfit", OBJPROP_YDISTANCE, lineY);
ObjectSetInteger(0, "sw_gridProfit", OBJPROP_XSIZE, 155);
ObjectSetInteger(0, "sw_gridProfit", OBJPROP_YSIZE, 26);
ObjectSetString(0, "sw_gridProfit", OBJPROP_TEXT, "盈利网格: 开");
ObjectSetInteger(0, "sw_gridProfit", OBJPROP_BGCOLOR, clrGreen);
ObjectSetInteger(0, "sw_gridProfit", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "sw_gridProfit", OBJPROP_FONTSIZE, 11);
lineY += 32;
ObjectCreate(0, "sw_gridLoss", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "sw_gridLoss", OBJPROP_XDISTANCE, x + 15);
ObjectSetInteger(0, "sw_gridLoss", OBJPROP_YDISTANCE, lineY);
ObjectSetInteger(0, "sw_gridLoss", OBJPROP_XSIZE, 155);
ObjectSetInteger(0, "sw_gridLoss", OBJPROP_YSIZE, 26);
ObjectSetString(0, "sw_gridLoss", OBJPROP_TEXT, "亏损网格: 开");
ObjectSetInteger(0, "sw_gridLoss", OBJPROP_BGCOLOR, clrGreen);
ObjectSetInteger(0, "sw_gridLoss", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "sw_gridLoss", OBJPROP_FONTSIZE, 11);
ObjectCreate(0, "sw_mobileTrade", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "sw_mobileTrade", OBJPROP_XDISTANCE, x + 180);
ObjectSetInteger(0, "sw_mobileTrade", OBJPROP_YDISTANCE, lineY);
ObjectSetInteger(0, "sw_mobileTrade", OBJPROP_XSIZE, 155);
ObjectSetInteger(0, "sw_mobileTrade", OBJPROP_YSIZE, 26);
ObjectSetString(0, "sw_mobileTrade", OBJPROP_TEXT, "移动跟单: 关");
ObjectSetInteger(0, "sw_mobileTrade", OBJPROP_BGCOLOR, clrDarkGray);
ObjectSetInteger(0, "sw_mobileTrade", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "sw_mobileTrade", OBJPROP_FONTSIZE, 11);
lineY += 32;
ObjectCreate(0, "sw_nightUnload", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "sw_nightUnload", OBJPROP_XDISTANCE, x + 15);
ObjectSetInteger(0, "sw_nightUnload", OBJPROP_YDISTANCE, lineY);
ObjectSetInteger(0, "sw_nightUnload", OBJPROP_XSIZE, 155);
ObjectSetInteger(0, "sw_nightUnload", OBJPROP_YSIZE, 26);
ObjectSetString(0, "sw_nightUnload", OBJPROP_TEXT, "夜间清仓: 关");
ObjectSetInteger(0, "sw_nightUnload", OBJPROP_BGCOLOR, clrDarkGray);
ObjectSetInteger(0, "sw_nightUnload", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "sw_nightUnload", OBJPROP_FONTSIZE, 11);
lineY += 40;
// 买卖按钮(宽度155px,文字完整)
ObjectCreate(0, "TRADEs_B", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "TRADEs_B", OBJPROP_XDISTANCE, x + 15);
ObjectSetInteger(0, "TRADEs_B", OBJPROP_YDISTANCE, lineY);
ObjectSetInteger(0, "TRADEs_B", OBJPROP_XSIZE, 155);
ObjectSetInteger(0, "TRADEs_B", OBJPROP_YSIZE, 32);
ObjectSetString(0, "TRADEs_B", OBJPROP_TEXT, "买入 0.01");
ObjectSetInteger(0, "TRADEs_B", OBJPROP_BGCOLOR, clrBlue);
ObjectSetInteger(0, "TRADEs_B", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "TRADEs_B", OBJPROP_FONTSIZE, 13);
ObjectCreate(0, "TRADEs_S", OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, "TRADEs_S", OBJPROP_XDISTANCE, x + 180);
ObjectSetInteger(0, "TRADEs_S", OBJPROP_YDISTANCE, lineY);
ObjectSetInteger(0, "TRADEs_S", OBJPROP_XSIZE, 155);
ObjectSetInteger(0, "TRADEs_S", OBJPROP_YSIZE, 32);
ObjectSetString(0, "TRADEs_S", OBJPROP_TEXT, "卖出 0.01");
ObjectSetInteger(0, "TRADEs_S", OBJPROP_BGCOLOR, clrRed);
ObjectSetInteger(0, "TRADEs_S", OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, "TRADEs_S", OBJPROP_FONTSIZE, 13);
}
//+------------------------------------------------------------------+
//| 更新按钮状态 |
//+------------------------------------------------------------------+
void UpdateButtonsState()
{
ObjectSetString(0, "sw_autoTrade", OBJPROP_TEXT, gAutoTrade ? "自动交易: 开" : "自动交易: 关");
ObjectSetInteger(0, "sw_autoTrade", OBJPROP_BGCOLOR, gAutoTrade ? clrGreen : clrDarkGray);
ObjectSetString(0, "sw_gridProfit", OBJPROP_TEXT, gGridProfit ? "盈利网格: 开" : "盈利网格: 关");
ObjectSetInteger(0, "sw_gridProfit", OBJPROP_BGCOLOR, gGridProfit ? clrGreen : clrDarkGray);
ObjectSetString(0, "sw_gridLoss", OBJPROP_TEXT, gGridLoss ? "亏损网格: 开" : "亏损网格: 关");
ObjectSetInteger(0, "sw_gridLoss", OBJPROP_BGCOLOR, gGridLoss ? clrGreen : clrDarkGray);
ObjectSetString(0, "sw_mobileTrade", OBJPROP_TEXT, gMobileTrade ? "移动跟单: 开" : "移动跟单: 关");
ObjectSetInteger(0, "sw_mobileTrade", OBJPROP_BGCOLOR, gMobileTrade ? clrGreen : clrDarkGray);
ObjectSetString(0, "sw_nightUnload", OBJPROP_TEXT, gUnloadNight ? "夜间清仓: 开" : "夜间清仓: 关");
ObjectSetInteger(0, "sw_nightUnload", OBJPROP_BGCOLOR, gUnloadNight ? clrGreen : clrDarkGray);
for(int i = 0; i < totalPairs; i++)
{
color bg = (gSelectedPairIndex == i) ? clrYellow : clrDarkGray;
color txt = (gSelectedPairIndex == i) ? clrBlack : clrWhite;
ObjectSetInteger(0, "pair_btn_"+IntegerToString(i), OBJPROP_BGCOLOR, bg);
ObjectSetInteger(0, "pair_btn_"+IntegerToString(i), OBJPROP_COLOR, txt);
}
}
//+------------------------------------------------------------------+
//| 图表事件处理 |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
if(id == CHARTEVENT_OBJECT_CLICK)
{
if(sparam == "info_toggle")
{
gInfoPanelCollapsed = !gInfoPanelCollapsed;
ObjectsDeleteAll(0, "info_", -1, -1);
if(gInfoPanelCollapsed)
ObjectSetString(0, "info_toggle", OBJPROP_TEXT, "显示");
else
{
CreateInfoPanel();
ObjectSetString(0, "info_toggle", OBJPROP_TEXT, "隐藏");
}
ChartRedraw();
}
else if(sparam == "trade_toggle")
{
gTradePanelCollapsed = !gTradePanelCollapsed;
ObjectsDeleteAll(0, "trade_", -1, -1);
if(gTradePanelCollapsed)
ObjectSetString(0, "trade_toggle", OBJPROP_TEXT, "显示");
else
{
CreateTradePanel();
ObjectSetString(0, "trade_toggle", OBJPROP_TEXT, "隐藏");
}
ChartRedraw();
}
else if(StringFind(sparam, "pair_btn_") == 0)
{
int idx = (int)StringToInteger(StringSubstr(sparam, 9));
if(idx >= 0 && idx < totalPairs)
gSelectedPairIndex = idx;
UpdateButtonsState();
UpdatePanelData();
}
else if(sparam == "btn_closeProfit")
{
CloseProfitPositions(pairs[gSelectedPairIndex].symbol);
}
else if(sparam == "btn_closeLoss")
{
CloseLossPositions(pairs[gSelectedPairIndex].symbol);
}
else if(sparam == "btn_closePair")
{
ClosePositionsBySymbol(pairs[gSelectedPairIndex].symbol);
}
else if(sparam == "btn_closeAll")
{
CloseAllPositions();
}
else if(sparam == "sw_autoTrade")
{
gAutoTrade = !gAutoTrade;
UpdateButtonsState();
}
else if(sparam == "sw_gridProfit")
{
gGridProfit = !gGridProfit;
UpdateButtonsState();
}
else if(sparam == "sw_gridLoss")
{
gGridLoss = !gGridLoss;
UpdateButtonsState();
}
else if(sparam == "sw_mobileTrade")
{
gMobileTrade = !gMobileTrade;
UpdateButtonsState();
}
else if(sparam == "sw_nightUnload")
{
gUnloadNight = !gUnloadNight;
UpdateButtonsState();
}
else if(sparam == "TRADEs_B")
{
string sym = pairs[gSelectedPairIndex].symbol;
double lot = CalculateLotSize(pairs[gSelectedPairIndex]);
OpenOrder(sym, 1, lot, InpMagic, "Manual Buy");
}
else if(sparam == "TRADEs_S")
{
string sym = pairs[gSelectedPairIndex].symbol;
double lot = CalculateLotSize(pairs[gSelectedPairIndex]);
OpenOrder(sym, -1, lot, InpMagic, "Manual Sell");
}
}
}
//+------------------------------------------------------------------+
//| 初始化 |
//+------------------------------------------------------------------+
int OnInit()
{
if(InpAllowedAccount != 0 && AccountInfoInteger(ACCOUNT_LOGIN) != InpAllowedAccount)
{
Print("账号未授权!");
return INIT_FAILED;
}
if(InpDemoOnly && AccountInfoInteger(ACCOUNT_TRADE_MODE) != ACCOUNT_TRADE_MODE_DEMO)
{
Print("仅允许模拟账户运行!");
return INIT_FAILED;
}
ParseBlacklist();
InitPairs();
CreateInfoPanel();
CreateTradePanel();
UpdateButtonsState();
EventSetMillisecondTimer(InpSpeedMs);
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| 反初始化 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer();
ObjectsDeleteAll(0);
}
//+------------------------------------------------------------------+
//| 定时器(主循环) |
//+------------------------------------------------------------------+
void OnTimer()
{
if(gIsProcessing) return;
gIsProcessing = true;
gIsWithinTime = IsWithinTradingHours();
gIsBlacklistTime = IsBlacklistTime();
ManageNightUnload();
ManageMobileTrade();
if(gAutoTrade && gIsWithinTime && !gMobileTrade && !gIsBlacklistTime)
{
SSignal sig = CalculateSignal();
for(int i = 0; i < totalPairs; i++)
{
if(sig.shouldOpen && GetPairPositionsCount(pairs.symbol) == 0 && GetAllPositionsCount() < InpMaxOrders)
{
double lot = CalculateLotSize(pairs);
if(AccountInfoDouble(ACCOUNT_MARGIN_FREE) > lot * 1000)
{
OpenOrder(pairs.symbol, sig.direction, lot, InpMagic, "BigRise Signal");
}
}
}
ManageGrid(sig);
}
ManageTakeProfitStopLoss();
UpdatePanelData();
UpdateButtonsState();
gIsProcessing = false;
}
//+------------------------------------------------------------------+ |