初学者的问题 MQL5 MT5 MetaTrader 5 - 页 485

 
-Aleks-:

请帮助我理解!

我需要找到 每一天(任其发展)的最大 跌幅(每天向文件写入一次) - MT4终端。

最大缩水是图表上从峰值到当前资金缩水的距离,资金缩水是当前的损失。

我写了以下代码

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew==AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

但它在某些图表上是正确的,而在其他图表上是不正常的。

显然,我在代码或逻辑上犯了一个错误,但我搞不清楚是哪一个。

据我所知,我们应该从股票峰值算到股票坑,而不是从余额算起,这样一来,缩水看起来就好多了!"。

请使用SRC 按钮,而不是其他按钮,这样你的代码就不会在回复中重复出现,使网站变得杂乱无章!

 
Boris:

据我所知,你必须从股票峰值算起,而不是从余额算起,这真的会使缩减的情况变得更加柔和!你必须从股票峰值算起,而不是从余额算起。

请使用SRC 按钮,而不是其他按钮,这样你的代码就不会在回复中重复出现,使网站变得杂乱无章!

将余额改为资金--仍然与测试器不一致--测试器中的数值更大。ACCOUNT_PROFIT实际上是余额和资金之间的差额,也许这就是 问题所在......另一方面,任务是找出EA需要多少资金来工作,在我看来,考虑到最大的资金量是没有意义的......

我不知道SRC是什么,这就是为什么我不使用它。

 
-Aleks-:

ACCOUNT_PROFIT实际上是余额和资金之间的delta,也许就是这样......另一方面,任务是找出EA工作所需的资金量,在我看来,考虑最大资金量是没有意义的......。

我不知道SRC是什么,这就是为什么我不使用它。

录像机左边的那个按钮(见上图)是用来插入代码的。

关于公平!如果你用权益代替余额,你必须排除ACCOUNT_PROFIT,因为 权益=余额+利润。然而,在终端中,我们总是看到净值在变化,而测试员报告的净值和平仓时 的缩减量是固定的,因此中期缩减量没有被测试员固定。因此,市场情况在测试器中比现实中更有吸引力。最近,我一直在测试器中打印演示和真实的所有信息,我需要一个EA的每个动作,打开,修改,关闭,等等,以避免废话,我既不能容忍自己,也不能容忍别人的废话!但你可能已经注意到了这一点。;)

 

晚上好,请告诉我,关于标准库中的CTrailingFixedPips类,"trailing "TakeProfit水平是什么意思?永远不会达到,是吗?要么是我不明白的东西,要么是代码或意义。

来自文件。

"如果价格缩进高于止损水平,建议采用新的仓位止损价格如果满足止损修改条件,且止盈水平不为零, 建议 为该仓位设置新的止盈价格。"

<Expert\Trailing\CTrailingFixedPips.mqh>

//+------------------------------------------------------------------+
//| Checking trailing stop and/or profit for long position.          |
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
...
...   
   delta=m_stop_level*m_adjusted_point;
   if(price-base>delta)
     {
      sl=price-delta;
      if(m_profit_level!=0) tp=price+m_profit_level*m_adjusted_point;
     }
...
  }
 
Hexen:

晚上好,请告诉我,关于标准库中的CTrailingFixedPips类,"trailing "TakeProfit水平是什么意思?永远不会达到,是吗?要么是我不明白的东西,要么是代码或意义。

来自文件。

"如果价格缩进高于止损水平,建议采用新的仓位止损价格如果 满足 止损修改条件 ,且止盈 水平不为零,建议 为该仓位设置新的止盈 价格。"

<Expert\Trailing\CTrailingFixedPips.mqh>

这很可能是一个误印。它应该是止损。
 
Hexen:

晚上好,请告诉我,关于标准库中的CTrailingFixedPips类,"trailing "TakeProfit水平是什么意思?永远不会达到,是吗?要么是我不明白的东西,要么是代码或意义。

来自文件。

"如果价格缩进高于止损水平,建议采用新的仓位止损价格如果满足止损修改条件,且止盈水平不为零, 建议 为该仓位设置新的止盈价格。"

<Expert\Trailing\CTrailingFixedPips.mqh>

从上述代码来看,TP与SL同步移动。去他妈的这样的追踪止损)
 
Boris:

录像机左边的这个按钮(见上图)是用来插入代码的!

有一个 "代码 "风格的代码--它是从菜单中选择的--我就是用这个。

Boris:

关于公平!如果你用权益代替余额,你必须排除ACCOUNT_PROFIT,因为 权益=余额+利润。然而,在终端中,我们总是看到净值在变化,而测试员报告的净值和平仓时 的缩水是固定的,因此中期缩水没有被测试员固定。因此,市场情况在测试器中比现实中更有吸引力。最近,我一直在测试器中打印演示和真实的所有信息,我需要一个EA的每个动作,打开,修改,关闭,等等,以避免废话,我既不能容忍自己,也不能容忍别人的废话!但你可能已经注意到了这一点。;)

如果报告的测试器中固定的缩减只是在平仓时,那么在市场中使用一个订单时就不会有缩减,而事实并非如此;)

ACCOUNT_PROFIT = 资金-余额,所以我认为没有理由不在计算中使用这个指标...

 
-Aleks-:

