在 MetaTrader4 EA 的 OrderSend() 中设置 StopLoss 和 TakeProfit 的正确方法是什么?
What is the correct way to set StopLoss and TakeProfit in OrderSend() in MetaTrader4 EA?
我想弄清楚是否有正确的方法 来设置止损 (SL) 和止盈 ( TP) 水平,当在 MQL4 (Metatrader4) 中的 EA 交易 中发送订单时。功能模板是:
OrderSend( symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);
所以我很自然地尝试执行以下操作:
double dSL = Point*MM_SL;
double dTP = Point*MM_TP;
if (buy) { cmd = OP_BUY; price = Ask; SL = ND(Bid - dSL); TP = ND(Ask + dTP); }
if (sell) { cmd = OP_SELL; price = Bid; SL = ND(Ask + dSL); TP = ND(Bid - dTP); }
ticket = OrderSend(SYM, cmd, LOTS, price, SLIP, SL, TP, comment, magic, 0, Blue);
但是,有多少脚本和 EA,就有多少变体。到目前为止,我已经遇到了这些。
在MQL4 Reference中MetaEditor,文档说要使用:
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,
NormalizeDouble(Bid - StopLoss*Point,Digits),
NormalizeDouble(Ask + TakeProfit*Point,Digits),
"My order #2",3,D'2005.10.10 12:30',Red);
在 "same" 文档 online 中,他们使用:
double stoploss = NormalizeDouble(Bid - minstoplevel*Point,Digits);
double takeprofit = NormalizeDouble(Bid + minstoplevel*Point,Digits);
int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen);
所以它继续有各种口味,here, here and here...
假设我们对 OP_BUY
感兴趣并且符号正确,我们可以选择将我们的 SL 和 TP 值基于:
bid, bid
bid, ask
ask, ask
ask, bid
那么设置买入的止损和止盈的正确方法是什么?
(使用各种变体的优点或缺点是什么?)
编辑:2018-06-12
除了一些细节,答案其实很简单,虽然不是很明显。可能 因为 MT4 只在图表上显示 Bid 价格(默认) 而不是 Ask 和 出价.
所以因为:Ask > Bid
和 Ask - Bid = Slippage
,只要我们知道滑点,我们选择哪个并不重要。然后根据您在图表上关注的价格,您可能希望决定使用其中一种,相应地增加或减少滑点。
因此,当您使用测量工具获取当前显示价格与您的 "exact" SL/TP 设置的 Pip 差异时,您需要保持记住这一点。
因此,为了避免在上面的代码中出现滑点,我对 OP_BUY
使用了以下代码:TP = ND(Bid + dTP);
(与 TP = ND(Bid + dTP);
相反=61=]OP_SELL
.)
So what is the correct way to set the SL and TP for a BUY ?
世上无所谓"The Correct Way",有规则可循
0级: 语法是满足呼号(最简单的一种)
级别 1:所有市场 XTO-s 都必须满足当前价格 +/- 滑点的正确级别,确保重复 RefreshRates()
-测试以接近PriceDOMAIN-levels 设置,否则它们会被 Broker 端拒绝(以不确定的附加 RTT 延迟阻止一个人的交易引擎)+ GetLastError() == 129
| ERR_INVALID_PRICE
第 2 级:经纪人方面在 [交易条款和条件] 中各自的服务/产品定义中设置了另一条规则。如果一个人的 OrderSend()
-请求未能满足其中任何一个,XTO 将再次被拒绝,具有相同的不利阻止效果,如级别 1 中所述。
一些经纪人由于其条款和条件而不允许某些 XTO 情况,因此请仔细阅读此类条件。如果违反了他们的任何一条规则,将导致您的 XTO 指令在法律上被拒绝,并产生所有不利影响,如上所述。检查所有规则,因为您不希望看到以下任何错误状态 + 任何其他错误状态,受您的经纪人的 T&C 限制:
ERR_LONG_POSITIONS_ONLY_ALLOWED Buy orders only allowed
ERR_TRADE_TOO_MANY_ORDERS The amount of open and pending orders has reached the limit set by the broker
ERR_TRADE_HEDGE_PROHIBITED An attempt to open an order opposite to the existing one when hedging is disabled
ERR_TRADE_PROHIBITED_BY_FIFO An attempt to close an order contravening the FIFO rule
ERR_INVALID_STOPS Invalid stops
ERR_INVALID_TRADE_VOLUME Invalid trade volume
...
..
.
#ASSUME NOTHING ; Is the best & safest design-side (self)-directive
如果您买入,您 OP_BUY
在 Ask
并在 Bid
平仓(SL, TP)。
如果您卖出,OP_SELL
操作在 Bid
价格进行,并在 Ask
.
平仓
SL 和 TP 都应至少保持在距离当前收盘价 STOP_LEVEL * Point()
的距离内(Bid
买入,Ask
卖出)。
STOP_LEVEL
可能为零 - 在这种情况下(虽然 MT4 接受订单)经纪商可能会根据自己的算法拒绝它(条款和条件可能将其称为 "floating Stoplevel" 规则或一些类似的营销方式 "re-dressed" 术语)。
建议发送一个OrderSend()
请求,SL和TP为零,看到订单发送成功后修改。有时不需要,有时甚至是强制性的。
您给我们的两个链接之间没有区别:您可以计算 SL 和 TP,然后将它们传递给函数或根据 OrderOpenPrice()
+/- distance * Point()
计算它们。
我想弄清楚是否有正确的方法 来设置止损 (SL) 和止盈 ( TP) 水平,当在 MQL4 (Metatrader4) 中的 EA 交易 中发送订单时。功能模板是:
OrderSend( symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);
所以我很自然地尝试执行以下操作:
double dSL = Point*MM_SL;
double dTP = Point*MM_TP;
if (buy) { cmd = OP_BUY; price = Ask; SL = ND(Bid - dSL); TP = ND(Ask + dTP); }
if (sell) { cmd = OP_SELL; price = Bid; SL = ND(Ask + dSL); TP = ND(Bid - dTP); }
ticket = OrderSend(SYM, cmd, LOTS, price, SLIP, SL, TP, comment, magic, 0, Blue);
但是,有多少脚本和 EA,就有多少变体。到目前为止,我已经遇到了这些。
在MQL4 Reference中MetaEditor,文档说要使用:
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,
NormalizeDouble(Bid - StopLoss*Point,Digits),
NormalizeDouble(Ask + TakeProfit*Point,Digits),
"My order #2",3,D'2005.10.10 12:30',Red);
在 "same" 文档 online 中,他们使用:
double stoploss = NormalizeDouble(Bid - minstoplevel*Point,Digits);
double takeprofit = NormalizeDouble(Bid + minstoplevel*Point,Digits);
int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen);
所以它继续有各种口味,here, here and here...
假设我们对 OP_BUY
感兴趣并且符号正确,我们可以选择将我们的 SL 和 TP 值基于:
bid, bid
bid, ask
ask, ask
ask, bid
那么设置买入的止损和止盈的正确方法是什么?
(使用各种变体的优点或缺点是什么?)
编辑:2018-06-12
除了一些细节,答案其实很简单,虽然不是很明显。可能 因为 MT4 只在图表上显示 Bid 价格(默认) 而不是 Ask 和 出价.
所以因为:Ask > Bid
和 Ask - Bid = Slippage
,只要我们知道滑点,我们选择哪个并不重要。然后根据您在图表上关注的价格,您可能希望决定使用其中一种,相应地增加或减少滑点。
因此,当您使用测量工具获取当前显示价格与您的 "exact" SL/TP 设置的 Pip 差异时,您需要保持记住这一点。
因此,为了避免在上面的代码中出现滑点,我对 OP_BUY
使用了以下代码:TP = ND(Bid + dTP);
(与 TP = ND(Bid + dTP);
相反=61=]OP_SELL
.)
So what is the correct way to set the SL and TP for a BUY ?
世上无所谓"The Correct Way",有规则可循
0级: 语法是满足呼号(最简单的一种)
级别 1:所有市场 XTO-s 都必须满足当前价格 +/- 滑点的正确级别,确保重复 RefreshRates()
-测试以接近PriceDOMAIN-levels 设置,否则它们会被 Broker 端拒绝(以不确定的附加 RTT 延迟阻止一个人的交易引擎)+ GetLastError() == 129
| ERR_INVALID_PRICE
第 2 级:经纪人方面在 [交易条款和条件] 中各自的服务/产品定义中设置了另一条规则。如果一个人的 OrderSend()
-请求未能满足其中任何一个,XTO 将再次被拒绝,具有相同的不利阻止效果,如级别 1 中所述。
一些经纪人由于其条款和条件而不允许某些 XTO 情况,因此请仔细阅读此类条件。如果违反了他们的任何一条规则,将导致您的 XTO 指令在法律上被拒绝,并产生所有不利影响,如上所述。检查所有规则,因为您不希望看到以下任何错误状态 + 任何其他错误状态,受您的经纪人的 T&C 限制:
ERR_LONG_POSITIONS_ONLY_ALLOWED Buy orders only allowed
ERR_TRADE_TOO_MANY_ORDERS The amount of open and pending orders has reached the limit set by the broker
ERR_TRADE_HEDGE_PROHIBITED An attempt to open an order opposite to the existing one when hedging is disabled
ERR_TRADE_PROHIBITED_BY_FIFO An attempt to close an order contravening the FIFO rule
ERR_INVALID_STOPS Invalid stops
ERR_INVALID_TRADE_VOLUME Invalid trade volume
...
..
.
#ASSUME NOTHING ; Is the best & safest design-side (self)-directive
如果您买入,您 OP_BUY
在 Ask
并在 Bid
平仓(SL, TP)。
如果您卖出,OP_SELL
操作在 Bid
价格进行,并在 Ask
.
SL 和 TP 都应至少保持在距离当前收盘价 STOP_LEVEL * Point()
的距离内(Bid
买入,Ask
卖出)。
STOP_LEVEL
可能为零 - 在这种情况下(虽然 MT4 接受订单)经纪商可能会根据自己的算法拒绝它(条款和条件可能将其称为 "floating Stoplevel" 规则或一些类似的营销方式 "re-dressed" 术语)。
建议发送一个OrderSend()
请求,SL和TP为零,看到订单发送成功后修改。有时不需要,有时甚至是强制性的。
您给我们的两个链接之间没有区别:您可以计算 SL 和 TP,然后将它们传递给函数或根据 OrderOpenPrice()
+/- distance * Point()
计算它们。