专家顾问 - 杂项问题 - 页 3

 
double LotCalculator(double lots)
  {
   double minlot  = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),
          maxlot  = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX),
          lotstep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   lots = MathFloor(lots/lotstep)*lotstep;
   lots = MathMax(lots,minlot);
   lots = MathMin(lots,maxlot);
   return(NormalizeDouble(lots,2));
  }
 
honest_knave:
double LotCalculator(double lots){}

非常感谢。

我只是想开始写这些代码 :)

你救了我很多次。

非常感谢!

 
我得到了同样的信息,关于手数的信息。
我在'OnChartEvent()'中调用'LotCalculator()',这样做不对吗?
 

我正在寻找关于"MarketInfo & LotSize"计算的好论坛。
谁知道这种类型的好论坛,请与我分享

谢谢。

 
在我编辑最后一行(NormalizeDouble)之前,你是否有可能使用我的代码片段?我看到从我的帖子到你的帖子只有3分钟,而我几乎立刻就编辑了它。
 
Max Enrik: 我正在为我的EA使用NormalizeDouble 。但我担心"NormalizeDouble"信息,但我看到图表上的手数 是这样的。0.07

所以,我需要好的建议,请。

02:00:00.069 - custom expert EURUSD,H1: | _lotSize - NormalizeDouble: 0.07000000000000001
02:00:00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07
  1. NormalizeDouble返回一个双数。浮点有无限的小数,这是你不了解浮点,有些数字不能准确表示。(比如1/10。)双精度浮点格式 - 维基百科,自由的 百科全书 参见==操作数。- MQL4论坛
  2. 不要使用NormalizeDouble,永远不要。无论什么原因。它是一个笨重的工具,不要使用它。它的使用总是错误的
 
whroeder1:
  1. 不要使用NormalizeDouble,永远 不要。无论什么原因。它是一个笨拙的工具,不要使用它。它的使用总是错误的

我相信你仍然需要NormalizeDouble()。

下面是一个例子,使用你的代码片断(同样适用于我使用MathFloor的例子)。

double NormalizeLots(double lots, string pair=""){
    if (pair == "") pair = Symbol();
    double  lotStep     = MarketInfo(pair, MODE_LOTSTEP),
            minLot      = MarketInfo(pair, MODE_MINLOT);
    lots                = MathRound(lots/lotStep) * lotStep;
    if (lots < minLot) lots = 0;    // or minLot
    return(lots);
}

调用了。

Print(NormalizeLots(2/3.0));

结果。

0.7000000000000001

现在代码调整了。

double NormalizeLots(double lots, string pair=""){
    if (pair == "") pair = Symbol();
    double  lotStep     = MarketInfo(pair, MODE_LOTSTEP),
            minLot      = MarketInfo(pair, MODE_MINLOT);
    lots            = MathRound(lots/lotStep) * lotStep;
    if (lots < minLot) lots = 0;    // or minLot
    return(NormalizeDouble(lots,2));
}

结果。

0.7


 

 Result: 0.7000000000000001

你不了解浮点,有些数字不能准确表示。(比如1/10。)双精度浮点格式 - 维基百科,自由的 百科全书 "有什么不清楚的?

NormalizeDouble(0.7, 2)会产生相同的确切 结果(也可能是0.6999999999999。)

 
whroeder1:

你不了解浮点,有些数字不能准确表示。(比如1/10。)双精度浮点格式--维基百科,自由的 百科全书 "有什么不清楚的吗?

NormalizeDouble(0.7, 2)将产生完全相同 的结果(也可能是0.6999999999999。)

我并不是说NormalizeDouble()是有效的OrderSend所必须的。这就是为什么我的第一个代码片段排除了它。我也不是不清楚浮点数的表示方式。

我编辑了这段代码以包括它,因为我觉得它更好地解决了我对OP的问题的理解(基本上是一个显示问题,可以通过在 "lot normalizer "代码中使用NormalizeDouble()来解决,或者在需要显示数值时使用printf或DoubleToStr)。

也许我误解了OP的意思。

02:00:00.069 - custom expert EURUSD,H1: | _lotSize - NormalizeDouble: 0.07000000000000001
02:00:00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07

(已编辑,删除了不必要的冗长内容)

 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- get minimum stop level
   double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   Print("Minimum Stop Level=",minstoplevel," points");
   double price=Ask;
//--- calculated SL and TP prices must be normalized
   double stoploss=NormalizeDouble(Bid-minstoplevel*Point,Digits);
   double takeprofit=NormalizeDouble(Bid+minstoplevel*Point,Digits);
//--- place market order to buy 1 lot
   int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen);
   if(ticket<0)
     {
      Print("OrderSend failed with error #",GetLastError());
     }
   else
      Print("OrderSend placed successfully");
//---
  }

这可能会让人们感到困惑,因为MQL4文档中的大多数例子都使用了NormalizeDouble()函数。

它甚至还警告说,不能应用未规范化的价格。

注意

在打开市场订单(OP_SELL或OP_BUY)时,只有Bid(用于卖出)或Ask(用于买入)的最新价格可以作为开盘价。如果操作的证券与当前证券不同,必须使用MarketInfo() 函数,并使用MODE_BID或MODE_ASK参数来获得该证券的最新报价。

不能应用计算的或未规范的价格。如果价格线程中没有要求的开盘价,或者没有根据小数点后的数字量进行规范化处理,将产生错误129(ERR_INVALID_PRICE)。如果要求的开盘价完全过期,将产生独立于滑点参数的错误138(ERR_REQUOTE)。如果要求的价格是过时的,但存在于线程中,订单将以当前价格打开,而且只有当当前价格位于价格+滑点的范围内。

甚至在一些较好的MQL书籍中,他们也大量使用这个方法。

这可能取决于它的应用,显示问题没有订单或修改失败那么夸张。

就个人而言,我总是向上转换为整数值,所以我很少处理它。