初学者的问题 MQL5 MT5 MetaTrader 5 - 页 799

 
Aleksey Vyazmikin:

谢谢你!我搜索了一下,没有找到...

那么下一个问题,假设步骤是25,那么如何安排四舍五入到一个能被25整除的数字,也许有一个函数?

https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinfonormalizeprice

Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
  • www.mql5.com
Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladislav Andruschenko:
没有代码,没有评论。

是的,这很奇怪。附上了文件,但没有检查。我的错。现在我同时附上代码和代码摘录,其中测试人员给出了一行[Invalid stops]。我想了解在修改头寸时,MqlTradeRequest结构 是如何工作的。在我的例子中,它是在改变SAR的停止时。我无法摆脱来自测试人员的[无效停止]信息。RTS拼接工具。

//+------------------------------------------------------------------+
//| Модификация Stop Loss открытой позиции                           |
//+------------------------------------------------------------------+
//--- объявление запроса и результата
   MqlTradeRequest request;
   MqlTradeResult  result;

   int total=PositionsTotal(); // количество открытых позиций  
   Print("total = ",total," ");
//--- перебор всех открытых позиций
   for(int i=0; i<total; i++)
     {
      if(PositionSelect(_Symbol)==true) // есть открытая позиция
        {
         //--- параметры ордера
         ulong  position_ticket=PositionGetTicket(i);// тикет позиции
         string position_symbol=PositionGetString(POSITION_SYMBOL); // символ 
         int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой
         ulong  magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber позиции

         if(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует
           {
            //--- обнуление значений запроса и результата
            ZeroMemory(request);
            ZeroMemory(result);
            //--- установка параметров операции
            request.action = TRADE_ACTION_SLTP;   // тип торговой операции
            request.position = position_ticket;   // тикет позиции
            request.symbol = position_symbol;     // символ 
            request.sl= STP;                      // Stop Loss позиции
            request.tp = 0;                       // Take Profit позиции

            //--- отсылаем ордер
            int number=OrderSend(request,result);
            // анализируем код возврата торгового сервера
            if(result.retcode==10009 || result.retcode==10008) //Request is completed or order placed
              {
               Alert("Ордер Sell успешно помещен, тикет ордера # ",result.order," ");
              }
            else
              {
               Alert("Запрос на установку ордера Sell не выполнен - код ошибки:",GetLastError());
               return;
              }
           }
        }
     }
附加的文件:
SAR_SAR.mq5  27 kb
 
DCodec:

是的,这很奇怪。附上文件,但没有检查。我的错。现在我同时附上代码和代码摘录,其中测试人员给出了一行[Invalid stops]。我想了解在修改头寸时,MqlTradeRequest结构 是如何工作的。在我的例子中,它是在改变SAR的停止时。我无法摆脱来自测试人员的[无效停止]信息。RTS拼接工具。

乍一看,这不是我们应该寻找错误的代码片段。让我感到不安的只是三选一和同一职位。它是多余的。

你有一个错误的错误站,你可能应该从计算这些站的地方开始搜索。

 
DCodec:

是的,这很奇怪。附上了文件,但没有检查。我的错。现在我同时附上代码和代码摘录,其中测试人员给出了一行[Invalid stops]。我想了解在修改头寸时,MqlTradeRequest结构 是如何工作的。在我的例子中,它是在改变SAR的停止时。我无法摆脱来自测试人员的[无效停止]信息。RTS拼接。

为了充分理解,有必要具体说明哪种类型的帐务清算或净额结算

如果账户类型为

if(PositionSelect(_Symbol)==true) // есть открытая позиция

你已经为符号选择了一个位置,但它可能不是你想要看到的。

ulong  position_ticket=PositionGetTicket(i);// тикет позиции

但现在我们选择了我们想要的确切位置。

该函数按索引返回未结头寸列表中的头寸票,并自动选择该头寸以进一步处理它,使用


接下来,再次尝试选择正确的位置

if(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует

同样,你选择错误位置的概率非常高

当独立代表头寸时(ACCOUNT_MARGIN_MODE_RETAIL_HEDGING),每个符号可以同时开出几个头寸。在这种情况下,PositionSelect将选择最小的刻度线的 位置。


要检查OrderSend()函数在这种情况下的表现,你应该这样做,但最好是按部就班地做,如果错误没有消失,不仅要打印错误代码,还要打印仓单、仓位价格、新的止损价格和采取。这是最低限度。

 
Alexey Viktorov:

为了充分了解,你需要说明是哪种类型的账户哈吉或净额结算

谢谢你的评论。账户类型是净值化。RTS拼接。这是最棘手的部分吗?一个符号上的一个位置。你可以选择任何你喜欢的方式,你仍然会到达那个位置。这些不是待定订单,是吗?这就是为什么我更不明白--什么是错的?我尝试了所有的变种。

 
DCodec:

谢谢你的评论。账户类型的净值化。RTS接驳仪器。这是最棘手的部分吗?一个符号上的一个位置。你可以选择任何你喜欢的方式,你仍然会到达那个位置。这些不是待定订单,是吗?这就是为什么我更不明白--什么是错的?我尝试了所有的变种。

这一点没有答案吗?

关于交易、自动交易系统和策略测试的论坛

初学者的问题 MQL5 MT5 MetaTrader 5

Alexey Viktorov, 2017.11.22 09:29

要检查OrderSend()函数在这种情况下是如何表现的,你需要这样做并检查,但最好是按照它应该做的来做,如果错误没有消失,不仅要打印错误代码,还要打印仓单、仓位价格、新的止损价格和采取这是最低限度。


 
DCodec:

这就是为什么我更不明白--什么是错的?尝试了所有的选项。

在出现错误的地方插入这一行

Print(ToString(request) + ToString(result));

关于交易、自动交易系统和交易策略测试的论坛

mql5语言的特殊性、微妙性和技巧性

fxsaber, 2017.02.25 16:27

将MqlTrade-structures翻译成字符串
#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeTransaction &Trans )
{
  return(TOSTRING(Trans.deal) + TOSTRING(Trans.order) + TOSTRING(Trans.symbol) +
         TOSTRING2(Trans.type) + TOSTRING2(Trans.order_type) + TOSTRING2(Trans.order_state) +
         TOSTRING2(Trans.deal_type) + TOSTRING2(Trans.time_type) +
         TOSTRING(Trans.time_expiration) + TOSTRING(Trans.price) + TOSTRING(Trans.price_trigger) +
         TOSTRING(Trans.price_sl) + TOSTRING(Trans.price_tp) + TOSTRING(Trans.volume) +
         TOSTRING(Trans.position) + TOSTRING(Trans.position_by));
}

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) +
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +  
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +  
         TOSTRING(Result.retcode_external));
}

