文章 "图表上的历史仓位及其盈利/亏损图指标"

 

新文章 图表上的历史仓位及其盈利/亏损图指标已发布:

在本文中,我将探讨根据交易历史获取已平仓头寸信息的选项。此外,我将创建一个简单的指标,以图表的形式显示每个柱形上仓位的大致盈利/亏损。

此函数获取价格(柱形的收盘价),相对于此价格应获得仓位的盈利点数,以及检查仓位存续的时间(柱形的开盘时间)。接下来将从每个历史仓位对象收到的所有仓位的盈利相加并返回。

编译完成后,我们可以在有大量持仓的交易品种图表上运行该指标,它会绘制所有历史仓位的盈利图表:

作者:Artyom Trishkin

 
文章很有意思,谢谢!
 
沉重的话题。MT5.
 
是....一个非常有趣和有用的作品。到目前为止,我对它只是略知一二。我将仔细阅读。我将在我的开发中使用代码部分。
谢谢。
 
遗憾的是,MQ 没有将HistoryPositionGet 函数 添加到历史函数列表 中。如果有了它,就会容易得多。
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:
遗憾的是,MQ 没有将HistoryPositionGet 函数 添加到历史函数列表 中。如果有了它,就会容易得多。

这就是我们必须自己动手的原因

 

您好、

我怎样才能让指标不显示每笔盈亏,而是显示累计总额?

如果可能的话--用一条线?

 
Roman Kutemov #:

你好

如何使指标不显示每次盈利/亏损,而是显示累计总额?

如果可能的话--用一条线?

我的直觉告诉我,您只需要把利润加到已经获得的利润上,而不是每次都把从仓位中获得的利润记录下来。

就是这样

//+------------------------------------------------------------------+
//| 自定义指标迭代函数
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- 设置数组 close 和 time 的索引,与时间序列相同
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(time,true);
//-- 成功创建项目列表的标志
   static bool done=false;
//--- 如果创建了位置数据对象
   if(history!=NULL)
     {
      //--- 如果项目列表尚未创建
      if(!done)
        {
         //--- 如果当前仪器的仓位列表创建成功、
         if(history.CreatePositionList(Symbol()))
           {
            //--- 在日志中打印位置,并设置成功创建位置列表的标志
            history.Print();
            done=true;
           }
        }
     }
//--- 指标计算所需的条数
   int limit=rates_total-prev_calculated;
//--- 如果限值大于 1,则表示这是第一次运行或历史数据发生了变化
   if(limit>1)
     {
      //--- 设置计算条数等于所有可用历史记录,并以 "空 "值初始化缓冲区
      limit=rates_total-1;
      ArrayInitialize(BufferFilling1,EMPTY_VALUE);
      ArrayInitialize(BufferFilling2,EMPTY_VALUE);
     }
//--- 在符号历史记录栏循环中
   static double profit=0;
   for(int i=limit;i>=0;i--)
     {
      //--- 获得周期索引为 i 的条形图上的仓位利润,并将获得的值写入第一个缓冲区
      profit+= Profit(close[i],time[i]);
      BufferFilling1[i]=profit;
      //--- 始终将零写入第二个缓冲区。取决于第一个缓冲区中的值是大于还是小于零、
      //--- 绘制的填充颜色将在指示器缓冲区数组 1 和 2 之间变化
      BufferFilling2[i]=0;
     }
//--- 为下一次调用返回 prev_calculated 的值
   return(rates_total);
  }

那么,缓冲区作为一条线--它本身就是缓冲区。你需要删除一个额外的缓冲区,因为填充总是使用两个缓冲区。而一行只需要一个缓冲区。

 

我觉得可以了。

我做了你的修改,只是指定了类型--线条图形。

我没有删除缓冲区。

https://www.mql5.com/ru/charts/18738352/nzdcad-d1-roboforex-ltd

График NZDCAD, D1, 2024.01.03 16:11 UTC, RoboForex Ltd, MetaTrader 5, Real
График NZDCAD, D1, 2024.01.03 16:11 UTC, RoboForex Ltd, MetaTrader 5, Real
  • www.mql5.com
Символ: NZDCAD. Период графика: D1. Брокер: RoboForex Ltd. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2024.01.03 16:11 UTC.
附加的文件:
 
货币方面似乎一切正常,但白银 方面却不知为何不断重绘。
 
Roman Kutemov #:
在货币上似乎一切正常,但在白银上却不知为何不断重绘。

有必要看看该指标接收了哪些数据,以及为什么没有计算。重绘的原因可能是限值大于 1。该值计算为 rates_total 和 prev_calculated 之间的差值。您需要查看这些值,以了解每个刻度线所包含的内容