下载MetaTrader 5
要添加评论,请登录注册
注册MQL5.community 发表您的论坛主题
phoenix17
42
phoenix17 2010.11.03 10:24 

for(int pos =0;pos<OrdersTotal; pos++)

{

OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);

OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-StopLoss*Point,OrderTakeProfit(),0,Blue);

Print(OrderStopLoss());

}

后来在 Print(OrderStopLoss());之前再次添加OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);后发现止损值改变了。

请问为什么呢? 还有MQL的订单队列是怎样一种存放模式?能否解释以上的问题?

angelstar
73
angelstar 2010.11.04 04:53  

bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, void arrow_color)
对于先前的开仓或挂单进行特性修改。如果函数成功,返回的值为 TRUE。如果函数失败,返回的值为FALSE。 获得详细的错误信息,查看 GetLastError()函数。
注解: 开价格和有效时间的改变只对挂单而言。
如果未改变的值作为函数参量通过,将会生成错误 1 (ERR_NO_RESULT)。
在一些服务器中挂单的有效时间会被隐藏。这种情况下,当一个非零值在 有效参量被指定时,将生成错误 147 (ERR_TRADE_EXPIRATION_DENIED)。
参量:
ticket - 定单编号。
price - 收盘价格
stoploss - 新止损水平。
takeprofit - 新赢利水平。
expiration - 挂单有效时间。
arrow_color - 在图表中允许对止损/赢利颜色进行修改。如果参量丢失或存在CLR_NONE 值,在图表中将不会显示。

OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-StopLoss*Point,OrderTakeProfit(),0,Blue);

你是已经修改了。修改成新的 新止损水平。 新赢利水平。

WANGGUANG
81
WANGGUANG 2010.11.04 07:46  

你加上 break;就可以了,更改后就停止就行了

细节请联系:QQ 1031130533

phoenix17
42
phoenix17 2010.11.04 10:11  

修改成功我是明白的 但是为什么修改后 原是订单的止损并未立刻改变? 需要重新选择订单后,止损值才会改变。

所以我想知道 MQL的订单队列 是怎样存放的?或者修改订单函数修改成功后,是否立即将止损值修改并且存入订单中,如果已经存入,为何直接调用OrderStopLoss()函数 却是0(依然是旧的止损)?

phoenix17
42
phoenix17 2010.11.04 10:14  

我想知道的是: 修改订单成功了 为何 OrderStoploss()函数却得不到订单的新的止损值?

phoenix17
42
phoenix17 2010.11.04 10:18  

angelstar 2010.11.04 05:53

OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-StopLoss*Point,OrderTakeProfit(),0,Blue);

你是已经修改了。修改成新的 新止损水平。 新赢利水平。

--------------------------------------------------------------------------------------

我想应该应该没有看仔细我的问题 我也知道确定修改成功了 但是为什么:马上调用OrderStoploss()函数却得不到订单的新的止损值?

angelstar
73
angelstar 2010.11.04 10:59  

不好意思,你标题写的是没有变动,而回复内容里面写改变了。呵呵。

据我观察,订单队列 最后一个是最新的一个。也就是OrdersTotal-1 是最新的一个。

你可以捕获下最新错误。

bool b = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-StopLoss*Point,OrderTakeProfit(),0,Blue);
if(!b)
{
Print("Error closing order (", (OrderType()),": ",OrderTicket(),"; Error(", GetLastError(),")");
}

angelstar
73
angelstar 2010.11.04 11:01  

我认为你的代码不够严谨

加上~

///如果有订单 循环订单找到需要的订单
for(int i=0;i< OrdersTotal();i++)
{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
{
Print("OrderSend 失败错误没有找到订单 #",GetLastError());
break;
}

......

WANGGUANG
81
WANGGUANG 2010.11.08 12:00  

你订单修改了止损,当然你的止损值就会发生了改变,可联系QQ:1031130533解决问题

okwh
1629
okwh 2010.11.11 03:25  

修改订单成功了 为何 OrderStoploss()函数却得不到订单的新的止损值?

因为设置是送到服务器设置的,然后返回更改是否成功,但是当前选择的订单是已经选定的,不会得到更新,print的还是原来的值, 

/
要添加评论,请登录注册