错误、漏洞、问题 - 页 3155

 
murziks #:


你能告诉我Metatrader还能读取什么而不是csv吗?

二进制文件可以读和写。变量、结构、数组。所有这些都被写入文件并读回。

 

尊敬的移动终端 开发者,请尽快修复 "邮件 "标签中的邮件处理问题。

在移动终端(安卓)的最新版本之前,当连接到一个账户时,"邮件 "选项卡中充满了之前已经被删除过多次的电子邮件。

当我重新连接到账户时,我在 "邮件 "选项卡中看到了一堆以前删除和未删除的电子邮件。我必须做什么才能摆脱它?

 

请解释在电脑终端 "工具>设置>显示交易历史 "中的变化,如果在任何值的复选框中,你可以通过 "PCM>交易历史 "和 "F8>显示交易历史 "启用/禁用显示交易历史?

也就是说,我可以在终端的 一般设置 中禁用交易历史的显示,这样就不会干扰它,而如果在图表设置中启用或使用PCM,它就会在任何图表上显示。我不明白这种逻辑。

 

亲爱的PC终端的开发者。长期以来,在使用图表配置文件(不是模板,只是配置文件)时,有一个奇怪的逻辑,即配置文件的任何变化都会自动导致它被保存,而不需要手动指示。

用户自定义配置文件 的错误或终端故障将难以配置的工作空间变成了南瓜。

为什么我们不能让它在用户手动保存配置文件之前,对配置文件所做的修改不会被保存(让它们被保存到一个临时的配置文件,而不是保存到最后的工作配置文件)?

我们多年来一直在等待内置界面的变化,就像TradingView一样,这对你来说可能并不困难,而且对用户来说也非常方便。

 

为什么会有这样的差别,例如,在测试中,有 "以点为单位的利润以加快计算"的复选框,有15%的缩水,而没有这个复选框,有93%的缩水?

哪个结果更正确?

交易数量是相同的

在这种情况下,第一种情况下的利润为2英镑,第二种情况下的利润为20英镑,同样的地段。

就像它是可见的,如果你改变地段也是10块钱的区别。

 
谢谢你。你不会想去做Txt
 
加密货币从MQ的 服务器上消失了。堕落、悲伤和沮丧。
 

Generic/Queue中的错误。

关于交易、自动交易系统和策略测试的论坛

[POSSIBLE ERROR] CQue容器的类别

Loris De Marchi, 2022.02.14 13:00

大家好!!!。

我怀疑至少在CQueue::Contains(T item)和CQueue::Remove(T item)方法中,存在一个错误。

队列是用经典的头尾循环系统管理的,所以这段代码一定是错的。

 //+------------------------------------------------------------------+
//| Removes all values from the CQueue<T>.                           |
//+------------------------------------------------------------------+
template < typename T>
bool CQueue::Contains(T item)
  {
   int count=m_size;
//--- try to find item in array
   while (count--> 0 )
     {
       //--- use default equality function
       if (::Equals(m_array[count],item))
         return ( true );
     }
   return ( false );
  }

另外,上面对方法的不正确描述让我觉得在编写这个类时可能犯了一些错误。


例如,在运行这段简单的代码时,Remove方法明显失败。

   CQueue< ulong > foo;
   foo.Enqueue( 1 );
   foo.Remove( 1 );
   foo.Enqueue( 2 );
   printf (foo.Contains( 2 ));

当项目明显在队列中时,它打印出 "false"...


让我知道这个班级是否已经修好,或者我是否应该使用我的班级。

谢谢!


 

你好,我们知道MQL中的数组可以是正向和反向索引的(系列)。这就是为什么我有一个问题,如果需要系列或反向索引,在MQL中处理数组的最佳方式是什么?按索引获取系列值的第一种变体可能看起来如下。

double arrayValue(const double array[], conct int shift) {
  int len = (int)array.Size();
  if (shift < 0 || shift >= len)
    return WRONG_VALUE;
  return array[len - shift - 1];
}

第二种方法是使用ArraySetAsSeries

double arrayValue(double &array[], conct int shift) {
  int len = (int)array.Size();
  double ret;
  if (shift < 0 || shift >= len)
    return WRONG_VALUE;
  if (!ArraySetAsSeries(array, true))
    return WRONG_VALUE;
  ret = array[shift];
  ArraySetAsSeries(array, false);
  return ret;
}

当然,我并没有断言什么,但我认为因为ArraySetAsSeries只是简单地打开了数组标志series,当通过索引访问一个值时,就会出现第一个例子中的情况。

double arrayValue(const double array[], conct int shift) {
  int len = (int)array.Size();
  if (shift < 0 || shift >= len)
    return WRONG_VALUE;
  return array[len - shift - 1];
}

而这大致是它如何处理按索引寻址的值。

每次在OnCalculate指标处理程序中包括数组的系列是有意义的,还是使用数组rate_total的长度来解决低杠会更好?

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]) 
{
  Print(price[rates_total-1]); // получение цены на младшем баре без использования серии
  return(rates_total);
}

这两种方法在速度上是否相等,还是我的推理有误?

 

终端不返回平仓的 累积利润。你能告诉我问题可能出在哪里吗?

double GetClosedPositionsInstrumentProfit(string symbol, datetime from) 
{
   HistorySelect(from, TimeCurrent());

   double profitSum = 0;

      for (int i = HistoryDealsTotal()-1; i >= 0; i--) 
    {   
      ulong ticket = HistoryDealGetTicket(i);
      if (ticket < 0) continue; 
      long magic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
      if (magic != EXPERT_MAGIC) continue; 
      string positionSymbol = HistoryDealGetString(ticket, DEAL_SYMBOL);
      if (symbol != positionSymbol) continue; 
      
      double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT) + HistoryDealGetDouble(ticket, DEAL_SWAP)+ HistoryDealGetDouble(ticket, DEAL_COMMISSION);
      profitSum += profit; 
         
      Print ("Profit " + DoubleToString(profitSum,2));              
    }         
   return profitSum;
}