昨日の続き。。。

昨日は、「+」や「*」を使わずにプログラムが書けるか?という話でしたが、MQL4 の関数を別のカタチで書きなおせるのか?を考えるのも、一種の知的パズルに成り得ます。
MathAbs,MathCeil,MathFloor,MathMax,MathMin,MathMod,MathPow,MathRound 辺りはすぐに分かると思います。
例えば、MathAbs の場合は、

int MyMathAbs(int x){
  if(x < 0) return(-x);
  return(x);
}

のような感じです。他にも Array 関数や、String 関数の中にも書き換え可能な関数があるかも?しれないので、お暇な人は考えてみてください。Windows の知識があると、IsDemo()やAccountNumber()も書き換えられるかもしれない?ので、興味のある人は続きをどうぞ。









…という訳で、サンプルコードです。

#import "user32.dll"
int GetAncestor(int,int);
int GetWindowTextA(int hWnd,string lpString,int nMaxCount);
#import

int start()
  {
   if(IsDemo_check()){
      Comment("This is Demo Account ["+AccountNumber_get()+"]");
   }
   return(0);
  }
//+------------------------------------------------------------------+
// use this concept in DLL
bool IsDemo_check(){
   string gwstr="                                                                                ";
   int hwnd = GetAncestor(WindowHandle(Symbol(),Period()),2);
   int len  = GetWindowTextA(hwnd,gwstr,80);
   if(StringFind(gwstr,CharToStr(101)+CharToStr(109)+CharToStr(111)) !=0) return(true);
   return(false);
}
int AccountNumber_get(){
   string gwstr="                                                                                ";
   int hwnd = GetAncestor(WindowHandle(Symbol(),Period()),2);
   int len  = GetWindowTextA(hwnd,gwstr,80);
   return(StrToInteger(StringSubstr(gwstr,0,StringFind(gwstr,CharToStr(58)))));
}

このコードがどうやってデモアカウントかどうか?と、アカウント番号を取得しているのかというと、原理は単純で、下図のようにタイトルウィンドウから取得しています。

↑図中のコメント部分がこのスクリプトの実行結果なのですが、それなりに機能しているようです。。。