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

 

祝大家玩得开心!

我有一个关于CTrade类中ResultDeal()函数的问题。

问题是,在策略测试器中,这个函数毫无问题地返回交易票据,但当你把EA扔到图表 上时,它总是返回 "零",尽管ResultRetcode()函数总是返回 "TRADE_RETCODE_DONE"。

示例代码。

/////////////////////////////////////////////////////////////////////
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
/////////////////////////////////////////////////////////////////////
CTrade Trade;
CSymbolInfo SymbolInfo;

uint Retcode;
ulong TicketDeal;
bool first_calc;
bool second_calc;
bool third_calc;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   TicketDeal = 9999999;
   
   first_calc = true;
   second_calc = false;
   third_calc = false;   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   if(first_calc)
   {
      first_calc = false;
      second_calc = true;
      
      SymbolInfo.Name(Symbol());
      SymbolInfo.RefreshRates();
      Trade.Buy(1.0, Symbol(), SymbolInfo.Ask(), 0.0, 0.0, "BUY");
//---
      Retcode = Trade.ResultRetcode();
      if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
      
      Print("first_calc ////////////////////////////////////");
      Print("PositionsTotal(): ", PositionsTotal());
      Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
   }
   else
   {
      if(second_calc)
      {
         second_calc = false;
         third_calc = true;
//---
         Retcode = Trade.ResultRetcode();
         if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
         
         Print("second_calc ////////////////////////////////////");
         Print("PositionsTotal(): ", PositionsTotal());
         Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
      }
      else
      {
         if(third_calc)
         {
            third_calc = false;
//---
            Retcode = Trade.ResultRetcode();
            if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
            
            Print("third_calc ////////////////////////////////////");
            Print("PositionsTotal(): ", PositionsTotal());
            Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
         }
         else
         {
            //Print("TicketDeal: ", Trade.ResultDeal());
         }
      }
   }   
}
//+------------------------------------------------------------------+

测试仪中的执行日志。

2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   first_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   second_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   third_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   Retcode: 10009; TicketDeal: 2

图表上的执行日志。

2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) first_calc ////////////////////////////////////
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) PositionsTotal(): 0
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.026 _TestSelect (EURUSD,M1) second_calc ////////////////////////////////////
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) third_calc ////////////////////////////////////
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0


我做错了什么?我怎样才能获得 实时 交易票据

第二个问题(不太重要),为什么在交易执行后 PositionsTotal()函数立即返回 "零"?而且它显示的是可靠的数据,有下一个刻度。是否有可能一下子获得 这些信息?


附加的文件:
 
ZAKST:

祝大家玩得开心!

我有一个关于CTrade类中ResultDeal()函数的问题。

问题是,在策略测试器中,这个函数毫无问题地返回交易票据,但当你把EA扔到图表 上时,它总是返回 "零",尽管ResultRetcode()函数总是返回 "TRADE_RETCODE_DONE"。

示例代码。

测试仪中的执行日志。

图表上的执行日志。


我做错了什么?我怎样才能获得 实时 交易票据

第二个问题(不太重要),为什么在交易执行后 PositionsTotal()函数立即返回 "零"?而且它显示的是可靠的数据,有下一个刻度。是否有可能一下子获得 这些信息?


嗯......突然间,我需要的实时 数据是由同一个CTrade 类的ResultOrder()函数返回的,尽管我没有使用挂单......

我的问题也是:我做错了什么?

 

有一个这样的宏观。

#define  Warning if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

我是这样使用的。

Warning"Warnig  сработал. ");

问题:为了能够像这样使用,在宏定义中需要纠正什么?

Warning("Warnig  сработал. ");

即在Warning和 "Warnig worked "之间加上一个括号。"试图在宏定义中使用小括号

#define  Warning( if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

但编译器不允许我使用小括号。

 
ZAKST:

嗯......突然间,同一个CTrade 类的ResultOrder()函数实时 返回我需要的数据,尽管我没有使用挂单......。

问题是一样的:我做错了什么?

只要了解MT5的订单系统,订单-交易-头寸。

ResultOrder是开场顺序。该职位的POSITION_IDENTIFIER 将等于该订单的票。

所有的交易都可以通过位置标识符在历史中找到。不要与位置的票相混淆,它可以改变,而标识符是不变的。

s.s. 测试员的不同之处在于,执行订单时没有延迟,交易立即 创建。在现实生活中,时间流逝,在成功创建订单的时候,还没有交易,它必须在OnTrade事件中被抓住。
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
pivomoe:

有一个这样的宏观。

我是这样使用的。

问题:为了能够像这样使用,在宏定义中需要纠正什么?

即在Warning和 "Warnig worked "之间加一个括号。"试图在宏定义中使用小括号

但编译器不会让你使用小括号。

你想使用参数化的形式,但你指定了一个非参数化的形式,它必须像这样

#define  Warning(CUSTOM) (if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+"",string(CUSTOM)))


Warning("Warnig  сработал. ");
 

我没有很好地解释。让我们从头开始。现在我是这样使用这个宏的。

Warning,"Warnig  сработал. i=",i);

这里是宏本身。

#define  Warning if(LogWarnig)MoiLoggerWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')

在宏调用中,在 "Warning, "和"); "之间,有任意数量的任意类型的参数。这都是通过反复重载写入 功能实现的。

问题。我应该在宏中纠正什么,以便能够像这样调用它。

Warning("Warnig  сработал. i=",i);
 
pivomoe:

我没有很好地解释。让我们从头开始。现在我是这样使用这个宏的。

这里是宏本身。

在宏调用中,在 "Warning, "和"); "之间,有任意数量的任意类型的参数。这都是通过反复重载写入 功能实现的。

问题。在宏中应如何纠正,使其能像这样调用。

答案:也是反复重新加载宏)

但最好是对字符串使用运算符+,并将所有内容转换为字符串,那么你就不需要一个有很多参数的函数(和宏)版本了。

 
Aleksey Mavrin:

只要了解MT5的订单系统,订单-交易-头寸。

ResultOrder是开场顺序。该职位的POSITION_IDENTIFIER 将等于该订单的票。

所有的交易都可以通过位置标识符在历史中找到。不要与位置的票相混淆,它可以改变,而标识符是不变的。

s.s. 测试员的不同之处在于,执行订单没有延迟,立即就 会有交易诞生。在真实的交易中,时间流逝,在成功执行时还没有交易,它必须在OnTrade事件中被捕获。
谢谢你的答复。我会处理的))。
 
你好!我如何从EA中访问一个指标的属性?例如,我想改变一个EA的线条颜色,知道指标手柄。我在帮助中搜索了一下,没有找到任何东西,也许是我找得不够仔细?
 
Tango_X:
你好!我如何从EA中访问指标属性?例如,我想从EA中改变线条的颜色,如果我知道指标的柄。我搜索了一下,没有找到,也许是我找得太辛苦了?

这方面的指标必须有一个输入颜色参数。也就是说,它必须是一个自定义指标