// アンカー
ObjectSetInteger(chartId, objectName, OBJPROP_ANCHOR, objectType == OBJ_ARROW_BUY ? ANCHOR_BOTTOM : ANCHOR_TOP);
って書けば、もっとスマートにできます・・。調査不足でした・・・・。
前回の記事でチャート上に矢印を表示できましたが、
買(↑)矢印は矢印の頭がクローズ時間にくっついていて、売矢印(↓)は矢印のお尻がくっついています。
なんとなくですが、クローズ時間を中心に
↑
↓
といった感じで、両方ともお尻基準になってほしいと思いましたので、オブジェクトをピクセルと価格のスケールから移動するコードを追加しました。
まず、チャートの高さ方向のピクセルと、価格の最大最小値を取得します。
矢印の高さは15pixcelですので、「15 * ( 価格の最大値 - 価格の最小値 ) / 高さ」分の価格だけずらして上げればよい事が分かります。
チャートの情報はChartGetXXXXX系の関数で取得します。ChartGetIntegerの場合は下記の形です。
ChartGetInteger
long ChartGetInteger(
long chart_id, // チャートID
int prop_id, // プロパティ種別
int sub_window=0 // サブウィンドウ番号 0の場合チャート
);
同様に戻り値の型違いで、ChartGetDouble、ChartGetStringが存在しています。
前回の記事からCreateArrawObject以外は変えていませんので、CreateArrawObjectだけ載せます。
FX-ONブログランキングにご協力よろしくお願いいたしますm(_ _ )m
//------------------------------------------------------------------ //売買矢印オブジェクトを生成する。 bool CreateArrawObject( ENUM_OBJECT objectType, //オブジェクトの種類(OBJ_ARROW_BUY/OBJ_ARROW_SELL) datetime time, //表示時間(横軸) double price ) //表示時間(縦軸) { //オブジェクトを作成する。 long chartId = ChartID(); long arrowSize = 15; if( objectType == OBJ_ARROW_BUY ) { long hight = ChartGetInteger(chartId, CHART_HEIGHT_IN_PIXELS); double min = ChartGetDouble(chartId, CHART_PRICE_MIN); double max = ChartGetDouble(chartId, CHART_PRICE_MAX); // 表示位置を矢印の大きさの分だけ上方向にずらす。 price = price + arrowSize * (max - min) / hight; } ObjectDelete(chartId, OBJECT_NAME); if( !ObjectCreate(chartId, OBJECT_NAME, objectType, 0, time, price) ) { return false; } ObjectSetInteger(chartId, OBJECT_NAME, OBJPROP_HIDDEN, true); ObjectSetInteger(chartId, OBJECT_NAME, OBJPROP_COLOR, objectType == OBJ_ARROW_BUY ? C'200,200,255' : C'255,128,128'); ObjectSetInteger(chartId, OBJECT_NAME, OBJPROP_ARROWCODE, objectType == OBJ_ARROW_BUY ? 233 : 234); return true; }