なにやら動きがおかしかった原因が分かりました。
浮動小数点演算で数値が狂っていました・・・・初歩的な話ですねw
お金が関わってくるシステムでは固定小数点演算出来るmathライブラリの使用がマストなのですが、MQL4には固定小数点演算の仕組みが用意されていません。
こういった場合、
①固定小数点演算用の何らかのライブラリ(外部DLL)を使用する。
②文字列変換を利用して整数で計算する。
という方法があります、ワイレベルに遥か昔からシステム開発に携わっていると言語仕様で出来ない事を解決する為の経験値が豊富な訳ですw
今回はドル円市場で桁数的に足りるのが分かっているので②を用いて修正しました。
//初期化処理
void _init()
{
_open = iOpen(_Symbol, _period, _shift);
_close = iClose(_Symbol, _period, _shift);
_high = iHigh(_Symbol, _period, _shift);
_low = iLow(_Symbol, _period, _shift);
string tmp = DoubleToString(_open, Digits);
StringReplace(tmp, ".", "");
int int_open = StringToInteger(tmp);
tmp = DoubleToString(_close, Digits);
StringReplace(tmp, ".", "");
int int_close = StringToInteger(tmp);
tmp = DoubleToString(_high, Digits);
StringReplace(tmp, ".", "");
int int_high = StringToInteger(tmp);
tmp = DoubleToString(_low, Digits);
StringReplace(tmp, ".", "");
int int_low = StringToInteger(tmp);
//陽線
if (_open < _close)
{
_entity_pips = int_close - int_open;
_upper_pips = int_high - int_close;
_lower_pips = int_open - int_low;
_barType = DA_BARTYPE_WHITE;
}
//陰線の場合
else if(_open > _close)
{
_entity_pips = int_open - int_close;
_upper_pips = int_high - int_open;
_lower_pips = int_close - int_low;
_barType = DA_BARTYPE_BLACK;
}
//十字線(始値・終値が同じ)
else
{
_entity_pips = 0;
_upper_pips = int_high - int_close;
_lower_pips = int_open - int_low;
_barType = DA_BARTYPE_CROSS;
}
}
修正したのはinit処理でpips設定している所のみです。
要するに浮動小数点の115.123000みたいなのに1000掛けて小数点なし=整数値にしても、その1000掛けるという計算で数値が狂ってしまうんですね。
なので文字列にして1000掛ける部分を終わらせてから整数値でpipsを計算するという形に直している感じです。
この修正をして正しくpips測定されるようになった結果エントリー回数がグンと下がって、今6時間くらい動いてるけど3回しかエントリーしなくなりました。
回数が減って勝率が100%に近づくと良いんですが、当分デモ放置して様子を見たいと思います。
※コンパイル時にアラートが出るようになっちゃいましたが桁数は足りているので無視でOKです。
コメント