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

 
pivomoe:
我只是想不明白,这是否正常。

这里有很多难以理解的事情。特别是在处理交易顺序时,我发现在一些情况下存在着一些不一致的地方。
例如,当开立头寸时,首先正式开立市场订单,然后转为头寸。然而,在这种机关枪式的系列交易中,有一种情况是已经开仓了,但订单还没有关闭。显然这是同一个事件,但交易是零散地组织起来的,按顺序发布,用这种方法原则上不可能正确反映市场订单向头寸的转变。

在我看来,最好的办法是组织你的交易控制:记住你的交易订单,监测订单和头寸的构成,只需在相关列表中出现的事实。
 

说到鸟类。

你知道在这些交易中发出的市价订单的价格为零吗?
例如,一个人想在1.2000开一个 买入头寸,Sl=1.1000,Tr=1.3000。
当这个交易被执行时,交易出现的第一件事是市场订单被列出,数据如下:
Sl= 1.1000, Tr= 1.3000,即有指定的数字和Price=0(等于零)。只是一种零价格的市场订单 :)并且想你所想。

 
pivomoe:

为了方便。从MqlTradeTransaction 中调用一个小函数。所需的元素是通过搜索类的元素在那里找到的。而对于这个元素,有一个类函数被调用,它做一些有用的事情。


请更详细地描述你到底想得到什么?你为什么要从OnTradeTransaction调用一些东西?

首先只是在文字上,然后我们会在正确的方向上纠正它。

 
User_mt5:
用户的函数Abc()被执行,它实现了一个很长的(以时间计算)算法。
这个功能的执行过程中,会发生一些事件,例如--交易、定时器等。
有没有可能在没有完成执行Abc()函数的情况下知道这些事件的发生?

不,当一个函数被计算时,其他的都将被跳过。

它类似于Sleep()函数--也就是说,当你的函数正在计算很长的时间时,它的行为类似于Sleep--所有其他事件都将被跳过

 
User_mt5:

...


在OnTradeTransaction中,绝对是一切透明。

