オブジェクト型

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, // 境界線のスタイル