mql5语言的特点、微妙之处以及技巧 - 页 109

 
Taras Slobodyanik:

符合逻辑--这是一场政变。

在没有评估逻辑性的情况下写了资料。如果它受到影响,PositionID应该以同样的方式改变。

现在还没有改变。如果这是一个bug,那就太好了!


因此,有一个问题。 DEAL_ENTRY_INOUT交易 是否应将PositionID改为DEAL_ORDER?

我认为应该这样。这种行为将是非常方便/正确的。
 
fxsaber:

在没有评估逻辑的情况下写了资料。然而,如果它受到影响,PositionID应该以同样的方式改变。

现在还没有改变。如果这是一个bug,那就太好了!


因此,有一个问题。 DEAL_ENTRY_INOUT交易 是否应将PositionID改为DEAL_ORDER?

它说,没有。https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer

虽然之前写的是,是的,而且职位标识也改了。

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
Andrey Barinov:

它说,没有。https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer

也许这其中有一些很好的理由。从我的观点来看,这似乎一点都不对。

虽然之前是这样写的,是的,而且职位标识也改了。

我请开发商澄清一下情况。当PositionID发生变化时,那么在五次翻转之后,头寸视图中的交易历史标签将显示五个头寸。

现在(PositionID在翻转过程中不发生变化)总是只显示一个位置。不客气地说,这是个奇怪的解决方案。

 

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

新版MetaTrader 5 build 1930:MQL5中的浮动图表窗口和.Net库

fxsaber, 2018.11.09 16:19

在 "通过真实刻度 "模式下,测试器在刻度到来时独立生成条形。由于这个原因,一个自定义符号在终端和测试器中的条形历史可能会有很大的不同。

 
经常发生的情况是,在编译EA之后,如果之前在测试 器中选择了这个EA,测试器的设置 会被重置。至少可以说,这很令人讨厌。每次编译后,我们都要到专家顾问的树上搜索我们的EA。如果有人不知道,有一个配方可以让测试器不重置。你应该在历史的调试模式下运行一次专家顾问 - CTRL+F5。此后,任何重新编译都不会影响测试器的设置。
 
fxsaber:
我们注意到,如果之前在测试器中选择了这个专家顾问,那么测试器的设置 往往在编译后被重置。至少可以说,这很令人讨厌。每次编译后,我们都要到专家顾问的树上搜索我们的EA。如果有人不知道,有一个配方可以让测试器不重置。你应该在历史的调试模式下运行一次专家顾问 - CTRL+F5。此后,任何重新编译都不会影响测试器的设置。


同样的事情,昨天就注意到了!

这样修正:编译新版本(新文件名)后,你必须重新启动终端。-也许它没有更新mqlcache

此后,在编译过程中,测试人员不会重置到以前的文件。


这个问题以前出现过几次,后来就消失了。然后它又重新出现在....

Z.I.没有读懂你的话的意思,你是在建议而不是询问......

 
 

有人在这里吗? 检查历史下载脚本...

我是唯一一个被冻死的人吗?该脚本取自帮助...

//+------------------------------------------------------------------+ 
//|                                              TestLoadHistory.mq5 | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.02" 
#property script_show_inputs 

//--- input parameters 

//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart()
  {



   int      all_symbols=SymbolsTotal(false);   string  sym_name="";
   Print("Load symbols ",all_symbols);

   for(int k=0;k<all_symbols;k++)
      if((sym_name=SymbolName(k,false))!="")
        {
         SymbolSelect(sym_name,true);

         Print(k," Symbol name ",sym_name);

         int res=CheckLoadHistory(sym_name,PERIOD_M1,(TimeCurrent()-60*60*24*5));

         switch(res)
           {
            case -1 : Print("Unknown symbol ",sym_name);             break;
            case -2 : Print("Requested bars more than max bars in chart ",sym_name); break;
            case -3 : Print("Program was stopped ",sym_name);                        break;
            case -4 : Print("Indicator shouldn't load its own data ",sym_name);      break;
            case -5 : Print("Load failed ",sym_name);                                break;
            case  0 : Print("Loaded OK ",sym_name);                                  break;
            case  1 : Print("Loaded previously ",sym_name);                          break;
            case  2 : Print("Loaded previously and built ",sym_name);                break;
            default : Print("Unknown result ",sym_name);
           }

         datetime first_date;
         SeriesInfoInteger(sym_name,PERIOD_M1,SERIES_FIRSTDATE,first_date);
         int bars=Bars(sym_name,PERIOD_M1);
         Print("First date ",first_date," - ",bars," bars");
        }
//--- 

//--- 
  }