首先:MqlTradeTransaction结构根据交易类型(ENUM_TRADE_TRANSACTION_TYPE以不同方式填充

read here:Structure of a Trade Transaction (MqlTradeTransaction)

第二:为了使结果可视化,我们可以从OrderSendAsync 的例子中提取这个代码块

//+------------------------------------------------------------------+ 
//| TradeTransaction function                                        | 
//+------------------------------------------------------------------+ 
void OnTradeTransaction(const MqlTradeTransaction &trans, 
                        const MqlTradeRequest &request, 
                        const MqlTradeResult &result) 
  { 
//--- получим тип транзакции в виде значения перечисления  
   ENUM_TRADE_TRANSACTION_TYPE type=(ENUM_TRADE_TRANSACTION_TYPE)trans.type; 
//--- если транзакция является результатом обработки запроса, выведем только её название 
   if(type==TRADE_TRANSACTION_REQUEST) 
     { 
      Print(EnumToString(type)); 
      //--- выведем строковое описание обработанного запроса 
      Print("------------RequestDescription\r\n",RequestDescription(request)); 
      //--- выведем описание результата запроса 
      Print("------------ResultDescription\r\n",TradeResultDescription(result)); 
      //--- запомним тикет ордера для его удаления на следующей обработке в OnTick() 
      if(result.order!=0) 
        { 
         //--- удалим этот ордер по его тикету при следующем вызове OnTick() 
         order_ticket=result.order; 
         Print(" Тикет отложенного ордера ",order_ticket,"\r\n"); 
        } 
     } 
   else // для транзакций другого типа выведем полное описание 
//--- выведем описание полученной транзакции в Журнал 
      Print("------------TransactionDescription\r\n",TransactionDescription(trans));
 
//---      
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание транзакции                         | 
//+------------------------------------------------------------------+ 
string TransactionDescription(const MqlTradeTransaction &trans) 
  { 
//---  
   string desc=EnumToString(trans.type)+"\r\n"; 
   desc+="Symbol: "+trans.symbol+"\r\n"; 
   desc+="Deal ticket: "+(string)trans.deal+"\r\n"; 
   desc+="Deal type: "+EnumToString(trans.deal_type)+"\r\n"; 
   desc+="Order ticket: "+(string)trans.order+"\r\n"; 
   desc+="Order type: "+EnumToString(trans.order_type)+"\r\n"; 
   desc+="Order state: "+EnumToString(trans.order_state)+"\r\n"; 
   desc+="Order time type: "+EnumToString(trans.time_type)+"\r\n"; 
   desc+="Order expiration: "+TimeToString(trans.time_expiration)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",trans.price)+"\r\n"; 
   desc+="Price trigger: "+StringFormat("%G",trans.price_trigger)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",trans.volume)+"\r\n"; 
   desc+="Position: "+(string)trans.position+"\r\n"; 
   desc+="Position by: "+(string)trans.position_by+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание торгового запроса                  | 
//+------------------------------------------------------------------+ 
string RequestDescription(const MqlTradeRequest &request) 
  { 
//--- 
   string desc=EnumToString(request.action)+"\r\n"; 
   desc+="Symbol: "+request.symbol+"\r\n"; 
   desc+="Magic Number: "+StringFormat("%d",request.magic)+"\r\n"; 
   desc+="Order ticket: "+(string)request.order+"\r\n"; 
   desc+="Order type: "+EnumToString(request.type)+"\r\n"; 
   desc+="Order filling: "+EnumToString(request.type_filling)+"\r\n"; 
   desc+="Order time type: "+EnumToString(request.type_time)+"\r\n"; 
   desc+="Order expiration: "+TimeToString(request.expiration)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",request.price)+"\r\n"; 
   desc+="Deviation points: "+StringFormat("%G",request.deviation)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",request.sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",request.tp)+"\r\n"; 
   desc+="Stop Limit: "+StringFormat("%G",request.stoplimit)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",request.volume)+"\r\n"; 
   desc+="Comment: "+request.comment+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание результата обработки запроса       | 
//+------------------------------------------------------------------+ 
string TradeResultDescription(const MqlTradeResult &result) 
  { 
//--- 
   string desc="Retcode "+(string)result.retcode+"\r\n"; 
   desc+="Request ID: "+StringFormat("%d",result.request_id)+"\r\n"; 
   desc+="Order ticket: "+(string)result.order+"\r\n"; 
   desc+="Deal ticket: "+(string)result.deal+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",result.volume)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",result.price)+"\r\n"; 
   desc+="Ask: "+StringFormat("%G",result.ask)+"\r\n"; 
   desc+="Bid: "+StringFormat("%G",result.bid)+"\r\n"; 
   desc+="Comment: "+result.comment+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  }

并将其粘贴到一个可以附加到图表上的专家顾问中。然后你可以手动开仓/平仓,并在专家标签中查看打印结果。

 
Vladimir Karputov:

不,当一个函数被计算时,其他的都将被跳过。

它类似于Sleep()函数--也就是说,当你的函数正在计算很长的时间时,它的行为与Sleep是一样的--所有其余的事件都将被跳过

谢谢你,这很不幸。
那么如何有效地利用PC资源呢?又是循环的代码和周期性的参数轮询?

 
Vladimir Karputov:

在OnTradeTransaction中,绝对是一切透明。

谢谢你的回答,我差不多就是这么做的。到目前为止,问题多于见解......

 
Vladimir Karputov:

请更详细地描述你到底想得到什么?你为什么要从OnTradeTransaction调用一些东西?

首先只是在文字上,然后我们会在正确的方向上纠正它。

我知道问题不在OnTradeTransaction上。看看我这里有多乱。

以下是代码。

 CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 if( !PositionInfoVedygii.Select("SBRF-12.17")   )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");

 Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());

下面是其执行的结果

2017.09.22 10:30:12 按符号选择位置失败 SBRF-12.17
2017.09.22 10:30:12成交量 0.0 成交量 0.0

我调换了第2行和第3行,也就是说,现在的代码是

CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if( !PositionInfoVedygii.Select("SBRF-12.17")   )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");
 if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 
 Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());

我得到一个这样的结果。

2017.09.22 10:30:12 按符号选择位置失败 SBRF-12.17
2017.09.22 10:30:12SBRF-3.18卷1.0 SBRF-3.18卷1.0

在这两种情况下,编译器 都不会产生警告。附上80行专家顾问代码和测试设置。经纪人BCS。1730年的版本。

Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
  • www.metatrader5.com
На данной вкладке отображается журнал компиляции программ, содержащий сообщения об использованных при компиляции файлах, а также ошибки и предупреждения, возникшие в этом процессе. — описание события. Иконки, расположенные слева от описания свидетельствуют о типе события. означает ошибку, — предупреждение, а — информационное сообщение; Если...
附加的文件:
temp.mq5  7 kb
1.png  11 kb
 
pivomoe:

我意识到,问题不在OnTradeTransaction上。看看我有什么乱七八糟的事情发生。

下面是代码。

下面是其执行的结果

2017.09.22 10:30:12 按符号选择位置失败 SBRF-12.17
2017.09.22 10:30:12成交量 0.0 成交量 0.0

我调换了第2行和第3行,也就是说,现在的代码是

我得到一个这样的结果。

2017.09.22 10:30:12 按符号选择位置失败 SBRF-12.17
2017.09.22 10:30:12SBRF-3.18卷1.0 SBRF-3.18卷1.0

在这两种情况下,编译器 都不会产生警告。附上80行专家顾问代码和测试设置。经纪人BCS。1730年的版本。

我将在本周末回复。对不起。

 

这个错误似乎是在试图获得超过1个位置的信息,在1行(打印)。

在任何时候,只有1个(选定的)位置的信息是可用的。

- 在第二种情况下,它是正确的,因为最后一个 选择返回真,而你没有检查。

- 而在第一种情况下:最后一个Select返回false ,你也没有检查,结果是不可预测的。

..... 显然Select==false会重置之前Select==true的信息。