エラー、バグ、質問 - ページ 2589

 
fxsaber:

ArrayResizeについて質問です。数ギガバイト分を一度にリザーブしておく。そして、初期Reserveより少ないSizeを徐々に増やしていく。

サイズアップ時にTaskManagerにメモリ消費量の増加が表示されるのはなぜですか?

OSの機能として、あえて何もしていないのです(それに、ユーザーは本当にギガバイトを必要としているのでしょうか?

プログラムの重要なポイントでホットメモリを確保したい場合、そのポイントより前に割り当てられたチャンクのページを「実行」して、プロセスの仮想メモリページが物理メモリを取得するようにしなければなりません。


しかし、MQLからは、配列の予約されたチャンクにアクセスすることはできません。

 
Ilyas:

このためにわざわざ何かをするわけではありません。OSの機能です(それに、ユーザーは本当にギガバイトを必要としているのでしょうか?

プログラムの重要なポイントで「ホット」メモリを確保したい場合、そのポイントの前に割り当てられたチャンクのページを「実行」し、プロセスの仮想メモリページが物理的なページを取得するようにしなければなりません。


しかし、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]) 
         {
         //расчеты
         }
      }
}

テストでは、5000パスで私のEAを最適化 しながらフルオーバーシュートを実行し、テスターのログからだけでカウントされます。

1.14:04:28.365 - 14:15:47.481 = 11 m 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と違い、1行しかありません。

でも、メニューは呼べない。BM_CLICKが機能しない。


x64でメッセージはどのように使うのですか?


WM_LBUTTONDOWNを使用して問題を解決しました。

 
ゼロスタティックというのは間違いなのか、そうでないのか。
int Array0[] = {};
 
モバイル端末で、地下にあるインディケータを直接チャートに適用するオプションはありますか?
 
Igor Makanu:

基本的には予想通りオプション2の方が速く、5000パスで約30秒の差となり、こちらも悪くない。

同じような結果がまとまるスレッドがあるといいと思います。For the Optimizerが関係しています。

 
fxsaber:

同じような結果が集まる支店があってもいいと思う。オプティマイザーに関連することです。

私はそれを支持します。何もないところでテストして結果を掲載するのは、今に始まったことではありませんから

が、支店を出すのはまだ早い...教育が悪い、責任感で圧倒される、話題は常に最新に...。とはいきませんね((

ZS: 上の例に倣うと...。昨日は、例2 SymbolInfoTick()からSymbolInfoInteger(_Symbol, SYMBOL_TIME) で、このスレッドを再度書くことにしたわけではありません。

ZZZY:私が使用する例です、それは5分のサンプルレートと時間を探すためにオプティマイザで私のためのより便利です - 少ないパス、そうオプティマイザの時間は一般的にushortで2バイトを作った、もし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;

すなわち、Disable()メソッドの結果 - très not working time, falce - working

 
fxsaber:

同じような結果が集まる支店があってもいいと思う。オプティマイザーに関連するものです。

似たようなものがありますね。

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

SocketTlsReadAvailable () が、SocketIsConnected () が true を返したのに、なぜエラー (5273 ERR_NETSOCKET_IO_ERROR) を返すのか、詳細を教えてください。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

アラン・ヴェルレーエン 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.019XXXX(EURUSD、H1)ERROR:5273、ソケット(1)、読み取り:LEN = 437
2019.08.29 00:45:43.237XXXX(EURUSD、H1)ERROR:5273、ソケット(1)、読み取り:LEN = 1242

...データ/メッセージを正しく受信する

5273エラーは非常によくあるもので、あまり役に立ちません。このようなエラーについて、もっと情報を得ることはできないのでしょうか?