原因はDPIの違い
オブジェクトを使ったインジケーター等を作って「よしバッチリ!」と思って第三者に配布したところ、「大きすぎて見にくい」とか「ずれる」と言われたことありませんか?
例えばこんな感じ。
上が大きすぎる例で、下が丁度いい例です。
ディスプレイの解像度(1920×1080とかのアレ)の問題だと思っていたものの、同じ解像度に設定してもオブジェクトの大きさが揃わない(一致しない)のです。
ずっと原因が分からなかったのですが、ついにその原因が分かりました。
その原因はズバリ、DPIです。
DPIとはDot Per Inch(ドット・パー・インチ)の略で、1インチの中にどれだけのドットを表現できるかを表します。
DPIが大きいほどより精細な色彩を画面に映すことが可能です。
ディスプレイの解像度の設定を変えてもDPIの数字は変わりません。
だから同じ解像度に設定しても見た目が一致しないんですね。
「ピクセルとDPIは違うの?」「DPIって結局何なの?」って方はドットとピクセルの違いに詳しく書かれていますので、興味のある方はご一読ください。
でもって、MQL4にはこのDPIを取得できる組込関数が用意されています!(知らなかった!)
それがTerminalInfoInteger(TERMINAL_SCREEN_DPI)関数です。
これを呼び出せばお使いのPCのDPIが分かります。
市場に出回ってるPCの大半は96か120で、高性能だと144ってところでしょうか。
開発しているPCのDPIを調べ、それをもとにオブジェクトサイズを調整してあげれば、DPIが異なるPCでも同じ見た目を実現できます。
こんな感じのコードになります。
// EAやインジケーターを稼働させるPCのDPI int dpi = TerminalInfoInteger(TERMINAL_SCREEN_DPI); // 開発者PCのDPI int dpiDevPC = 120; // 何らかのオブジェクトの横幅 int xSize = 100; // 調整したオブジェクトの横幅 // 割り算で小数点が発生しないようにすること // つまり割り切れるようにxSizeを定義すること // 5の倍数がオススメ int xSizeAdjust = (xSize * dpi) / dpiDevPC; // 以降はxSizeAdjustを使ってオブジェクトを作成していけばよい
コメントに記載していますが、割り算が小数点が出ることなく割り切れるように元のオブジェクトサイズを定義してあげないと、DPIの違いによって微妙にずれちゃいますので、ご注意ください。
5の倍数で定義することをお勧めします。人間にも分かりやすいですしね。