MQL4プログラミング中にStack overflowエラーが出て躓いた話

こんにちは
fx-on.comエンジニアの岩淵です。
皆さんは昨夜のFOMCでトレードしたでしょうか?
私は起きれませんでしたorz
最近MQL4をゴリゴリと書いていたら、Stack overflowというエラーが発生しました。
お恥ずかしながら長年MQL4を弄っておきながら、
このエラーに出会ったのが初めてでしたので、
解決にだいぶ手間取ってしまいました。
そこで備忘録的に記事に残したいと思います。
問題形式にしたのでプログラマの方は原因を考えてみてくださいw
問題
こちらが今回問題のコード 保有中のポジション情報を取得するクラスとなっております。 例えばTicket()を実行すると保有中のポジションのチケット番号を返す仕組みです。 このクラスからインスタンスを作成してTicket()を実行したところStack overflowとなりました。 何が問題でしょうか?
class Sample{
private:
int magic;
public:
Sample(int value);
int Ticket(void);
string Symbol(void);
};
Sample::Sample(int value){
this.magic = value;
}
int Sample::Ticket(void){
for(int i = OrdersTotal() - 1; i >= 0; i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) return(-1);
if(OrderMagicNumber() != this.magic) continue;
if(OrderSymbol() != Symbol()) continue;
return(OrderTicket());
}
return(-1);
}
string Sample::Symbol(void){
for(int i = OrdersTotal() - 1; i >= 0; i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) return(NULL);
if(OrderMagicNumber() != this.magic) continue;
if(OrderSymbol() != Symbol()) continue;
return(OrderSymbol());
}
return(NULL);
}
ヒント1 スタックオーバーフローとは?
Google先生に尋ねたところ、wikipediaの記事を紹介して頂きました。 wikipediaによる事例int f()
{
g();
}
int g()
{
f();
}
関数fを実行すると、関数gが実行される。
関数gを実行すると、関数fが実行される。
このように関数が終わりなく交互に実行されてプログラムが使用する容量をオーバーすることが原因でスタックオーバーフローが発生する。
ヒント2 問題の行
Ticket()内の処理を少しずつコメントアウトしていくと、次の1行に問題があることが分かりました。if(OrderSymbol() != Symbol()) continue;