2015年4月10日金曜日

矢印の縦位置をチャートの高さを見て調整する。

※2015/11/2追記
// アンカー
   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;
}