//--- 描述 #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, // 图表 ID 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, // 图表 ID 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, // 图表ID 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); //--- } |