新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 14

 
Andrey F. Zelinsky:
这里有一个关于它的小故事https://docs.mql4.com/ru/convert/normalizedouble

DoubleToString,IMHO...

打印。

 
Andrey F. Zelinsky:
这里有一个关于它的小故事https://docs.mql4.com/ru/convert/normalizedouble
你不会相信,但最初所有的数据都是规范化的,而且在逗号后面有一个数字。我知道,即使是双倍的数值也要进行标准化处理。试着自己重新计算归一化的静态数据,我认为这是一个编译器错误,但我希望我是错的,到目前为止,我用MathRound解决了这个问题,但它是错的!
 
arhipov-76:
你不会相信,但最初所有的数据都是规范化的,数字 是在逗号之后。我知道,即使是双倍值也必须进行归一化处理。试着自己重新计算归一化的静态数据,我认为这是一个编译器错误,但我希望我是错的,到目前为止,我用MathRound函数解决了这个问题,但它是错误的!

我不知道Digis是什么,只要试试DoubleToString(...) 函数。

如果你用现在EA内部的东西进行计算,计算结果是正确的,即使使用NormalizeDouble(),但如果你想在外面输出参数,例如打印、警报、评论,那么通过DoubleToString(...) 使用规范化。

DoubleToString - Преобразование данных - Справочник MQL4
DoubleToString - Преобразование данных - Справочник MQL4
  • docs.mql4.com
DoubleToString - Преобразование данных - Справочник MQL4
 

无论 如何将数字 0.0001归一化,它在二进制表示中仍然是一个无限的周期性分数,因为它有一个除以5。在计算机中,这个无限的分数必须被截断到一个合适的长度。除以它的结果又是非常长的东西,这也必须进行修剪。为了得到一个 "好的 "十进制的结果,你需要在程序中把它转换为一个具有给定的适当数量的小数位的字符串。例如,使用DoubleToString,这里已经写了。

P.S. "结果产出比应该的少十分之一" --没有这样的事情,是一种虚妄的指责。按一亿分之一计算,它确实...

 
Timur1988:

你好!请帮我解答一下算法的问题。
我写了一个简单的脚本,用来计算皮尔逊的相关系数。这些数组是基于收盘价,从第一条开始。

价格数组从第一条到第24条取值。
现在我也想计算24个柱子的相关性,但要从第二(!)个柱子的价格数组。

由于不知道这个算法,我手动输入了每个价格阵列。

24个条形图是一个拖累,如果我想知道100个条形图的相关性,输入每个数组是一个痛苦的过程。
该怎么做呢,人们?)

我也许应该修正Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w))这个字符串的平方根。

 
Vladimir:

我们也许还应该纠正字符串的平方根计算 Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w)))。

这里有一个计算相关性的工作函数,只需给出带有价格的数组,输出将是数值。

string Correlation1(double& CurOpen[], double& SubOpen[]) {
double sumXY2=0, sumX2=0, sumY2=0, sumXs2=0, sumYs2=0, res2=1;

int k=MathMin(ArraySize(CurOpen), ArraySize(SubOpen));
  if(k>2) {
   for(int i=0; i<k; i++) {
     sumXY2+=CurOpen[i]*SubOpen[i];
     sumX2 +=CurOpen[i];
     sumY2 +=SubOpen[i];
     sumXs2+=CurOpen[i]*CurOpen[i];
     sumYs2+=SubOpen[i]*SubOpen[i];    
    }
   res2 = (k*sumXY2-sumX2*sumY2) / MathSqrt( (k*sumXs2-sumX2*sumX2)*(k*sumYs2-sumY2*sumY2) );
  }
  return(DoubleToStr(res2,2));
}
 
你好!我把我的机器人放在一个模拟账户 上,它已经运行了第二个月。今天我打开终端,一个信号下了两个订单,尽管之前已经下了一个订单。我对订单的数量有限制。原因可能是什么?
 

以下是我使用的方法

Вот что я использую

if(ExistPositions(Symb)==false&&ExistOrders(Symb)==false&&Delta_Buy<Low[1]&& sar>Close[1])
{SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);}
if(ExistPositions(Symb)==false&&ExistOrders(Symb)==false&&Delta_Sell>High[1] && sar<Close[1])
{SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);}


//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}
//--------------------------------------------------------------------------------//


bool ExistPositions(string sy="", int op=-1, datetime ot=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symb;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if ( OrderMagicNumber()==Magik_number) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 
Neron_76:

以下是我使用的方法

循环需要按相反的顺序计算,从OrdersTotal()-1到0
 
Vitalie Postolache:
循环应按相反顺序计算,从OrdersTotal()-1到0
谢谢你,我将不得不重新做。
原因: