错误、漏洞、问题 - 页 2589

 
fxsaber:

关于ArrayResize的问题。我一次为几个千兆字节做了储备。然后我逐渐增加尺寸,这比最初的储备量要少。

为什么TaskManager在尺寸增加时显示内存消耗增加?

我们没有故意做任何事情--这是操作系统的一个特点(而且用户真的需要千兆字节吗?

如果你想在程序的一个关键点拥有 "热 "内存,你必须在该点之前 "运行 "所分配的块的页,以便进程的虚拟内存页得到物理的。


但是,从MQL来看,无法访问阵列的保留块。

 
Ilyas:

我们并没有刻意为此做什么--这是操作系统的一个特点(而且用户真的需要千兆字节吗?

如果你想在程序的一个关键点上有热的内存,你必须在该点之前 "运行 "所分配的块的页,以便进程的虚拟内存页得到物理的。


但是,从MQL来看,无法访问阵列的保留块。

谢谢。我想知道如果一次对数千字节做完整的ArrayResize,性能应该受到什么影响。

 
void OnStart()
{  datetime m_stoptime = 0;
//1.
   if(m_stoptime < TimeCurrent())
   {
      //расчеты   
   }


//2.
   MqlTick last_tick;
   if(SymbolInfoTick(_Symbol, last_tick))
   {  if(m_stoptime < last_tick.time) 
      {
         //расчеты
      }
   }
//3. 
      const  int start = 0;
      const int count = 1;
      datetime time[1];
      if(CopyTime(_Symbol,PERIOD_M1,start,count,time)>0)
      {
        if(m_stoptime < time[0]) 
         {
         //расчеты
         }
      }
}

经测试,在优化我的EA 时,运行了一个完整的超限值,共5000次,仅从测试者的日志中算起

1.14:04:28.365 - 14:15:47.481 = 11米19秒

2.13:49:56.885 - 14:00:30.819 = 10 m 34 sec.

3.14:28:35.89 - 14:41:11.659 = 12 m 36 sec


原则上,正如预期的那样,选项2更快,对于5000次运行来说,收益约为30秒,也相当不错。

 

请帮助通过WinAPI调用这个菜单。

我可以得到带有选定的EA名称的行。ComboBox中只有一行,与MT4不同。

但我不能调用菜单。BM_CLICK不起作用。


你如何在x64中使用信息?


使用WM_LBUTTONDOWN解决了这个问题。

 
零点静力学到底是不是一个错误?
int Array0[] = {};
 
移动终端 中是否会有一个选项,将地下室的指标直接应用到图表中?
 
Igor Makanu:

基本上,正如预期的那样,选项2更快,对于5000次传球来说,收益约为30秒,也不错了。

如果能有一个汇编类似结果的主题,那就更好了。对于优化者来说是相关的。

 
fxsaber:

如果有一个收集类似结果的分支,那就好了。这与优化器有关。

我支持它,这不是我第一次在茫茫人海中测试和发布结果了

但我还没准备好开分店....,不好的教育,责任感会压得我喘不过气来,并保持话题的更新......我不确定我是否能够(())。

ZS:按照上面的例子....昨天没有决定再写这个线程的例子#2 SymbolInfoTick() 到SymbolInfoInteger(_Symbol, SYMBOL_TIME)

ZZZY:这是我使用的一个例子,对我来说,在优化器中用5分钟的采样率寻找时间更方便--更少的次数,所以在优化器中的时间一般做成2个字节的ushort,如果是0--那么这个选项就不用了,我有更多的--检查如何用字节工作,但不是现在--在我的例子中,一旦在OnInit()中我分割字节--不是关键的

class CWorkTime
{
private:
   int               m_starthour, m_stophour, m_startmin, m_stopmin;
   datetime          m_starttime, m_stoptime;
   bool              UseThisSession, NotIntraDay;
   void              setTodayWorkTime();
public:
   void              CWorkTime(const ushort worktime);
   bool              Disable(); };
//+------------------------------------------------------------------+
void CWorkTime::CWorkTime(const ushort worktime): UseThisSession(true)
{  union UShortToByte { ushort u_short; uchar byte[2]; } ShortToByte;
   if(worktime == 0)
   {  UseThisSession = false;
      Print("EA working time is not used"); }
   else
   {  ShortToByte.u_short = worktime;
      int t = (int)(ShortToByte.byte[0] * 5.625);
      m_starthour = (int)(t / 60);
      m_startmin = t % 60;

      t = (int)(ShortToByte.byte[1] * 5.625);
      m_stophour = (int)(t / 60);
      m_stopmin = t % 60;
      NotIntraDay = m_starthour > m_stophour ? true : false;
      setTodayWorkTime();
      printf("EA working time start: %d h %d min , end: %d h %d min", m_starthour, m_startmin, m_stophour, m_stopmin); } }
//+------------------------------------------------------------------+
void CWorkTime::setTodayWorkTime()
{  MqlDateTime dtstart, dtstop;
   TimeCurrent(dtstart);
   dtstop         = dtstart;
   dtstart.hour   = m_starthour;
   dtstart.min    = m_startmin;
   dtstop.hour    = m_stophour;
   dtstop.min     = m_stopmin;
   m_starttime    = StructToTime(dtstart);
   m_stoptime     = StructToTime(dtstop);
   if(NotIntraDay) m_stoptime += 86400; }
//+------------------------------------------------------------------+
bool CWorkTime::Disable(void)
{  bool result    = false;
   if(UseThisSession)
   {  datetime time = (datetime)SymbolInfoInteger(_Symbol, SYMBOL_TIME);
      if(m_stoptime < time) setTodayWorkTime();
      result      = time >= m_starttime && time <= m_stoptime ? false : true; }
   return(result); };
//+------------------------------------------------------------------+

使用方法。

int OnInit()
  {
   WorkTime=new CWorkTime(EA_Time);
   }

void OnTick()
  {
    bool DisableTradingByTime=WorkTime.Disable();
.....
    if(DisableTradingByTime) return;
 
fxsaber:

如果有一个收集类似结果的分支,那就好了。它与优化器有关。

在这个问题上,有一个类似的。

Алгоритмы, методы решений, сравнение их производительности
Алгоритмы, методы решений, сравнение их производительности
  • 2017.12.10
  • www.mql5.com
В данной ветке будем обсуждать разные способы решения тех, или иных задач, сравнивать производительность предложенных решений...
 

我可以得到一些细节:为什么SocketTlsReadAvailable()在Socket已连接(SocketIsConnected()返回真)时返回错误(5273 ERR_NETSOCKET_IO_ERROR)?

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

虫子,虫子,问题

Alain Verleyen, 2019.08.29 01:17

关于mql SocketXXX函数()这条信息主要是针对Metaquotes的开发者。@Renat Fatkhullin, @Slava, @Ilyas

我正在使用下面的代码来控制安全连接上的信息接收。

int socket;
//+------------------------------------------------------------------+
//| void OnTimer()                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   string message;
   if(receive(message))
     {
      //--- ...     
     }
  }
//+------------------------------------------------------------------+
//| Call every X ms                                                  |
//+------------------------------------------------------------------+
bool receive(string &message)
  {
//--- ...
   char response[];
   message="";

   ResetLastError();
   uint len=SocketIsReadable(socket);
   if(len>1)
     {
      int read=SocketTlsReadAvailable(socket,response,len);

      //--- analyze the response 
      if(read>0)
        {
         //--- ...

         message=CharArrayToString(response,0,read);
         return(true);
        }
      else if(read==-1)
        {
         if(SocketIsConnected(socket))
           {
            printf("ERROR: %i, socket(%i) read: len=%i",_LastError,socket,len);
           }
         else
           {
            printf("ERROR: %i, socket(%i) not connected. len=%i",_LastError,socket,len);
            //--- ...            
           }
        }
     }
   else
     {
      if(_LastError!=0)
         printf("ERROR: %i (SocketIsReadable).",_LastError);
     }
//--- ...
   return(false);
  }

大多数时候,它都能正常工作。然而,尽管插座已经连接,我偶尔会得到一个错误信息,一段时间后(1到5/6个错误),它继续工作。

...正确接收数据/信息

2019.08.29 00: 45: 43.019 XXXX (EURUSD, H1) ERROR: 5273, socket (1), read: len = 437
2019.08.29 00: 45: 43.237 XXXX (EURUSD, H1) ERROR: 5273, socket (1), read: len = 1242

...正确接收数据/信息

错误5273是非常常见的,没有什么帮助。是否有可能获得有关此类错误的更多信息?