//+------------------------------------------------------------------+ 
//|                                                                  | 
//+------------------------------------------------------------------+ 
int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
  {
   datetime first_date=0;
   datetime times[100];
//--- check symbol & period 
   if(symbol==NULL || symbol=="") symbol=Symbol();
   if(period==PERIOD_CURRENT)     period=Period();
//--- check if symbol is selected in the MarketWatch 
   if(!SymbolInfoInteger(symbol,SYMBOL_SELECT))
     {
      if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1);

      SymbolSelect(symbol,true);
     }
//--- check if data is present 
   SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);
   if(first_date>0 && first_date<=start_date) return(1);
//--- don't ask for load of its own data if it is an indicator 
   if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol)
      return(-4);
//--- second attempt 
   if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
     {
      //--- there is loaded data to build timeseries 
      if(first_date>0)
        {
         //--- force timeseries build 
         CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
         //--- check date 
         if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
            if(first_date>0 && first_date<=start_date) return(2);
        }
     }
//--- max bars in chart from terminal options 
   int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
//--- load symbol history info 
   datetime first_server_date=0;
   while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopped())
      Sleep(5);
//--- fix start date for loading 
   if(first_server_date>start_date) start_date=first_server_date;
   if(first_date>0 && first_date<first_server_date)
      Print("Warning: first server date ",first_server_date," for ",symbol,
            " does not match to first series date ",first_date);
//--- load data step by step 
   int fail_cnt=0;
   while(!IsStopped())
     {
      //--- wait for timeseries build 
      while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
         Sleep(5);
      //--- ask for built bars 
      int bars=Bars(symbol,period);
      if(bars>0)
        {
         if(bars>=max_bars) return(-2);
         //--- ask for first date 
         if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
            if(first_date>0 && first_date<=start_date) return(0);
        }
      //--- copying of next part forces data loading 
      int copied=CopyTime(symbol,period,bars,100,times);
      if(copied>0)
        {
         //--- check for data 
         if(times[0]<=start_date)  return(0);
         if(bars+copied>=max_bars) return(-2);
         fail_cnt=0;
        }
      else
        {
         //--- no more than 100 failed attempts 
         fail_cnt++;
         if(fail_cnt>=100) return(-5);
         Sleep(10);
        }
     }
//--- stopped 
   return(-3);
  }
//+------------------------------------------------------------------+ 
//| Возвращает строкое значение периода                              | 
//+------------------------------------------------------------------+ 
string GetPeriodName(ENUM_TIMEFRAMES period)
  {
   if(period==PERIOD_CURRENT) period=Period();
//--- 
   switch(period)
     {
      case PERIOD_M1:  return("M1");
      case PERIOD_M2:  return("M2");
      case PERIOD_M3:  return("M3");
      case PERIOD_M4:  return("M4");
      case PERIOD_M5:  return("M5");
      case PERIOD_M6:  return("M6");
      case PERIOD_M10: return("M10");
      case PERIOD_M12: return("M12");
      case PERIOD_M15: return("M15");
      case PERIOD_M20: return("M20");
      case PERIOD_M30: return("M30");
      case PERIOD_H1:  return("H1");
      case PERIOD_H2:  return("H2");
      case PERIOD_H3:  return("H3");
      case PERIOD_H4:  return("H4");
      case PERIOD_H6:  return("H6");
      case PERIOD_H8:  return("H8");
      case PERIOD_H12: return("H12");
      case PERIOD_D1:  return("Daily");
      case PERIOD_W1:  return("Weekly");
      case PERIOD_MN1: return("Monthly");
     }
//--- 
   return("unknown period");
  }
//+------------------------------------------------------------------+
 

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

待定订单触发时的不明确情况。

fxsaber, 2018.11.26 13:37

还有一种情况是这样的。

  1. 一个市场订单被放置在一个位置 上,订单总数增加了一个。
  2. 它被执行,OrdersTotal减少了一个,但PositionsTotal没有增加一个换句话说,有一个位置,但终端不知道它。

例如,没有头寸或订单 - 头寸总数=0,订单总数=0。

你设置了一个市场订单。职位总数=0,订单总数=1。

市场订单被执行 - OrdersTotal = 0。但职位总数=0!

 
执行时间
PositionSelectByTicket(OrderGetInteger(ORDER_TICKET));

这样,PositionsTotal 可以(不难再现)变化。


例如,PositionsTotal在PositionsSelectBytTicket之前返回0,而PositionsSelectBytTicket则返回true。