#undef TOSTRING
#undef TOSTRING2

 
fxsaber:

在出现错误的地方插入这一行


已粘贴。下面是测试器的结果。

2017.11.22 18:22:51.127 2016.11.09 12:00:00 交易所买入1.00 RTS在98080处的拼接:94130(98070/98080/98070)。
2017.11.22 18:22:51.127 2016.11.09 12:00:00 交易#4买入1.00 RTS拼接在98080完成(基于订单#4)。
2017.11.22 18:22:51.127 2016.11.09 12:00:00交易执行[#4买入1.00 RTS接盘在98080]
2017.11.22 18:22:51.127 2016.11.09 12:00:00订单执行,在98080买入1.00 [#4在98080买入1.00 RTS拼接]
2017.11.22 18:22:53.561 2016.11.09 14:05:00:00 修改失败 #4买1.00 RTS拼接 sl: 94130, tp: 0 -> sl: 94316, tp: 0 [无效站]
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.action =TRADE_ACTION_SLTP(6)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.magic = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.order = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.symbol = RTS Splice
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.volume = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.price = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.stoplimit = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.sl = 94316.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.tp = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.deviation = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type = ORDER_TYPE_BUY (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type_filling = ORDER_FILLING_FOK(0)。
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type_time = ORDER_TIME_GTC(0)。
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.expiration = 1970.01.01 00:00:00
2017.11.22 18:22:53.576 2016.11.09 14:05:00 请求.评论 =
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.position = 4
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.position_by = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.retcode = 10016
2017.11.22 18:22:53.576 2016.11.09 14:05:00 结果.交易=0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.order = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.volume = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.price = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.bid = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.ask = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.comment = 无效站点
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.request_id = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.retcode_external = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00警报:TP和SL的位置修改错误,错误代码。4756

 
DCodec:

把它放进去。下面是测试器的结果。

服务器和测试员模式?