昨日の続き。。。
昨日は、「+」や「*」を使わずにプログラムが書けるか?という話でしたが、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))))); }
このコードがどうやってデモアカウントかどうか?と、アカウント番号を取得しているのかというと、原理は単純で、下図のようにタイトルウィンドウから取得しています。
↑図中のコメント部分がこのスクリプトの実行結果なのですが、それなりに機能しているようです。。。