オブジェクト型

OBJ_VLINE

垂直線

ObjVLine

注意事項

垂直線を描画する際は、全てのチャートウィンドウのライン表示モードを設定することが出来ます( OBJPROP_RAY プロパティ)。

次のスクリプトは、チャート上で垂直線を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

//— 説明
#property description “Script draws “Vertical Line” graphical object.”
#property description “Anchor point date is set in percentage of”
#property description “the chart window width in bars.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“VLine”;     // 線の名称
input int             InpDate=25;         // % で表されたイベントの日
input color           InpColor=clrRed;     // 線の色
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // 線のスタイル
input int             InpWidth=3;         // 線の幅
input bool           InpBack=false;       // 背景の線
input bool           InpSelection=true;   // 強調表示して移動
input bool           InpRay=true;         // 線が下に続く
input bool           InpHidden=true;     // オブジェクトリストに隠す
input long           InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| 垂直線を作成する                                                     |
//+——————————————————————+
bool VLineCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“VLine”,     // 線の名称
const int             sub_window=0,     // サブウィンドウ番号
datetime              time=0,           // 線の時間
const color           clr=clrRed,       // 線の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 線のスタイル
const int             width=1,           // 線の幅
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            ray=true,         // 線が下に続く
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 線の時間が設定されていない場合、最後のバーで描画する
if(!time)
time=TimeCurrent();
//— エラー値をリセットする
ResetLastError();
//— 垂直線を作成する
if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0))
{
Print(__FUNCTION__,
“: failed to create a vertical line! Error code = “,GetLastError());
return(false);
}
//— 線の色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線の表示スタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで線を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— チャートサブウィンドウで線を表示するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY,ray);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| 垂直線を移動する                                                    |
//+——————————————————————+
bool VLineMove(const long   chart_ID=0,   // チャート識別子
const string name=“VLine”, // 線の名称
datetime     time=0)       // 線の時間
{
//— 時間が設定されていない場合、最後のバーに移動する
if(!time)
time=TimeCurrent();
//— エラー値をリセットする
ResetLastError();
//— 垂直線を移動する
if(!ObjectMove(chart_ID,name,0,time,0))
{
Print(__FUNCTION__,
“: failed to move the vertical line! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 垂直線を削除する                                                     |
//+——————————————————————+
bool VLineDelete(const long   chart_ID=0,   // チャート識別子
const string name=“VLine”) // 線の名称
{
//— エラー値をリセットする
ResetLastError();
//— 垂直線を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete the vertical line! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate<0 || InpDate>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— イベントアンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
//— メモリ割り当て
ArrayResize(date,bars);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 線を描画するポイントを定義する
int d=InpDate*(bars-1)/100;
//— 垂直線を作成する
if(!VLineCreate(0,InpName,0,date[d],InpColor,InpStyle,InpWidth,InpBack,
InpSelection,InpRay,InpHidden,InpZOrder))
return;
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— 線を移動する
//— ループカウンタ
int h_steps=bars/2;
//— 線を移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d<bars-1)
d+=1;
//— ポイントを移動する
if(!VLineMove(0,InpName,date[d]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.03 秒の遅れ
Sleep(30);
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからチャンネルを削除する
VLineDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_HLINE

水平線

ObjHLine

次のスクリプトは、チャート上で水平線を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Horizontal Line” graphical object.”
#property description “Anchor point price is set in percentage of the height of”
#property description “the chart window.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“HLine”;     // 線の名称
input int             InpPrice=25;         // % で表された線の価格
input color           InpColor=clrRed;     // 線の色
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // 線のスタイル
input int             InpWidth=3;         // 線の幅
input bool           InpBack=false;       // 背景の線
input bool           InpSelection=true;   // 強調表示して移動
input bool           InpHidden=true;     // オブジェクトリストに隠す
input long           InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| 水平線を作成する                                                     |
//+——————————————————————+
bool HLineCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“HLine”,     // 線の名称
const int             sub_window=0,     // サブウィンドウ番号
double                price=0,           // 線の価格
const color           clr=clrRed,       // 線の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 線のスタイル
const int             width=1,           // 線の幅
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 価格が設定されていない場合、現在の売値レベルで設定する
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— 水平線を作成する
if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
{
Print(__FUNCTION__,
“: failed to create a horizontal line! Error code = “,GetLastError());
return(false);
}
//— 線の色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線の表示スタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで線を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| 水平線を移動する                                                     |
//+——————————————————————+
bool HLineMove(const long   chart_ID=0,   // チャート識別子
const string name=“HLine”, // 線の名称
double       price=0)     // 線の価格
{
//— 価格が設定されていない場合、現在の売値レベルへ移す
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— 水平線を移動する
if(!ObjectMove(chart_ID,name,0,0,price))
{
Print(__FUNCTION__,
“: failed to move the horizontal line! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 水平線を削除する                                                     |
//+——————————————————————+
bool HLineDelete(const long   chart_ID=0,   // チャート識別子
const string name=“HLine”) // 線の名称
{
//— エラー値をリセットする
ResetLastError();
//— 水平線を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete a horizontal line! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpPrice<0 || InpPrice>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される
//— 価格の値を格納するための配列
double price[];
//— メモリ割り当て
ArrayResize(price,accuracy);
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 線を描画するポイントを定義する
int p=InpPrice*(accuracy-1)/100;
//— 水平線を作成する
if(!HLineCreate(0,InpName,0,price[p],InpColor,InpStyle,InpWidth,InpBack,
InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— 線を移動する
//— ループカウンタ
int v_steps=accuracy/2;
//— 線を移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p<accuracy-1)
p+=1;
//— ポイントを移動する
if(!HLineMove(0,InpName,price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートから削除する
HLineDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_TREND

傾向線

ObjTrend

注意事項

傾向線では表示継続のモードを右及び/または左に指定することが出来ます(OBJPROP_RAY_RIGHT 及び OBJPROP_RAY_LEFT プロパティ)。

次のスクリプトは、チャート上で傾向線を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Trend Line” graphical object.”
#property description “Anchor point coordinates are set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“Trend”;     // 線の名称
input int             InpDate1=35;         // 1 番目のポイントの日付( % )
input int             InpPrice1=60;       // 1 番目のポイントの価格( % )
input int             InpDate2=65;         // 2 番目のポイントの日付( % )
input int             InpPrice2=40;       // 2 番目のポイントの価格( % )
input color           InpColor=clrRed;     // 線の色
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // 線のスタイル
input int             InpWidth=2;         // 線の幅
input bool           InpBack=false;       // 背景の線
input bool           InpSelection=true;   // 強調表示して移動
input bool           InpRayLeft=false;   // 線の左への継続
input bool           InpRayRight=false;   // 線の右への継続
input bool           InpHidden=true;     // オブジェクトリストに隠す
input long           InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標で傾向線を作成する                                         |
//+——————————————————————+
bool TrendCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“TrendLine”, // 線の名称
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,         // 2 番目のポイントの価格
const color           clr=clrRed,       // 線の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 線のスタイル
const int             width=1,           // 線の幅
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            ray_left=false,   // 線の左への継続
const bool            ray_right=false,   // 線の右への継続
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeTrendEmptyPoints(time1,price1,time2,price2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標で傾向線を作成する
if(!ObjectCreate(chart_ID,name,OBJ_TREND,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
“: failed to create a trend line! Error code = “,GetLastError());
return(false);
}
//— 線の色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線の表示スタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで線を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— 線の表示を左に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//— 線の表示を右に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| 傾向線のアンカーポイントを移動する                                         |
//+——————————————————————+
bool TrendPointChange(const long   chart_ID=0,       // チャート識別子
const string name=“TrendLine”, // 線の名称
const int    point_index=0,   // アンカーポイントのインデックス
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— 傾向線のアンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| この関数はチャートから傾向線を削除する                                      |
//+——————————————————————+
bool TrendDelete(const long   chart_ID=0,       // チャート識別子
const string name=“TrendLine”) // 線の名称
{
//— エラー値をリセットする
ResetLastError();
//— 傾向線を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete a trend line! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 傾向線のアンカーポイントの値をチェックして                                     |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeTrendEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//— 1 番目のポイントの時間が設定されていない場合、現在足になる
if(!time1)
time1=TimeCurrent();
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 2 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time2)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//— 2 番目のポイントを最初のものから 9 バー左に設定する
time2=temp[0];
}
//— 2 番目のポイントの価格は設定されていない場合は 1 番目のポイントと等しい
if(!price2)
price2=price1;
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 線を描画するポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//— 傾向線を作成する
if(!TrendCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,InpStyle,
InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— 線のアンカーポイントを移動する
//— ループカウンタ
int v_steps=accuracy/5;
//— 1 番目のアンカーポイントを垂直方向に移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1>1)
p1-=1;
//— ポイントを移動する
if(!TrendPointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 2 番目のアンカーポイントを垂直方向に移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p2<accuracy-1)
p2+=1;
//— ポイントを移動する
if(!TrendPointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 半秒の遅れ
Sleep(500);
//— ループカウンタ
int h_steps=bars/2;
//— 両方のアンカーポイントを同時に水平方向に移動させる
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d1<bars-1)
d1+=1;
if(d2>1)
d2-=1;
//— ポイントをシフトする
if(!TrendPointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!TrendPointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.03 秒の遅れ
Sleep(30);
}
//— 1 秒の遅れ
Sleep(1000);
//— 傾向線を削除する
TrendDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_TRENDBYANGLE

角度による傾向線

ObjTrendByAngle

注意事項

角度による傾向線では表示継続のモードを右及び/または左に指定することが出来ます(OBJPROP_RAY_RIGHT 及び OBJPROP_RAY_LEFT プロパティ)。

角度及び 2 番目のアンカー点の座標の両方が、線の傾きを設定するために使用出来ます。

次のスクリプトは、チャート上で傾向線を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Trend Line By Angle” graphical object.”
#property description “Anchor point coordinates are set in percentage of the size of”
#property description “the chart window.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“Trend”;     // 線の名称
input int             InpDate1=50;         // 1 番目のポイントの日付( % )
input int             InpPrice1=75;       // 1 番目のポイントの価格( % )
input int             InpAngle=0;         // 線の傾斜
input color           InpColor=clrRed;     // 線の色
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // 線のスタイル
input int             InpWidth=2;         // 線の幅
input bool           InpBack=false;       // 背景の線
input bool           InpSelection=true;   // 強調表示して移動
input bool           InpRayLeft=false;   // 線の左への継続
input bool           InpRayRight=true;   // 線の右への継続
input bool           InpHidden=true;     // オブジェクトリストに隠す
input long           InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| 角度での傾向線を作成する                                              |
//+——————————————————————+
bool TrendByAngleCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“TrendLine”, // 線の名称
const int             sub_window=0,     // サブウィンドウ番号
datetime              time=0,           // ポイントの時間
double                price=0,           // ポイントの価格
const double          angle=45.0,       // 傾斜
const color           clr=clrRed,       // 線の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 線のスタイル
const int             width=1,           // 線の幅
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            ray_left=false,   // 線の左への継続
const bool            ray_right=true,   // 線の右への継続
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— マウスの傾向線のドラッグを容易にするために、2 番目の点を作成する
datetime time2=0;
double   price2=0;
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeTrendEmptyPoints(time,price,time2,price2);
//— エラー値をリセットする
ResetLastError();
//— 2 点を使用して傾向線を作成する
if(!ObjectCreate(chart_ID,name,OBJ_TRENDBYANGLE,sub_window,time,price,time2,price2))
{
Print(__FUNCTION__,
“: failed to create a trend line! Error code = “,GetLastError());
return(false);
}
//— 傾向線の傾斜角度を変更する。
//— 角度の変更時に、2 番目のポイントの座標は、角度の新しい値に応じて自動的に再定義される
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//— 線の色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで線を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— 線の表示を左に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//— 線の表示を右に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| 傾向線のアンカーポイントを変更する                                         |
//+——————————————————————+
bool TrendPointChange(const long   chart_ID=0,       // チャート識別子
const string name=“TrendLine”, // 線の名称
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— 傾向線のアンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 傾向線の傾斜角度を変更する                                             |
//+——————————————————————+
bool TrendAngleChange(const long   chart_ID=0,       // チャート識別子
const string name=“TrendLine”, // 傾向線の名称
const double angle=45)         // 傾向線の傾斜角度
{
//— エラー値をリセットする
ResetLastError();
//— 傾向線の傾斜角度を変更する
if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle))
{
Print(__FUNCTION__,
“: failed to change the line’s slope angle! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 傾向線を削除する                                                     |
//+——————————————————————+
bool TrendDelete(const long   chart_ID=0,       // チャート識別子
const string name=“TrendLine”) // 線の名称
{
//— エラー値をリセットする
ResetLastError();
//— 傾向線を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete a trend line! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 傾向線のアンカーポイントの値をチェックして                                     |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeTrendEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//— 1 番目のポイントの時間が設定されていない場合、現在足になる
if(!time1)
time1=TimeCurrent();
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 2 番目のポイント(補助点)の座標を設定する
//— 2 番目のポイントは最初のものから 9 バー左で同じ価格を持つ
datetime second_point_time[10];
CopyTime(Symbol(),Period(),time1,10,second_point_time);
time2=second_point_time[0];
price2=price1;
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(&qquot;Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 線を描画するポイントを定義する
int d1=InpDate1*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//— 傾向線を作成する
if(!TrendByAngleCreate(0,InpName,0,date[d1],price[p1],InpAngle,InpColor,InpStyle,
InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— 線を移動して回転させる
//— ループカウンタ
int v_steps=accuracy/2;
//— アンカーポイントを移動してラインの傾斜角度を変更する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1>1)
p1-=1;
//— ポイントを移動する
if(!TrendPointChange(0,InpName,date[d1],price[p1]))
return;
if(!TrendAngleChange(0,InpName,18*(i+1)))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートから削除する
TrendDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_CYCLES

サイクルライン

ObjCycles

注意事項

線の間の距離は、オブジェクトの 2 つのアンカー点の時間座標で設定されています。

次のスクリプトは、チャート上でサイクルラインを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script creates cycle lines on the chart.”
#property description “Anchor point coordinates are set in percentage”
#property description “percentage of the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“Cycles”;   // オブジェクト名
input int             InpDate1=10;       // 1 番目のポイントの日付( % )
input int             InpPrice1=45;       // 1 番目のポイントの価格( % )
input int             InpDate2=20;       // 2 番目のポイントの日付( % )
input int             InpPrice2=55;       // 2 番目のポイントの価格( % )
input color           InpColor=clrRed;   // サイクルラインの色
input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // サイクルラインのスタイル
input int             InpWidth=1;         // サイクルラインの幅
input bool           InpBack=false;     // 背景オブジェクト
input bool           InpSelection=true; // 強調表示して移動
input bool           InpHidden=true;     // オブジェクトリストに隠す
input long           InpZOrder=0;       // マウスクリックの優先順位
//+——————————————————————+
//| サイクルラインを作成する                                                 |
//+——————————————————————+
bool CyclesCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“Cycles”,     // オブジェクト名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,         // 2 番目のポイントの価格
const color           clr=clrRed,       // サイクルラインの色
const ENUM_LINE_STYLE style=STYLE_SOLID, // サイクルラインのスタイル
const int             width=1,           // サイクルラインの幅
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeCyclesEmptyPoints(time1,price1,time2,price2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でサイクルラインを作成する
if(!ObjectCreate(chart_ID,name,OBJ_CYCLES,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
“: failed to create cycle lines! Error code = “,GetLastError());
return(false);
}
//— 線の色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線の表示スタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで線を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool CyclesPointChange(const long   chart_ID=0,   // チャート識別子
const string name=“Cycles”, // オブジェクト名
const int    point_index=0, // アンカーポイントのインデックス
datetime     time=0,       // アンカーポイントの時間座標
double       price=0)       // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| サイクルラインを削除する                                                 |
//+——————————————————————+
bool CyclesDelete(const long   chart_ID=0,   // チャート識別子
const string name=“Cycles”) // オブジェクト名
{
//— エラー値をリセットする
ResetLastError();
//— サイクルラインを削除する  
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete cycle lines! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| サイクルラインのアンカーポイントの値をチェックして                                 |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeCyclesEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//— 1 番目のポイントの時間が設定されていない場合、現在足になる
if(!time1)
time1=TimeCurrent();
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 2 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time2)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//— 2 番目のポイントを最初のものから 9 バー左に設定する
time2=temp[0];
}
//— 2 番目のポイントの価格は設定されていない場合は 1 番目のポイントと等しい
if(!price2)
price2=price1;
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— サイクルライン描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//— 傾向線を作成する
if(!CyclesCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動する
//— ループカウンタ
int h_steps=bars/5;
//— 2 番目のアンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d2<bars-1)
d2+=1;
//— ポイントを移動する
if(!CyclesPointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
h_steps=bars/4;
//— 1 番目のアンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d1<bars-1)
d1+=1;
//— ポイントを移動する
if(!CyclesPointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからオブジェクトを削除する
CyclesDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ARROWED_LINE

矢印

ObjArrowedLine

次のスクリプトは、チャート上で矢印を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Arrowed line” graphical object.”
#property description “Anchor point coordinates are set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“ArrowedLine”; // 線の名称
input int             InpDate1=35;           // 1 番目のポイントの日付( % )
input int             InpPrice1=60;         // 1 番目のポイントの価格( % )
input int             InpDate2=65;           // 2 番目のポイントの日付( % )
input int             InpPrice2=40;         // 2 番目のポイントの価格( % )
input color           InpColor=clrRed;       // 線の色
input ENUM_LINE_STYLE InpStyle=STYLE_DASH;   // 線のスタイル
input int             InpWidth=2;           // 線の幅
input bool           InpBack=false;         // 背景の線
input bool           InpSelection=true;     // 強調表示して移動
input bool           InpHidden=true;       // オブジェクトリストに隠す
input long           InpZOrder=0;           // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標で矢印を作成する                                           |
//+——————————————————————+
bool ArrowedLineCreate(const long            chart_ID=0,         // チャート識別子
const string          name=“ArrowedLine”, // 線の名称
const int             sub_window=0,       // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,           // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,           // 2 番目のポイントの値
const color           clr=clrRed,         // 線の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 線のスタイル
const int             width=1,           // 線の幅
const bool            back=false,         // 背景で表示する
const bool            selection=true,     // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeArrowedLineEmptyPoints(time1,price1,time2,price2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標で矢印を作成する
if(!ObjectCreate(chart_ID,name,OBJ_ARROWED_LINE,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
“: failed to create an arrowed line! Error code = “,GetLastError());
return(false);
}
//— 線の色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線の表示スタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで線を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| 矢印のアンカーポイントを移動する                                          |
//+——————————————————————+
bool ArrowedLinePointChange(const long   chart_ID=0,         // チャート識別子
const string name=“ArrowedLine”, // 線の名称
const int    point_index=0,     // アンカーポイントのインデックス
datetime     time=0,             // アンカーポイントの時間座標
double       price=0)           // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— 線のアンカーポイントを移動する   
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| この関数はチャートから矢印を削除する                                       |
//+——————————————————————+
bool ArrowedLineDelete(const long   chart_ID=0,         // チャート識別子
nbsp;               const string name=“ArrowedLine”) // 線の名称
{
//— エラー値をリセットする
ResetLastError();
//— 矢印を削除する  
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to create an arrowed line! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeArrowedLineEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//— 1 番目のポイントの時間が設定されていない場合、現在足になる
if(!time1)
time1=TimeCurrent();
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 2 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time2)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//— 2 番目のポイントを最初のものから 9 バー左に設定する
time2=temp[0];
}
//— 2 番目のポイントの価格は設定されていない場合は 1 番目のポイントと等しい
if(!price2)
price2=price1;
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 線を描画するポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//— 矢印を作成する
if(!ArrowedLineCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— 線のアンカーポイントを移動する
//— ループカウンタ
int v_steps=accuracy/5;
//— 2 番目のアンカーポイントを垂直方向に移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p2<accuracy-1)
p2+=1;
//— ポイントを移動する
if(!ArrowedLinePointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 番目のアンカーポイントを垂直方向に移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1>1)
p1-=1;
//— ポイントを移動する
if(!ArrowedLinePointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 半秒の遅れ
Sleep(500);
//— ループカウンタ
int h_steps=bars/2;
//— 両方のアンカーポイントを同時に水平方向に移動させる
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d1<bars-1)
d1+=1;
if(d2>1)
d2-=1;
//— ポイントをシフトする
if(!ArrowedLinePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!ArrowedLinePointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.03 秒の遅れ
Sleep(30);
}
//— 1 秒の遅れ
Sleep(1000);
//— 矢印を削除する  
ArrowedLineDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_CHANNEL

等距離チャンネル

ObjChannel

注意事項

等距離チャンネルでは、継続のモードを右及び/または左に指定することが出来ます(OBJPROP_RAY_RIGHT 及び OBJPROP_RAY_LEFT プロパティ)。チャンネルを色で塗りつぶすモードも設定することが出来ます。

次のスクリプトは、チャート上で等距離チャンネルを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Equidistant Channel” graphical object.”
#property description “Anchor point coordinates are set in percentage of the size of”
#property description “the chart window.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“Channel”;   // チャンネル名
input int             InpDate1=25;         // 1 番目のポイントの日付( % )
input int             InpPrice1=60;       // 1 番目のポイントの価格( % )
input int             InpDate2=65;         // 2 番目のポイントの日付( % )
input int             InpPrice2=80;       // 2 番目のポイントの価格( % )
input int             InpDate3=30;         // 3 番目のポイントの日付( % )
input int             InpPrice3=40;       // 3 番目のポイントの価格( % )
input color           InpColor=clrRed;     // チャンネルの色
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // チャンネル線のスタイル
input int             InpWidth=2;         // チャンネル線の幅
input bool           InpBack=false;       // 背景チャンネル
input bool           InpFill=false;       // チャンネルを色で塗りつぶす
input bool           InpSelection=true;   // 強調表示して移動
input bool           InpRayLeft=false;   // チャンネルの左への継続
input bool           InpRayRight=false;   // チャンネルの右への継続
input bool           InpHidden=true;     // オブジェクトリストに隠す
input long           InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標で等距離チャンネルを作成する                                  |
//+——————————————————————+
bool ChannelCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“Channel”,   // チャンネル名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,         // 2 番目のポイントの価格
datetime              time3=0,           // 3 番目のポイントの時間
double                price3=0,         // 3 番目のポイントの価格
const color           clr=clrRed,       // チャンネルの色
const ENUM_LINE_STYLE style=STYLE_SOLID, // チャンネルの線のスタイル
const int             width=1,           // チャンネルの線の幅
const bool            fill=false,       // チャンネルを色で塗りつぶす
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            ray_left=false,   // チャンネルの左への継続
const bool            ray_right=false,   // チャンネルの右への継続
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeChannelEmptyPoints(time1,price1,time2,price2,time3,price3);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でチャンネルを作成する 
if(!ObjectCreate(chart_ID,name,OBJ_CHANNEL,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
“: failed to create an equidistant channel! Error code = “,GetLastError());
return(false);
}
//— チャンネルの色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— チャンネルの線のスタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— チャンネルの線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— チャンネルを色で塗りつぶすモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してチャンネルを移動するモードを有効(true)か無効(false)にする。
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— チャンネルの表示を左に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//— チャンネルの表示を右に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャンネルのアンカーポイントを移動する                                       |
//+——————————————————————+
bool ChannelPointChange(const long   chart_ID=0,     // チャート識別子
const string name=“Channel”, // チャンネル名
const int    point_index=0, // アンカーポイントのインデックス
datetime     time=0,         // アンカーポイントの時間座標
double       price=0)       // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャンネルを削除する                                                   |
//+——————————————————————+
bool ChannelDelete(const long   chart_ID=0,     // チャート識別子
const string name=“Channel”) // チャンネル名
{
//— エラー値をリセットする
ResetLastError();
//— チャンネルを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete the channel! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+————————————————————————-+
//| チャンネルのアンカーポイントの値をチェックして                                          |
//| 空の物には初期値を設定する                                                    |
//+————————————————————————-+
void ChangeChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//— 2 番目(右)のポイントの時間が設定されていない場合、現在足になる
if(!time2)
time2=TimeCurrent();
//— 2 番目のポイントの価格が設定されていない場合、売値になる
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 1 番目(左)のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time1)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//— 1 番目のポイントを 2 番目から 9 バー左に設定する
time1=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、2 番目より 300 ポイント高くする
if(!price1)
price1=price2+300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//— 3 番目のポイントの時間が設定されていない場合、最初のポイントに等しい
if(!time3)
time3=time1;
//— 3 番目のポイントの価格が設定されていない場合、2 番目のポイントに等しい
if(!price3)
price3=price2;
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— チャンネル描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//— 等距離チャンネルを作成する
if(!ChannelCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],InpColor,
InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— チャンネルのアンカーポイントを移動する
//— ループカウンタ
int h_steps=bars/6;
//— 2 番目のアンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d2<bars-1)
d2+=1;
//— ポイントを移動する
if(!ChannelPointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— 1 番目のアンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d1>1)
d1-=1;
//— ポイントを移動する
if(!ChannelPointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
int v_steps=accuracy/10;
//— 3 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p3>1)
p3-=1;
//— ポイントを移動する
if(!ChannelPointChange(0,InpName,2,date[d3],price[p3]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからチャンネルを削除する
ChannelDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_STDDEVCHANNEL

標準偏差チャンネル

ObjStdDevChannel

注意事項

標準偏差チャンネルでは、継続のモードを右及び/または左に指定することが出来ます( OBJPROP_RAY_RIGHT 及び OBJPROP_RAY_LEFT プロパティ)。チャンネルを色で塗りつぶすモードも設定することが出来ます。

OBJPROP_DEVIATION プロパティがチャンネル偏差の値を変更するために使用されます。

次のスクリプトは、チャート上で標準偏差チャンネルを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Standard Deviation Channel” graphical object.”
#property description “Anchor point coordinates are set in percentage of the size of”
#property description “the chart window.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“StdDevChannel”;   // チャンネル名
input int             InpDate1=10;               // 1 番目のポイントの日付( % )
input int             InpDate2=40;               // 2 番目のポイントの日付( % )
input double         InpDeviation=1.0;         // 偏差値
input color           InpColor=clrRed;           // チャンネルの色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // チャンネルの線のスタイル
input int             InpWidth=2;               // チャンネルの線の幅
input bool           InpFill=false;             // チャンネルを色で塗りつぶす
input bool           InpBack=false;             // 背景チャンネル
input bool           InpSelection=true;         // 強調表示して移動
input bool           InpRayLeft=false;         // チャンネルの左への継続
input bool           InpRayRight=false;         // チャンネルの右への継続
input bool           InpHidden=true;           // オブジェクトリストに隠す
input long           InpZOrder=0;               // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標で標準偏差チャンネルを作成する                                |
//+——————————————————————+
bool StdDevChannelCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“Channel”,   // チャンネル名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
datetime              time2=0,           // 2 番目のポイントの時間
const double          deviation=1.0,     // 偏差値
const color           clr=clrRed,       // チャンネルの色
const ENUM_LINE_STYLE style=STYLE_SOLID, // チャンネルの線のスタイル
const int             width=1,           // チャンネルの線の幅
const bool            fill=false,       // チャンネルを色で塗りつぶす
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            ray_left=false,   // チャンネルの左への継続
const bool            ray_right=false,   // チャンネルの右への継続
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeChannelEmptyPoints(time1,time2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でチャンネルを作成する 
if(!ObjectCreate(chart_ID,name,OBJ_STDDEVCHANNEL,sub_window,time1,0,time2,0))
{
Print(__FUNCTION__,
“: failed to create standard deviation channel! Error code = “,GetLastError());
return(false);
}
//— チャンネル幅に影響を与える偏差値を設定する
ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation);
//— チャンネルの色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— チャンネルの線のスタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— チャンネルの線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— チャンネルを色で塗りつぶすモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してチャンネルを移動するモードを有効(true)か無効(false)にする。
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— チャンネルの表示を左に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//— チャンネルの表示を右に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャンネルのアンカーポイントを移動する                                       |
//+——————————————————————+
bool StdDevChannelPointChange(const long   chart_ID=0,     // チャート識別子
const string name=“Channel”, // チャンネル名
const int    point_index=0, // アンカーポイントのインデックス
datetime     time=0)         // アンカーポイントの時間座標
{
//— ポイントの時間が設定されていない場合、ポイントを現在足に移動する
if(!time)
time=TimeCurrent();
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,0))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャンネルの偏差を変更する                                              |
//+——————————————————————+
bool StdDevChannelDeviationChange(const long   chart_ID=0,     // チャート識別子
const string name=“Channel”, // チャンネル名
const double deviation=1.0) // 偏差値
{
//— エラー値をリセットする
ResetLastError();
//— 傾向線の傾斜角度を変更する
if(!ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation))
{
Print(__FUNCTION__,
“: failed to change channel deviation! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャンネルを削除する                                                   |
//+——————————————————————+
bool StdDevChannelDelete(const long   chart_ID=0,     // チャート識別子
const string name=“Channel”) // チャンネル名
{
//— エラー値をリセットする
ResetLastError();
//— チャンネルを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete the channel! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+————————————————————————-+
//| チャンネルのアンカーポイントの値をチェックして                                          |
//| 空の物には初期値を設定する                                                    |
//+————————————————————————-+
void ChangeChannelEmptyPoints(datetime &time1,datetime &time2)
{
//— 2 番目のポイントの時間が設定されていない場合、現在足になる
if(!time2)
time2=TimeCurrent();
//— 1 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time1)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//— 1 番目のポイントを 2 番目から 9 バー左に設定する
time1=temp[0];
}
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 ||
InpDate2<0 || InpDate2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— チャンネル描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
//— 標準偏差チャンネルを作成する
if(!StdDevChannelCreate(0,InpName,0,date[d1],date[d2],InpDeviation,InpColor,InpStyle,
InpWidth,InpFill,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— チャンネルを右に水平に移動して伸ばす
//— ループカウンタ
int h_steps=bars/2;
//— チャンネルを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d1<bars-1)
d1+=1;
if(d2<bars-1)
d2+=1;
//— アンカーポイントを移動する
if(!StdDevChannelPointChange(0,InpName,0,date[d1]))
return;
if(!StdDevChannelPointChange(0,InpName,1,date[d2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
double v_steps=InpDeviation*2;
//— チャンネルを拡張する
for(double i=InpDeviation;i<v_steps;i+=10.0/accuracy)
{
if(!StdDevChannelDeviationChange(0,InpName,i))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからチャンネルを削除する
StdDevChannelDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_REGRESSION

線形回帰チャンネル

ObjRegression

注意事項

線形回帰チャンネルでは、継続のモードを右及び/または左に指定することが出来ます( OBJPROP_RAY_RIGHT 及び OBJPROP_RAY_LEFT プロパティ)。チャンネルを色で塗りつぶすモードも設定することが出来ます。

次のスクリプトは、チャート上で線形回帰チャンネルを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Linear Regression Channel” graphical object.”
#property description “Anchor point coordinates are set in percentage of the size of”
#property description “the chart window.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“Regression”; // チャンネル名
input int             InpDate1=10;         // 1 番目のポイントの日付( % )
input int             InpDate2=40;         // 2 番目のポイントの日付( % )
input color           InpColor=clrRed;     // チャンネルの色
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // チャンネルの線のスタイル
input int             InpWidth=2;           // チャンネルの線の幅
input bool           InpFill=false;       // チャンネルを色で塗りつぶす
input bool           InpBack=false;       // 背景チャンネル
input bool           InpSelection=true;   // 強調表示して移動
input bool           InpRayLeft=false;     // チャンネルの左への継続
input bool           InpRayRight=false;   // チャンネルの右への継続
input bool           InpHidden=true;       // オブジェクトリストに隠す
input long           InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標で直線回帰チャンネルを作成する                                 |
//+——————————————————————+
bool RegressionCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“Regression”, // チャンネル名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
datetime              time2=0,           // 2 番目のポイントの時間
const color           clr=clrRed,       // チャンネルの色
const ENUM_LINE_STYLE style=STYLE_SOLID, // チャンネルの線のスタイル
const int             width=1,           // チャンネルの線の幅
const bool            fill=false,       // チャンネルを色で塗りつぶす
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            ray_left=false,   // チャンネルの左への継続
const bool            ray_right=false,   // チャンネルの右への継続
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeRegressionEmptyPoints(time1,time2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でチャンネルを作成する 
if(!ObjectCreate(chart_ID,name,OBJ_REGRESSION,sub_window,time1,0,time2,0))
{
Print(__FUNCTION__,
“: failed to create linear regression channel! Error code = “,GetLastError());
return(false);
}
//— チャンネルの色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— チャンネルの線のスタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— チャンネルの線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— チャンネルを色で塗りつぶすモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してチャンネルを移動するモードを有効(true)か無効(false)にする。
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— チャンネルの表示を左に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//— チャンネルの表示を右に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャンネルのアンカーポイントを移動する                                       |
//+——————————————————————+
bool RegressionPointChange(const long   chart_ID=0,     // チャート識別子
const string name=“Channel”, // チャンネル
const int    point_index=0, // アンカーポイントのインデックス
datetime     time=0)         // アンカーポイントの時間座標
{
//— ポイントの時間が設定されていない場合、ポイントを現在足に移動する
if(!time)
time=TimeCurrent();
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,0))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャンネルを削除する                                                   |
//+——————————————————————+
bool RegressionDelete(const long   chart_ID=0,     // チャート識別子
const string name=“Channel”) // チャンネル名
{
//— エラー値をリセットする
ResetLastError();
//— チャンネルを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete the channel! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+————————————————————————-+
//| チャンネルのアンカーポイントの値をチェックして                                          |
//| 空の物には初期値を設定する                                                    |
//+————————————————————————-+
void ChangeRegressionEmptyPoints(datetime &time1,datetime &time2)
{
//— 2 番目のポイントの時間が設定されていない場合、現在足になる
if(!time2)
time2=TimeCurrent();
//— 1 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time1)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//— 1 番目のポイントを 2 番目から 9 バー左に設定する
time1=temp[0];
}
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 ||
InpDate2<0 || InpDate2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— チャンネル描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
//— 直線回帰チャンネルを作成する
if(!RegressionCreate(0,InpName,0,date[d1],date[d2],InpColor,InpStyle,InpWidth,
InpFill,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— チャンネルを右に水平に移動する
//— ループカウンタ
int h_steps=bars/2;
//— チャンネルを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d1<bars-1)
d1+=1;
if(d2<bars-1)
d2+=1;
//— アンカーポイントを移動する
if(!RegressionPointChange(0,InpName,0,date[d1]))
return;
if(!RegressionPointChange(0,InpName,1,date[d2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからチャンネルを削除する
RegressionDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_PITCHFORK

アンドリューズピッチフォーク

ObjPitchfork

注意事項

アンドリューズピッチフォークでは、継続のモードを右及び/または左に指定することが出来ます(OBJPROP_RAY_RIGHT 及び OBJPROP_RAY_LEFT プロパティ)。

ラインレベル、その値と色も指定することが出来ます。

次のスクリプトは、チャート上でアンドリューズピッチフォークを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

//— 説明
#property description “Script draws “Andrews’ Pitchfork” graphical object.”
#property description “Anchor point coordinates are set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“Pitchfork”; // ピッチフォーク名
input int             InpDate1=14;         // 1 番目のポイントの日付( % )
input int             InpPrice1=40;         // 1 番目のポイントの価格( % )
input int             InpDate2=18;         // 2 番目のポイントの日付( % )
input int             InpPrice2=50;         // 2 番目のポイントの価格( % )
input int             InpDate3=18;         // 3 番目のポイントの日付( % )
input int             InpPrice3=30;         // 3 番目のポイントの価格( % )
input color           InpColor=clrRed;     // ピッチフォークの色
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // ピッチフォークの線のスタイル
input int             InpWidth=1;           // ピッチフォークの線の幅
input bool           InpBack=false;       // 背景のピッチフォーク
input bool           InpSelection=true;   // 強調表示して移動
input bool           InpRayLeft=false;     // ピッチフォークの左への継続
input bool           InpRayRight=false;   // ピッチフォークの右への継続
input bool           InpHidden=true;       // オブジェクトリストに隠す
input long           InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標でアンドリューズピッチフォークを作成する                             |
//+——————————————————————+
bool PitchforkCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“Pitchfork”, // ピッチフォーク名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,         // 2 番目のポイントの価格
datetime              time3=0,           // 3 番目のポイントの時間
double                price3=0,         // 3 番目のポイントの価格
const color           clr=clrRed,       // ピッチフォークの線の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // ピッチフォークの線のスタイル
const int             width=1,           // ピッチフォークの線の幅
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            ray_left=false,   // ピッチフォークの左への継続
const bool            ray_right=false,   // ピッチフォークの右への継続
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeChannelEmptyPoints(time1,price1,time2,price2,time3,price3);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でアンドリューズピッチフォークを作成する
if(!ObjectCreate(chart_ID,name,OBJ_PITCHFORK,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
“: failed to create “Andrews’ Pitchfork“! Error code = “,GetLastError());
return(false);
}
//— 色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線のスタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してピッチフォークを移動するモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— ピッチフォークの表示を左に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//— ピッチフォークの表示を右に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンドリューズピッチフォークのレベルとパラメータを設定する                            |
//+——————————————————————+
bool PitchforkLevelsSet(int             levels,           // レベル線の数
double          &values[],       // レベル線の値
color           &colors[],       // レベル線の色
ENUM_LINE_STYLE &styles[],       // レベル線のスタイル
int             &widths[],       // レベル線の幅
const long      chart_ID=0,       // チャート識別子
const string    name=“Pitchfork”) // ピッチフォークの名称
{
//— 配列のサイズをチェックする
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,“: array length does not correspond to the number of levels, error!”);
return(false);
}
//— レベル数を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//— ループ内でレベルプロパティを設定する
for(int i=0;i<levels;i++)
{
//— レベル値
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//— レベルの色
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//— レベルのスタイル
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//— レベルの幅
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//— レベルの説明
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ピッチフォークのアンカーポイントを移動する                                     |
//+——————————————————————+
bool PitchforkPointChange(const long   chart_ID=0,       // チャート識別子
const string name=“Pitchfork”, // チャンネル名
const int    point_index=0,   // アンカーポイントのインデックス
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンドリューズピッチフォークを削除する                                        |
//+——————————————————————+
bool PitchforkDelete(const long   chart_ID=0,       // チャート識別子
const string name=“Pitchfork”) // チャンネル名
{
//— エラー値をリセットする
ResetLastError();
//— チャンネルを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Andrews’ Pitchfork“! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+———————————————————————-+
//| アンドリューズピッチフォークのアンカーポイントの値をチェックして                             |
//| 空の物には初期値を設定する                                                 |
//+———————————————————————-+
void ChangeChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//— 2 番目(右上)のポイントの時間が設定されていない場合、現在足になる
if(!time2)
time2=TimeCurrent();
//— 2 番目のポイントの価格が設定されていない場合、売値になる
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 1 番目(左)のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time1)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//— 1 番目のポイントを 2 番目から 9 バー左に設定する
time1=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、2 番目より 200 ポイント低くする
if(!price1)
price1=price2-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//— 3 番目のポイントの時間が設定されていない場合、2 番目のポイントに等しい
if(!time3)
time3=time2;
//— 3 番目のポイントの価格が設定されていない場合、1 番目より 200 ポイント低くする
if(!price3)
price3=price1-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— アンドリューズピッチフォーク描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//— ピッチフォークを作成する
if(!PitchforkCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— ピッチフォークのアンカーポイントを移動する 
//— ループカウンタ
int v_steps=accuracy/10;
//— 1 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1>1)
p1-=1;
//— ポイントを移動する
if(!PitchforkPointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
int h_steps=bars/8;
//— 3 番目のアンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d3<bars-1)
d3+=1;
//— ポイントを移動する
if(!PitchforkPointChange(0,InpName,2,date[d3],price[p3]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
v_steps=accuracy/10;
//— 2 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p2>1)
p2-=1;
//— ポイントを移動する
if(!PitchforkPointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからピッチフォークを削除する
PitchforkDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_GANNLINE

ギャンライン

ObjGannLine

注意事項

ギャンラインでは継続のモードを右及び/または左に指定することが出来ます(OBJPROP_RAY_RIGHT 及び OBJPROP_RAY_LEFT プロパティ)。

スケールを持ったギャン角度及び第2アンカー点の座標の両方が、線の傾きを設定するために使用出来ます。

次のスクリプトは、チャート上でギャンラインを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Gann Line” graphical object.”
#property description “Anchor point coordinates are set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“GannLine”;       // 線の名称
input int             InpDate1=20;               // 1 番目のポイントの日付( % )
input int             InpPrice1=75;             // 1 番目のポイントの価格( % )
input int             InpDate2=80;               // 2 番目のポイントの日付( % )
input double         InpAngle=0.0;             // ギャン角度
input double         InpScale=1.0;             // 規模
input color           InpColor=clrRed;           // 線の色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // 線のスタイル
input int             InpWidth=2;               // 線の幅
input bool           InpBack=false;             // 背景の線
input bool           InpSelection=true;         // 強調表示して移動
input bool           InpRayLeft=false;         // 線の左への継続
input bool           InpRayRight=true;         // 線の右への継続
input bool           InpHidden=true;           // オブジェクトリストに隠す
input long           InpZOrder=0;               // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標、角度とスケールでギャンラインを作成する                           |
//+——————————————————————+
bool GannLineCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“GannLine”,   // 線の名称
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
const double          angle=1.0,         // ギャン角度
const double          scale=1.0,         // 規模
const color           clr=clrRed,       // 線の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 線のスタイル
const int             width=1,           // 線の幅
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            ray_left=false,   // 線の左への継続
const bool            ray_right=true,   // 線の右への継続
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeGannLineEmptyPoints(time1,price1,time2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でギャンラインを作成する
//— 第2アンカー点の正しい座標は
//— ギャン角度及び/または規模の変更後に自動的に再定義される
if(!ObjectCreate(chart_ID,name,OBJ_GANNLINE,sub_window,time1,price1,time2,0))
{
Print(__FUNCTION__,
“: failed to create “Gann Line“! Error code = “,GetLastError());
return(false);
}
//— ギャン角度を変更する
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//— スケール(バーあたりのピップ数)を変更する
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//— 線の色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線の表示スタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示して線を移動するモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— 線の表示を左に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//— 線の表示を右に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| ギャンラインのアンカーポイントを移動する                                      |
//+——————————————————————+
bool GannLinePointChange(const long   chart_ID=0,     // チャート識別子
const string name=“GannLine”, // 線の名称
const int    point_index=0,   // アンカーポイントのインデックス
datetime     time=0,         // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— 線のアンカーポイントを移動する   
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ギャン角度を変更する                                                  |
//+——————————————————————+
bool GannLineAngleChange(const long   chart_ID=0,     // チャート識別子
const string name=“GannLine”, // 線の名称
const double angle=1.0)       // ギャン角度
{
//— エラー値をリセットする
ResetLastError();
//— ギャン角度を変更する
if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle))
{
Print(__FUNCTION__,
“: failed to change Gann angle! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ギャンラインの規模を変更する                                             |
//+——————————————————————+
bool GannLineScaleChange(const long   chart_ID=0,     // チャート識別子
const string name=“GannLine”, // 線の名称
const double scale=1.0)       // 規模
{
//— エラー値をリセットする
ResetLastError();
//— スケール(バーあたりのピップ数)を変更する
if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
{
Print(__FUNCTION__,
“: failed to change the scale! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| この関数はチャートからギャンラインを削除する                                   |
//+——————————————————————+
bool GannLineDelete(const long   chart_ID=0,     // チャート識別子
const string name=“GannLine”) // 線の名称
{
//— エラー値をリセットする
ResetLastError();
//— ギャンラインを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Gann Line“! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ギャンラインのアンカーポイントの値をチェックして                                  |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeGannLineEmptyPoints(datetime &time1,double &price1,datetime &time2)
{
//— 2 番目のポイントの時間が設定されていない場合、現在足になる
if(!time2)
time2=TimeCurrent();
//— 1 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time1)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//— 1 番目のポイントを 2 番目から 9 バー左に設定する
time1=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— ギャンライン描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//— ギャンラインを作成する
if(!GannLineCreate(0,InpName,0,date[d1],price[p1],date[d2],InpAngle,InpScale,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— 線のアンカーポイントを移動して角度を変更する
//— ループカウンタ
int v_steps=accuracy/2;
//— 1 番目のアンカーポイントを垂直方向に移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1>1)
p1-=1;
//— ポイントを移動する
if(!GannLinePointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 半秒の遅れ
Sleep(500);
//— ギャン角度の現在値を定義する
//— (最初のアンカーポイントを移動した後に変更された)
double curr_angle;
if(!ObjectGetDouble(0,InpName,OBJPROP_ANGLE,0,curr_angle))
return;
//— ループカウンタ
v_steps=accuracy/8;
//— ギャン角度を変更する
for(int i=0;i<v_steps;i++)
{
if(!GannLineAngleChange(0,InpName,curr_angle-0.05*i))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートから線を削除する
GannLineDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_GANNFAN

ギャンファン

ObjGannFan

注意事項

ギャンファンでは、トレンドの種類を ENUM_GANN_DIRECTION 列挙で指定することが可能です。スケール値(OBJPROP_SCALE)の調節によって、ファンの線の傾斜角度を変更することが出来ます。

次のスクリプトは、チャート上でギャンファンを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Gann Fan” graphical object.”
#property description “Anchor point coordinates are set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“GannFan”;         // ファンの名称
input int             InpDate1=15;               // 1 番目のポイントの日付( % )
input int             InpPrice1=25;             // 1 番目のポイントの価格( % )
input int             InpDate2=85;               // 2 番目のポイントの日付( % )
input double         InpScale=2.0;             // 規模
input bool           InpDirection=false;       // トレンドの方向
input color           InpColor=clrRed;           // ファンの色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // ファンの線のスタイル
input int             InpWidth=1;               // ファンの線の幅
input bool           InpBack=false;             // 背景のファン
input bool           InpSelection=true;         // 強調表示して移動
input bool           InpHidden=true;           // オブジェクトリストに隠す
input long           InpZOrder=0;               // マウスクリックの優先順位
//+——————————————————————+
//| ギャンファンを作成する                                                  |
//+——————————————————————+
bool GannFanCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“GannFan”,   // ファンの名称
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
const double          scale=1.0,         // 規模
const bool            direction=true,   // トレンドの方向
const color           clr=clrRed,       // ファンの色
const ENUM_LINE_STYLE style=STYLE_SOLID, // ファン線のスタイル
const int             width=1,           // ファン線の幅
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeGannFanEmptyPoints(time1,price1,time2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でギャンファンを作成する
if(!ObjectCreate(chart_ID,name,OBJ_GANNFAN,sub_window,time1,price1,time2,0))
{
Print(__FUNCTION__,
“: failed to create “Gann Fan“! Error code = “,GetLastError());
return(false);
}
//— スケール(バーあたりのピップ数)を変更する
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//— ギャンファンのトレンド方向を変更する(true – 下降, false – 上行)
ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction);
//— ファンの色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— ファンの線の表示スタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— ファンの線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してファンを移動するモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| ギャンファンのアンカーポイントを移動する                                      |
//+——————————————————————+
bool GannFanPointChange(const long   chart_ID=0,     // チャート識別子
const string name=“GannFan”, // ファンの名称
const int    point_index=0, // アンカーポイントのインデックス
datetime     time=0,         // アンカーポイントの時間座標
double       price=0)       // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— ファンのアンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ギャンファンの規模を変更する                                              |
//+——————————————————————+
bool GannFanScaleChange(const long   chart_ID=0,     // チャート識別子
const string name=“GannFan”, // ファンの名称
const double scale=1.0)     // 規模
{
//— エラー値をリセットする
ResetLastError();
//— スケール(バーあたりのピップ数)を変更する
if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
{
Print(__FUNCTION__,
“: failed to change the scale! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ギャンファンのトレンド方向を変更する                                         |
//+——————————————————————+
bool GannFanDirectionChange(const long   chart_ID=0,     // チャート識別子
const string name=“GannFan”, // ファンの名称
const bool   direction=true) // トレンドの方向
{
//— エラー値をリセットする
ResetLastError();
//— ギャンファンのトレンド方向を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction))
{
Print(__FUNCTION__,
“: failed to change trend direction! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| この関数はチャートからギャンファンを削除する                                   |
//+——————————————————————+
bool GannFanDelete(const long   chart_ID=0,     // チャート識別子
const string name=“GannFan”) // ファンの名称
{
//— エラー値をリセットする
ResetLastError();
//— ギャンファンを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Gann Fan“! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
// | ギャンファンのアンカーポイントの値をチェックして                                  |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeGannFanEmptyPoints(datetime &time1,double &price1,datetime &time2)
{
//— 2 番目のポイントの時間が設定されていない場合、現在足になる
if(!time2)
time2=TimeCurrent();
//— 1 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time1)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//— 1 番目のポイントを 2 番目から 9 バー左に設定する
time1=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— ギャンファン描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//— ギャンファンを作成する
if(!GannFanCreate(0,InpName,0,date[d1],price[p1],date[d2],InpScale,InpDirection,
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— ファンのアンカーポイントを移動する
//— ループカウンタ
int v_steps=accuracy/2;
//— 1 番目のアンカーポイントを垂直方向に移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1<accuracy-1)
p1+=1;
//— ポイントを移動する
if(!GannFanPointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ファンのトレンド方向を下降に変更する
GannFanDirectionChange(0,InpName,true);
//— チャートを再描画する
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//— チャートからファンを削除する
GannFanDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_GANNGRID

ギャングリッド

ObjGannGrid

注意事項

ギャングリッドでは、トレンドの種類を ENUM_GANN_DIRECTION 列挙で指定することが可能です。スケール値(OBJPROP_SCALE)の調節によってグリッド線の傾斜角度を変更することが出来ます。

次のスクリプトは、チャート上でギャングリッドを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Gann Grid” graphical object.”
#property description “Anchor point coordinates of the grid are set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“GannGrid”;       // グリッド名
input int             InpDate1=15;               // 1 番目のポイントの日付( % )
input int             InpPrice1=25;             // 1 番目のポイントの価格( % )
input int             InpDate2=35;               // 2 番目のポイントの日付( % )
input double         InpScale=3.0;             // 規模
input bool           InpDirection=false;       // トレンドの方向
input color           InpColor=clrRed;           // グリッドの色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // グリッド線のスタイル
input int             InpWidth=1;               // ファンの線の幅
input bool           InpBack=false;             // 背景のグリッド
input bool           InpSelection=true;         // 強調表示して移動
input bool           InpHidden=true;           // オブジェクトリストに隠す
input long           InpZOrder=0;               // マウスクリックの優先順位
//+——————————————————————+
//| ギャングリッドを作成する                                                  |
//+——————————————————————+
bool GannGridCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“GannGrid”,   // グリッド名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
const double          scale=1.0,         // 規模
const bool            direction=true,   // トレンドの方向
const color           clr=clrRed,       // グリッドの色
const ENUM_LINE_STYLE style=STYLE_SOLID, // グリッド線のスタイル
const int             width=1,           // グリッド線の幅
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeGannGridEmptyPoints(time1,price1,time2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でギャングリッドを作成する
if(!ObjectCreate(chart_ID,name,OBJ_GANNGRID,sub_window,time1,price1,time2,0))
{
Print(__FUNCTION__,
“: failed to create “Gann Grid“! Error code = “,GetLastError());
return(false);
}
//— スケール(バーあたりのピップ数)を変更する
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//— ギャンファンのトレンド方向を変更する(true – 下降, false – 上行)
ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction);
//— グリッドの色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— グリッド線の表示スタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— グリッド線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してグリッドを移動するモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| ギャングリッドのアンカーポイントを移動する                                      |
//+——————————————————————+
bool GannGridPointChange(const long   chart_ID=0,     // チャート識別子
const string name=“GannGrid”, // グリッド名
const int    point_index=0,   // アンカーポイントのインデックス
datetime     time=0,         // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— グリッドのアンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ギャングリッドの規模を変更する                                            |
//+——————————————————————+
bool GannGridScaleChange(const long   chart_ID=0,     // チャート識別子
const string name=“GannGrid”, // グリッド
const double scale=1.0)       // 規模
{
//— エラー値をリセットする
ResetLastError();
//— スケール(バーあたりのピップ数)を変更する
if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
{
Print(__FUNCTION__,
“: failed to change the scale! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ギャングリッドのトレンド方向を変更する                                        |
//+——————————————————————+
bool GannGridDirectionChange(const long   chart_ID=0,     // チャート識別子
const string name=“GannGrid”, // グリッド名
const bool   direction=true) // トレンドの方向
{
//— エラー値をリセットする
ResetLastError();
//— ギャングリッドのトレンド方向を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction))
{
Print(__FUNCTION__,
“: failed to change trend direction! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| この関数はチャートからギャンファンを削除する                                   |
//+——————————————————————+
bool GannGridDelete(const long   chart_ID=0,     // チャート識別子
const string name=“GannGrid”) // グリッド名
{
//— エラー値をリセットする
ResetLastError();
//— ギャングリッドを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Gann Grid“! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ギャングリッドのアンカーポイントの値をチェックして                                 |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeGannGridEmptyPoints(datetime &time1,double &price1,datetime &time2)
{
//— 2 番目のポイントの時間が設定されていない場合、現在足になる
if(!time2)
time2=TimeCurrent();
//— 1 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time1)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//— 1 番目のポイントを 2 番目から 9 バー左に設定する
time1=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— ギャングリッド描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//— ギャングリッドを作成する
if(!GannGridCreate(0,InpName,0,date[d1],price[p1],date[d2],InpScale,InpDirection,
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— グリッドのアンカーポイントを移動する
//— ループカウンタ
int v_steps=accuracy/4;
//— 1 番目のアンカーポイントを垂直方向に移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1<accuracy-1)
p1+=1;
if(!GannGridPointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
int h_steps=bars/4;
//— 2 番目のアンカーポイントを水平方向に移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d2<bars-1)
d2+=1;
if(!GannGridPointChange(0,InpName,1,date[d2],0))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— グリッドのトレンド方向を下降に変更する
GannGridDirectionChange(0,InpName,true);
//— チャートを再描画する
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//— チャートからグリッドを削除する
GannGridDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_FIBO

フィボナッチリトレースメント

ObjFiboLevels

注意事項

フィボナッチリトレースメントでは、継続のモードを右及び/または左に指定することが出来ます(OBJPROP_RAY_RIGHT 及び OBJPROP_RAY_LEFT プロパティ)

ラインレベル、その値と色も指定することが出来ます。

次のスクリプトは、チャート上でフィボナッチリトレースメントを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Fibonacci Retracement” graphical object.”
#property description “Anchor point coordinates are set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“FiboLevels”;     // オブジェクト名
input int             InpDate1=10;               // 1 番目のポイントの日付( % )
input int             InpPrice1=65;             // 1 番目のポイントの価格( % )
input int             InpDate2=90;               // 2 番目のポイントの日付( % )
input int             InpPrice2=85;             // 2 番目のポイントの価格( % )
input color           InpColor=clrRed;           // オブジェクトの色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // 線のスタイル
input int             InpWidth=2;               // 線の幅
input bool           InpBack=false;             // 背景オブジェクト
input bool           InpSelection=true;         // 強調表示して移動
input bool           InpRayLeft=false;         // オブジェクトの左への継続
input bool           InpRayRight=false;         // オブジェクトの右への継続
input bool           InpHidden=true;           // オブジェクトリストに隠す
input long           InpZOrder=0;               // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標でフィボナッチリトレースメントを作成する                             |
//+——————————————————————+
bool FiboLevelsCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“FiboLevels”, // オブジェクト名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,         // 2 番目のポイントの価格
const color           clr=clrRed,       // オブジェクトの色
const ENUM_LINE_STYLE style=STYLE_SOLID, // オブジェクト線のスタイル
const int             width=1,           // オブジェクト線の幅
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            ray_left=false,   // オブジェクトの左への継続
const bool            ray_right=false,   // オブジェクトの右への継続
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeFiboLevelsEmptyPoints(time1,price1,time2,price2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でフィボナッチリトレースメントを作成する  
if(!ObjectCreate(chart_ID,name,OBJ_FIBO,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
“: failed to create “Fibonacci Retracement“! Error code = “,GetLastError());
return(false);
}
//— 色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してチャンネルを移動するモードを有効(true)か無効(false)にする。
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトの表示を左に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//— オブジェクトの表示を右に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| レベルの数とパラメータを設定する                                           |
//+——————————————————————+
bool FiboLevelsSet(int             levels,           // レベル線の数
double          &values[],         // レベル線の値
color           &colors[],         // レベル線の色
ENUM_LINE_STYLE &styles[],         // レベル線のスタイル
int             &widths[],         // レベル線の幅
const long      chart_ID=0,       // チャート識別子
const string    name=“FiboLevels”) // オブジェクト名
{
//— 配列のサイズをチェックする
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,“: array length does not correspond to the number of levels, error!”);
return(false);
}
//— レベル数を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//— ループ内でレベルプロパティを設定する
for(int i=0;i<levels;i++)
{
//— レベル値
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//— レベルの色
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//— レベルのスタイル
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//— レベルの幅
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//— レベルの説明
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチリトレースメントのアンカーポイントを移動する                             |
//+——————————————————————+
bool FiboLevelsPointChange(const long   chart_ID=0,       // チャート識別子
const string name=“FiboLevels”, // オブジェクト名
const int    point_index=0,     // アンカーポイントのインデックス
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)           // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチリトレースメントを削除する                                         |
//+——————————————————————+
bool FiboLevelsDelete(const long   chart_ID=0,       // チャート識別子
const string name=“FiboLevels”) // オブジェクト名
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Fibonacci Retracement“! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチリトレースメントのアンカーポイントの値をチェックして                         |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeFiboLevelsEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//— 2 番目のポイントの時間が設定されていない場合、現在足になる
if(!time2)
time2=TimeCurrent();
//— 2 番目のポイントの価格が設定されていない場合、売値になる
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 1 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time1)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//— 1 番目のポイントを 2 番目から 9 バー左に設定する
time1=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、2 番目より 200 ポイント低くする
if(!price1)
price1=price2-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— フィボナッチリトレースメントの描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//— オブジェクトを作成する
if(!FiboLevelsCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動する
//— ループカウンタ
int v_steps=accuracy*2/5;
//— 1 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1>1)
p1-=1;
//— ポイントを移動する
if(!FiboLevelsPointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
v_steps=accuracy*4/5;
//— 2 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p2>1)
p2-=1;
//— ポイントを移動する
if(!FiboLevelsPointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからオブジェクトを削除する
FiboLevelsDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_FIBOTIMES

フィボナッチタイムゾーン

ObjFiboTimes

注意事項

フィボナッチタイムゾーンでは、ラインレベル、その値と色も指定することが出来ます。

次のスクリプトは、チャート上でフィボナッチタイムゾーンを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

//— 説明
#property description “Script draws “Fibonacci Time Zones” graphical object.”
#property description “Anchor point coordinates are set in percentage of the size of”
#property description “the chart window.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“FiboTimes”;       // オブジェクト名
input int             InpDate1=10;               // 1 番目のポイントの日付( % )
input int             InpPrice1=45;             // 1 番目のポイントの価格( % )
input int             InpDate2=20;               // 2 番目のポイントの日付( % )
input int             InpPrice2=55;             // 2 番目のポイントの価格( % )
input color           InpColor=clrRed;           // オブジェクトの色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // 線のスタイル
input int             InpWidth=2;               // 線の幅
input bool           InpBack=false;             // 背景オブジェクト
input bool           InpSelection=true;         // 強調表示して移動
input bool           InpHidden=true;           // オブジェクトリストに隠す
input long           InpZOrder=0;               // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標でフィボナッチタイムゾーンを作成する                              |
//+——————————————————————+
bool FiboTimesCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“FiboTimes”, // オブジェクト名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,         // 2 番目のポイントの価格
const color           clr=clrRed,       // オブジェクトの色
const ENUM_LINE_STYLE style=STYLE_SOLID, // オブジェクト線のスタイル
const int             width=1,           // オブジェクト線の幅
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeFiboTimesEmptyPoints(time1,price1,time2,price2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でフィボナッチタイムゾーンを作成する
if(!ObjectCreate(chart_ID,name,OBJ_FIBOTIMES,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
“: failed to create “Fibonacci Time Zones“! Error code = “,GetLastError());
return(false);
}
//— 色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してチャンネルを移動するモードを有効(true)か無効(false)にする。
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| レベルの数とパラメータを設定する                                           |
//+——————————————————————+
bool FiboTimesLevelsSet(int             levels,           // レベル線の数
double          &values[],       // レベル線の値
color           &colors[],       // レベル線の色
ENUM_LINE_STYLE &styles[],       // レベル線のスタイル
int             &widths[],       // レベル線の幅
const long      chart_ID=0,       // チャート識別子
const string    name=“FiboTimes”) // オブジェクト名
{
//— 配列のサイズをチェックする
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,“: array length does not correspond to the number of levels, error!”);
return(false);
}
//— レベル数を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//— ループ内でレベルプロパティを設定する
for(int i=0;i<levels;i++)
{
//— レベル値
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//— レベルの色
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//— レベルのスタイル
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//— レベルの幅
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//— レベルの説明
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(values[i],1));
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチタイムゾーンのアンカーポイントを移動する                               |
//+——————————————————————+
bool FiboTimesPointChange(const long   chart_ID=0,       // チャート識別子
const string name=“FiboTimes”, // オブジェクト名
const int    point_index=0,   // アンカーポイントのインデックス
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチタイムゾーンを削除する                                          |
//+——————————————————————+
bool FiboTimesDelete(const long   chart_ID=0,       // チャート識別子
const string name=“FiboTimes”) // オブジェクト名
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Fibonacci Time Zones“! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチタイムゾーンの値をチェックして                                      |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeFiboTimesEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//— 1 番目のポイントの時間が設定されていない場合、現在足になる
if(!time1)
time1=TimeCurrent();
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 2 番目のポイントの時間が設定されていない場合、2 番目から2バー左に置かれる
if(!time2)
{
//— 最後の 3 バーのオープン時間を受信するための配列
datetime temp[3];
CopyTime(Symbol(),Period(),time1,3,temp);
//— 1 番目のポイントを2 番目から 2 バー左に設定する
time2=temp[0];
}
//— 2 番目のポイントの価格は設定されていない場合は 1 番目のポイントと等しい
if(!price2)
price2=price1;
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— フィボナッチタイムゾーン描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//— オブジェクトを作成する
if(!FiboTimesCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動する
//— ループカウンタ
int h_steps=bars*2/5;
//— 2 番目のアンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d2<bars-1)
d2+=1;
//— ポイントを移動する
if(!FiboTimesPointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
h_steps=bars*3/5;
//— 1 番目のアンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d1<bars-1)
d1+=1;
//— ポイントを移動する
if(!FiboTimesPointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからオブジェクトを削除する
FiboTimesDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_FIBOFAN

フィボナッチファン(扇)

ObjFiboFan

注意事項

フィボナッチファンでは、ラインレベルの数、値と色を指定することが出来ます。

次のスクリプトは、チャート上でフィボナッチファンを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Fibonacci Fan” graphical object.”
#property description “Anchor point coordinates are set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“FiboFan”;         // ファンの名称
input int             InpDate1=10;               // 1 番目のポイントの日付( % )
input int             InpPrice1=25;             // 1 番目のポイントの価格( % )
input int             InpDate2=30;               // 2 番目のポイントの日付( % )
input int             InpPrice2=50;             // 2 番目のポイントの価格( % )
input color           InpColor=clrRed;           // ファンの線の色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // 線のスタイル
input int             InpWidth=2;               // 線の幅
input bool           InpBack=false;             // 背景オブジェクト
input bool           InpSelection=true;         // 強調表示して移動
input bool           InpHidden=true;           // オブジェクトリストに隠す
input long           InpZOrder=0;               // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標でフィボナッチファンを作成する                                   |
//+——————————————————————+
bool FiboFanCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“FiboFan”,   // ファンの名称
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,         // 2 番目のポイントの価格
const color           clr=clrRed,       // ファンの線の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // ファンの線のスタイル
const int             width=1,           // ファンの線の幅
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeFiboFanEmptyPoints(time1,price1,time2,price2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でフィボナッチファンを作成する 
if(!ObjectCreate(chart_ID,name,OBJ_FIBOFAN,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
“: failed to create “Fibonacci Fan“! Error code = “,GetLastError());
return(false);
}
//— 色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してファンを移動するモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| レベルの数とパラメータを設定する                                           |
//+——————————————————————+
bool FiboFanLevelsSet(int             levels,         // レベル線の数
double          &values[],     // レベル線の値
color           &colors[],     // レベル線の色
ENUM_LINE_STYLE &styles[],     // レベル線のスタイル
int             &widths[],     // レベル線の幅
const long      chart_ID=0,     // チャート識別子
const string    name=“FiboFan”) // ファンの名称
{
//— 配列のサイズをチェックする
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,“: array length does not correspond to the number of levels, error!”);
return(false);
}
//— レベル数を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//— ループ内でレベルプロパティを設定する
for(int i=0;i<levels;i++)
{
//— レベル値
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//— レベルの色
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//— レベルのスタイル
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//— レベルの幅
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//— レベルの説明
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチファンのアンカーポイントを移動する                                   |
//+——————————————————————+
bool FiboFanPointChange(const long   chart_ID=0,     // チャート識別子
const string name=“FiboFan”, // ファンの名称
const int    point_index=0, // アンカーポイントのインデックス
datetime     time=0,         // アンカーポイントの時間座標
double       price=0)       // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチリファンを削除する                                              |
//+——————————————————————+
bool FiboFanDelete(const long   chart_ID=0,     // チャート識別子
const string name=“FiboFan”) // ファンの名称
{
//— エラー値をリセットする
ResetLastError();
//— ファンを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Fibonacci Fan“! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチファンのアンカーポイントの値をチェックして                               |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeFiboFanEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//— 2 番目のポイントの時間が設定されていない場合、現在足になる
if(!time2)
time2=TimeCurrent();
//— 2 番目のポイントの価格が設定されていない場合、売値になる
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 1 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time1)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//— 1 番目のポイントを 2 番目から 9 バー左に設定する
time1=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、2 番目より 200 ポイント低くする
if(!price1)
price1=price2-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— フィボナッチファン描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//— オブジェクトを作成する
if(!FiboFanCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— ファンのアンカーポイントを移動する
//— ループカウンタ
int v_steps=accuracy/2;
//— 1 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1<accuracy-1)
p1+=1;
//— ポイントを移動する
if(!FiboFanPointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
int h_steps=bars/4;
//— 2 番目のアンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d2<bars-1)
d2+=1;
//— ポイントを移動する
if(!FiboFanPointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからオブジェクトを削除する
FiboFanDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_FIBOARC

フィボナッチアーク(円弧)

ObjFiboArc

注意事項

フィボナッチアークでは、楕円形全体の表示モードを指定することが可能です。曲率半径は、スケールとアンカーポイントの座標を変更することにより指定することが出来ます。

ラインレベル、その値と色も指定することが出来ます。

次のスクリプトは、チャート上でフィボナッチアークを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Fibonacci Arcs” graphical object.”
#property description “Anchor point coordinates are set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“FiboArc”;         // オブジェクト名
input int             InpDate1=25;               // 1 番目のポイントの日付( % )
input int             InpPrice1=25;             // 1 番目のポイントの価格( % )
input int             InpDate2=35;               // 2 番目のポイントの日付( % )
input int             InpPrice2=55;             // 2 番目のポイントの価格( % )
input double         InpScale=3.0;             // 規模
input bool           InpFullEllipse=true;       // 円弧の図形
input color           InpColor=clrRed;           // 線の色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // 線のスタイル
input int             InpWidth=2;               // 線の幅
input bool           InpBack=false;             // 背景オブジェクト
input bool           InpSelection=true;         // 強調表示して移動
input bool           InpHidden=true;           // オブジェクトリストに隠す
input long           InpZOrder=0;               // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標でフィボナッチ円弧を作成する                                   |
//+——————————————————————+
bool FiboArcCreate(const long            chart_ID=0,         // チャート識別子
const string          name=“FiboArc”,     // オブジェクト名
const int             sub_window=0,       // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,           // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,           // 2 番目のポイントの価格
const double          scale=1.0,         // 規模
const bool            full_ellipse=false, // 円弧の図形
const color           clr=clrRed,         // 線の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 線のスタイル
const int             width=1,           // 線の幅
const bool            back=false,         // 背景で表示する
const bool            selection=true,     // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeFiboArcEmptyPoints(time1,price1,time2,price2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でフィボナッチ円弧を作成する
if(!ObjectCreate(chart_ID,name,OBJ_FIBOARC,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
“: failed to create “Fibonacci Arcs“! Error code = “,GetLastError());
return(false);
}
//— 規模を設定する
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//— 円弧の表示を楕円形(true)またはそれの半分の弧(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_ELLIPSE,full_ellipse);
//— 色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してアークを移動するモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| レベルの数とパラメータを設定する                                           |
//+——————————————————————+
bool FiboArcLevelsSet(int             levels,         // レベル線の数
double          &values[],     // レベル線の値
color           &colors[],     // レベル線の色
ENUM_LINE_STYLE &styles[],     // レベル線のスタイル
int             &widths[],     // レベル線の幅
const long      chart_ID=0,     // チャート識別子
const string    name=“FiboArc”) // オブジェクト名
{
//— 配列のサイズをチェックする
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,“: array length does not correspond to the number of levels, error!”);
return(false);
}
//— レベル数を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//— ループ内でレベルプロパティを設定する
for(int i=0;i<levels;i++)
{
//— レベル値
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//— レベルの色
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//— レベルのスタイル
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//— レベルの幅
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//— レベルの説明
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチ円弧のアンカーポイントを移動する                                   |
//+——————————————————————+
bool FiboArcPointChange(const long   chart_ID=0,     // チャート識別子
const string name=“FiboArc”, // オブジェクト名
const int    point_index=0, // アンカーポイントのインデックス
datetime     time=0,         // アンカーポイントの時間座標
double       price=0)       // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチ円弧を削除する                                               |
//+——————————————————————+
bool FiboArcDelete(const long   chart_ID=0,     // チャート識別子
const string name=“FiboArc”) // オブジェクト名
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Fibonacci Arcs“! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチ円弧のアンカーポイントの値をチェックして                               |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeFiboArcEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//— 2 番目のポイントの時間が設定されていない場合、現在足になる
if(!time2)
time2=TimeCurrent();
//— 2 番目のポイントの価格が設定されていない場合、売値になる
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 1 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time1)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//— 1 番目のポイントを 2 番目から 9 バー左に設定する
time1=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、2 番目より 300 ポイント低くする
if(!price1)
price1=price2-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— フィボナッチ円弧描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//— オブジェクトを作成する
if(!FiboArcCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpScale,
InpFullEllipse,InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動する
//— ループカウンタ
int v_steps=accuracy/5;
//— 1 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1<accuracy-1)
p1+=1;
//— ポイントを移動する
if(!FiboArcPointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
int h_steps=bars/5;
//— 2 番目のアンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d2<bars-1)
d2+=1;
//— ポイントを移動する
if(!FiboArcPointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからオブジェクトを削除する
FiboArcDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_FIBOCHANNEL

フィボナッチチャンネル

ObjFiboChannel

注意事項

フィボナッチチャンネルでは、継続のモードを右及び/または左に指定することが出来ます(OBJPROP_RAY_RIGHT 及び OBJPROP_RAY_LEFT プロパティ)。

ラインレベル、その値と色も指定することが出来ます。

次のスクリプトは、チャート上でフィボナッチチャンネルを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Fibonacci Channel” graphical object.”
#property description “Anchor point coordinates are set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“FiboChannel”;     // チャンネル名
input int             InpDate1=20;               // 1 番目のポイントの日付( % )
input int             InpPrice1=10;             // 1 番目のポイントの価格( % )
input int             InpDate2=60;               // 2 番目のポイントの日付( % )
input int             InpPrice2=30;             // 2 番目のポイントの価格( % )
input int             InpDate3=20;               // 3 番目のポイントの日付( % )
input int             InpPrice3=25;             // 3 番目のポイントの価格( % )
input color           InpColor=clrRed;           // チャンネルの色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // チャンネルの線のスタイル
input int             InpWidth=2;               // チャンネルの線の幅
input bool           InpBack=false;             // 背景チャンネル
input bool           InpSelection=true;         // 強調表示して移動
input bool           InpRayLeft=false;         // チャンネルの左への継続
input bool           InpRayRight=false;         // チャンネルの右への継続
input bool           InpHidden=true;           // オブジェクトリストに隠す
input long           InpZOrder=0;               // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標でフィボナッチチャンネルを作成する                                |
//+——————————————————————+
bool FiboChannelCreate(const long            chart_ID=0,         // チャート識別子
const string          name=“FiboChannel”, // チャンネル名
const int             sub_window=0,       // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,           // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,           // 2 番目のポイントの値
datetime              time3=0,           // 3 番目のポイントの時間
double                price3=0,           // 3 番目のポイントの価格
const color           clr=clrRed,         // チャンネルの色
const ENUM_LINE_STYLE style=STYLE_SOLID, // チャンネルの線のスタイル
const int             width=1,           // チャンネルの線の幅
const bool            back=false,         // 背景で表示する
const bool            selection=true,     // 強調表示して移動
const bool            ray_left=false,     // チャンネルの左への継続
const bool            ray_right=false,   // チャンネルの右への継続
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeFiboChannelEmptyPoints(time1,price1,time2,price2,time3,price3);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でチャンネルを作成する 
if(!ObjectCreate(chart_ID,name,OBJ_FIBOCHANNEL,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
“: failed to create “Fibonacci Channel“! Error code = “,GetLastError());
return(false);
}
//— チャンネルの色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— チャンネルの線のスタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— チャンネルの線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してチャンネルを移動するモードを有効(true)か無効(false)にする。
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— チャンネルの表示を左に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//— チャンネルの表示を右に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| レベルの数とパラメータを設定する                                           |
//+——————————————————————+
bool FiboChannelLevelsSet(int             levels,             // レベル線の数
double          &values[],         // レベル線の値
color           &colors[],         // レベル線の色
ENUM_LINE_STYLE &styles[],         // レベル線のスタイル
int             &widths[],         // レベル線の幅
const long      chart_ID=0,         // チャート識別子
const string    name=“FiboChannel”) // オブジェクト名
{
//— 配列のサイズをチェックする
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,“: array length does not correspond to the number of levels, error!”);
return(false);
}
//— レベル数を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//— ループ内でレベルプロパティを設定する
for(int i=0;i<levels;i++)
{
//— レベル値
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//— レベルの色
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//— レベルのスタイル
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//— レベルの幅
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//— レベルの説明
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチチャンネルのアンカーポイントを移動する                                |
//+——————————————————————+
bool FiboChannelPointChange(const long   chart_ID=0,         // チャート識別子
const string name=“FiboChannel”, // チャンネル名
const int    point_index=0,     // アンカーポイントのインデックス
datetime     time=0,             // アンカーポイントの時間座標
double       price=0)           // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャンネルを削除する                                                   |
//+——————————————————————+
bool FiboChannelDelete(const long   chart_ID=0,         // チャート識別子
const string name=“FiboChannel”) // チャンネル名
{
//— エラー値をリセットする
ResetLastError();
//— チャンネルを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Fibonacci Channel“! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチリチャンネルのアンカーポイントの値をチェックして                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeFiboChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//— 2 番目(右)のポイントの時間が設定されていない場合、現在足になる
if(!time2)
time2=TimeCurrent();
//— 2 番目のポイントの価格が設定されていない場合、売値になる
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 1 番目(左)のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time1)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//— 1 番目のポイントを 2 番目から 9 バー左に設定する
time1=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、2 番目より 300 ポイント高くする
if(!price1)
price1=price2+300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//— 3 番目のポイントの時間が設定されていない場合、最初のポイントに等しい
if(!time3)
time3=time1;
//— 3 番目のポイントの価格が設定されていない場合、2 番目のポイントに等しい
if(!price3)
price3=price2;
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— チャンネル描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//— フィボナッチチャンネルを作成する
if(!FiboChannelCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— チャンネルのアンカーポイントを移動する
//— ループカウンタ
int h_steps=bars/10;
//— 1 番目のアンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d1>1)
d1-=1;
//— ポイントを移動する
if(!FiboChannelPointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
int v_steps=accuracy/10;
//— 2 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p2>1)
p2-=1;
//— ポイントを移動する
if(!FiboChannelPointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
v_steps=accuracy/15;
//— 3 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p3<accuracy-1)
p3+=1;
//— ポイントを移動する
if(!FiboChannelPointChange(0,InpName,2,date[d3],price[p3]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからチャンネルを削除する
FiboChannelDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_EXPANSION

フィボナッチ拡張

ObjFiboExpansion

注意事項

フィボナッチ拡張では、継続のモードを右及び/または左に指定することが出来ます (OBJPROP_RAY_RIGHT 及び OBJPROP_RAY_LEFT プロパティ)。

ラインレベル、その値と色も指定することが出来ます。

次のスクリプトは、チャート上でフィボナッチ拡張を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Fibonacci Expansion“graphical object.”
#property description “Anchor point coordinates are set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“FiboExpansion”;   // オブジェクト名
input int             InpDate1=10;               // 1 番目のポイントの日付( % )
input int             InpPrice1=55;             // 1 番目のポイントの価格( % )
input int             InpDate2=30;               // 2 番目のポイントの日付( % )
input int             InpPrice2=10;             // 2 番目のポイントの価格( % )
input int             InpDate3=80;               // 3 番目のポイントの日付( % )
input int             InpPrice3=75;             // 3 番目のポイントの価格( % )
input color           InpColor=clrRed;           // オブジェクトの色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // 線のスタイル
input int             InpWidth=2;               // 線の幅
input bool           InpBack=false;             // 背景オブジェクト
input bool           InpSelection=true;         // 強調表示して移動
input bool           InpRayLeft=false;         // オブジェクトの左への継続
input bool           InpRayRight=false;         // オブジェクトの右への継続
input bool           InpHidden=true;           // オブジェクトリストに隠す
input long           InpZOrder=0;               // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標でフィボナッチ拡張を作成する                                   |
//+——————————————————————+
bool FiboExpansionCreate(const long            chart_ID=0,           // チャート識別子
const string          name=“FiboExpansion”, // チャンネル名
const int             sub_window=0,         // サブウィンドウ番号
datetime              time1=0,             // 1 番目のポイントの時間
double                price1=0,             // 1 番目のポイントの価格
datetime              time2=0,             // 2 番目のポイントの時間
double                price2=0,             // 2 番目のポイントの価格
datetime              time3=0,             // 3 番目のポイントの時間
double                price3=0,             // 3 番目のポイントの価格
const color           clr=clrRed,           // オブジェクトの色
const ENUM_LINE_STYLE style=STYLE_SOLID,   // 線のスタイル
const int             width=1,             // 線の幅
const bool            back=false,           // 背景で表示する
const bool            selection=true,       // 強調表示して移動
const bool            ray_left=false,       // オブジェクトの左への継続
const bool            ray_right=false,     // オブジェクトの右への継続
const bool            hidden=true,         // オブジェクトリストに隠す
const long            z_order=0)           // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeFiboExpansionEmptyPoints(time1,price1,time2,price2,time3,price3);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標でフィボナッチ拡張を作成する  
if(!ObjectCreate(chart_ID,name,OBJ_EXPANSION,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
“: failed to create “Fibonacci Extension“! Error code = “,GetLastError());
return(false);
}
//— オブジェクトの色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線のスタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してチャンネルを移動するモードを有効(true)か無効(false)にする。
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトの表示を左に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//— オブジェクトの表示を右に延長するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| レベルの数とパラメータを設定する                                           |
//+——————————————————————+
bool FiboExpansionLevelsSet(int             levels,               // レベル線の数
double          &values[],           // レベル線の値
color           &colors[],           // レベル線の色
ENUM_LINE_STYLE &styles[],           // レベル線のスタイル
int             &widths[],           // レベル線の幅
const long      chart_ID=0,           // チャート識別子
const string    name=“FiboExpansion”) // オブジェクト名
{
//— 配列のサイズをチェックする
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,“: array length does not correspond to the number of levels, error!”);
return(false);
}
//— レベル数を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//— ループ内でレベルプロパティを設定する
for(int i=0;i<levels;i++)
{
//— レベル値
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//— レベルの色
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//— レベルのスタイル
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//— レベルの幅
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//— レベルの説明
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,“FE “+DoubleToString(100*values[i],1));
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチ拡張のアンカーポイントを移動する                                   |
//+——————————————————————+
bool FiboExpansionPointChange(const long   chart_ID=0,           // チャート識別子
const string name=“FiboExpansion”, // オブジェクト名
const int    point_index=0,       // アンカーポイントのインデックス
datetime     time=0,               // アンカーポイントの時間座標
double       price=0)             // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチ拡張を削除する                                               |
//+——————————————————————+
bool FiboExpansionDelete(const long   chart_ID=0,           // チャート識別子
const string name=“FiboExpansion”) // オブジェクト名
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Fibonacci Expansion“! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| フィボナッチ拡張のアンカーポイントの値をチェックして                               |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeFiboExpansionEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//— 3 番目(右)のポイントの時間が設定されていない場合、現在足になる
if(!time3)
time3=TimeCurrent();
//— 3 番目のポイントの価格が設定されていない場合、売値になる
if(!price3)
price3=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 1 番目(左)のポイントの時間が設定されていない場合、3 番目から9バー左に置かれる
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[];
ArrayResize(temp,10);
if(!time1)
{
CopyTime(Symbol(),Period(),time3,10,temp);
//— 1 番目のポイントを 2 番目から 9 バー左に設定する
time1=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、3 番目のポイントに等しい
if(!price1)
price1=price3;
//— 2 番目のポイントの時間が設定されていない場合、3 番目から 7 バー左に置かれる
if(!time2)
time2=temp[2];
//— 2 番目のポイントの価格が設定されていない場合、1 番目より 250 ポイント低くする
if(!price2)
price2=price1-250*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— フィボナッチ拡張描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//— フィボナッチ拡張を作成する
if(!FiboExpansionCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動する
//— ループカウンタ
int v_steps=accuracy/10;
//— 1 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1>1)
p1-=1;
//— ポイントを移動する
if(!FiboExpansionPointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
v_steps=accuracy/2;
//— 3 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p3>1)
p3-=1;
//— ポイントを移動する
if(!FiboExpansionPointChange(0,InpName,2,date[d3],price[p3]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
v_steps=accuracy*4/5;
//— 2 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p2<accuracy-1)
p2+=1;
//— ポイントを移動する
if(!FiboExpansionPointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからオブジェクトを削除する
FiboExpansionDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ELLIOTWAVE5

エリオット動機波

ObjElliotWave5

注意事項

エリオット動機波では、ポイントを線でつなぐモードを有効/無効にすることができ( OBJPROP_DRAWLINE Sプロパティ)波のポジションレベルを( ENUM_ELLIOT_WAVE_DEGREE 列挙から)設定することも出来ます。

次のスクリプトは、チャート上でエリオット動機波を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Elliott Motive Wave“.”
#property description “Anchor point coordinates are set in percentage of the size of”
#property description “the chart window.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string                 InpName=“ElliotWave5”;   // 動機
input int                     InpDate1=10;             // 1 番目のポイントの日付( % )
input int                     InpPrice1=90;           // 1 番目のポイントの価格( % )
input int                     InpDate2=20;             // 2 番目のポイントの日付( % )
input int                     InpPrice2=40;           // 2 番目のポイントの価格( % )
input int                     InpDate3=30;             // 3 番目のポイントの日付( % )
input int                     InpPrice3=60;           // 3 番目のポイントの価格( % )
input int                     InpDate4=40;             // 4 番目のポイントの日( % )
input int                     InpPrice4=10;           // 4 番目のポイントの価格( % )
input int                     InpDate5=60;             // 5 番目のポイントの日( % )
input int                     InpPrice5=40;           // 5 番目のポイントの価格( % )
input ENUM_ELLIOT_WAVE_DEGREE InpDegree=ELLIOTT_MINOR; // レベル
input bool                   InpDrawLines=true;       // 線を表示
input color                   InpColor=clrRed;         // 線の色
input ENUM_LINE_STYLE         InpStyle=STYLE_DASH;     // 線のスタイル
input int                     InpWidth=2;             // 線の幅
input bool                   InpBack=false;           // 背景オブジェクト
input bool                   InpSelection=true;       // 強調表示して移動
input bool                   InpHidden=true;         // オブジェクトリストに隠す
input long                   InpZOrder=0;             // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標で「エリオット動機波」を作成する                                 |
//+——————————————————————+
bool ElliotWave5Create(const long                    chart_ID=0,             // チャート識別子
const string                  name=“ElliotWave5”,     // 波の名称
const int                     sub_window=0,           // サブウィンドウ番号
datetime                      time1=0,                 // 1 番目のポイントの時間
double                        price1=0,               // 1 番目のポイントの価格
datetime                      time2=0,                 // 2 番目のポイントの時間
double                        price2=0,               // 2 番目のポイントの価格
datetime                      time3=0,                 // 3 番目のポイントの時間
double                        price3=0,               // 3 番目のポイントの価格
datetime                      time4=0,                 // 4 番目のポイントの時間
double                        price4=0,               // 4 番目のポイントの価格
datetime                      time5=0,                 // 5 番目のポイントの時間
double                        price5=0,               // 5 番目のポイントの価格
const ENUM_ELLIOT_WAVE_DEGREE degree=ELLIOTT_MINUETTE, // 度
const bool                    draw_lines=true,         // 線の表示
const color                   clr=clrRed,             // オブジェクトの色
const ENUM_LINE_STYLE         style=STYLE_SOLID,       // 線のスタイル
const int                     width=1,                 // 線の幅
const bool                    back=false,             // 背景で表示する
const bool                    selection=true,         // 強調表示して移動
const bool                    hidden=true,             // オブジェクトリストに隠す
const long                    z_order=0)               // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeElliotWave5EmptyPoints(time1,price1,time2,price2,time3,price3,time4,price4,time5,price5);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標で「エリオット動機波」を作成する    
if(!ObjectCreate(chart_ID,name,OBJ_ELLIOTWAVE5,sub_window,time1,price1,time2,price2,time3,
price3,time4,price4,time5,price5))
{
Print(__FUNCTION__,
“: failed to create “Elliott Motive Wave“! Error code = “,GetLastError());
return(false);
}
//— 角度(波の大きさ)を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_DEGREE,degree);
//— 線を表示するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_DRAWLINES,draw_lines);
//— オブジェクトの色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線のスタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してチャンネルを移動するモードを有効(true)か無効(false)にする。
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| エリオット動機波のアンカーポイントを移動する                                   |
//+——————————————————————+
bool ElliotWave5PointChange(const long   chart_ID=0,         // チャート識別子
const string name=“ElliotWave5”, // オブジェクト名
const int    point_index=0,     // アンカーポイントのインデックス
datetime     time=0,             // アンカーポイントの時間座標
double       price=0)           // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| エリオット動機波を削除する                                               |
//+——————————————————————+
bool ElliotWave5Delete(const long   chart_ID=0,         // チャート識別子
const string name=“ElliotWave5”) // オブジェクト名
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Elliott Motive Wave“! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| エリオット動機波のアンカーポイントの値をチェックして                               |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeElliotWave5EmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2,
datetime &time3,double &price3,
datetime &time4,double &price4,
datetime &time5,double &price5)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[];
ArrayResize(temp,10);
//— データを受け取る
CopyTime(Symbol(),Period(),TimeCurrent(),10,temp);
//— 現在のチャートでの一ポイントの値を受け取る
double point=SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//— 1 番目のポイントの時間が設定されていない場合、最後のバーから 9 バー左になる
if(!time1)
time1=temp[0];
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 2 番目のポイントの時間が設定されていない場合、最後のバーから 7 バー左になる
if(!time2)
time2=temp[2];
//— 1 番目のポイントの価格が設定されていない場合、2 番目より 300 ポイント低くする
if(!price2)
price2=price1-300*point;
//— 3 番目のポイントの時間が設定されていない場合、最後のバーの 5 バー左になる
if(!time3)
time3=temp[4];
//— 3 番目のポイントの価格が設定されていない場合、1 番目より250ポイント低くする
if(!price3)
price3=price1-250*point;
//— 4 番目のポイントの時間が設定されていない場合、最後のバーから 3 バー左になる
if(!time4)
time4=temp[6];
//— 4 番目のポイントの価格が設定されていない場合、1 番目より 550 ポイント低くする
if(!price4)
price4=price1-550*point;
//— 4 番目のポイントの時間が設定されていない場合、最後のバーになる
if(!time5)
time5=temp[9];
//— 4 番目のポイントの価格が設定されていない場合、1 番目より 450 ポイント低くする
if(!price5)
price5=price1-450*point;
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100 ||
InpDate4<0 || InpDate4>100 || InpPrice4<0 || InpPrice4>100 ||
InpDate5<0 || InpDate5>100 || InpPrice5<0 || InpPrice5>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
エリオット動機波の描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int d4=InpDate4*(bars-1)/100;
int d5=InpDate5*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
int p4=InpPrice4*(accuracy-1)/100;
int p5=InpPrice5*(accuracy-1)/100;
//— 「エリオット動機波」を作成する    
if(!ElliotWave5Create(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
date[d4],price[p4],date[d5],price[p5],InpDegree,InpDrawLines,InpColor,InpStyle,InpWidth,
InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動する
//— ループカウンタ
int v_steps=accuracy/5;
//— 5 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p5<accuracy-1)
p5+=1;
//— ポイントを移動する
if(!ElliotWave5PointChange(0,InpName,4,date[d5],price[p5]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
v_steps=accuracy/5;
//— 2 番目と3 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p2<accuracy-1)
p2+=1;
if(p3>1)
p3-=1;
//— ポイントをシフトする
if(!ElliotWave5PointChange(0,InpName,1,date[d2],price[p2]))
return;
if(!ElliotWave5PointChange(0,InpName,2,date[d3],price[p3]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
v_steps=accuracy*4/5;
//— 1 番目と2 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1>1)
p1-=1;
if(p4<accuracy-1)
p4+=1;
//— ポイントをシフトする
if(!ElliotWave5PointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!ElliotWave5PointChange(0,InpName,3,date[d4],price[p4]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからオブジェクトを削除する
ElliotWave5Delete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ELLIOTWAVE3

エリオット修正波

ObjElliotWave3

注意事項

エリオット修正波では、ポイントを線でつなぐモードを有効/無効にすることができ( OBJPROP_DRAWLINES プロパティ)、波のポジションレベルを( ENUM_ELLIOT_WAVE_DEGREE 列挙から)設定することも出来ます。

次のスクリプトは、チャート上でエリオット修正波を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Elliott Correction Wave” graphical object.”
#property description “Anchor point coordinates are set in percentage of the chart’s window”
#property description “size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string                 InpName=“ElliotWave3”;   //オブジェクト名
input int                     InpDate1=10;             // 1 番目のポイントの日付( % )
input int                     InpPrice1=90;           // 1 番目のポイントの価格( % )
input int                     InpDate2=30;             // 2 番目のポイントの日付( % )
input int                     InpPrice2=10;           // 2 番目のポイントの価格( % )
input int                     InpDate3=50;             // 3 番目のポイントの日付( % )
input int                     InpPrice3=40;           // 3 番目のポイントの価格( % )
input ENUM_ELLIOT_WAVE_DEGREE InpDegree=ELLIOTT_MINOR; // レベル
input bool                   InpDrawLines=true;       // 線を表示
input color                   InpColor=clrRed;         // 線の色
input ENUM_LINE_STYLE         InpStyle=STYLE_DASH;     // 線のスタイル
input int                     InpWidth=2;             // 線の幅
input bool                   InpBack=false;           // 背景オブジェクト
input bool                   InpSelection=true;       // 強調表示して移動
input bool                   InpHidden=true;         // オブジェクトリストに隠す
input long                   InpZOrder=0;             // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標で「エリオット修正波」を作成する                                 |
//+——————————————————————+
bool ElliotWave3Create(const long                    chart_ID=0,             // チャート識別子
const string                  name=“ElliotWave3”,     // 波の名称
const int                     sub_window=0,           // サブウィンドウ番号
datetime                      time1=0,                 // 1 番目のポイントの時間
double                        price1=0,               // 1 番目のポイントの価格
datetime                      time2=0,                 // 2 番目のポイントの時間
double                        price2=0,               // 2 番目のポイントの価格
datetime                      time3=0,                 // 3 番目のポイントの時間
double                        price3=0,               // 3 番目のポイントの価格
const ENUM_ELLIOT_WAVE_DEGREE degree=ELLIOTT_MINUETTE, // 度
const bool                    draw_lines=true,         // 線の表示
const color                   clr=clrRed,             // オブジェクトの色
const ENUM_LINE_STYLE         style=STYLE_SOLID,       // 線のスタイル
const int                     width=1,                 // 線の幅
const bool                    back=false,             // 背景で表示する
const bool                    selection=true,         // 強調表示して移動
const bool                    hidden=true,             // オブジェクトリストに隠す
const long                    z_order=0)               // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeElliotWave3EmptyPoints(time1,price1,time2,price2,time3,price3);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標で「エリオット修正波」を作成する
if(!ObjectCreate(chart_ID,name,OBJ_ELLIOTWAVE3,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
“: failed to create “Elliott Correction Wave“! Error code = “,GetLastError());
return(false);
}
//— 角度(波の大きさ)を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_DEGREE,degree);
//— 線を表示するモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_DRAWLINES,draw_lines);
//— オブジェクトの色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 線のスタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 線の幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示してチャンネルを移動するモードを有効(true)か無効(false)にする。
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| エリオット波動のアンカーポイントを移動する                                     |
//+——————————————————————+
bool ElliotWave3PointChange(const long   chart_ID=0,         // チャート識別子
const string name=“ElliotWave3”, // オブジェクト名
const int    point_index=0,     // アンカーポイントのインデックス
datetime     time=0,             // アンカーポイントの時間座標
double       price=0)           // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| エリオット修正波を削除する                                               |
//+——————————————————————+
bool ElliotWave3Delete(const long   chart_ID=0,         // チャート識別子
const string name=“ElliotWave3”) // オブジェクト名
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Elliott Correction Wave“! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| エリオット修正波のアンカーポイントの値をチェックして                               |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeElliotWave3EmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2,
datetime &time3,double &price3)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[];
ArrayResize(temp,10);
//— データを受け取る
CopyTime(Symbol(),Period(),TimeCurrent(),10,temp);
//— 現在のチャートでの一ポイントの値を受け取る
double point=SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//— 1 番目のポイントの時間が設定されていない場合、最後のバーから 9 バー左になる
if(!time1)
time1=temp[0];
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 2 番目のポイントの時間が設定されていない場合、最後のバーから 5 バー左になる
if(!time2)
time2=temp[4];
//— 1 番目のポイントの価格が設定されていない場合、2 番目より 300 ポイント低くする
if(!price2)
price2=price1-300*point;
//— 3 番目のポイントの時間が設定されていない場合、最後のバーの 1 バー左になる
if(!time3)
time3=temp[8];
//— 3 番目のポイントの価格が設定されていない場合、1 番目より 200 ポイント低くする
if(!price3)
price3=price1-200*point;
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— エリオット修正波の描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//— エリオット修正波を作成する
if(!ElliotWave3Create(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpDegree,InpDrawLines,InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動する
//— ループカウンタ
int v_steps=accuracy/5;
//— 3 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p3<accuracy-1)
p3+=1;
//— ポイントを移動する
if(!ElliotWave3PointChange(0,InpName,2,date[d3],price[p3]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
v_steps=accuracy*4/5;
//— 1 番目と2 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1>1)
p1-=1;
if(p2<accuracy-1)
p2+=1;
//— ポイントをシフトする
if(!ElliotWave3PointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!ElliotWave3PointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからオブジェクトを削除する
ElliotWave3Delete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_RECTANGLE

四角形

ObjRectangle

注意事項

四角形では、色で塗りつぶすモードが OBJPROP_FILL プロパティによって設定されます。

次のスクリプトは、チャート上で四角形を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script creates rectangle on the chart.”
#property description “Anchor point coordinates are set in”
#property description “percentage of the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“Rectangle”; // 四角形名
input int             InpDate1=40;         // 1 番目のポイントの日付( % )
input int             InpPrice1=40;       // 1 番目のポイントの価格( % )
input int             InpDate2=60;         // 2 番目のポイントの日付( % )
input int             InpPrice2=60;       // 2 番目のポイントの価格( % )
input color           InpColor=clrRed;     // 四角形の色
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // 四角形の線のスタイル
input int             InpWidth=2;         // 四角形の線の幅
input bool           InpFill=true;       // 四角形を色で塗りつぶす
input bool           InpBack=false;       // 背景の重宝系
input bool           InpSelection=true;   // 強調表示して移動
input bool           InpHidden=true;     // オブジェクトリストに隠す
input long           InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標で四角形を作成する                                         |
//+——————————————————————+
bool RectangleCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“Rectangle”, // 四角形名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,         // 2 番目のポイントの価格
const color           clr=clrRed,       // 四角形の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 四角形の線のスタイルs
const int             width=1,           // 四角形の線の幅
const bool            fill=false,       // 四角形を色で塗りつぶす
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeRectangleEmptyPoints(time1,price1,time2,price2);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標で四角形を作成する
if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
“: failed to create a rectangle! Error code = “,GetLastError());
return(false);
}
//— 四角形の色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 四角形の線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 四角形の線の幅を設定s
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 四角形を色で塗りつぶすモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示して 四角形を移動するモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| 四角形のアンカーポイントを移動する                                         |
//+——————————————————————+
bool RectanglePointChange(const long   chart_ID=0,       // チャート識別子
const string name=“Rectangle”, // 四角形名
const int    point_index=0,   // アンカーポイントのインデックス
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 四角形を削除する                                                     |
//+——————————————————————+
bool RectangleDelete(const long   chart_ID=0,       // チャート識別子
const string name=“Rectangle”) // 四角形名
{
//— エラー値をリセットする
ResetLastError();
//— 四角形を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete rectangle! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 四角形のアンカーポイントの値をチェックして                                     |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeRectangleEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//— 1 番目のポイントの時間が設定されていない場合、現在足になる
if(!time1)
time1=TimeCurrent();
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 2 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time2)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//— 2 番目のポイントを最初のものから 9 バー左に設定する
time2=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、2 番目より 300 ポイント低くする
if(!price2)
price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 四角形描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//— 四角形を作成する
if(!RectangleCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— 四角形のアンカーポイントを移動する  
//— ループカウンタ
int h_steps=bars/2;
//— アンカーポイントを移動する  
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d1<bars-1)
d1+=1;
if(d2>1)
d2-=1;
//— ポイントをシフトする
if(!RectanglePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!RectanglePointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
int v_steps=accuracy/2;
//— アンカーポイントを移動する  
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1<accuracy-1)
p1+=1;
if(p2>1)
p2-=1;
//— ポイントをシフトする
if(!RectanglePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!RectanglePointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートから四角形を削除する
RectangleDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_TRIANGLE

三角形

ObjTriangle

注意事項

三角形では、色で塗りつぶすモードが OBJPROP_FILL プロパティによって設定されます。

次のスクリプトは、チャート上で三角形を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script creates triangle on the chart.”
#property description “Anchor point coordinates are set in”
#property description “percentage of the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“Triangle”;       // 三角形の名称
input int             InpDate1=25;               // 1 番目のポイントの日付( % )
input int             InpPrice1=50;             // 1 番目のポイントの価格( % )
input int             InpDate2=70;               // 2 番目のポイントの日付( % )
input int             InpPrice2=70;             // 2 番目のポイントの価格( % )
input int             InpDate3=65;               // 3 番目のポイントの日付( % )
input int             InpPrice3=20;             // 3 番目のポイントの価格( % )
input color           InpColor=clrRed;           // 三角形の色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // 三角形の線のスタイル
input int             InpWidth=2;               // 三角形の線の幅
input bool           InpFill=false;             // 三角形を色で塗りつぶす
input bool           InpBack=false;             // 背景の三角形
input bool           InpSelection=true;         // 強調表示して移動
input bool           InpHidden=true;           // オブジェクトリストに隠す
input long           InpZOrder=0;               // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標で三角形を作成する                                         |
//+——————————————————————+
bool TriangleCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“Triangle”,   // 三角形の名称
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,         // 2 番目のポイントの価格
datetime              time3=0,           // 3 番目のポイントの時間
double                price3=0,         // 3 番目のポイントの価
const color           clr=clrRed,       // 三角形の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 三角形の線のスタイル
const int             width=1,           // 三角形の線の 幅
const bool            fill=false,       // 三角形を色で塗りつぶす
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeTriangleEmptyPoints(time1,price1,time2,price2,time3,price3);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標で三角形を作成する
if(!ObjectCreate(chart_ID,name,OBJ_TRIANGLE,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
“: failed to create a triangle! Error code = “,GetLastError());
return(false);
}
//— 三角形の色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 三角形の線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 三角形の線の幅を設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 三角形を色で塗りつぶすモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示して 三角形を移動するモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| 三角形のアンカーポイントを移動する                                         |
//+——————————————————————+
bool TrianglePointChange(const long   chart_ID=0,     // チャート識別子
const string name=“Triangle”, // 三角形の名称
const int    point_index=0,   // アンカーポイントのインデックス
datetime     time=0,         // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 三角形を削除する                                                     |
//+——————————————————————+
bool TriangleDelete(const long   chart_ID=0,     // チャート識別子
const string name=“Triangle”) // 三角形の名称
{
//— エラー値をリセットする
ResetLastError();
//— 三角形を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete the ellipse! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 三角形のアンカーポイントの値をチェックして                                     |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeTriangleEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2,
datetime &time3,double &price3)
{
//— 1 番目のポイントの時間が設定されていない場合、現在足になる
if(!time1)
time1=TimeCurrent();
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 2 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time2)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//— 2 番目のポイントを最初のものから 9 バー左に設定する
time2=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、2 番目より 300 ポイント低くする
if(!price2)
price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//— 3 番目のポイントの時間が設定されていない場合、2 番目のポイントの日に等しい
if(!time3)
time3=time2;
//— 3 番目のポイントの価格が設定されていない場合、最初のポイントに等しい
if(!price3)
price3=price1;
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 三角形描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//— 三角形を作成する
if(!TriangleCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpColor,InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— now, move the triangle anchor points
//— ループカウンタ
int v_steps=accuracy*3/10;
//— 1 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1>1)
p1-=1;
//— ポイントを移動する
if(!TrianglePointChange(0,InpName,0,date[d1],price[p1]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
int h_steps=bars*9/20-1;
//— 2 番目のアンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d2>1)
d2-=1;
//— ポイントを移動する
if(!TrianglePointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
v_steps=accuracy/4;
//— 3 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p3<accuracy-1)
p3+=1;
//— ポイントを移動する
if(!TrianglePointChange(0,InpName,2,date[d3],price[p3]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートから三角形を削除する
TriangleDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ELLIPSE

楕円形

ObjEllipse

注意事項

楕円形では、色で塗りつぶすモードが OBJPROP_FILL プロパティによって設定されます。

次のスクリプトは、チャート上で楕円形を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

//— 説明
#property description “Script creates ellipse on the chart.”
#property description “Anchor point coordinates are set”
#property description “in percentage of the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“Ellipse”;         // 楕円形名
input int             InpDate1=30;               // 1 番目のポイントの日付( % )
input int             InpPrice1=20;             // 1 番目のポイントの価格( % )
input int             InpDate2=70;               // 2 番目のポイントの日付( % )
input int             InpPrice2=80;             // 2 番目のポイントの価格( % )
input int             InpDate3=50;               // 3 番目のポイントの日付( % )
input int             InpPrice3=60;             // 3 番目のポイントの価格( % )
input color           InpColor=clrRed;           // 楕円形の色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // 楕円形の線のスタイル
input int             InpWidth=2;               // 楕円形の線の幅
input bool           InpFill=false;             // 楕円形を色で塗りつぶす
input bool           InpBack=false;             // 背景の楕円形
input bool           InpSelection=true;         // 強調表示して移動
input bool           InpHidden=true;           // オブジェクトリストに隠す
input long           InpZOrder=0;               // マウスクリックの優先順位
//+——————————————————————+
//| 与えられた座標で楕円形を作成する                                         |
//+——————————————————————+
bool EllipseCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“Ellipse”,   // 楕円形の名称
const int             sub_window=0,     // サブウィンドウ番号
datetime              time1=0,           // 1 番目のポイントの時間
double                price1=0,         // 1 番目のポイントの価格
datetime              time2=0,           // 2 番目のポイントの時間
double                price2=0,         // 2 番目のポイントの価格
datetime              time3=0,           // 3 番目のポイントの時間
double                price3=0,         // 3 番目のポイントの価格
const color           clr=clrRed,       // 楕円形の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 楕円形の線のスタイル
const int             width=1,           // 楕円形の線の幅
const bool            fill=false,       // 楕円形を色で塗りつぶす
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeEllipseEmptyPoints(time1,price1,time2,price2,time3,price3);
//— エラー値をリセットする
ResetLastError();
//— 与えられた座標で楕円形を作成する
if(!ObjectCreate(chart_ID,name,OBJ_ELLIPSE,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
“: failed to create an ellipse! Error code = “,GetLastError());
return(false);
}
//— 楕円形の色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 楕円形の線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 楕円形の線の幅を設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 楕円形を色で塗りつぶすモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— 強調表示して楕円形を移動するモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool EllipsePointChange(const long   chart_ID=0,     // チャート識別子
const string name=“Ellipse”, // 楕円形の名称
const int    point_index=0, // アンカーポイントのインデックス
datetime     time=0,         // アンカーポイントの時間座標
double       price=0)       // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 楕円形を削除する                                                     |
//+——————————————————————+
bool EllipseDelete(const long   chart_ID=0,     // チャート識別子
const string name=“Ellipse”) // 楕円形の名称
{
//— エラー値をリセットする
ResetLastError();
//— 楕円形を削除する  
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete an ellipse! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 楕円形のアンカーポイントの値をチェックして                                     |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeEllipseEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2,
datetime &time3,double &price3)
{
//— 1 番目のポイントの時間が設定されていない場合、現在足になる
if(!time1)
time1=TimeCurrent();
//— 1 番目のポイントの価格が設定されていない場合、売値になる
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— 2 番目のポイントの時間が設定されていない場合、2 番目から 9 バー左に置かれる
if(!time2)
{
//— 最後の 10 バーのオープン時間を受信するための配列
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//— 2 番目のポイントを最初のものから 9 バー左に設定する
time2=temp[0];
}
//— 1 番目のポイントの価格が設定されていない場合、2 番目より 300 ポイント低くする
if(!price2)
price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//— 3 番目のポイントの時間が設定されていない場合、2 番目のポイントの日に等しい
if(!time3)
time3=time2;
//— 3 番目のポイントの価格が設定されていない場合、最初のポイントに等しい
if(!price3)
price3=price1;
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 楕円形描画のポイントを定義する
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//— 楕円形を作成する
if(!EllipseCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpColor,InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— 楕円形アンカーポイントを移動する 
//— ループカウンタ
int v_steps=accuracy/5;
//— 1 番目と2 番目のアンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p1<accuracy-1)
p1+=1;
if(p2>1)
p2-=1;
//— ポイントをシフトする
if(!EllipsePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!EllipsePointChange(0,InpName,1,date[d2],price[p2]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
int h_steps=bars/5;
//— 3 番目のアンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d3>1)
d3-=1;
//— ポイントを移動する
if(!EllipsePointChange(0,InpName,2,date[d3],price[p3]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートから楕円形を削除する
EllipseDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ARROW_THUMB_UP

サムズアップ記号

ObjArrowTumbUp

注意事項

記号に相対したアンカーポイントの位置関係は ENUM_ARROW_ANCHOR 列挙から選択出来ます。

5 以上の大きな矢印は MetaEditor でコードを書く際に OBJPROP_WIDTH プロパティ値を設定してのみ作成出来ます。

次のスクリプトは、チャート上でサムズアップ記号を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Thumbs Up” sign.”
#property description “Anchor point coordinate is set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“ThumbUp”;   // 記号名
input int               InpDate=75;           // アンカーポイントの日付( % )
input int               InpPrice=25;         // アンカーポイントの価格( % )
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // アンカーの種類
input color             InpColor=clrRed;     // 記号の色
input ENUM_LINE_STYLE   InpStyle=STYLE_DOT;   // 境界線のスタイル
input int               InpWidth=5;           // 記号サイズ
input bool             InpBack=false;       // 背景の記号
input bool             InpSelection=true;   // 強調表示して移動
input bool             InpHidden=true;       // オブジェクトリストに隠す
input long             InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| サムズアップ記号を作成する                                              |
//+——————————————————————+
bool ArrowThumbUpCreate(const long              chart_ID=0,           // チャート識別子
const string            name=“ThumbUp”,       // 記号名
const int               sub_window=0,         // サブウィンドウ番号
datetime                time=0,               // アンカーポイントの時刻
double                  price=0,             // アンカーポイントの価格
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // アンカーの種類
const color             clr=clrRed,           // 記号の色
const ENUM_LINE_STYLE   style=STYLE_SOLID,   // 境界線のスタイル
const int               width=3,             // 記号サイズ
const bool              back=false,           // 背景で表示する
const bool              selection=true,       // 強調表示して移動
const bool              hidden=true,         // オブジェクトリストに隠す
const long              z_order=0)           // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeArrowEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— 記号を作成する
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_THUMB_UP,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create “Thumbs Up” sign! Error code = “,GetLastError());
return(false);
}
//— アンカーの種類を設定
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//— 記号の色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 境界線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 記号のサイズを設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで記号を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                                |
//+——————————————————————+
bool ArrowThumbUpMove(const long   chart_ID=0,     // チャート識別子
const string name=“ThumbUp”, // オブジェクト名
datetime     time=0,         // アンカーポイントの時間座標
double       price=0)       // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| サムズアップ記号のアンカーの種類を変更する                                   |
//+——————————————————————+
bool ArrowThumbUpAnchorChange(const long              chart_ID=0,       // チャート識別子
const string            name=“ThumbUp”,   // オブジェクト名
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // アンカーの種類
{
//— エラー値をリセットする
ResetLastError();
//— アンカーの種類を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
“: failed to change anchor type! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| サムズアップ記号を削除する                                              |
//+——————————————————————+
bool ArrowThumbUpDelete(const long   chart_ID=0,     // チャート識別子
const string name=“ThumbUp”) // 記号名
{
//— エラー値をリセットする
ResetLastError();
//— 記号を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Thumbs Up” sign! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 記号描画のポイントを定義する
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//— チャート上にサムズアップ記号を作成する
if(!ArrowThumbUpCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動し、記号との相互位置を変更する
//— ループカウンタ
int h_steps=bars/4;
//— アンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d>1)
d-=1;
//— ポイントを移動する
if(!ArrowThumbUpMove(0,InpName,date[d],price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
int v_steps=accuracy/4;
//— アンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p<accuracy-1)
p+=1;
//— ポイントを移動する
if(!ArrowThumbUpMove(0,InpName,date[d],price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 記号に相対したアンカーポイントの位置関係を変更する
ArrowThumbUpAnchorChange(0,InpName,ANCHOR_BOTTOM);
//— チャートを再描画する
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//— チャートから記号を削除する
ArrowThumbUpDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ARROW_THUMB_DOWN

サムズダウン記号

ObjArrowTumbDown

注意事項

記号に相対したアンカーポイントの位置関係は ENUM_ARROW_ANCHOR 列挙から選択出来ます。

5 以上の大きな矢印は MetaEditor でコードを書く際に OBJPROP_WIDTH プロパティ値を設定してのみ作成出来ます。

次のスクリプトは、チャート上でサムズダウン記号を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

 

//— 説明
#property description “Script draws “Thumbs Down” sign.”
#property description “Anchor point coordinate is set in percentage of”
#property description “the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“ThumbDown”;     // 記号名
input int               InpDate=25;             // アンカーポイントの日付( % )
input int               InpPrice=75;             // アンカーポイントの価格( % )
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_BOTTOM; // アンカーの種類
input color             InpColor=clrRed;         // 記号の色
input ENUM_LINE_STYLE   InpStyle=STYLE_DOT;     // 境界線のスタイル
input int               InpWidth=5;             // 記号サイズ
input bool             InpBack=false;           // 背景の記号
input bool             InpSelection=true;       // 強調表示して移動
input bool             InpHidden=true;         // オブジェクトリストに隠す
input long             InpZOrder=0;             // マウスクリックの優先順位
//+——————————————————————+
//| サムズダウン記号を作成する                                              |
//+——————————————————————+
bool ArrowThumbDownCreate(const long              chart_ID=0,           // チャート識別子
const string            name=“ThumbDown”,     // サイン名
const int               sub_window=0,         // サブウィンドウ番号
datetime                time=0,               // アンカーポイントの時刻
double                  price=0,             // アンカーポイントの価格
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // アンカーの種類
const color             clr=clrRed,           // 記号の色
const ENUM_LINE_STYLE   style=STYLE_SOLID,   // 境界線のスタイル
const int               width=3,             // 記号サイズ
const bool              back=false,           // 背景で表示する
const bool              selection=true,       // 強調表示して移動
const bool              hidden=true,         // オブジェクトリストに隠す
const long              z_order=0)           // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeArrowEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— 記号を作成する
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_THUMB_DOWN,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create “Thumbs Down” sign! Error code = “,GetLastError());
return(false);
}
//— アンカーの種類を設定
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//— 記号の色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 境界線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 記号のサイズを設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで記号を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool ArrowThumbDownMove(const long   chart_ID=0,       // チャート識別子
const string name=“ThumbDown”, // オブジェクト名
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| サムズダウン記号のアンカーの種類を変更する                                  |
//+——————————————————————+
bool ArrowThumbDownAnchorChange(const long              chart_ID=0,       // チャート識別子
const string            name=“ThumbDown”, // オブジェクト名
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // アンカーの種類
{
//— エラー値をリセットする
ResetLastError();
//— アンカーの種類を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
“: failed to change anchor type! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| サムズダウン記号を削除する                                              |
//+——————————————————————+
bool ArrowThumbDownDelete(const long   chart_ID=0,       // チャート識別子
const string name=“ThumbDown”) // 記号名
{
//— エラー値をリセットする
ResetLastError();
//— 記号を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Thumbs Down” sign! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 記号描画のポイントを定義する
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//— チャート上にサムズダウン記号を作成する
if(!ArrowThumbDownCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動し、記号との相互位置を変更する
//— ループカウンタ
int h_steps=bars/4;
//— アンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d<bars-1)
d+=1;
//— ポイントを移動する
if(!ArrowThumbDownMove(0,InpName,date[d],price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— ループカウンタ
int v_steps=accuracy/4;
//— アンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p>1)
p-=1;
//— ポイントを移動する
if(!ArrowThumbDownMove(0,InpName,date[d],price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 記号に相対したアンカーポイントの位置関係を変更する
ArrowThumbDownAnchorChange(0,InpName,ANCHOR_TOP);
//— チャートを再描画する
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//— チャートから記号を削除する
ArrowThumbDownDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ARROW_UP

上矢印記号

ObjArrowUp

注意事項

記号に相対したアンカーポイントの位置関係は ENUM_ARROW_ANCHOR 列挙から選択出来ます。

5 以上の大きな矢印は MetaEditor でコードを書く際に OBJPROP_WIDTH プロパティ値を設定してのみ作成出来ます。

次のスクリプトは、チャート上で上矢印記号を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Arrow Up” sign.”
#property description “Anchor point coordinate is set in”
#property description “percentage of the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“ArrowUp”;   // 記号名
input int               InpDate=25;           // アンカーポイントの日付( % )
input int               InpPrice=25;         // アンカーポイントの価格( % )
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // アンカーの種類
input color             InpColor=clrRed;     // 記号の色
input ENUM_LINE_STYLE   InpStyle=STYLE_DOT;   // 境界線のスタイル
input int               InpWidth=5;           // 記号サイズ
input bool             InpBack=false;       // 背景の記号
input bool             InpSelection=false;   // 強調表示して移動
input bool             InpHidden=true;       // オブジェクトリストに隠す
input long             InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| 上矢印記号を作成する                                                 |
//+——————————————————————+
bool ArrowUpCreate(const long              chart_ID=0,           // チャート識別子
const string            name=“ArrowUp”,       // 記号名
const int               sub_window=0,         // サブウィンドウ番号
datetime                time=0,               // アンカーポイントの時刻
double                  price=0,             // アンカーポイントの価格
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // アンカーの種類
const color             clr=clrRed,           // 記号の色
const ENUM_LINE_STYLE   style=STYLE_SOLID,   // 境界線のスタイル
const int               width=3,             // 記号サイズ
const bool              back=false,           // 背景で表示する
const bool              selection=true,       // 強調表示して移動
const bool              hidden=true,         // オブジェクトリストに隠す
const long              z_order=0)           // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeArrowEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— 記号を作成する
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_UP,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create “Arrow Up” sign! Error code = “,GetLastError());
return(false);
}
//— アンカーの種類を設定
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//— 記号の色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 境界線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 記号のサイズを設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで記号を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool ArrowUpMove(const long   chart_ID=0,     // チャート識別子
const string name=“ArrowUp”, // オブジェクト名
datetime     time=0,         // アンカーポイントの時間座標
double       price=0)       // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 下矢印記号のアンカーの種類を変更する                                      |
//+——————————————————————+
bool ArrowUpAnchorChange(const long              chart_ID=0,       // チャート識別子
const string            name=“ArrowUp”,   // オブジェクト名
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // アンカーの種類
{
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントの位置を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
“: failed to change anchor type! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 上矢印記号を削除する                                                 |
//+——————————————————————+
bool ArrowUpDelete(const long   chart_ID=0,     // チャート識別子
const string name=“ArrowUp”) // 記号名
{
//— エラー値をリセットする
ResetLastError();
//— 記号を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Arrow Up” sign! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 記号描画のポイントを定義する
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//— チャートに上矢印を作成する
if(!ArrowUpCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動し、記号との相互位置を変更する
//— ループカウンタ
int v_steps=accuracy/2;
//— アンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p<accuracy-1)
p+=1;
//— ポイントを移動する
if(!ArrowUpMove(0,InpName,date[d],price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— 記号に相対したアンカーポイントの位置関係を変更する
ArrowUpAnchorChange(0,InpName,ANCHOR_BOTTOM);
//— チャートを再描画する
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//— チャートから記号を削除する
ArrowUpDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ARROW_DOWN

下矢印記号

ObjArrowDown

注意事項

記号に相対したアンカーポイントの位置関係は ENUM_ARROW_ANCHOR 列挙から選択出来ます。

5 以上の大きな矢印は MetaEditor でコードを書く際に OBJPROP_WIDTH プロパティ値を設定してのみ作成出来ます。

次のスクリプトは、チャート上で下矢印記号を作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

//— 説明
#property description “Script draws “Arrow Down” sign.”
#property description “Anchor point coordinate is set in”
#property description “percentage of the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“ArrowDown”;     // 記号名
input int               InpDate=75;             // アンカーポイントの日付( % )
input int               InpPrice=75;             // アンカーポイントの価格( % )
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_BOTTOM; // アンカーの種類
input color             InpColor=clrRed;         // 記号の色
input ENUM_LINE_STYLE   InpStyle=STYLE_DOT;     // 境界線のスタイル
input int               InpWidth=5;             // 記号サイズ
input bool             InpBack=false;           // 背景の記号
input bool             InpSelection=false;     // 強調表示して移動
input bool             InpHidden=true;         // オブジェクトリストに隠す
input long             InpZOrder=0;             // マウスクリックの優先順位
//+——————————————————————+
//| 下矢印記号を作成する                                                 |
//+——————————————————————+
bool ArrowDownCreate(const long              chart_ID=0,           // チャート識別子
const string            name=“ArrowDown”,     // 記号名
const int               sub_window=0,         // サブウィンドウ番号
datetime                time=0,               // アンカーポイントの時刻
double                  price=0,             // アンカーポイントの価格
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // アンカーの種類
const color             clr=clrRed,           // 記号の色
const ENUM_LINE_STYLE   style=STYLE_SOLID,   // 境界線のスタイル
const int               width=3,             // 記号サイズ
const bool              back=false,           // 背景で表示する
const bool              selection=true,       // 強調表示して移動
const bool              hidden=true,         // オブジェクトリストに隠す
const long              z_order=0)           // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeArrowEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— 記号を作成する
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_DOWN,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create “Arrow Down” sign! Error code = “,GetLastError());
return(false);
}
//— アンカーの種類
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//— 記号の色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 境界線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 記号のサイズを設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで記号を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool ArrowDownMove(const long   chart_ID=0,       // チャート識別子
const string name=“ArrowDown”, // オブジェクト名
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
nbsp;}
//+——————————————————————+
//| 下矢印記号のアンカーの種類を変更する                                      |
//+——————————————————————+
bool ArrowDownAnchorChange(const long              chart_ID=0,       // チャート識別子
const string            name=“ArrowDown”, // オブジェクト名
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // アンカーの種類
{
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントの位置を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
“: failed to change anchor type! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 下矢印記号を削除する                                                 |
//+——————————————————————+
bool ArrowDownDelete(const long   chart_ID=0,       // チャート識別子
const string name=“ArrowDown”) // 記号名
{
//— エラー値をリセットする
ResetLastError();
//— 記号を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Arrow Down” sign! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 記号描画のポイントを定義する
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//— チャートに下矢印を作成する
if(!ArrowDownCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動し、記号との相互位置を変更する
//— ループカウンタ
int v_steps=accuracy/2;
//— アンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p>1)
p-=1;
//— ポイントを移動する
if(!ArrowDownMove(0,InpName,date[d],price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— 記号に相対したアンカーポイントの位置関係を変更する
ArrowDownAnchorChange(0,InpName,ANCHOR_TOP);
//— チャートを再描画する
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//— チャートから記号を削除する
ArrowDownDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ARROW_STOP

ストップサイン

ObjArrowStop

注意事項

記号に相対したアンカーポイントの位置関係は ENUM_ARROW_ANCHOR 列挙から選択出来ます。

5 以上の大きな矢印は MetaEditor でコードを書く際に OBJPROP_WIDTH プロパティ値を設定してのみ作成出来ます。

次のスクリプトは、チャート上でストップサインを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Stop” sign.”
#property description “Anchor point coordinate is set in”
#property description “percentage of the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“ArrowStop”;     // 記号名
input int               InpDate=10;             // アンカーポイントの日付( % )
input int               InpPrice=50;             // アンカーポイントの価格( % )
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_BOTTOM; // アンカーの種類
input color             InpColor=clrRed;         // 記号の色
input ENUM_LINE_STYLE   InpStyle=STYLE_DOT;     // 境界線のスタイル
input int               InpWidth=5;             // 記号サイズ
input bool             InpBack=false;           // 背景の記号
input bool             InpSelection=false;     // 強調表示して移動
input bool             InpHidden=true;         // オブジェクトリストに隠す
input long             InpZOrder=0;             // マウスクリックの優先順位
//+——————————————————————+
//| ストップサインを作成する                                                 |
//+——————————————————————+
bool ArrowStopCreate(const long              chart_ID=0,           // チャート識別子
const string            name=“ArrowStop”,     // 記号名
const int               sub_window=0,         // サブウィンドウ番号
datetime                time=0,               // アンカーポイントの時刻
double                  price=0,             // アンカーポイントの価格
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // アンカーの種類
const color             clr=clrRed,           // 記号の色
const ENUM_LINE_STYLE   style=STYLE_SOLID,   // 境界線のスタイル
const int               width=3,             // 記号サイズ
const bool              back=false,           // 背景で表示する
const bool              selection=true,       // 強調表示して移動
const bool              hidden=true,         // オブジェクトリストに隠す
const long              z_order=0)           // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeArrowEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— 記号を作成する
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_STOP,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create “Stop” sign! Error code = “,GetLastError());
return(false);
}
//— アンカーの種類を設定
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//— 記号の色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 境界線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 記号のサイズを設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで記号を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool ArrowStopMove(const long   chart_ID=0,       // チャート識別子
const string name=“ArrowStop”, // オブジェクト名
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ストップサインのアンカーの種類を変更する                                      |
//+——————————————————————+
bool ArrowStopAnchorChange(const long              chart_ID=0,       // チャート識別子
const string            name=“ArrowStop”, // オブジェクト名
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // アンカーポイント位置
{
//— エラー値をリセットする
ResetLastError();
//— アンカーの種類を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
“: failed to change anchor type! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ストップサインを削除する                                                 |
//+——————————————————————+
bool ArrowStopDelete(const long   chart_ID=0,       // チャート識別子
const string name=“ArrowStop”) // ラベル名
{
//— エラー値をリセットする
ResetLastError();
//— 記号を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Stop” sign! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 記号描画のポイントを定義する
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//— チャートにストップサインを作成する
if(!ArrowStopCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動し、記号との相互位置を変更する
//— ループカウンタ
int h_steps=bars*2/5;
//— アンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d<bars-1)
d+=1;
//— ポイントを移動する
if(!ArrowStopMove(0,InpName,date[d],price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.025 秒の遅れ
Sleep(25);
}
//— 記号に相対したアンカーポイントの位置関係を変更する
ArrowStopAnchorChange(0,InpName,ANCHOR_TOP);
//— チャートを再描画する
ChartRedraw();
//— ループカウンタ
h_steps=bars*2/5;
//— アンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d<bars-1)
d+=1;
//— ポイントを移動する
if(!ArrowStopMove(0,InpName,date[d],price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.025 秒の遅れ
Sleep(25);
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートから記号を削除する
ArrowStopDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ARROW_CHECK

チェックサイン

ObjArrowCheck

注意事項

記号に相対したアンカーポイントの位置関係は ENUM_ARROW_ANCHOR 列挙から選択出来ます。

5 以上の大きな矢印は MetaEditor でコードを書く際に OBJPROP_WIDTH プロパティ値を設定してのみ作成出来ます。

次のスクリプトは、チャート上でチェックサインを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Check” sign.”
#property description “Anchor point coordinate is set in”
#property description “percentage of the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“ArrowCheck”; // 記号名
input int               InpDate=10;           // アンカーポイントの日付( % )
input int               InpPrice=50;         // アンカーポイントの価格( % )
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // アンカーの種類
input color             InpColor=clrRed;     // 記号の色
input ENUM_LINE_STYLE   InpStyle=STYLE_DOT;   // 境界線のスタイル
input int               InpWidth=5;           // 記号サイズ
input bool             InpBack=false;       // 背景の記号
input bool             InpSelection=false;   // 強調表示して移動
input bool             InpHidden=true;       // オブジェクトリストに隠す
input long             InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| チェックサインを作成する                                                 |
//+——————————————————————+
bool ArrowCheckCreate(const long              chart_ID=0,           // チャート識別子
const string            name=“ArrowCheck”,   // 記号名
const int               sub_window=0,         // サブウィンドウ番号
datetime                time=0,               // アンカーポイントの時刻
double                  price=0,             // アンカーポイントの価格
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // アンカーの種類
const color             clr=clrRed,           // 記号の色
const ENUM_LINE_STYLE   style=STYLE_SOLID,   // 境界線のスタイル
const int               width=3,             // 記号サイズ
const bool              back=false,           // 背景で表示する
const bool              selection=true,       // 強調表示して移動
const bool              hidden=true,         // オブジェクトリストに隠す
const long              z_order=0)           // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeArrowEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— 記号を作成する
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_CHECK,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create “Check” sign! Error code = “,GetLastError());
return(false);
}
//— アンカーの種類を設定
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//— 記号の色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 境界線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 記号のサイズを設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで記号を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool ArrowCheckMove(const long   chart_ID=0,       // チャート識別子
const string name=“ArrowCheck”, // オブジェクト名
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)           // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| チェックアンカーの種類を変更する                                           |
//+——————————————————————+
bool ArrowCheckAnchorChange(const long              chart_ID=0,       // チャート識別子
const string            name=“ArrowCheck”, // オブジェクト名
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // アンカーの種類
{
//— エラー値をリセットする
ResetLastError();
//— アンカーの種類を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
“: failed to change anchor type! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| チェックサインを削除する                                                 |
//+——————————————————————+
bool ArrowCheckDelete(const long   chart_ID=0,       // チャート識別子
const string name=“ArrowCheck”) // 記号名
{
//— エラー値をリセットする
ResetLastError();
//— 記号を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Check” sign! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 記号描画のポイントを定義する
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//— チャートにチェックサインを作成する
if(!ArrowCheckCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動し、記号との相互位置を変更する
//— ループカウンタ
int h_steps=bars*2/5;
//— アンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d<bars-1)
d+=1;
//— ポイントを移動する
if(!ArrowCheckMove(0,InpName,date[d],price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.025 秒の遅れ
Sleep(25);
}
//— 記号に相対したアンカーポイントの位置関係を変更する
ArrowCheckAnchorChange(0,InpName,ANCHOR_BOTTOM);
//— チャートを再描画する
ChartRedraw();
//— ループカウンタ
h_steps=bars*2/5;
//— アンカーポイントを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d<bars-1)
d+=1;
//— ポイントを移動する
if(!ArrowCheckMove(0,InpName,date[d],price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.025 秒の遅れ
Sleep(25);
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートから記号を削除する
ArrowCheckDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ARROW_LEFT_PRICE

左プライスラベル。

ObjArrowLeftPrice

次のスクリプトは、チャート上で左プライスラベルを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script creates the left price label on the chart.”
#property description “Anchor point coordinate is set in”
#property description “percentage of the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“LeftPrice”; // 価格ラベル名
input int               InpDate=100;         // アンカーポイントの日付( % )
input int               InpPrice=10;         // アンカーポイントの価格( % )
input color             InpColor=clrRed;     // 価格ラベルの色
input ENUM_LINE_STYLE   InpStyle=STYLE_SOLID; // 境界線のスタイル
input int               InpWidth=2;           // 価格ラベルのサイズ
input bool             InpBack=false;       // 背景ラベル
input bool             InpSelection=true;   // 強調表示して移動
input bool             InpHidden=true;       // オブジェクトリストに隠す
input long             InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| 左プライスラベルを作成する                                               |
//+——————————————————————+
bool ArrowLeftPriceCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“LeftPrice”, // 価格ラベル名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time=0,           // アンカーポイントの時刻
double                price=0,           // アンカーポイントの価格
const color           clr=clrRed,       // 価格ラベルの色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 境界線のスタイル
const int             width=1,           // 価格ラベルのサイズ
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeArrowEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— 価格ラベルを作成する
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_LEFT_PRICE,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create the left price label! Error code = “,GetLastError());
return(false);
}
//— ラベルの色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 境界線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— ラベルサイズを設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスでラベルを移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool ArrowLeftPriceMove(const long   chart_ID=0,       // チャート識別子
const string name=“LeftPrice”, // ラベル名
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 左プライスラベルをチャートから削除する                                       |
//+——————————————————————+
bool ArrowLeftPriceDelete(const long   chart_ID=0,       // チャート識別子
const string name=“LeftPrice”) // ラベル名
{
//— エラー値をリセットする
ResetLastError();
//— ラベルを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete the left price label! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— ラベル描画のポイントを定義する
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//— 左プライスラベルをチャートに作成する
if(!ArrowLeftPriceCreate(0,InpName,0,date[d],price[p],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動する
//— ループカウンタ
int v_steps=accuracy*4/5;
//— アンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p<accuracy-1)
p+=1;
//— ポイントを移動する
if(!ArrowLeftPriceMove(0,InpName,date[d],price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからラベルを削除する
ArrowLeftPriceDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ARROW_RIGHT_PRICE

右プライスラベル

ObjArrowRightPrice

次のスクリプトは、チャート上で右プライスラベルを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script creates the right price label on the chart.”
#property description “Anchor point coordinate is set in”
#property description “percentage of the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“RightPrice”; // 価格ラベル名
input int               InpDate=0;           // アンカーポイントの日付( % )
input int               InpPrice=90;         // アンカーポイントの価格( % )
input color             InpColor=clrRed;     // 価格ラベルの色
input ENUM_LINE_STYLE   InpStyle=STYLE_SOLID; // 境界線のスタイル
input int               InpWidth=2;           // 価格ラベルのサイズ
input bool             InpBack=false;       // 背景ラベル
input bool             InpSelection=true;   // 強調表示して移動
input bool             InpHidden=true;       // オブジェクトリストに隠す
input long             InpZOrder=0;         // マウスクリックの優先順位
//+——————————————————————+
//| 右プライスラベルを作成する                                               |
//+——————————————————————+
bool ArrowRightPriceCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“RightPrice”, // 価格ラベル名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time=0,           // アンカーポイントの時刻
double                price=0,           // アンカーポイントの価格
const color           clr=clrRed,       // 価格ラベルの色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 境界線のスタイル
const int             width=1,           // 価格ラベルのサイズ
const bool            back=false,       // 背景で表示する
const bool            selection=true,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeArrowEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— 価格ラベルを作成する
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_RIGHT_PRICE,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create the right price label! Error code = “,GetLastError());
return(false);
}
//— ラベルの色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 境界線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— ラベルサイズを設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスでラベルを移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool ArrowRightPriceMove(const long   chart_ID=0,       // チャート識別子
const string name=“RightPrice”, // ラベル名
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)           // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 右プライスラベルをチャートから削除する                                       |
//+——————————————————————+
bool ArrowRightPriceDelete(const long   chart_ID=0,       // チャート識別子
const string name=“RightPrice”) // ラベル名
{
//— エラー値をリセットする
ResetLastError();
//— ラベルを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete the right price label! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— ラベル描画のポイントを定義する
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//— 右プライスラベルをチャートに作成する
if(!ArrowRightPriceCreate(0,InpName,0,date[d],price[p],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— アンカーポイントを移動する
//— ループカウンタ
int v_steps=accuracy*4/5;
//— アンカーポイントを移動する
for(int i=0;i<v_steps;i++)
{
//— 次の値を使用する
if(p>1)
p-=1;
//— ポイントを移動する
if(!ArrowRightPriceMove(0,InpName,date[d],price[p]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからラベルを削除する
ArrowRightPriceDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_ARROW_BUY

買いサイン

ObjArrowBuy

次のスクリプトは、チャート上で買いサインを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Buy” signs in the chart window.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input color InpColor=C’3,95,172′; // 記号の色
//+——————————————————————+
//| 買いサインを作成する                                                  |
//+——————————————————————+
bool ArrowBuyCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“ArrowBuy”,   // 記号名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time=0,           // アンカーポイントの時刻
double                price=0,           // アンカーポイントの価格
const color           clr=C’3,95,172′,   // 記号の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 強調表示時の線のスタイル
const int             width=1,           // 強調表示時の線のサイズ
const bool            back=false,       // 背景で表示する
const bool            selection=false,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeArrowEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— 記号を作成する
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_BUY,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create “Buy” sign! Error code = “,GetLastError());
return(false);
}
//— 記号の色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 強調表示時の線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 強調表示時の線のサイズを設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで記号を移動させるモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool ArrowBuyMove(const long   chart_ID=0,     // チャート識別子
const string name=“ArrowBuy”, // オブジェクト名
datetime     time=0,         // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 買いサインを削除する                                                  |
//+——————————————————————+
bool ArrowBuyDelete(const long   chart_ID=0,     // チャート識別子
const string name=“ArrowBuy”) // 記号名
{
//— エラー値をリセットする
ResetLastError();
//— 記号を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Buy” sign! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
datetime date[]; // 表示中のバーの日付を格納するための配列
double   low[]; // 表示中の足の安値を格納するための配列
double   high[]; // 表示中の足の高値を格納するための配列
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(low,bars);
ArrayResize(high,bars);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 安値の配列に書き込む
if(CopyLow(Symbol(),Period(),0,bars,low)==-1)
{
Print(“Failed to copy the values of Low prices! Error code = “,GetLastError());
return;
}
//— 高値の配列に書き込む
if(CopyHigh(Symbol(),Period(),0,bars,high)==-1)
{
Print(“Failed to copy the values of High prices! Error code = “,GetLastError());
return;
}
//— 表示された各足の低ポイントで買い記号を作成する
for(int i=0;i<bars;i++)
{
if(!ArrowBuyCreate(0,“ArrowBuy_”+(string)i,0,date[i],low[i],InpColor))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 表示された各足の買い記号を高ポイントに移動する
for(int i=0;i<bars;i++)
{
if(!ArrowBuyMove(0,“ArrowBuy_”+(string)i,date[i],high[i]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 買いサインを削除する  
for(int i=0;i<bars;i++)
{
if(!ArrowBuyDelete(0,“ArrowBuy_”+(string)i))
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//—
}

OBJ_ARROW_SELL

売りサイン

ObjArrowSell

次のスクリプトは、チャート上で売りサインを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Sell” signs in the chart window.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input color InpColor=C’225,68,29′; // 記号の色
//+——————————————————————+
//| 売りサインを作成する                                                   |
//+——————————————————————+
bool ArrowSellCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“ArrowSell”, // 記号名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time=0,           // アンカーポイントの時刻
double                price=0,           // アンカーポイントの価格
const color           clr=C’225,68,29′, // 記号の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 強調表示時の線のスタイル
const int             width=1,           // 強調表示時の線のサイズ
const bool            back=false,       // 背景で表示する
const bool            selection=false,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeArrowEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— 記号を作成する
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_SELL,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create “Sell” sign! Error code = “,GetLastError());
return(false);
}
//— 記号の色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 強調表示時の線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 強調表示時の線のサイズを設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで記号を移動させるモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool ArrowSellMove(const long   chart_ID=0,       // チャート識別子
const string name=“ArrowSell”, // オブジェクト名
datetime     time=0,           // アンカーポイントの時間座標
double       price=0)         // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 売りサインを作成する                                                   |
//+——————————————————————+
bool ArrowSellDelete(const long   chart_ID=0,       // チャート識別子
const string name=“ArrowSell”) // 記号名
{
//— エラー値をリセットする
ResetLastError();
//— 記号を削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Sell” sign! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
datetime date[]; // 表示中のバーの日付を格納するための配列
double   low[]; // 表示中の足の安値を格納するための配列
double   high[]; // 表示中の足の高値を格納するための配列
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(low,bars);
ArrayResize(high,bars);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 安値の配列に書き込む
if(CopyLow(Symbol(),Period(),0,bars,low)==-1)
{
Print(“Failed to copy the values of Low prices! Error code = “,GetLastError());
return;
}
//— 高値の配列に書き込む
if(CopyHigh(Symbol(),Period(),0,bars,high)==-1)
{
Print(“Failed to copy the values of High prices! Error code = “,GetLastError());
return;
}
//— 表示された各足の高ポイントで売り記号を作成する
for(int i=0;i<bars;i++)
{
if(!ArrowSellCreate(0,“ArrowSell_”+(string)i,0,date[i],high[i],InpColor))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 表示された各足の売り記号を低ポイントに移動する
for(int i=0;i<bars;i++)
{
if(!ArrowSellMove(0,“ArrowSell_”+(string)i,date[i],low[i]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 売りサインを削除する
for(int i=0;i<bars;i++)
{
if(!ArrowSellDelete(0,“ArrowSell_”+(string)i))
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//—
}

OBJ_ARROW

矢印オブジェクト

ObjArrow

注意事項

オブジェクトのアンカーポイントの位置関係は ENUM_ARROW_ANCHOR から選択することが出来ます。

5以上の大きな矢印はMetaEditorでコードを書く際に OBJPROP_WIDTH プロパティ値を設定してのみ作成出来ます。

必要な矢印タイプはワインディングフォントの記号コードのいずれかを設定して選択出来ます。

次のスクリプトは、チャート上で矢印オブジェクトを作成し、その型を変更します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script creates a random arrow in the chart window.”
#property description “Anchor point coordinate is set in”
#property description “percentage of the chart window size.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“Arrow”;       // 矢印名
input int               InpDate=50;             // アンカーポイントの日付( % )
input int               InpPrice=50;           // アンカーポイントの価格( % )
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP;   // アンカーの種類
input color             InpColor=clrDodgerBlue; // 矢印の色
input ENUM_LINE_STYLE   InpStyle=STYLE_SOLID;   // 境界線のスタイル
input int               InpWidth=10;           // 矢印のサイズ
input bool             InpBack=false;         // 背景の→
input bool             InpSelection=false;     // 強調表示して移動
input bool             InpHidden=true;         // オブジェクトリストに隠す
input long             InpZOrder=0;           // マウスクリックの優先順位
//+——————————————————————+
//| 矢印の作成                                                         |
//+——————————————————————+
bool ArrowCreate(const long              chart_ID=0,           // チャート識別子
const string            name=“Arrow”,         // 矢印名
const int               sub_window=0,         // サブウィンドウ番号
datetime                time=0,               // アンカーポイントの時刻
double                  price=0,             // アンカーポイントの価格
const uchar             arrow_code=252,       // 矢印コード
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // アンカーポイント位置
const color             clr=clrRed,           // 矢印の色
const ENUM_LINE_STYLE   style=STYLE_SOLID,   // 境界線のスタイル
const int               width=3,             // 矢印のサイズ
const bool              back=false,           // 背景で表示する
const bool              selection=true,       // 強調表示して移動
const bool              hidden=true,         // オブジェクトリストに隠す
const long              z_order=0)           // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeArrowEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— 矢印を作成
if(!ObjectCreate(chart_ID,name,OBJ_ARROW,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create an arrow! Error code = “,GetLastError());
return(false);
}
//— 矢印コードを設定
ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,arrow_code);
//— アンカーの種類を設定
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//— 矢印の色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 境界線のスタイルを設定
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— 矢印のサイズを設定
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスで矢印を移動させるモードを有効(true)か無効(false)にする
//— ObjectCreate 関数を使用してグラフィックオブジェクトを作成する際、オブジェクトは
//— デフォルトではハイライトされたり動かされたり出来ない。このメソッド内では、選択パラメータは
//— デフォルトでは true でハイライトと移動を可能にする。
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool ArrowMove(const long   chart_ID=0,   // チャート識別子
const string name=“Arrow”, // オブジェクト名
datetime     time=0,       // アンカーポイントの時間座標
double       price=0)     // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 矢印コードを変更                                                     |
//+——————————————————————+
bool ArrowCodeChange(const long   chart_ID=0,   // チャート識別子
const string name=“Arrow”, // オブジェクト名
const uchar  code=252)     // 矢印コード
{
//— エラー値をリセットする
ResetLastError();
//— 矢印コードを変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,code))
{
Print(__FUNCTION__,
“: failed to change the arrow code! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーの種類を変更する                                               |
//+——————————————————————+
bool ArrowAnchorChange(const long              chart_ID=0,       // チャート識別子
const string            name=“Arrow”,     // オブジェクト名
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // アンカーの種類
{
//— エラー値をリセットする
ResetLastError();
//— アンカーの種類を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
“: failed to change anchor type! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 矢印を削除する                                                      |
//+——————————————————————+
bool ArrowDelete(const long   chart_ID=0,   // チャート識別子
const string name=“Arrow”) // 矢印名
{
//— エラー値をリセットする
ResetLastError();
//— 矢印を削除する    
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete an arrow! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— 価格配列サイズ
int accuracy=1000;
//— アンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
double   price[];
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 価格配列に書き込む
//— チャートの最高値と最安値を見つける
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//— 価格の変更ステップを定義し、配列に書き込む
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//— 矢印描画のポイントを定義する
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//— チャートに矢印を作成する
if(!ArrowCreate(0,InpName,0,date[d],price[p],32,InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画する
ChartRedraw();
//— ループ内での矢印作成の全てのケースを検討する
for(int i=33;i<256;i++)
{
if(!ArrowCodeChange(0,InpName,(uchar)i))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 半秒の遅れ
Sleep(500);
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートから矢印を削除する
ArrowDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_TEXT

テキストオブジェクト

ObjText

注意事項

テキストに相対したアンカーポイントの位置関係は ENUM_ANCHOR_POINT 列挙から選択出来ます。また、テキストの傾斜角度は OBJPROP_ANGLE プロパティで変更出来ます。

次のスクリプトは、チャート上で複数のテキストオブジェクトを作成します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script creates “Text” graphical object.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpFont=“Arial”;         // フォント
input int               InpFontSize=10;         // フォントサイズ
input color             InpColor=clrRed;         // 色
input double           InpAngle=90.0;           // 傾斜角度
input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_LEFT;   // アンカーの種類
input bool             InpBack=false;           // 背景オブジェクト
input bool             InpSelection=false;     // 強調表示して移動
input bool             InpHidden=true;         // オブジェクトリストに隠す
input long             InpZOrder=0;             // マウスクリックの優先順位
//+——————————————————————+
//| テキストオブジェクトを作成する                                             |
//+——————————————————————+
bool TextCreate(const long              chart_ID=0,               // チャート識別子
const string            name=“Text”,             // オブジェクト名
const int               sub_window=0,             // サブウィンドウ番号
datetime                time=0,                   // アンカーポイントの時刻
double                  price=0,                 // アンカーポイントの価格
const string            text=“Text”,             // テキスト
const string            font=“Arial”,             // フォント
const int               font_size=10,             // フォントサイズ
const color             clr=clrRed,               // 色
const double            angle=0.0,               // テキストの傾斜
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // アンカーの種類
const bool              back=false,               // 背景で表示する
const bool              selection=false,         // 強調表示して移動
const bool              hidden=true,             // ブジェクトリストに隠れている
const long              z_order=0)               // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeTextEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— テキストオブジェクトを作成する
if(!ObjectCreate(chart_ID,name,OBJ_TEXT,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create “Text” object! Error code = “,GetLastError());
return(false);
}
//— テキストを設定する
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//— テキストフォントを設定する
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//— フォントサイズを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//— テキストの傾斜を設定する
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//— アンカーの種類を設定
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//— 色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスでオブジェクトを移動させるモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントを移動する                                               |
//+——————————————————————+
bool TextMove(const long   chart_ID=0, // チャート識別子
const string name=“Text”, // オブジェクト名
datetime     time=0,     // アンカーポイントの時間座標
double       price=0)     // アンカーポイントの価格座標
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| オブジェクトのテキストを変更する                                            |
//+——————————————————————+
bool TextChange(const long   chart_ID=0, // チャート識別子
const string name=“Text”, // オブジェクト名
const string text=“Text”) // テキスト
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトのテキストを変更する
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
“: failed to change the text! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| テキストオブジェクトを削除する                                             |
//+——————————————————————+
bool TextDelete(const long   chart_ID=0, // チャート識別子
const string name=“Text”) // オブジェクト名
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Text” object! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeTextEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
datetime date[]; // 表示中のバーの日付を格納するための配列
double   low[]; // 表示中の足の安値を格納するための配列
double   high[]; // 表示中の足の高値を格納するための配列
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(low,bars);
ArrayResize(high,bars);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 安値の配列に書き込む
if(CopyLow(Symbol(),Period(),0,bars,low)==-1)
{
Print(“Failed to copy the values of Low prices! Error code = “,GetLastError());
return;
}
//— 高値の配列に書き込む
if(CopyHigh(Symbol(),Period(),0,bars,high)==-1)
{
Print(“Failed to copy the values of High prices! Error code = “,GetLastError());
return;
}
//— テキスト表示の頻度を定義する
int scale=(int)ChartGetInteger(0,CHART_SCALE);
//— ステップを定義する
int step=1;
switch(scale)
{
case 0:
step=12;
break;
case 1:
step=6;
break;
case 2:
step=4;
break;
case 3:
step=2;
break;
}
//— 高値と安値のバーの値のテキストを作成する(ギャップで)
for(int i=0;i<bars;i+=step)
{
//— テキストを作成する
if(!TextCreate(0,“TextHigh_”+(string)i,0,date[i],high[i],DoubleToString(high[i],5),InpFont,InpFontSize,
InpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
if(!TextCreate(0,“TextLow_”+(string)i,0,date[i],low[i],DoubleToString(low[i],5),InpFont,InpFontSize,
InpColor,-InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 半秒の遅れ
Sleep(500);
//— テキストを削除する
for(int i=0;i<bars;i+=step)
{
if(!TextDelete(0,“TextHigh_”+(string)i))
return;
if(!TextDelete(0,“TextLow_”+(string)i))
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//—
}

OBJ_LABEL

ラベルオブジェクト

ObjTextLabel

注意事項

ラベルに相対したアンカーポイントの位置関係は ENUM_ANCHOR_POINT 列挙から選択出来ます。アンカーポイントの座標はピクセルで設定されています。

ラベルのアンカーポイントとして使用される隅は ENUM_BASE_CORNER 列挙から選択出来ます。

次のスクリプトは、チャート上で編集オブジェクトを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script creates “Label” graphical object.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“Label”;         // ラベル名
input int               InpX=150;               // X 軸距離
input int               InpY=150;               // Y 軸距離
input string           InpFont=“Arial”;         // フォント
input int               InpFontSize=14;         // フォントサイズ
input color             InpColor=clrRed;         // 色
input double           InpAngle=0.0;           // 傾斜角度
input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_CENTER; // アンカーの種類
input bool             InpBack=false;           // 背景オブジェクト
input bool             InpSelection=true;       // 強調表示して移動
input bool             InpHidden=true;         // オブジェクトリストに隠す
input long             InpZOrder=0;             // マウスクリックの優先順位
//+——————————————————————+
//| ラベルを作成する                                                      |
//+——————————————————————+
bool LabelCreate(const long              chart_ID=0,               // チャート識別子
const string            name=“Label”,             // ラベル名
const int               sub_window=0,             // サブウィンドウ番号
const int               x=0,                     // X 座標
const int               y=0,                     // Y 座標
const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // アンカーに使用されるチャートのコーナー
const string            text=“Label”,             // テキスト
const string            font=“Arial”,             // フォント
const int               font_size=10,             // フォントサイズ
const color             clr=clrRed,               // 色
const double            angle=0.0,               // テキストの傾斜
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // アンカーの種類
const bool              back=false,               // 背景で表示する
const bool              selection=false,         // 強調表示して移動
const bool              hidden=true,             // オブジェクトリストに隠す
const long              z_order=0)               // マウスクリックの優先順位
{
//— エラー値をリセットする
ResetLastError();
//— ラベルを作成する
if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
“: failed to create text label! Error code = “,GetLastError());
return(false);
}
//— ラベル座標を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//— ポイント座標が相対的に定義されているチャートのコーナーを設定
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//— テキストを設定する
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//— テキストフォントを設定する
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//— フォントサイズを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//— テキストの傾斜を設定する
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//— アンカーの種類を設定
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//— 色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスでラベルを移動させるモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| ラベルを移動する                                                      |
//+——————————————————————+
bool LabelMove(const long   chart_ID=0,   // チャート識別子
const string name=“Label”, // ラベル名
const int    x=0,         // X 座標
const int    y=0)         // Y 座標
{
//— エラー値をリセットする
ResetLastError();
//— ラベルを移動する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
“: failed to move X coordinate of the label! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
“: failed to move Y coordinate of the label! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ラベル結合に使用されるチャートのコーナーを変更する                              |
//+——————————————————————+
bool LabelChangeCorner(const long             chart_ID=0,               // チャート識別子
const string           name=“Label”,             // ラベル名
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER) // アンカーに使用されるチャートのコーナー
{
//— エラー値をリセットする
ResetLastError();
//— アンカーに使用される隅を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner))
{
Print(__FUNCTION__,
“: failed to change the anchor corner! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ラベルテキストを変更する                                                 |
//+——————————————————————+
bool LabelTextChange(const long   chart_ID=0,   // チャート識別子
const string name=“Label”, // オブジェクト名
const string text=“Text”) // テキスト
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトのテキストを変更する
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
“: failed to change the text! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ラベルを削除する                                                      |
//+——————————————————————+
bool LabelDelete(const long   chart_ID=0,   // チャート識別子
const string name=“Label”) // ラベル名
{
//— エラー値をリセットする
ResetLastError();
//— ラベルを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete a text label! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— ラベルの座標をローカル変数に収納する
int x=InpX;
int y=InpY;
//— チャートウィンドウサイズ
long x_distance;
long y_distance;
//— ウィンドウサイズを設定する
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print(“Failed to get the chart width! Error code = “,GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print(“Failed to get the chart height! Error code = “,GetLastError());
return;
}
//— 入力パラメータの正しさをチェックする
if(InpX<0 || InpX>x_distance-1 || InpY<0 || InpY>y_distance-1)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— ラベルの初期テキストを準備する
string text;
StringConcatenate(text,“Upper left corner: “,x,“,”,y);
//— チャートにラベルを作成する
if(!LabelCreate(0,InpName,0,InpX,InpY,CORNER_LEFT_UPPER,text,InpFont,InpFontSize,
InpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して1 秒待つ
ChartRedraw();
Sleep(500);
//— ラベルを移動すると同時に、そのテキストを変更する
//— 軸による反復回数
int h_steps=(int)(x_distance/2-InpX);
int v_steps=(int)(y_distance/2-InpY);
//— ラベルを下に移動する
for(int i=0;i<v_steps;i++)
{
//— 座標を変更する
y+=2;
//— ラベルを移動してテキストを変更する
MoveAndTextChange(x,y,“Upper left corner: “);
}
//— 半秒の遅れ
Sleep(500);
//— ラベルを右に移動する
for(int i=0;i<h_steps;i++)
{
//— 座標を変更する
x+=2;
//— ラベルを移動してテキストを変更する
MoveAndTextChange(x,y,“Upper left corner: “);
}
//— 半秒の遅れ
Sleep(500);
//— ラベルを上に移動する
for(int i=0;i<v_steps;i++)
{
//— 座標を変更する
y-=2;
//— ラベルを移動してテキストを変更する
MoveAndTextChange(x,y,“Upper left corner: “);
}
//— 半秒の遅れ
Sleep(500);
//— ラベルを左に移動する
for(int i=0;i<h_steps;i++)
{
//— 座標を変更する
x-=2;
//— ラベルを移動してテキストを変更する
MoveAndTextChange(x,y,“Upper left corner: “);
}
//— 半秒の遅れ
Sleep(500);
//— アンカーに使用される隅を変更してポイントを移動する
//— 左下の隅に移動する
if(!LabelChangeCorner(0,InpName,CORNER_LEFT_LOWER))
return;
//— ラベルテキストを変更する
StringConcatenate(text,“Lower left corner: “,x,“,”,y);
if(!LabelTextChange(0,InpName,text))
return;
//— チャートを再描画して 2 秒待つ
ChartRedraw();
Sleep(2000);
//— 右下の隅に移動する
if(!LabelChangeCorner(0,InpName,CORNER_RIGHT_LOWER))
return;
//— ラベルテキストを変更する
StringConcatenate(text,“Lower right corner: “,x,“,”,y);
if(!LabelTextChange(0,InpName,text))
return;
//— チャートを再描画して 2 秒待つ
ChartRedraw();
Sleep(2000);
//— 右上の隅に移動する
if(!LabelChangeCorner(0,InpName,CORNER_RIGHT_UPPER))
return;
//— ラベルテキストを変更する
StringConcatenate(text,“Upper right corner: “,x,“,”,y);
if(!LabelTextChange(0,InpName,text))
return;
//— チャートを再描画して 2 秒待つ
ChartRedraw();
Sleep(2000);
//— 左上の隅に移動する
if(!LabelChangeCorner(0,InpName,CORNER_LEFT_UPPER))
return;
//— ラベルテキストを変更する
StringConcatenate(text,“Upper left corner: “,x,“,”,y);
if(!LabelTextChange(0,InpName,text))
return;
//— チャートを再描画して 2 秒待つ
ChartRedraw();
Sleep(2000);
//— ラベルを削除する
LabelDelete(0,InpName);
//— チャートを再描画して1 秒待つ
ChartRedraw();
Sleep(500);
//—
}
//+——————————————————————+
//| この関数はオブジェクトを移動してそのテキストを変更する                            |
//+——————————————————————+
bool MoveAndTextChange(const int x,const int y,string text)
{
//— ラベルを移動する
if(!LabelMove(0,InpName,x,y))
return(false);
//— ラベルテキストを変更する
StringConcatenate(text,text,x,“,”,y);
if(!LabelTextChange(0,InpName,text))
return(false);
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return(false);
//— チャートを再描画する
ChartRedraw();
// 0.01 秒の遅れ
Sleep(10);
//— 関数を終了する
return(true);
}

OBJ_BUTTON

ボタンオブジェクト

ObjButton

注意事項

アンカーポイントの座標はピクセルで設定されています。ボタンオブジェクトのアンカーポイントとして使用される隅は ENUM_BASE_CORNER 列挙から選択出来ます。

次のスクリプトは、チャート上でボタンオブジェクトを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

//— 説明
#property description “Script creates the button on the chart.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“Button”;           // ボタン名
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // アンカーに使用されるチャートのコーナー
input string           InpFont=“Arial”;             // フォント
input int             InpFontSize=14;             // フォントサイズ
input color           InpColor=clrBlack;           // テキストの色
input color           InpBackColor=C’236,233,216′; // 背景色
input color           InpBorderColor=clrNONE;     // 境界線の色
input bool             InpState=false;             // 押される/放される
input bool             InpBack=false;               // 背景オブジェクト
input bool             InpSelection=false;         // 強調表示して移動
input bool             InpHidden=true;             // オブジェクトリストに隠す
input long             InpZOrder=0;                 // マウスクリックの優先順位
//+——————————————————————+
//| ボタンを作成する                                                      |
//+——————————————————————+
bool ButtonCreate(const long              chart_ID=0,               // チャート識別子
const string            name=“Button”,           // ボタン名
const int               sub_window=0,             // サブウィンドウ番号
const int               x=0,                     // X 座標
const int               y=0,                     // Y 座標
const int               width=50,                 // ボタンの幅
const int               height=18,               // ボタンの高さ
const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // アンカーに使用されるチャートのコーナー
const string            text=“Button”,           // テキスト
const string            font=“Arial”,             // フォント
const int               font_size=10,             // フォントサイズ
const color             clr=clrBlack,             // テキストの色
const color             back_clr=C’236,233,216′, // 背景色
const color             border_clr=clrNONE,       // 境界線の色
const bool              state=false,             // 押される/放される
const bool              back=false,               // 背景で表示する
const bool              selection=false,         // 強調表示して移動
const bool              hidden=true,             // オブジェクトリストに隠す
const long              z_order=0)               // マウスクリックの優先順位
{
//— エラー値をリセットする
ResetLastError();
//— ボタンを作成する
if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))
{
Print(__FUNCTION__,
“: failed to create the button! Error code = “,GetLastError());
return(false);
}
//— ボタン座標を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//— ボタンサイズを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//— ポイント座標が相対的に定義されているチャートのコーナーを設定
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//— テキストを設定する
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//— テキストフォントを設定する
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//— フォントサイズを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//— テキストの色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 背景色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//— 境界線の色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— ボタンの状態を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//— マウスでのボタンを移動させるモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| ボタンを移動する                                                      |
//+——————————————————————+
bool ButtonMove(const long   chart_ID=0,   // チャート識別子
const string name=“Button”, // ボタン名
const int    x=0,           // X 座標
const int    y=0)           // Y 座標
{
//— エラー値をリセットする
ResetLastError();
//— ボタンを移動する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
“: failed to move X coordinate of the button! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
“: failed to move Y coordinate of the button! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ボタンサイズを変更する                                                  |
//+——————————————————————+
bool ButtonChangeSize(const long   chart_ID=0,   // チャート識別子
const string name=“Button”, // ボタン名
const int    width=50,     // ボタンの幅
const int    height=18)     // ボタンの高さ
{
//— エラー値をリセットする
ResetLastError();
//— ボタンサイズを変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
“: failed to change the button width! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
“: failed to change the button height! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ボタン結合に使用されるチャートのコーナーを変更する                              |
//+——————————————————————+
bool ButtonChangeCorner(const long             chart_ID=0,               // チャート識別子
const string           name=“Button”,           // ボタン名
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER) // アンカーに使用されるチャートのコーナー
{
//— エラー値をリセットする
ResetLastError();
//— アンカーに使用される隅を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner))
{
Print(__FUNCTION__,
“: failed to change the anchor corner! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ボタンテキストを変更する                                                 |
//+——————————————————————+
bool ButtonTextChange(const long   chart_ID=0,   // チャート識別子
const string name=“Button”, // ボタン名
const string text=“Text”)   // テキスト
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトのテキストを変更する
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
“: failed to change the text! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ボタンを削除する                                                      |
//+——————————————————————+
bool ButtonDelete(const long   chart_ID=0,   // チャート識別子
const string name=“Button”) // ボタン名
{
//— エラー値をリセットする
ResetLastError();
//— ボタンを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete the button! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— チャートウィンドウサイズ
long x_distance;
long y_distance;
//— ウィンドウサイズを設定する
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print(“Failed to get the chart width! Error code = “,GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print(“Failed to get the chart height! Error code = “,GetLastError());
return;
}
//— ボタンサイズ変更のステップを定義する
int x_step=(int)x_distance/32;
int y_step=(int)y_distance/32;
//— ボタン座標とサイズを設定する
int x=(int)x_distance/32;
int y=(int)y_distance/32;
int x_size=(int)x_distance*15/16;
int y_size=(int)y_distance*15/16;
//— ボタンを作成する
if(!ButtonCreate(0,InpName,0,x,y,x_size,y_size,InpCorner,“Press”,InpFont,InpFontSize,
InpColor,InpBackColor,InpBorderColor,InpState,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画する
ChartRedraw();
//— ループ内でボタンを減らす
int i=0;
while(i<13)
{
//— 半秒の遅れ
Sleep(500);
//— ボタンを押された状態に切り替える
ObjectSetInteger(0,InpName,OBJPROP_STATE,true);
//— チャートを再描画して 0.2 秒待つ
ChartRedraw();
Sleep(200);
//— 座標とボタンサイズを再定義する
x+=x_step;
y+=y_step;
x_size-=x_step*2;
y_size-=y_step*2;
//— ボタンを減らす
ButtonMove(0,InpName,x,y);
ButtonChangeSize(0,InpName,x_size,y_size);
//— ボタンを押されていない状態に返す
ObjectSetInteger(0,InpName,OBJPROP_STATE,false);
//— チャートを再描画する
nbsp;   ChartRedraw();
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— ループカウンタを増加する
i++;
}
//— 半秒の遅れ
Sleep(500);
//— ボタンを削除する
ButtonDelete(0,InpName);
ChartRedraw();
//—1 秒待つ
Sleep(1000);
//—
}

OBJ_CHART

チャートオブジェクト

ObjChart

注意事項

アンカーポイントの座標はピクセルで設定されています。アンカーポイントとして使用される隅は ENUM_BASE_CORNER 列挙から選択出来ます。

チャートオブジェクトでは、シンボル、期間と規模を選択することが出来ます。価格スケールと日付表示モードは、有効/無効にすることも出来ます。

次のスクリプトは、チャート上でチャートオブジェクトを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script creates “Chart” object.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“Chart”;             // オブジェクト名
input string           InpSymbol=“EURUSD”;         // シンボル
input ENUM_TIMEFRAMES InpPeriod=PERIOD_H1;         // 期間
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // アンカーに使用される隅
input int             InpScale=2;                 // 規模
input bool             InpDateScale=true;           // 時間スケール表示
input bool             InpPriceScale=true;         // 価格スケール表示
input color           InpColor=clrRed;             // 強調表示時の境界線の色
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT;   // 強調表示時の線のスタイル
input int             InpPointWidth=1;             // 移動のポイントサイズ
input bool             InpBack=false;               // 背景オブジェクト
input bool             InpSelection=true;           // 強調表示して移動
input bool             InpHidden=true;             // オブジェクトリストに隠す
input long             InpZOrder=0;                 // マウスクリックの優先順位
//+——————————————————————+
//| チャートオブジェクトを作成する                                             |
//+——————————————————————+
bool ObjectChartCreate(const long              chart_ID=0,               // チャート識別子
const string            name=“Chart”,             // オブジェクト名
const int               sub_window=0,             // サブウィンドウ番号
const string           symbol=“EURUSD”,         // シンボル
const ENUM_TIMEFRAMES   period=PERIOD_H1,         // 期間
const int               x=0,                     // X 座標
const int               y=0,                     // Y 座標
const int               width=300,               // 幅
const int               height=200,               // 高さ
const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // アンカーに使用される隅
const int               scale=2,                 // 規模
const bool              date_scale=true,         // 時間スケール表示
const bool              price_scale=true,         // 価格スケール表示
const color             clr=clrRed,               // 強調表示時の境界線の色
const ENUM_LINE_STYLE   style=STYLE_SOLID,       // 強調表示時の線のスタイル
const int               point_width=1,           // 移動ポイントサイズ
const bool              back=false,               // 背景で表示する
const bool              selection=false,         // 強調表示して移動
const bool              hidden=true,             // オブジェクトリストに隠す
const long              z_order=0)               // マウスクリックの優先順位
{
//— エラー値をリセットする
ResetLastError();
//— チャートオブジェクトを作成する  
if(!ObjectCreate(chart_ID,name,OBJ_CHART,sub_window,0,0))
{
Print(__FUNCTION__,
“: failed to create “Chart” object! Error code = “,GetLastError());
return(false);
}
//— オブジェクト座標を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//— オブジェクトサイズを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//— ポイント座標が相対的に定義されているチャートのコーナーを設定
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//— シンボルを設定する
ObjectSetString(chart_ID,name,OBJPROP_SYMBOL,symbol);
//— 期間を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_PERIOD,period);
//— 規模を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_CHART_SCALE,scale);
//— 時間スケールを表示(true)または非表示(false)する
ObjectSetInteger(chart_ID,name,OBJPROP_DATE_SCALE,date_scale);
//— 価格スケールを表示(true)または非表示(false)する
ObjectSetInteger(chart_ID,name,OBJPROP_PRICE_SCALE,price_scale);
//— オブジェクトのハイライト表示モードが有効になっている際の境界線の色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— オブジェクトのハイライト表示モードが有効になっている際の境界線のスタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— オブジェクトを移動するためのアンカーポイントのサイズを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスでラベルを移動させるモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャートオブジェクトのシンボルと時間軸を設定する                                |
//+——————————————————————+
bool ObjectChartSetSymbolAndPeriod(const long            chart_ID=0,       // チャート識別子(チャートオブジェクト識別子ではない)
const string          name=“Chart”,     // オブジェクト名
const string         symbol=“EURUSD”, // シンボル
const ENUM_TIMEFRAMES period=PERIOD_H1) // 時間軸
{
//— エラー値をリセットする
ResetLastError();
//— チャートオブジェクトのシンボルと時間軸を設定する
if(!ObjectSetString(chart_ID,name,OBJPROP_SYMBOL,symbol))
{
Print(__FUNCTION__,
“: failed to set a symbol for “Chart” object! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_PERIOD,period))
{
Print(__FUNCTION__,
“: failed to set a period for “Chart” object! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャートオブジェクトを移動する                                             |
//+——————————————————————+
bool ObjectChartMove(const long   chart_ID=0,   // チャート識別子 (チャートオブジェクト ID ではない)
const string name=“Chart”, // オブジェクト名
const int    x=0,         // X 座標
const int    y=0)         // Y 座標
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトを移動する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
“: failed to move X coordinate of “Chart” object! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
“: failed to move Y coordinate of “Chart” object! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャートオブジェクトサイズを変更する                                         |
//+——————————————————————+
bool ObjectChartChangeSize(const long   chart_ID=0,   // チャート識別子(チャートオブジェクト ID ではない)
const string name=“Chart”, // オブジェクト名
const int    width=300,   // 幅
const int    height=200)   // 高さ
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトサイズを変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
“: failed to change the width of “Chart” object! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
“: failed to change the height of “Chart” object! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャートオブジェクト ID を返す                                             |
//+——————————————————————+
long ObjectChartGetID(const long   chart_ID=0,   // チャート識別子 (チャートオブジェクト ID ではない)
const string name=“Chart”) // オブジェクト名
{
//— チャートオブジェクト ID 取得の変数を準備する
long id=-1;
//— エラー値をリセットする
ResetLastError();
//— ID 取得
if(!ObjectGetInteger(chart_ID,name,OBJPROP_CHART_ID,0,id))
{
Print(__FUNCTION__,
“: failed to get “Chart” object’s ID! Error code = “,GetLastError());
}
//— 結果を返す
return(id);
}
//+——————————————————————+
//| チャートオブジェクトを削除する                                             |
//+——————————————————————+
bool ObjectChartDelete(const long   chart_ID=0,   // チャート識別子 (チャートオブジェクト ID ではない)
const string name=“Chart”) // オブジェクト名
{
//— エラー値をリセットする
ResetLastError();
//— ボタンを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Chart” object! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 「気配値表示」でのシンボル数を取得
int  symbols=SymbolsTotal(true);
//— 指定された名称のシンボルがシンボルのリストに存在するかどうかをチェックする
bool exist=false;
for(int i=0;i<symbols;i++)
if(InpSymbol==SymbolName(i,true))
{
exist=true;
break;
}
if(!exist)
{
Print(“Error!”,InpSymbol,” symbol is not present in “「気配値表示」“!”);
return;
}
//— 入力パラメータの有効性をチェックする
if(InpScale<0 || InpScale>5)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}

//— チャートウィンドウサイズ
long x_distance;
long y_distance;
//— ウィンドウサイズを設定する
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print(“Failed to get the chart width! Error code = “,GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print(“Failed to get the chart height! Error code = “,GetLastError());
return;
}
//— チャートオブジェクトの座標とサイズを設定する
int x=(int)x_distance/16;
int y=(int)y_distance/16;
int x_size=(int)x_distance*7/16;
int y_size=(int)y_distance*7/16;
//— チャートオブジェクトを作成する  
if(!ObjectChartCreate(0,InpName,0,InpSymbol,InpPeriod,x,y,x_size,y_size,InpCorner,InpScale,InpDateScale,
InpPriceScale,InpColor,InpStyle,InpPointWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— チャートオブジェクトをスケッチする
int steps=(int)MathMin(x_distance*7/16,y_distance*7/16);
for(int i=0;i<steps;i++)
{
//— サイズ変更
x_size+=1;
y_size+=1;
if(!ObjectChartChangeSize(0,InpName,x_size,y_size))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画して 0.01 秒待つ
ChartRedraw();
Sleep(10);
}
//— 半秒の遅れ
Sleep(500);
//— チャートの時間軸を変更する
if(!ObjectChartSetSymbolAndPeriod(0,InpName,InpSymbol,PERIOD_M1))
return;
ChartRedraw();
//— 3 秒の遅れ
Sleep(3000);
//— オブジェクトを削除する
ObjectChartDelete(0,InpName);
ChartRedraw();
//—1 秒待つ
Sleep(1000);
//—
}

OBJ_BITMAP

ビットマップオブジェクト

ObjBitmap

注意事項

ビットマップオブジェクトでは、画像の表示範囲を選択出来ます。

次のスクリプトは、チャート上で複数のビットマップオブジェクトを作成します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script creates a bitmap in the chart window.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpFile=“Imagesdollar.bmp”; // ビットマップファイル名
input int             InpWidth=24;                   // 表示範囲の X 座標
input int             InpHeight=24;                   // 表示範囲の Y 座標
input int             InpXOffset=4;                   // 表示範囲を X 軸に沿ってシフト
input int             InpYOffset=4;                   // 表示範囲を Y 軸に沿ってシフト
input color           InpColor=clrRed;               // 強調表示時の境界線の色
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID;           // 強調表示時の線のスタイル
input int             InpPointWidth=1;               // 移動のポイントサイズ
input bool           InpBack=false;                 // 背景オブジェクト
input bool           InpSelection=false;             // 強調表示して移動
input bool           InpHidden=true;                 // オブジェクトリストに隠す
input long           InpZOrder=0;                   // マウスクリックの優先順位
//+——————————————————————+
//| チャートウィンドウでビットマップを作成する                                      |
//+——————————————————————+
bool BitmapCreate(const long            chart_ID=0,       // チャート識別子
const string          name=“Bitmap”,     // ビットマップ名
const int             sub_window=0,     // サブウィンドウ番号
datetime              time=0,           // アンカーポイントの時刻
double                price=0,           // アンカーポイントの価格
const string          file=“”,           // ビットマップファイル名
const int             width=10,         // 表示範囲の X 座標
const int             height=10,         // 表示範囲の Y 座標
const int             x_offset=0,       // 表示範囲を X 軸に沿ってシフト
const int             y_offset=0,       // 表示範囲を Y 軸に沿ってシフト
const color           clr=clrRed,       // 強調表示時の境界線の色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 強調表示時の線のスタイル
const int             point_width=1,     // 移動ポイントサイズ
const bool            back=false,       // 背景で表示する
const bool            selection=false,   // 強調表示して移動
const bool            hidden=true,       // オブジェクトリストに隠す
const long            z_order=0)         // マウスクリックの優先順位
{
//— 設定されてない場合アンカーポイントの座標を設定する
ChangeBitmapEmptyPoint(time,price);
//— エラー値をリセットする
ResetLastError();
//— ビットマップを作成する
if(!ObjectCreate(chart_ID,name,OBJ_BITMAP,sub_window,time,price))
{
Print(__FUNCTION__,
“: failed to create a bitmap in the chart window! Error code = “,GetLastError());
return(false);
}
//— 画像へのパスを設定する
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,file))
{
Print(__FUNCTION__,
“: failed to load the image! Error code = “,GetLastError());
return(false);
}
//— 画像の表示範囲を設定する。もし幅または高さの値が
//— それぞれソース画像の幅と高さを超えた場合、
//— 描画されない。反対の場合
//— これらの値に対応する部分が描画される。
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//— 表示範囲に表示される画像の部分を設定する
//— デフォルトの部分は、画像の左上の領域
//— 値は、この領域からのシフトして画像の別の部分の表示を可能にする
ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset);
ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);
//— オブジェクトのハイライト表示モードが有効になっている際の境界線の色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— オブジェクトのハイライト表示モードが有効になっている際の境界線のスタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— オブジェクトを移動するためのアンカーポイントのサイズを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスでラベルを移動させるモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| ビットマップに新しい画像を設定する                                          |
//+——————————————————————+
bool BitmapSetImage(const long   chart_ID=0,   // チャート識別子
const string name=“Bitmap”, // ビットマップ名
const string file=“”)       // ファイルパス
{
//— エラー値をリセットする
ResetLastError();
//— 画像へのパスを設定する
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,file))
{
Print(__FUNCTION__,
“: failed to load the image! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| チャートのビットマップを移動する                                            |
//+——————————————————————+
bool BitmapMove(const long   chart_ID=0,   // チャート識別子
const string name=“Bitmap”, // ビットマップ名
datetime     time=0,       // アンカーポイントの時刻
double       price=0)       // アンカーポイントの価格
{
//— ポイントの位置が設定されていない場合、売値を有する現在足に移動する
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//— エラー値をリセットする
ResetLastError();
//— アンカーポイントを移動する
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
“: failed to move the anchor point! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ビットマップの表示範囲のサイズを変更する                                     |
//+——————————————————————+
bool BitmapChangeSize(const long   chart_ID=0,   // チャート識別子
const string name=“Bitmap”, // ビットマップ名
const int    width=0,       // ビットマップの幅
const int    height=0)     // ビットマップの高さ
{
//— エラー値をリセットする
ResetLastError();
//— ビットマップサイズを変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
“: failed to change the bitmap width! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
“: failed to change the bitmap height! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————–+
//| 表示範囲の左上隅のy座標を変更する                                         |
//+——————————————————————–+
bool BitmapMoveVisibleArea(const long   chart_ID=0,   // チャート識別子
const string name=“Bitmap”, // ビットマップ名
const int    x_offset=0,   // 表示範囲の X 座標
const int    y_offset=0)   // 表示範囲の Y 座標
{
//— エラー値をリセットする
ResetLastError();
//— ビットマップの表示範囲の座標を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset))
{
Print(__FUNCTION__,
“: failed to change X coordinate of the visibility scope! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset))
{
Print(__FUNCTION__,
“: failed to change Y coordinate of the visibility scope! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ビットマップを削除する                                                   |
//+——————————————————————+
bool BitmapDelete(const long   chart_ID=0,   // チャート識別子
const string name=“Bitmap”) // ビットマップ名
{
//— エラー値をリセットする
ResetLastError();
//— ラベルを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete a bitmap! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| アンカーポイントの値をチェックして                                           |
//| 空の物には初期値を設定する                                             |
//+——————————————————————+
void ChangeBitmapEmptyPoint(datetime &time,double &price)
{
//— ポイントの時間が設定されていない場合、現在足になる
if(!time)
time=TimeCurrent();
//— ポイントの価格が設定されていない場合、売値になる
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
datetime date[]; // 表示されるバーを格納するための配列
double   close[]; // 終値を格納するための配列
//— ビットマップファイル名
string   file=“Imagesdollar.bmp”;
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— メモリ割り当て
ArrayResize(date,bars);
ArrayResize(close,bars);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— 終値の配列に書き込む
if(CopyClose(Symbol(),Period(),0,bars,close)==-1)
{
Print(“Failed to copy the values of Close prices! Error code = “,GetLastError());
return;
}
//— 画像表示の頻度を定義する
int scale=(int)ChartGetInteger(0,CHART_SCALE);
//— ステップを定義する
int step=1;
switch(scale)
{
case 0:
step=27;
break;
case 1:
step=14;
break;
case 2:
step=7;
break;
case 3:
step=4;
break;
case 4:
step=2;
break;
}
//— 高値と安値のバーの値でビットマップを作成する(ギャップで)
for(int i=0;i<bars;i+=step)
{
//— ビットマップを作成する
if(!BitmapCreate(0,“Bitmap_”+(string)i,0,date[i],close[i],InpFile,InpWidth,InpHeight,InpXOffset,
InpYOffset,InpColor,InpStyle,InpPointWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 半秒の遅れ
Sleep(500);
//— 売りサインを削除する
for(int i=0;i<bars;i+=step)
{
if(!BitmapDelete(0,“Bitmap_”+(string)i))
return;
if(!BitmapDelete(0,“Bitmap_”+(string)i))
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//—
}

OBJ_BITMAP_LABEL

ビットマップラベルオブジェクト

ObjBitmapLabel

注意事項

ラベルに相対したアンカーポイントの位置関係は ENUM_ANCHOR_POINT 列挙から選択出来ます。アンカーポイントの座標はピクセルで設定されています。

ビットマップのアンカーポイントとして使用される隅は ENUM_BASE_CORNER 列挙から選択出来ます。

ビットマップラベルでは、画像の 表示範囲を選択出来ます。

次のスクリプトは、チャート上で複数のビットマップオブジェクトを作成します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

//— 説明
#property description “Script creates “Bitmap Label” object.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“BmpLabel”;               // ラベル名
input string           InpFileOn=“Imagesdollar.bmp”; // オンモードでのファイル名
input string           InpFileOff=“Imageseuro.bmp”; // オフモードでのファイル名
input bool             InpState=false;                   // ラベルが押される/解放される
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER;     // アンカーに使用されるチャートのコーナー
input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_CENTER;         // アンカーの種類
input color             InpColor=clrRed;                 // 強調表示時の境界線の色
input ENUM_LINE_STYLE   InpStyle=STYLE_SOLID;             // 強調表示時の線のスタイル
input int               InpPointWidth=1;                 // 移動のポイントサイズ
input bool             InpBack=false;                   // 背景オブジェクト
input bool             InpSelection=false;               // 強調表示して移動
input bool             InpHidden=true;                   // オブジェクトリストに隠す
input long             InpZOrder=0;                     // マウスクリックの優先順位
//+——————————————————————+
//| ビットマップラベルオブジェクトを作成する                                       |
//+——————————————————————+
bool BitmapLabelCreate(const long              chart_ID=0,               // チャート識別子
const string            name=“BmpLabel”,         // ラベル名
const int               sub_window=0,             // サブウィンドウ番号
const int               x=0,                     // X 座標
const int               y=0,                     // Y 座標
const string            file_on=“”,               // オンモードでの画像
const string            file_off=“”,             // オフモードでの画像
const int               width=0,                 // 表示範囲の X 座標
const int               height=0,                 // 表示範囲の Y 座標
const int               x_offset=10,             // 表示範囲を X 軸に沿ってシフト
const int               y_offset=10,             // 表示範囲を Y 軸に沿ってシフト
const bool              state=false,             // 押される/解放される
const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // アンカーに使用されるチャートのコーナー
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // アンカーの種類
const color             clr=clrRed,               // 強調表示時の境界線の色
const ENUM_LINE_STYLE   style=STYLE_SOLID,       // 強調表示時の線のスタイル
const int               point_width=1,           // 移動ポイントサイズ
const bool              back=false,               // 背景で表示する
const bool              selection=false,         // 強調表示して移動
const bool              hidden=true,             // オブジェクトリストに隠す
const long              z_order=0)               // マウスクリックの優先順位
{
//— エラー値をリセットする
ResetLastError();
//— ビットマップラベルを作成する
if(!ObjectCreate(chart_ID,name,OBJ_BITMAP_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
“: failed to create “Bitmap Label” object! Error code = “,GetLastError());
return(false);
}
//— オンとオフモードでの画像を設定する
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,0,file_on))
{
Print(__FUNCTION__,
“: failed to load the image for On mode! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,1,file_off))
{
Print(__FUNCTION__,
“: failed to load the image for Off mode! Error code = “,GetLastError());
return(false);
}
//— ラベル座標を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//— 画像の表示範囲を設定する。もし幅または高さの値が
//— それぞれソース画像の幅と高さを超えた場合、
//— 描画されない。反対の場合
//— これらの値に対応する部分が描画される。
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//— 表示範囲に表示される画像の部分を設定する
//— デフォルトの部分は、画像の左上の領域
//— 値は、この領域からのシフトして画像の別の部分の表示を可能にする
ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset);
ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);
//— ラベルの状態(キーの押または離し)を定義する
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//— ポイント座標が相対的に定義されているチャートのコーナーを設定
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//— アンカーの種類を設定
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//— オブジェクトのハイライト表示モードが有効になっている際の境界線の色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— オブジェクトのハイライト表示モードが有効になっている際の境界線のスタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— オブジェクトを移動するためのアンカーポイントのサイズを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスでラベルを移動させるモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| ビットマップラベルオブジェクトに新しい画像を設定する                              |
//+——————————————————————+
bool BitmapLabelSetImage(const long   chart_ID=0,     // チャート識別子
const string name=“BmpLabel”, // ラベル名e
const int    on_off=0,       // 修飾子(オンまたはオフ)
const string file=“”)         // ファイルパス
{
//— エラー値をリセットする
ResetLastError();
//— 画像へのパスを設定する
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,on_off,file))
{
Print(__FUNCTION__,
“: failed to load the image! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ビットマップラベルオブジェクトを移動する                                        |
//+——————————————————————+
bool BitmapLabelMove(const long   chart_ID=0,     // チャート識別子
const string name=“BmpLabel”, // ラベル名
const int    x=0,             // X 座標
const int    y=0)             // Y 座標
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトを移動する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
“: failed to move X coordinate of the object! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
“: failed to move Y coordinate of the object! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ビットマップの表示範囲のサイズを変更する                                     |
//+——————————————————————+
bool BitmapLabelChangeSize(const long   chart_ID=0,     // チャート識別子
const string name=“BmpLabel”, // ラベル名
const int    width=0,         // ラベル幅
const int    height=0)       // ラベルの高さ
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトサイズを変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
“: failed to change the object width! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
“: failed to change the object height! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————–+
//| 表示範囲の左上隅のy座標を変更する                                         |
//+——————————————————————–+
bool BitmapLabelMoveVisibleArea(const long   chart_ID=0,     // チャート識別子
const string name=“BmpLabel”, // ラベル名
const int    x_offset=0,     // 表示範囲の X 座標
const int    y_offset=0)     //表示範囲の Y 座標
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトの表示範囲の座標を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset))
{
Print(__FUNCTION__,
“: failed to change X coordinate of the visibility scope! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset))
{
Print(__FUNCTION__,
“: failed to change Y coordinate of the visibility scope! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| ビットマップラベルオブジェクトを削除する                                        |
//+——————————————————————+
bool BitmapLabelDelete(const long   chart_ID=0,     // チャート識別子
const string name=“BmpLabel”) // ラベル名
{
//— エラー値をリセットする
ResetLastError();
//— ラベルを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Bitmap label” object! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— チャートウィンドウサイズ
long x_distance;
long y_distance;
//— ウィンドウサイズを設定する
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print(“Failed to get the chart width! Error code = “,GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print(“Failed to get the chart height! Error code = “,GetLastError());
return;
}
//— ビットマップラベル座標を定義する
int x=(int)x_distance/2;
int y=(int)y_distance/2;
//— ラベルのサイズと表示範囲座標を設定する
int width=32;
int height=32;
int x_offset=0;
int y_offset=0;
//— ビットマップラベルをウィンドウの中央に配置する
if(!BitmapLabelCreate(0,InpName,0,x,y,InpFileOn,InpFileOff,width,height,x_offset,y_offset,InpState,
InpCorner,InpAnchor,InpColor,InpStyle,InpPointWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して1 秒待つ
ChartRedraw();
Sleep(1000);
//— ループ内でラベルの表示範囲サイズを変更する
for(int i=0;i<6;i++)
{
//— 表示範囲サイズを変更する
width–;
height–;
if(!BitmapLabelChangeSize(0,InpName,width,height))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.3 秒の遅れ
Sleep(300);
}
//— 1 秒の遅れ
Sleep(1000);
//— ループ内でラベルの表示範囲座標を変更する
for(int i=0;i<2;i++)
{
//— 表示範囲座標を変更する
x_offset++;
y_offset++;
if(!BitmapLabelMoveVisibleArea(0,InpName,x_offset,y_offset))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.3 秒の遅れ
Sleep(300);
}
//— 1 秒の遅れ
Sleep(1000);
//— ラベルを削除する
BitmapLabelDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_EDIT

編集オブジェクト

ObjEdit

注意事項

アンカーポイントの座標はピクセルで設定されています。編集オブジェクトに使用される隅は ENUM_BASE_CORNER 列挙から選択出来ます。

また、編集オブジェクトではテキストの整列の種類を ENUM_ALIGN_MODE 列挙から選択することが出来ます。

次のスクリプトは、チャート上で編集オブジェクトを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

//— 説明
#property description “Script creates “Edit” object.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“Edit”;             // オブジェクト名
input string           InpText=“Text”;             // オブジェクトテキスト
input string           InpFont=“Arial”;             // フォント
input int             InpFontSize=14;             // フォントサイズ
input ENUM_ALIGN_MODE InpAlign=ALIGN_CENTER;       // テキスト整列の種類
input bool             InpReadOnly=false;           // 編集許可
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // アンカーに使用されるチャートのコーナー
input color           InpColor=clrBlack;           // テキストの色
input color           InpBackColor=clrWhite;       // 背景色
input color           InpBorderColor=clrBlack;     // 境界線の色
input bool             InpBack=false;               // 背景オブジェクト
input bool             InpSelection=false;         // 強調表示して移動
input bool             InpHidden=true;             // オブジェクトリストに隠す
input long             InpZOrder=0;                 // マウスクリックの優先順位
//+——————————————————————+
//| 編集オブジェクトを作成する                                               |
//+——————————————————————+
bool EditCreate(const long             chart_ID=0,               // チャート識別子
const string           name=“Edit”,             // オブジェクト名
const int              sub_window=0,             // サブウィンドウ番号
const int              x=0,                     // X 座標
const int              y=0,                     // Y 座標
const int              width=50,                 // 幅
const int              height=18,               // 高さ
const string           text=“Text”,             // テキスト
const string           font=“Arial”,             // フォント
const int              font_size=10,             // フォントサイズ
const ENUM_ALIGN_MODE  align=ALIGN_CENTER,       // 整列の種類
const bool             read_only=false,         // 編集する能力
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // アンカーに使用されるチャートのコーナー
const color            clr=clrBlack,             // テキストの色
const color            back_clr=clrWhite,       // 背景色r
const color            border_clr=clrNONE,       // 境界線の色
const bool             back=false,               // 背景で表示する
const bool             selection=false,         // 強調表示して移動
const bool             hidden=true,             // オブジェクトリストに隠す
const long             z_order=0)               // マウスクリックの優先順位
{
//— エラー値をリセットする
ResetLastError();
//— 編集フィールドを作成する
if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0))
{
Print(__FUNCTION__,
“: failed to create “Edit” object! Error code = “,GetLastError());
return(false);
}
//— オブジェクト座標を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//— オブジェクトサイズを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//— テキストを設定する
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//— テキストフォントを設定する
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//— フォントサイズを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//— オブジェクトでのテキスト配置のタイプを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,align);
//— 読み込み専用モードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_READONLY,read_only);
//— オブジェクト座標が相対的に定義されているチャートのコーナーを設定
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//— テキストの色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— 背景色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//— 境界線の色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスでラベルを移動させるモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| 編集オブジェクトを移動する                                               |
//+——————————————————————+
bool EditMove(const long   chart_ID=0, // チャート識別子
const string name=“Edit”, // オブジェクト名
const int    x=0,         // X 座標
const int    y=0)         // Y 座標
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトを移動する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
“: failed to move X coordinate of the object! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
“: failed to move Y coordinate of the object! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 編集オブジェクトのサイズを変更する                                         |
//+——————————————————————+
bool EditChangeSize(const long   chart_ID=0, // チャート識別子
const string name=“Edit”, // オブジェクト名
const int    width=0,     // 幅
const int    height=0)   // 高さ
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトサイズを変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
“: failed to change the object width! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
“: failed to change the object height! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 編集オブジェクトのテキストを変更する                                        |
//+——————————————————————+
bool EditTextChange(const long   chart_ID=0, // チャート識別子
const string name=“Edit”, // オブジェクト名
const string text=“Text”) // テキスト
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトのテキストを変更する
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
“: failed to change the text! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 編集オブジェクトのテキストを返す                                            |
//+——————————————————————+
bool EditTextGet(string      &text,       // テキスト
const long   chart_ID=0, // チャート識別子
const string name=“Edit”) // オブジェクト名
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトのテキストを取得する
if(!ObjectGetString(chart_ID,name,OBJPROP_TEXT,0,text))
{
Print(__FUNCTION__,
“: failed to get the text! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 編集オブジェクトを削除する                                               |
//+——————————————————————+
bool EditDelete(const long   chart_ID=0, // チャート識別子
const string name=“Edit”) // オブジェクト名
{
//— エラー値をリセットする
ResetLastError();
//— ラベルを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Edit” object! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— チャートウィンドウサイズ
long x_distance;
long y_distance;
//— ウィンドウサイズを設定する
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print(“Failed to get the chart width! Error code = “,GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print(“Failed to get the chart height! Error code = “,GetLastError());
return;
}
//— 編集フィールド変更のステップを定義する
int x_step=(int)x_distance/64;
//— 編集フィールド座標とサイズを設定する
int x=(int)x_distance/8;
int y=(int)y_distance/2;
int x_size=(int)x_distance/8;
int y_size=InpFontSize*2;
//— テキストをローカル変数に収納する
string text=InpText;
//— 編集フィールドを作成する
if(!EditCreate(0,InpName,0,x,y,x_size,y_size,InpText,InpFont,InpFontSize,InpAlign,InpReadOnly,
InpCorner,InpColor,InpBackColor,InpBorderColor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— 編集フィールドを伸ばす
while(x_size-x<x_distance*5/8)
{
//— 編集フィールドの幅を増やす
x_size+=x_step;
if(!EditChangeSize(0,InpName,x_size,y_size))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画して 0.05 秒待つ
ChartRedraw();
Sleep(50);
}
//— 半秒の遅れ
Sleep(500);
//— テキストを変更する
for(int i=0;i<20;i++)
{
//— 「+」を始めと終わりに足す
text=“+”+text+“+”;
if(!EditTextChange(0,InpName,text))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画して 0.1 秒待つ
ChartRedraw();
Sleep(100);
}
//— 半秒の遅れ
Sleep(500);
//— 編集フィールドを削除する
EditDelete(0,InpName);
ChartRedraw();
//—1 秒待つ
Sleep(1000);
//—
}

OBJ_EVENT

イベントオブジェクト

ObjEvent

注意事項

イベントにマウスをホーバーすると、テキストが表示されます。

次のスクリプトは、チャート上でイベントオブジェクトを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script draws “Event” graphical object.”
#property description “Anchor point date is set in percentage of”
#property description “the chart window width in bars.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string         InpName=“Event”;   // イベント名
input int             InpDate=25;         // イベントの日付( % )
input string         InpText=“Text”;     // イベントテキスト
input color           InpColor=clrRed;   // イベントの色
input int             InpWidth=1;         // 強調表示時のポイントサイズ
input bool           InpBack=false;     // 背景イベント
input bool           InpSelection=false; // 強調表示して移動
input bool           InpHidden=true;     // オブジェクトリストに隠す
input long           InpZOrder=0;       // マウスクリックの優先順位
//+——————————————————————+
//| チャートにイベントオブジェクトを作成する                                       |
//+——————————————————————+
bool EventCreate(const long            chart_ID=0,     // チャート識別子
const string          name=“Event”,   // イベント名
const int             sub_window=0,   // サブウィンドウ番号
const string          text=“Text”,     // イベントテキスト
datetime              time=0,         // 時間
const color           clr=clrRed,     // 色
const int             width=1,         // 強調表示時のポイントの幅
const bool            back=false,     // 背景で表示する
const bool            selection=false, // 強調表示して移動
const bool            hidden=true,     // オブジェクトリストに隠す
const long            z_order=0)       // マウスクリックの優先順位
{
//— 時間が設定されていない場合、最後のバーにオブジェクトを作成する
if(!time)
time=TimeCurrent();
//— エラー値をリセットする
ResetLastError();
//— イベントオブジェクトを作成する
if(!ObjectCreate(chart_ID,name,OBJ_EVENT,sub_window,time,0))
{
Print(__FUNCTION__,
“: failed to create “Event” object! Error code = “,GetLastError());
return(false);
}
//— イベントテキストを設定
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//— 色を設定
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— オブジェクトがハイライトされた時のアンカーポイントの幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスでイベントを移動させるモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| イベントオブジェクトのテキストを変更する                                       |
//+——————————————————————+
bool EventTextChange(const long   chart_ID=0,   // チャート識別子
const string name=“Event”, // イベント名
const string text=“Text”) // テキスト
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトのテキストを変更する
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
“: failed to change the text! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| イベントオブジェクトを移動する                                             |
//+——————————————————————+
bool EventMove(const long   chart_ID=0,   // チャート識別子
const string name=“Event”, // イベント名
datetime     time=0)       // 時間
{
//— 時間が設定されていない場合、イベントを最後のバーに移動する
if(!time)
time=TimeCurrent();
//— エラー値をリセットする
ResetLastError();
//— オブジェクトを移動する
if(!ObjectMove(chart_ID,name,0,time,0))
{
Print(__FUNCTION__,
“: failed to move “Event” object! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| イベントオブジェクトを削除する                                             |
//+——————————————————————+
bool EventDelete(const long   chart_ID=0,   // チャート識別子
const string name=“Event”) // イベント名
{
//— エラー値をリセットする
ResetLastError();
//— オブジェクトを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete “Event” object! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 入力パラメータの正しさをチェックする
if(InpDate<0 || InpDate>100)
{
Print(“Error! Incorrect values of input parameters!”);
return;
}
//— チャートウィンドウで表示されているバーの数
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//— イベントアンカーポイントの座標の設定と変更に使用される日付と
//— 価格の値を格納するための配列
datetime date[];
//— メモリ割り当て
ArrayResize(date,bars);
//— 日付配列に書き込む
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print(“Failed to copy time values! Error code = “,GetLastError());
return;
}
//— オブジェクト作成のポイントを定義する
int d=InpDate*(bars-1)/100;
//— イベントオブジェクトを作成する
if(!EventCreate(0,InpName,0,InpText,date[d],InpColor,InpWidth,
InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— オブジェクトを移動する
//— ループカウンタ
int h_steps=bars/2;
//— オブジェクトを移動する
for(int i=0;i<h_steps;i++)
{
//— 次の値を使用する
if(d<bars-1)
d+=1;
//— ポイントを移動する
if(!EventMove(0,InpName,date[d]))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画する
ChartRedraw();
// 0.05 秒の遅れ
Sleep(50);
}
//— 1 秒の遅れ
Sleep(1000);
//— チャートからチャンネルを削除する
EventDelete(0,InpName);
ChartRedraw();
//— 1 秒の遅れ
Sleep(1000);
//—
}

OBJ_RECTANGLE_LABEL

四角形ラベルオブジェクト

ObjRectangleLabel

注意事項

アンカーポイントの座標はピクセルで設定されています。四角形ラベルのアンカーポイントとして使用される隅は ENUM_BASE_CORNER 列挙から選択出来ます。四角形ラベルの境界線の種類は ENUM_BORDER_TYPE 列挙から選択出来ます。

このオブジェクトは、カスタムグラフィカルインタフェースの作成と設計に使用されます。

次のスクリプトは、チャート上で四角形ラベルオブジェクトを作成して移動します。グラフィックオブジェクトのプロパティを作成そして変更するために特別な関数が開発されています。これらの関数はお使いのアプリケーションでそのまま使用することが出来ます。

 

//— 説明
#property description “Script creates “Rectangle Label” graphical object.”
//— スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//— スクリプト入力パラメータ
input string           InpName=“RectLabel”;         // ラベル名
input color           InpBackColor=clrSkyBlue;     // 背景色
input ENUM_BORDER_TYPE InpBorder=BORDER_FLAT;       // 境界線の種類
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // アンカーに使用されるチャートのコーナー
input color           InpColor=clrDarkBlue;       // フラット境界線の色 (Flat)
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID;       // フラット境界スタイル (Flat)
input int             InpLineWidth=3;             // フラット境界幅 (Flat)
input bool             InpBack=false;               // 背景オブジェクト
input bool             InpSelection=true;           // 強調表示して移動
input bool             InpHidden=true;             // オブジェクトリストに隠す
input long             InpZOrder=0;                 // マウスクリックの優先順位
//+——————————————————————+
//| 四角形ラベルを作成する                                                 |
//+——————————————————————+
bool RectLabelCreate(const long             chart_ID=0,               // チャート識別子
const string           name=“RectLabel”,         // ラベル名
const int              sub_window=0,             // サブウィンドウ番号
const int              x=0,                     // X 座標
const int              y=0,                     // Y 座標
const int              width=50,                 // 幅
const int              height=18,               // 高さ
const color            back_clr=C’236,233,216′, // 背景色
const ENUM_BORDER_TYPE border=BORDER_SUNKEN,     // 境界線の種類
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // アンカーに使用されるチャートのコーナー
const color            clr=clrRed,               // フラット境界線の色 (Flat)
const ENUM_LINE_STYLE  style=STYLE_SOLID,       // フラット境界スタイル
const int              line_width=1,             //フラット境界幅
const bool             back=false,               // 背景で表示する
const bool             selection=false,         // 強調表示して移動
const bool             hidden=true,             // オブジェクトリストに隠す
const long             z_order=0)               // マウスクリックの優先順位
{
//— エラー値をリセットする
ResetLastError();
//— 四角形ラベルを作成する
if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
“: failed to create a rectangle label! Error code = “,GetLastError());
return(false);
}
//— ラベル座標を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//— ラベルサイズを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//— 背景色を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//— 境界線を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border);
//— ポイント座標が相対的に定義されているチャートのコーナーを設定
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//— フラット境界線色を設定する(Flat モード)
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//— フラット境界線スタイルを設定する
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//— フラット境界線幅を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
//— 前景(false)または背景(true)に表示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//— マウスでラベルを移動させるモードを有効(true)か無効(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//— オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//— チャートのマウスクリックのイベントを受信するための優先順位を設定する
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//— 実行成功
return(true);
}
//+——————————————————————+
//| 四角形ラベルを移動するl                                                |
//+——————————————————————+
bool RectLabelMove(const long   chart_ID=0,       // チャート識別子
const string name=“RectLabel”, // ラベル名
const int    x=0,             // X 座標
const int    y=0)             // Y 座標
{
//— エラー値をリセットする
ResetLastError();
//— 四角形ラベルを移動する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
“: failed to move X coordinate of the label! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
“: failed to move Y coordinate of the label! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 四角形ラベルのサイズを変更する                                           |
//+——————————————————————+
bool RectLabelChangeSize(const long   chart_ID=0,       // チャート識別子
const string name=“RectLabel”, // ラベル名
const int    width=50,         // ラベル幅
const int    height=18)       // ラベルの高さ
{
//— エラー値をリセットする
ResetLastError();
//— ラベルサイズを変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
“: failed to change the label’s width! Error code = “,GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
“: failed to change the label’s height! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 四角形ラベルの境界線の種類を変更する                                     |
//+——————————————————————+
bool RectLabelChangeBorderType(const long             chart_ID=0,           // チャート識別子
const string           name=“RectLabel”,     // ラベル名
const ENUM_BORDER_TYPE border=BORDER_SUNKEN) // 境界線の種類
{
//— エラー値をリセットする
ResetLastError();
//— 境界線の種類を変更する
if(!ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border))
{
Print(__FUNCTION__,
“: failed to change the border type! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| 四角形ラベルを削除する                                                |
//+——————————————————————+
bool RectLabelDelete(const long   chart_ID=0,       // チャート識別子
const string name=“RectLabel”) // ラベル名
{
//— エラー値をリセットする
ResetLastError();
//— ラベルを削除する
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
“: failed to delete a rectangle label! Error code = “,GetLastError());
return(false);
}
//— 実行成功
return(true);
}
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— チャートウィンドウサイズ
long x_distance;
long y_distance;
//— ウィンドウサイズを設定する
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print(“Failed to get the chart width! Error code = “,GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print(“Failed to get the chart height! Error code = “,GetLastError());
return;
}
//— 四角形ラベル座標を定義する
int x=(int)x_distance/4;
int y=(int)y_distance/4;
//— ラベルサイズを設定する
int width=(int)x_distance/4;
int height=(int)y_distance/4;
//— 四角形ラベルを作成する
if(!RectLabelCreate(0,InpName,0,x,y,width,height,InpBackColor,InpBorder,InpCorner,
InpColor,InpStyle,InpLineWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//— チャートを再描画して1 秒待つ
ChartRedraw();
Sleep(1000);
//— 四角形ラベルのサイズを変更する
int steps=(int)MathMin(x_distance/4,y_distance/4);
for(int i=0;i<steps;i++)
{
//— サイズ変更
width+=1;
height+=1;
if(!RectLabelChangeSize(0,InpName,width,height))
return;
//— スクリプトの動作が強制的に無効にされているかどうかをチェックする
if(IsStopped())
return;
//— チャートを再描画して 0.01 秒待つ
ChartRedraw();
Sleep(10);
}
//— 1 秒の遅れ
Sleep(1000);
//— 境界線の種類を変更する
if(!RectLabelChangeBorderType(0,InpName,BORDER_RAISED))
return;
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— 境界線の種類を変更する
if(!RectLabelChangeBorderType(0,InpName,BORDER_SUNKEN))
return;
//— チャートを再描画して 1 秒待つ
ChartRedraw();
Sleep(1000);
//— ラベルを削除する
RectLabelDelete(0,InpName);
ChartRedraw();
//—1 秒待つ
Sleep(1000);
//—
}

Originally posted 2019-07-28 21:41:23.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">