MQL5でOpen,Low,High,Closeのパラメータを取得するにはどうしたらいいですか? - ページ 7

 
Igor Makanu:


を測定しました。

2019.07.30 00:44:29.156 tst_iXXX_Copy (EURUSD,H1) CopyClose: loops=1410065408 ms=69407

2019.07.30 00:45:29.408 tst_iXXX_Copy (EURUSD,H1) iClose: loops=1410065408 ms=60250

うーん、どこかのモデレーターが炎上の挨拶が必要なようだ ))))

スクリプトを実行する

2019.07.30 03:58:46.425 CopyClose: loops=-2147483648 ms=0
2019.07.30 03:58:46.425 iClose: loops=-2147483648 ms=0

どうしたんですか?(考える暇もなく)

 
Artyom Trishkin:

スクリプトを実行する

どうしたんですか?(考える暇もなく)

チャート上のバーの数のチェックはありません、多分存在しないバーによって終了します - 私はeuの無制限とH1期間を持って、rand()は最大65000を与えるようです。


rand()コンパイラをポチりました、4つのメソッドの正しいテストはこちらです。

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define  DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get(const string Symb,const int TimeFrame,const int iShift) \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator[](const int iPos) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME  NAME;                                                                                           \
                                                                                                              \
  T i##NAME(const string Symb,const int TimeFrame,const int iShift) \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb,  TimeFrame, iShift));                                                        \
  }
//+------------------------------------------------------------------+
DEFINE_TIMESERIE(Volume,TickVolume,long)
DEFINE_TIMESERIE(Time,Time,datetime)
DEFINE_TIMESERIE(Open,Open,double)
DEFINE_TIMESERIE(High,High,double)
DEFINE_TIMESERIE(Low,Low,double)
DEFINE_TIMESERIE(Close,Close,double)
#define    test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn&&!_StopFlag;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}
//+------------------------------------------------------------------+
void OnStart()
  {
   double buff[1];
   MqlRates rates[1];
   srand(GetTickCount());
   test(10,"CopyClose",CopyClose(_Symbol,_Period,rand(),1,buff));
   srand(GetTickCount());
   test(10,"iClose",iClose(NULL,0,rand())); 
   srand(GetTickCount());
   test(10,"Close[i]",Close[rand()]); 
   srand(GetTickCount());
   test(10,"CopyRates",CopyRates(_Symbol,_Period,rand(),1,rates)); 
  }
//+------------------------------------------------------------------+

2019.07.30 00:59:10.911 tst_iXXX_Copy (EURUSD,H1) CopyClose: loops=1410065408 ms=69765

2019.07.30 01:01:23.655 tst_iXXX_Copy (EURUSD,H1) iClose: loops=1410065408 ms=132735

2019.07.30 01:03:51.541 tst_iXXX_Copy (EURUSD,H1) Close[i]: loops=1410065408 ms=147890

2019.07.30 01:05:19.872 tst_iXXX_Copy (EURUSD,H1) CopyRates: loops=1410065408 ms=88328

 
Igor Makanu:

チャート上のバー数のチェックがないので、存在しないバーでクラッシュする可能性があります - 私はeuで無制限とH1期間を持っていますが、rand()は最大で65000を与えるようです


rand()コンパイラをポチりました、4つのメソッドの正しいテストはこちらです。

2019.07.30 00:59:10.911 tst_iXXX_Copy (EURUSD,H1) CopyClose: loops=1410065408 ms=69765

2019.07.30 01:01:23.655 tst_iXXX_Copy (EURUSD,H1) iClose: loops=1410065408 ms=132735

2019.07.30 01:03:51.541 tst_iXXX_Copy (EURUSD,H1) Close[i]: loops=1410065408 ms=147890

2019.07.30 01:05:19.872 tst_iXXX_Copy (EURUSD,H1) CopyRates: loops=1410065408 ms=88328

2019.07.30 04:12:50.825 CopyClose: loops=-2147483648 ms=0
2019.07.30 04:12:50.825 iClose: loops=-2147483648 ms=0
2019.07.30 04:12:50.825 Close[i]: loops=-2147483648 ms=0
2019.07.30 04:12:50.825 CopyRates: loops=-2147483648 ms=0
なぜかファイルが必要なときは困ります :)
 
Artyom Trishkin:
ファイルが必要なときには、なぜか不利になる :)

うーん、やっぱりハーフリッターじゃないと無理か...。

なぜ私のソースコードではloops=-2147483648が違うのですか!

;)

追記:ulong-intsの定義での置換について - 朝までテストするのであれば ))) 。)

 
Igor Makanu:

うーん、やっぱりハーフリッターじゃないと無理か...。

なぜ私のソースコードではloops=-2147483648が違うのですか!

;)

PS: 定義でintをulong-intoする - 朝までテストする場合 )))

交換された。

