mozuyun1688 发表于 2025-2-12 21:23:19

MT4历史浮亏统计指标

MT4复盘侠最新指标,可查看历史最大浮亏,最大浮亏比例。

2025yao 发表于 2025-2-12 22:56:48

//+------------------------------------------------------------------+
//| 历史最大浮亏和最大浮亏比例指标                                 |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1Red
#property indicator_color2Blue

// 指标缓冲区
double MaxDrawdownBuffer[];
double MaxDrawdownPercentBuffer[];

// 全局变量
double g_MaxDrawdown = 0;
double g_MaxDrawdownPercent = 0;
int MODE_POINTVALUE;


//+------------------------------------------------------------------+
//| 自定义指标初始化函数                                           |
//+------------------------------------------------------------------+
int init()
{
    // 指标缓冲区赋值
    SetIndexBuffer(0, MaxDrawdownBuffer);
    SetIndexBuffer(1, MaxDrawdownPercentBuffer);

    // 设置指标名称
    IndicatorShortName("历史最大浮亏和最大浮亏比例");

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 自定义指标计算函数                                             |
//+------------------------------------------------------------------+
int start()
{
    int counted_bars = IndicatorCounted();
    int limit = Bars - counted_bars - 1;

    // 初始化最大浮亏和最大浮亏比例
    g_MaxDrawdown = 0;
    g_MaxDrawdownPercent = 0;

    // 遍历历史订单
    for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      {
            if (OrderType() < OP_SELL) // 只处理开仓订单
            {
                double open_price = OrderOpenPrice();
                double lot = OrderLots();
                double initial_margin = MarketInfo(OrderSymbol(), MODE_MARGINREQUIRED) * lot;

                // 模拟持仓过程,计算浮亏
                int ticket = OrderTicket();
                for (int j = Bars - 1; j >= 0; j--)
                {
                  double current_price = (OrderType() == OP_BUY)? iClose(NULL, 0, j) : iOpen(NULL, 0, j);
                  double profit = (OrderType() == OP_BUY)? (current_price - open_price) * Point * lot * MarketInfo(OrderSymbol(),MODE_POINTVALUE) : (open_price - current_price) * Point * lot * MarketInfo(OrderSymbol(), MODE_POINTVALUE);

                  if (profit < 0)
                  {
                        double drawdown = -profit;
                        double drawdown_percent = (drawdown / initial_margin) * 100;

                        if (drawdown > g_MaxDrawdown)
                        {
                            g_MaxDrawdown = drawdown;
                        }

                        if (drawdown_percent > g_MaxDrawdownPercent)
                        {
                            g_MaxDrawdownPercent = drawdown_percent;
                        }
                  }
                }
            }
      }
    }

    // 将最大浮亏和最大浮亏比例写入缓冲区
    for (int k = 0; k < limit; k++)
    {
      MaxDrawdownBuffer = g_MaxDrawdown;
      MaxDrawdownPercentBuffer = g_MaxDrawdownPercent;
    }

    return(0);
}
页: [1]
查看完整版本: MT4历史浮亏统计指标