mql5言語の特徴、微妙なニュアンスとテクニック - ページ 83

 
fxsaber

私の答えをもう一度読んでください。短いソースコードを開き、それを理解し...プロフィット!

もちろん、ソースコードも開きましたよ。MT5で全部必要とは言っていないのですが、何かいい案はないでしょうか。

関数GetBarSize()のどの行がこの問題(隠れたアイデア)を解決しているか教えてください。

#property show_inputs

extern int Width = 1280;
extern int Height = 800;

#import "user32.dll"
  int GetClientRect( int hWnd, int lpRect[] );
#import

#define  BORDER_SIZE 44

int GetBarSize()
{
  int Rect[4], PrevBars, PrevRect, Res = 1;
  int hwnd = WindowHandle(Symbol(), Period());

  GetClientRect(hwnd, Rect);
  PrevRect = Rect[2] - BORDER_SIZE;
  PrevBars = WindowBarsPerChart();

  PrevBars += PrevBars;
    
  while(PrevBars <= PrevRect)
  {
    Res += Res;
    PrevBars += PrevBars;
  }
  
  return(Res);
}

string StrNumToLen( string Num, int Len )
{
  Len -= StringLen(Num);
  
  while (Len > 0)
  {
    Num = "0" + Num;
    Len--;
  }
  
  return(Num);
}

void start()
{
  int Pos = WindowFirstVisibleBar(), Step, i = 1;
  string Directory = Width + "x" + Height + "_" + Symbol() + Period() + " (" +
                     TimeToStr(Time[Pos], TIME_DATE) + "-" +
                     TimeToStr(Time[0], TIME_DATE) + ")/";

  Pos += 2;
  Step = 1 + (Width - BORDER_SIZE) / GetBarSize();
  
  while (Pos >= 0)
  {
    WindowScreenShot(Directory + StrNumToLen(i, 5) + ".gif", Width, Height, Pos);
    i++;
    Pos -= Step;
  }
  
  return;
}
 
アレクセイ・ヴャジミキン

もちろん、ソースコードも開きましたよ。MT5で全部必要とは明記していないものの、アイデア募集中です・・・。

関数GetBarSize()のどの行がこの問題(隠れたアイデア)を解決しているか教えてください。

int GetBarSize( const ulong Chart = 0 )
{
  return(1 << (int)ChartGetInteger(Chart, CHART_SCALE));
}
 
fxsaber

バカみたい、「<<」ってなんだ?それと、グラフのスケールと どう関係があるのでしょうか?

 
アレクセイ・ヴャジミキン

バカみたいだ。"<<"ってどういう意味?

ビット単位で左にシフト します。1(2進数表現で0000 0001)は、ChartGetIntegerが返す値の数だけ左にシフトされます。基本的には2のべき乗です。

その結果が1バーあたりの画素数となります。

 
イホル・ヘラスコ

ビット単位で左にシフト します。1(2進数表現で 0000 0001)は ChartGetInteger が返す値の数だけ左にシフトされます。基本的には2のべき乗です。

その結果が1バーあたりの画素数となります。

分かりやすい説明ありがとうございます!実行してみます。

fxsaber

ありがとうございました。

 

Roshさん、探していただきありがとうございました。

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

バグ、バグ、質問

イリヤス さん 2016.08.24 11:08

配列("inside")には、その配列が 何個の要素に割り当てられて いるかが格納される。

アロケートされたものを扱うロジック(条件分岐コード)です。
ArrayResize(arr,int size,int reserve)
  {
   if(arr.allocated<size)
      if(!ArrayAllocateMemory(arr,size+reserve))  // -> arr.allocated=size+reserve;
         return(-1);
   //---
   CallConstructorsOrDestructors(arr,size);
   //---
   arr.size=size;
   return(size);
  }

全く使えないのが残念(配列ラッパーは選択肢にない)。まだ機能を追加できるかも?

int ArrayAllocated( const void&  array[] );

文字列の場合はStringBufferLenがありますね、やはり。

 
このトピックに関係のないコメントは、「バグ、不具合、問題」に移動しました。
 
このトピックに関係のないコメントは、「バグ、不具合、問題」に移動しました。
 
string Str = "123.456";

double Num1 = StringToDouble(Str);  
double Num2 = (double)Str; // Быстрее


この方法ではるかに高速化(デバッグではなく、リリース)

double StringToDouble2( const string Str, const uint StartPos = 0 )
{
  const uint Size = StringLen(Str);
  
  bool Sign = false;  
  uint i = StartPos;
  
  while (i < Size)
  {
    const int Digit = Str[i];

    if ((Digit != ' ') && (Digit != '\t') && (Digit != '\n') && (Digit != '\r'))
    {
      if ((Sign = (Digit == '-')) || (Digit == '+'))
        i++;
      
      break;
    }
      
    i++;
  }

  long Res = 0;
  int point = 0;
  
  while (i < Size)
  {
    const int Digit = Str[i];
    
    if (!point && (Digit == '.'))
      point = 1;
    else if (((Digit >= '0') && (Digit <= '9')))
    {
      Res = Res * 10 + Digit - '0';
      
      if (point)
        point *= 10;
    }
    else
      break;
      
    i++;
  }
  
  if (Sign)
    Res = -Res;
  
  return((point > 1) ? Res / (double)point : Res); // Возможна потеря точности при делении
}

大量のデータを解析する場合、大幅なスピードアップが得られる。

 
fxsaber


この方法ではるかに高速化(デバッグではなく、リリース)


大量のデータを解析する場合、大幅なスピードアップが 得られる。

それを実証するベンチマークコードを提供してもらえますか?

理由: