专家顾问 - 杂项问题 - 页 3 12345678910...43 新评论 honest_knave 2016.11.29 00:34 #21 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)); } Max Enrik 2016.11.29 00:37 #22 honest_knave: double LotCalculator(double lots){}非常感谢。我只是想开始写这些代码 :)你救了我很多次。非常感谢! Max Enrik 2016.11.29 01:50 #23 我得到了同样的信息,关于手数的信息。我在'OnChartEvent()'中调用'LotCalculator()',这样做不对吗? Max Enrik 2016.11.29 04:27 #24 我正在寻找关于"MarketInfo & LotSize"计算的好论坛。 谁知道这种类型的好论坛,请与我分享。谢谢。 honest_knave 2016.11.29 08:31 #25 在我编辑最后一行(NormalizeDouble)之前,你是否有可能使用我的代码片段?我看到从我的帖子到你的帖子只有3分钟,而我几乎立刻就编辑了它。 William Roeder 2016.11.29 16:28 #26 Max Enrik: 我正在为我的EA使用NormalizeDouble 。但我担心"NormalizeDouble"信息,但我看到图表上的手数 是这样的。0.07所以,我需要好的建议,请。02:00:00.069 - custom expert EURUSD,H1: | _lotSize - NormalizeDouble: 0.0700000000000000102:00:00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07NormalizeDouble返回一个双数。浮点有无限的小数,这是你不了解浮点,有些数字不能准确表示。(比如1/10。)双精度浮点格式 - 维基百科,自由的 百科全书 参见==操作数。- MQL4论坛 不要使用NormalizeDouble,永远不要。无论什么原因。它是一个笨重的工具,不要使用它。它的使用总是错误的 SL/TP(止损)需要被规范化为tick大小(而不是Point。)(在5Digit Broker上,止损只允许放在全pip值上。如何在mql中找到?-MQL4论坛),并遵守限制在进行交易时的要求和限制 - 附录 - MQL4教程,这需要了解浮点的平等性Can price != price ?- MQL4论坛 挂单的公开价格需要调整。在货币上,点==TickSize,所以你会得到同样的答案,但在金属上就不行了。所以要做得正确。追踪条形输入EA - MQL4论坛 或Bid/Ask。(没有必要)在OrderSend中使用NormalizeDouble - MQL4论坛 手数大小也必须调整为LotStep 的倍数。如果这不是1/10的幂,那么NormalizeDouble 就是错误的。正确的做法是。 honest_knave 2016.11.29 18:11 #27 whroeder1:不要使用NormalizeDouble,永远 不要。无论什么原因。它是一个笨拙的工具,不要使用它。它的使用总是错误的。SL/TP(止损)需要规范化为tick大小(而不是Point。)(在5位数的经纪商中,止损只允许放在全点值上。如何在mql中找到答案?-MQL4论坛),并遵守限制在进行交易时的要求和限制 - 附录 - MQL4教程,这需要了解浮点的平等性Can price != price ?- MQL4论坛挂单的公开价格需要调整。在货币上,点==TickSize,所以你会得到同样的答案,但在金属上就不行了。因此,正确的做法是:拖曳条形入口EA - MQL4论坛 或Bid/Ask。(没有必要)在OrderSend中使用NormalizeDouble - MQL4论坛手数大小也必须调整为LotStep 的倍数。如果这不是1/10的倍数,那么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 expert advisor - miscellaneous Partial Close EA Money managment incresing lots William Roeder 2016.11.29 18:55 #28 Result: 0.7000000000000001你不了解浮点,有些数字不能准确表示。(比如1/10。)双精度浮点格式 - 维基百科,自由的 百科全书 "有什么不清楚的?NormalizeDouble(0.7, 2)会产生相同的确切 结果(也可能是0.6999999999999。) honest_knave 2016.11.29 19:02 #29 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.0700000000000000102:00:00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07(已编辑,删除了不必要的冗长内容) expert advisor - miscellaneous 如何利用 MQL5 创建简单的多币种智能交易系统(第 5 如何利用 MQL5 创建简单的多币种智能交易系统(第 3 Marco vd Heijden 2016.11.29 21:15 #30 //+------------------------------------------------------------------+//| 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书籍中,他们也大量使用这个方法。这可能取决于它的应用,显示问题没有订单或修改失败那么夸张。就个人而言,我总是向上转换为整数值,所以我很少处理它。 OrderSend failed with error OrderSend Problem in demo I try to open 12345678910...43 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
{
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));
}
非常感谢。
我只是想开始写这些代码 :)
你救了我很多次。
非常感谢!
我正在寻找关于"MarketInfo & LotSize"计算的好论坛。
谁知道这种类型的好论坛,请与我分享。
谢谢。
所以,我需要好的建议,请。
02:00:00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07
我相信你仍然需要NormalizeDouble()。
下面是一个例子,使用你的代码片断(同样适用于我使用MathFloor的例子)。
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);
}
调用了。
结果。
现在代码调整了。
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));
}
结果。
Result: 0.7000000000000001
你不了解浮点,有些数字不能准确表示。(比如1/10。)双精度浮点格式 - 维基百科,自由的 百科全书 "有什么不清楚的?
NormalizeDouble(0.7, 2)会产生相同的确切 结果(也可能是0.6999999999999。)
你不了解浮点,有些数字不能准确表示。(比如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 - 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书籍中,他们也大量使用这个方法。
这可能取决于它的应用,显示问题没有订单或修改失败那么夸张。
就个人而言,我总是向上转换为整数值,所以我很少处理它。