2019.07.30 04:26:12.849 CopyClose: loops=1410065408 ms=71234
2019.07.30 04:26:12.849 iClose: loops=1410065408 ms=0
2019.07.30 04:26:12.849 Close[i]: loops=1410065408 ms=0
2019.07.30 04:26:12.849 CopyRates: loops=1410065408 ms=0

:))

 
Artyom Trishkin:

交換された。

:))

MQL-ソースコードは1対1なので、ターミナルログからテストをコピーしてみました。

うーん、いたずらな手が他にどこを掘ったのか想像がつかない ))))

私は、このコードにそれほどこだわりはありませんし、問題なく動作しています。

SZY: Win10 - 64, build 2093 (Intel Core - 8GB RAM) - 問題は指摘されていません。

--------------

を添付しました。スクリプトです。script フォルダにあります。

ファイル:
 
Win10 x64では、すべてのコアが動作しています。
2019.07.30 00:25:29.057 Test (GBPUSD,M1)   CopyClose: loops=1410065408 ms=72953
2019.07.30 00:27:51.501 Test (GBPUSD,M1)   iClose:    loops=1410065408 ms=143625
2019.07.30 00:30:17.904 Test (GBPUSD,M1)   Close[i]:  loops=1410065408 ms=149078
2019.07.30 00:31:56.618 Test (GBPUSD,M1)   CopyRates: loops=1410065408 ms=88891

Debian x64のWine上では、なぜか1つのカーネルしか動作しません。
2019.07.30 00:38:03.104 Test (GBPUSD,M1)   CopyClose: loops=1410065408 ms=119863
2019.07.30 00:41:10.478 Test (GBPUSD,M1)   iClose:    loops=1410065408 ms=187364
2019.07.30 00:44:16.935 Test (GBPUSD,M1)   Close[i]:  loops=1410065408 ms=186449
2019.07.30 00:46:29.732 Test (GBPUSD,M1)   CopyRates: loops=1410065408 ms=132794
ファイル:
CPU_Win10.png  47 kb
CPU_Wine.png  21 kb
 
Igor Makanu:

MQL-sourceのコードは全く同じで、ターミナルログからテストをコピーしました。

うーん、いたずらなペンが他にどこを掘ったのか想像がつかない ))))

私は、このコードにそれほどこだわりはありませんし、問題なく動作しています。

SZY: Win10 - 64, build 2093 (Intel Core - 8GB RAM) - 問題は指摘されていません。

--------------

を添付しました。スクリプトです。script フォルダにあります。

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define  DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get(const string Symb,const int TimeFrame,const int iShift) \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator[](const int iPos) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME  NAME;                                                                                           \
                                                                                                              \
  T i##NAME(const string Symb,const int TimeFrame,const int iShift) \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb,  TimeFrame, iShift));                                                        \
  }
//+------------------------------------------------------------------+
DEFINE_TIMESERIE(Volume,TickVolume,long)
DEFINE_TIMESERIE(Time,Time,datetime)
DEFINE_TIMESERIE(Open,Open,double)
DEFINE_TIMESERIE(High,High,double)
DEFINE_TIMESERIE(Low,Low,double)
DEFINE_TIMESERIE(Close,Close,double)
#define    test(M,S,EX)        {ulong mss=GetTickCount();ulong nn=(ulong)pow(10,M);for(ulong tst=0;tst<nn&&!_StopFlag;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}
//+------------------------------------------------------------------+
void OnStart()
  {
   double buff[1];
   MqlRates rates[1];
   srand(GetTickCount());
   test(10,"CopyClose",CopyClose(_Symbol,_Period,rand(),1,buff));
   srand(GetTickCount());
   test(10,"iClose",iClose(NULL,0,rand())); 
   srand(GetTickCount());
   test(10,"Close[i]",Close[rand()]); 
   srand(GetTickCount());
   test(10,"CopyRates",CopyRates(_Symbol,_Period,rand(),1,rates)); 
  }
//+------------------------------------------------------------------+

Vin10 - 64 , ビルド 2093 (Intel Core i3-3217U CPU @ 1.80GHz - 12GB RAM)- 問題なし...

 
Artyom Trishkin:

の問題点に気づいた...

ここでやるべきことは、サイクル数を減らすことと、スクリプトが動作する場所があれば - GetLastError()アンパッキングを使ってそれを探すことだけ

または、端末の設定?- うーん、どんな設定があるんだろう?- チャート上のバーの本数、以上

 
Igor Makanu:

ここでは、サイクル数を減らし、スクリプトが動作する場所があれば - GetLastError()アンドゥを使用することです。

または、端末の設定?- うーん、どんな設定があるんだろう?- チャートのバーの数、これだけです。

探す時間がないんです。何か「はずれ」があるのでは......と思いつつ、とりあえず実行して結果を見た。そうしてはい、そしてスクリプトはすぐには動作せず、そのアイコンのPCMを押して強制的に閉じるまでハングします。そして初めて、そこにある何かが印刷されるのです。一般的に - マクロでは、何らかの理由で1つの手間がかかります。