新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1110 1...110311041105110611071108110911101111111211131114111511161117...1953 新评论 Dmitri Custurov 2020.04.01 21:34 #11091 if(OrderSelect(ticket, SELECT_BY_TICKET)){ double lots; string symbol = OrderSymbol(); while(true){ RefreshRates(); double price; parseClosePrice(OrderType(), symbol, price); if(OrderClose(OrderTicket(), OrderLots(), price, 500)){ break; }else{ Print(GetLastError()); } Sleep(1000); } 有时会返回错误4108--订单关闭的错误票据。有没有可能OrderTicket()与OrderSelect 中的票据不匹配?票据变量可以等于零。 我花了很长时间来重现这个错误,问起来比较容易。 Artyom Trishkin 2020.04.01 21:54 #11092 Dmitri Custurov: 有时会返回错误4108--订单关闭的错误票据。有没有可能OrderTicket()与OrderSelect中的票据不匹配? 票据变量可以等于零。 我花了很长时间来重现这个错误,问起来比较容易。 你通过票据选择一个订单。你确定所选的订单还没有关闭吗?但你试图再次关闭它......。成功选票后,请查看关闭时间。 Dmitri Custurov 2020.04.01 22:08 #11093 Artyom Trishkin: 你在选择 票面上的顺序。你确定所选的订单没有被关闭?但你又试图关闭它。在票面上选择成功后查看关闭时间。 当我重现这个错误时,我会进行检查。我把所有票据都储存在全局变量中。当订单关闭时,它们会被删除。在OrderSelect()的票据从全局变量中获取。如果票据不在变量中 - 这个变量将是0,因此订单不应该被选择,OrderSelect()将返回false。但总的来说,是的,这值得检查。谢谢你。 Artyom Trishkin 2020.04.01 22:15 #11094 Dmitri Custurov: 当我重现这个错误时,我会进行检查。我把所有票据都储存在全局变量中。当订单关闭时,它们会被删除。在OrderSelect()的票据从全局变量中获取。如果票据不在变量中 - 这个变量将是0,因此订单不应该被选择,OrderSelect()将返回false。但总的来说,是的,这值得检查。谢谢你。 当一个订单被票选时,检查收盘价是标准做法。你不会以任何其他方式知道该订单是否被关闭并从关闭的订单列表中选择,或者是否仍然开放并从市场订单列表中选择。 最短视的方法是将票据存储在全局变量 中。它们应该取自交易环境--当前的信息就在那里。 Dmitri Custurov 2020.04.01 22:25 #11095 Artyom Trishkin: 当一个订单被票选时,检查收盘价是标准做法。你不会以任何其他方式知道该订单是否被关闭并从关闭的列表中选择,或者是否仍然开放并从市场的列表中选择。 在全局变量 中存储门票是最短视的。它们应该取自交易环境--当前的信息就在那里。 如果我像这样选择:OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES),是不是应该部分解决这个问题?我在全局变量中存储票据是出于其他原因,好吧,我在这个案例中也使用了它。 Artyom Trishkin 2020.04.01 22:38 #11096 Dmitri Custurov: 如果我像这样选择:OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES),是不是应该部分解决这个问题?我出于其他原因将票据存储在全局变量中,在这种情况下我也使用了它们。 不,不会的--池子(MODE_TRADES)在按票选择时被忽略。 Igor Makanu 2020.04.01 22:41 #11097 Dmitri Custurov: 有时会返回错误4108--订单关闭的错误票据。有没有可能OrderTicket()与OrderSelect中的票据不匹配? 票据变量可能等于零。 我花了很长时间来重现这个错误,问起来就容易多了。 通常只需检查市场订单即可。 OrderCloseTime() == 0 //订单已开启 OrderCloseTime() > 0 //订单已关闭 对于限价订单,你还应该检查收盘价;如果它等于0,说明限价订单已经被取消。 Dmitri Custurov 2020.04.01 22:53 #11098 谢谢大家的回答,我明白了 )) odyn 2020.04.02 05:30 #11099 你好! 如果可以的话,请分享使用PositionClosePartial方法的代码。 理论上我明白它是如何工作的,但我希望看到一些工作代码。 或者建议我去哪里找。 预先感谢你。 Alexey Viktorov 2020.04.02 07:57 #11100 odyn: 你好! 如果可以的话,请分享使用PositionClosePartial方法的代码。 理论上我明白它是如何工作的,但我希望看到一些工作代码。 或者建议我去哪里找。 我在此表示感谢。 事实上,这只是一行代码。但是,你必须为它拿到位置票。这是OnInit的专家顾问,以0.2手开仓,在OnTick中关闭一半的仓位。 //+------------------------------------------------------------------+ //| 00.mq5 | //| © 2020, Alexey Viktorov | //| https://www.mql5.com/ru/users/alexeyvik/news | //+------------------------------------------------------------------+ #property copyright "© 2020, Alexey Viktorov" #property link "https://www.mql5.com/ru/users/alexeyvik/news" #property version "1.00" #include <Trade\Trade.mqh> CTrade trade; ulong posTicket; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { trade.SetExpertMagicNumber(111); trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.2, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(PositionSelectByTicket(posTicket) && PositionGetDouble(POSITION_VOLUME) > 0.1) trade.PositionClosePartial(posTicket, 0.1); } //+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { //--- if(trans.type == TRADE_TRANSACTION_HISTORY_ADD) { if(PositionSelectByTicket(trans.position) && PositionGetInteger(POSITION_MAGIC) == 111 && PositionGetString(POSITION_SYMBOL) == _Symbol) posTicket = PositionGetInteger(POSITION_TICKET); } } //+------------------------------------------------------------------+ 或者这里是CTrade类 的完整代码 //+------------------------------------------------------------------+ //| Partial close specified opened position (for hedging mode only) | //+------------------------------------------------------------------+ bool CTrade::PositionClosePartial(const ulong ticket,const double volume,const ulong deviation) { //--- check stopped if(IsStopped(__FUNCTION__)) return(false); //--- for hedging mode only if(!IsHedging()) return(false); //--- check position existence if(!PositionSelectByTicket(ticket)) return(false); string symbol=PositionGetString(POSITION_SYMBOL); //--- clean ClearStructures(); //--- check filling if(!FillingCheck(symbol)) return(false); //--- check if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) { //--- prepare request for close BUY position m_request.type =ORDER_TYPE_SELL; m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID); } else { //--- prepare request for close SELL position m_request.type =ORDER_TYPE_BUY; m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK); } //--- check volume double position_volume=PositionGetDouble(POSITION_VOLUME); if(position_volume>volume) position_volume=volume; //--- setting request m_request.action =TRADE_ACTION_DEAL; m_request.position =ticket; m_request.symbol =symbol; m_request.volume =position_volume; m_request.magic =m_magic; m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation; //--- close position return(OrderSend(m_request,m_result)); } 附加的文件: 00.mq5 5 kb 1...110311041105110611071108110911101111111211131114111511161117...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
有时会返回错误4108--订单关闭的错误票据。有没有可能OrderTicket()与OrderSelect 中的票据不匹配?票据变量可以等于零。
我花了很长时间来重现这个错误,问起来比较容易。有时会返回错误4108--订单关闭的错误票据。有没有可能OrderTicket()与OrderSelect中的票据不匹配? 票据变量可以等于零。
我花了很长时间来重现这个错误,问起来比较容易。你通过票据选择一个订单。你确定所选的订单还没有关闭吗?但你试图再次关闭它......。成功选票后,请查看关闭时间。
你在选择 票面上的顺序。你确定所选的订单没有被关闭?但你又试图关闭它。在票面上选择成功后查看关闭时间。
当我重现这个错误时,我会进行检查。我把所有票据都储存在全局变量中。当订单关闭时,它们会被删除。在OrderSelect()的票据从全局变量中获取。如果票据不在变量中 - 这个变量将是0,因此订单不应该被选择,OrderSelect()将返回false。但总的来说,是的,这值得检查。谢谢你。
当我重现这个错误时,我会进行检查。我把所有票据都储存在全局变量中。当订单关闭时,它们会被删除。在OrderSelect()的票据从全局变量中获取。如果票据不在变量中 - 这个变量将是0,因此订单不应该被选择,OrderSelect()将返回false。但总的来说,是的,这值得检查。谢谢你。
当一个订单被票选时,检查收盘价是标准做法。你不会以任何其他方式知道该订单是否被关闭并从关闭的订单列表中选择,或者是否仍然开放并从市场订单列表中选择。
最短视的方法是将票据存储在全局变量 中。它们应该取自交易环境--当前的信息就在那里。
当一个订单被票选时,检查收盘价是标准做法。你不会以任何其他方式知道该订单是否被关闭并从关闭的列表中选择,或者是否仍然开放并从市场的列表中选择。
在全局变量 中存储门票是最短视的。它们应该取自交易环境--当前的信息就在那里。
如果我像这样选择:OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES),是不是应该部分解决这个问题?我在全局变量中存储票据是出于其他原因,好吧,我在这个案例中也使用了它。
如果我像这样选择:OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES),是不是应该部分解决这个问题?我出于其他原因将票据存储在全局变量中,在这种情况下我也使用了它们。
不,不会的--池子(MODE_TRADES)在按票选择时被忽略。
有时会返回错误4108--订单关闭的错误票据。有没有可能OrderTicket()与OrderSelect中的票据不匹配? 票据变量可能等于零。
我花了很长时间来重现这个错误,问起来就容易多了。通常只需检查市场订单即可。
OrderCloseTime() == 0 //订单已开启
OrderCloseTime() > 0 //订单已关闭
对于限价订单,你还应该检查收盘价;如果它等于0,说明限价订单已经被取消。
你好!
如果可以的话,请分享使用PositionClosePartial方法的代码。
理论上我明白它是如何工作的,但我希望看到一些工作代码。
或者建议我去哪里找。
预先感谢你。
你好!
如果可以的话,请分享使用PositionClosePartial方法的代码。
理论上我明白它是如何工作的,但我希望看到一些工作代码。
或者建议我去哪里找。
我在此表示感谢。
事实上,这只是一行代码。但是,你必须为它拿到位置票。这是OnInit的专家顾问,以0.2手开仓,在OnTick中关闭一半的仓位。
或者这里是CTrade类 的完整代码