//--- 説明 #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); //--- } |