请帮助我理解!

我需要找到 每一天(任其发展)的最大 跌幅(每天向文件写入一次) - MT4终端。

最大缩水是图表上从峰值到当前资金缩水的距离,资金缩水是当前的损失。

我写了以下代码

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew== AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

但它在一些图表中显示正确,而在另一些图表中不显示。 同时,这些图表在视觉上是一样的。

我一定是在代码或逻辑上犯了一个错误,但我搞不清楚是哪一个。

我发现代码中的一个错误--多了一个等号,应该是

 BalansNew=AccountInfoDouble(ACCOUNT_BALANCE); 

然而,即使这样,也没有使我更接近解决电位计算和测试器中的结果之间的差异原因。

我用股权计算检查了鲍里斯的理论,结果也是否定的。

   if(Analiz_Prosadki==true)

     {

      if(ContolSavaTXT==1)

        {

         ProfitNew=0;

         ContolSavaTXT=0;

        }


      if(ContolSavaTXT==0)

        {

         BalansNew=AccountInfoDouble(ACCOUNT_EQUITY);  //Текущее значение баланса

         if (BalansNew>BalansMax) BalansMax=BalansNew;

         if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;

         if (ProfitNew<ProfitMin) ProfitMin=ProfitNew;

        }


      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitNew);   // Пишем информацию в файл - функция возвращает 1

     }

顺便说一下,不清楚当只有一手交易时,测试器中的图表上的股本和余额是如何不同步的。

 
-Aleks-:

我发现代码中的一个错误--多了一个等号,应该是这样的

 BalansNew=AccountInfoDouble(ACCOUNT_BALANCE); 

然而,即使这样也没有使我更接近解决计算出来的股票和测试器中的结果之间的差异的原因。

我用股权计算检查了鲍里斯的理论,结果也是否定的。

   if(Analiz_Prosadki==true)

     {

      if(ContolSavaTXT==1)

        {

         ProfitNew=0;

         ContolSavaTXT=0;

        }


      if(ContolSavaTXT==0)

        {

         BalansNew=AccountInfoDouble(ACCOUNT_EQUITY);  //Текущее значение баланса

         if (BalansNew>BalansMax) BalansMax=BalansNew;

         if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;

         if (ProfitNew<ProfitMin) ProfitMin=ProfitNew;

        }


      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitNew);   // Пишем информацию в файл - функция возвращает 1

     }

顺便说一下,如果只有一手交易,不清楚在图表上的测试器中,权益和余额是如何去同步的。

要理解 "股权和余额是如何失调的",我们需要了解什么是余额,什么是股权。

余额 - 账户中的权益数额。

净值 - 账户上当前的、可变的资金数额。

你的测试器中也有同样的功能,它修复了缩减,但不是以你想要的方式。

总而言之,为了计算最大缩水,你需要声明静态或全局变量 来存储数值,然后重写这个变量,就像在你的代码中。

这就是你现在所写的......。

if (BalansNew>BalansMax) BalansMax=BalansNew; // Если новое значение эквити больше зафиксированного в прошлый раз - перезапишем значение переменной

// но это не просадка, это максимальная прибыль

if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;  // А здесь BalansNew уже равно BalansMax и эта строка не выполняется никогда...

你必须制作两个变量max和min,并在其中写入数值。

这里有一个想法,大声说出来。你最好不要在文件中写上当天的内容,而是在关闭订单时,重写变量。在这一时刻,公平等于平衡,我们应该将写有最大和最小的变量归零。

 
Alexey Viktorov:

要理解 "股权和余额是如何失调的",你需要了解什么是余额,什么是股权。

余额是账户中的固定资金数额。

净值 - 账户上当前的、可变的资金数额。

你现在写的测试器中也有同样的功能,它可以解决缩减问题,但不是以你想要的方式。

总而言之,为了计算最大缩水,你需要声明静态或全局变量 来存储数值,然后重写这个变量,就像在你的代码中。

这就是你现在所写的......

if (BalansNew>BalansMax) BalansMax=BalansNew; // Если новое значение эквити больше зафиксированного в прошлый раз - перезапишем значение переменной

// но это не просадка, это максимальная прибыль

if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;  // А здесь BalansNew уже равно BalansMax и эта строка не выполняется никогда...

你必须制作两个变量max和min,并在其中写入数值。

这里有一个想法,大声说出来。你最好不要在文件中写上当天的内容,而是在关闭订单时,重写变量。在这一时刻,公平等于平衡,我们应该将写有最大和最小的变量归零。

谢谢你响应帮助的请求!

全局变量与真实的市场活动有关--我需要测试信息,这就是为什么我没有去管它。

什么是股本和余额--我当然知道,但我没能计算出缩水。 我的代码样本显示,我试图把余额和资金都作为最大值,把余额和资金作为最小值。

为什么你认为如果(BalansNew<BalansMax)ProfitNew=BalansNew-BalansMax; 这个不等式永远不会被满足?只有在达到新的余额最大值(或股本--仍然不真实)时,它才不在条形图上履行,但在这一点上,我固定了利润缩水ProfitMin=ProfitNew

记录当天的文件更有意义,因为在关闭订单的时候通常不会达到最大的缩减量,目的是计算专家顾问工作所需的平均资金量。