智能交易网,程序化交易,自动交易,量化交易

 找回密码
 注册

QQ登录

只需一步,快速开始

手机短信登录

参加MT4智能交易编程培训,7课免费在线试听MT4指标,EA代写,或EA指标加密账户远程验证服务 最完善商业MT4跟单系统(0.1秒极速响应不漏单)
为论坛做贡献有奖学金,奖学金可直接换真钱 扫本站微信公 众号部分视频课程指标EA免费得智能交易网MT4操盘神器,扫公众号免费得
查看: 111|回复: 1

线性回归通道取值

[复制链接]
发表于 2019-7-7 10:18:34 | 显示全部楼层 |阅读模式
老师你好:
    我最近在弄一个用“线型回归通道”来下单的EA,但是我现在出现了一个问题,就是我应该如何获取“线型回归通道”的上轨中轨和下轨的值,并把他们显示在数据窗口中,麻烦老师帮忙解答一下,非常感谢。
回复

使用道具 举报

 楼主| 发表于 2019-7-7 13:21:45 | 显示全部楼层
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link     xxxxxxxxxxxxx
#property version   "1.00"
//--- input parameters
input int      K线数目=500;
input int      深度=30;
input int      ExtBackstep=3;
//---
datetime time[],向上时间坐标,向下时间坐标;
double   open[],high[],low[],close[],A点值;
long     tick_volume[],real_volume[];
//---
int z=500,
    high_a,low_a,a,
    last_high_b,last_low_b,b,
    A点_high,A点_low,A点;
//---
string 向上箭头,向下箭头,
       最高点箭头,最低点箭头,
       向上拇指,向下拇指,
       A点线,A点字,
       线性回归通道(旧),线性回归通道(新);
double t1;
//+------------------------------------------------------------------+
int OnInit(){return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
    ObjectDelete(0,"向上箭头");
    ObjectDelete(0,"向下箭头");
    ObjectDelete(0,"最高点箭头");
    ObjectDelete(0,"最低点箭头");
    ObjectDelete(0,"向上拇指");
    ObjectDelete(0,"向下拇指");
    ObjectDelete(0,"线性回归通道(旧)");
    ObjectDelete(0,"线性回归通道(新)");
    ObjectDelete(0,"A点线");
    ObjectDelete(0,"A点字");
  }
//+------------------------------------------------------------------+
void OnTick()
{
//+---------------------------------+
//|
   int      K线总数  = iBars(NULL,0);
//---
   CopyTime(Symbol(),PERIOD_CURRENT,0,K线总数,time);
   ArraySetAsSeries(time,true);
   datetime 时间  = time[0];
//---
   CopyOpen(Symbol(),PERIOD_CURRENT,0,K线总数,open);
   ArraySetAsSeries(open,true);
   double 开盘价  = open[0];
//---
   CopyHigh(Symbol(),PERIOD_CURRENT,0,K线总数,high);
   ArraySetAsSeries(high,true);
   double 最高点  = high[0];
//---
   CopyLow(Symbol(),PERIOD_CURRENT,0,K线总数,low);
   ArraySetAsSeries(low,true);
   double 最低点  = low[0];
//---
   CopyClose(NULL,PERIOD_CURRENT,0,K线总数,close);
   ArraySetAsSeries(close,true);
   double 收盘价  = close[0];
//---
   CopyTickVolume(Symbol(),PERIOD_CURRENT,0,K线总数,tick_volume);
   ArraySetAsSeries(tick_volume,true);
   long 点击成交量  = tick_volume[0];
//---
   CopyRealVolume(Symbol(),PERIOD_CURRENT,0,K线总数,real_volume);
   ArraySetAsSeries(real_volume,true);
   long 交易成交量  = real_volume[0];
//+---------------------------------+
//|Comment函数可以将信息在屏幕左上角显示  
   Comment(Symbol(),","  ,EnumToString(Period()),"\n",
           "时间: "      ,TimeToString(时间,TIME_DATE|TIME_SECONDS),"\n",
           "开盘价: "    ,DoubleToString(开盘价,Digits()),"\n",
           "最高点: "    ,DoubleToString(最高点,Digits()),"\n",
           "最低点: "    ,DoubleToString(最低点,Digits()),"\n",
           "收盘价: "    ,DoubleToString(收盘价,Digits()),"\n",
           "点击成交量: ",IntegerToString(点击成交量),"\n",
           "交易成交量: ",IntegerToString(交易成交量),"\n",
           "K线总数: "   ,IntegerToString(K线总数),"\n");
//+------------------------------------------------------------------+
//+---------------------------------+
//|寻找五百根K线内的高点和低点
//---五百根K线内的高点
double 五百根K线内的高点=high[0];
//---
for(int i=0;i<K线数目;i++)
  {
    if(high[i]>五百根K线内的高点)
     {
       五百根K线内的高点=high[i];
        high_a=i;
     }
  }
//---五百根K线内的低点
double 五百根K线内的低点=low[0];
//---
for(int i=0;i<K线数目;i++)
  {
    if(low[i]<五百根K线内的低点)
      {
        五百根K线内的低点=low[i];
        low_a=i;
      }
  }
//+---------------------------------+
//|以K线位置为基准判断高点在前还是低点在前,以此决定通道的第一时间点和价格点
  if(low_a>high_a)
    {
      a=low_a;
    }
  else
    {
      a=high_a;
    }
//+------------------------------------------------------------------+
//+---------------------------------+
//|以30根K线位置为基准获取最近高点和最近低点
//---获取最近高点
double 最近高点=high[0];
for(int i=0;i<深度;i++)
  {
    if(high[i]>最近高点)
     {
       最近高点=high[i];
        last_high_b=i;
     }
  }
//---获取最近低点
double 最近低点=low[0];
//---
for(int i=0;i<深度;i++)
  {
    if(low[i]<最近低点)
      {
        最近低点=low[i];
        last_low_b=i;
      }
  }
//+---------------------------------+
//|以K线位置为基准判断高点在前还是低点在前,以此决定通道的第二时间点和价格点
//+---------------------------------+
  if(last_low_b<last_high_b)
    {
      b=last_low_b;
    }
  else
    {
      b=last_high_b;
    }
//+------------------------------------------------------------------+
//+---------------------------------+
//|最高点前的第一个低点和最低点前的第一个高点,也就是A点
//+---------------------------------+
//---最高点前的第一个低点
double 最高点前的第一个低点=high[b];
//---
for(int i=b;i<b+深度;i++)
  {
    if(high[i]>最高点前的第一个低点)
     {
       最高点前的第一个低点=high[i];
        A点_high=i;
     }
  }
//---最低点前的第一个高点
double 最低点前的第一个高点=low[b];
//---
for(int i=b;i<b+深度;i++)
  {
    if(low[i]<最低点前的第一个高点)
      {
        最低点前的第一个高点=low[i];
        A点_low=i;
      }
  }
//+---------------------------------+
//|以K线位置为基准判断高点在前还是低点在前,以此决定A点的位置
//+---------------------------------+
  if(A点_low<A点_high)
    {
      A点=A点_high;
      A点值=high[A点_high];
    }
  else
    {
      A点=A点_low;
      A点值=low[A点_low];
    }
//+------------------------------------------------------------------+
//---五百根K线内的高点画向上箭头(1小时图加0.0015,5分钟图加0.0003)
  ObjectCreate(0,"最高点箭头",OBJ_ARROW_UP,0,time[high_a],五百根K线内的高点+0.0003);
//--- 设置符号颜色
  ObjectSetInteger(0,"最高点箭头",OBJPROP_COLOR,clrYellow);
//--- 设置符号大小
  ObjectSetInteger(0,"最高点箭头",OBJPROP_WIDTH,2);
//---
//---五百根K线内的低点画向下箭头
  ObjectCreate(0,"最低点箭头",OBJ_ARROW_DOWN,0,time[low_a],五百根K线内的低点);
//--- 设置符号颜色
  ObjectSetInteger(0,"最低点箭头",OBJPROP_COLOR,clrYellow);
//--- 设置符号大小
  ObjectSetInteger(0,"最低点箭头",OBJPROP_WIDTH,2);
//+------------------------------------------------------------------+
//---最近高点画向上箭头(1小时图加0.0015,5分钟图加0.0003)
  ObjectCreate(0,"向上箭头",OBJ_ARROW_UP,0,time[last_high_b],最近高点+0.0003);
//--- 设置符号颜色
  ObjectSetInteger(0,"向上箭头",OBJPROP_COLOR,clrBlue);
//--- 设置符号大小
  ObjectSetInteger(0,"向上箭头",OBJPROP_WIDTH,2);
//---
//---最近高点画向下箭头
  ObjectCreate(0,"向下箭头",OBJ_ARROW_DOWN,0,time[last_low_b],最近低点);
//--- 设置符号颜色
  ObjectSetInteger(0,"向下箭头",OBJPROP_COLOR,clrBlue);
//--- 设置符号大小
  ObjectSetInteger(0,"向下箭头",OBJPROP_WIDTH,2);
//+------------------------------------------------------------------+
//---最高点前的第一个低点画向上拇指(1小时图加0.0015,5分钟图加0.0003)
  ObjectCreate(0,"向上拇指",OBJ_ARROW_THUMB_UP,0,time[A点],最高点前的第一个低点+0.0003);
//--- 设置符号颜色
  ObjectSetInteger(0,"向上拇指",OBJPROP_COLOR,clrYellow);
//--- 设置符号大小
  ObjectSetInteger(0,"向上拇指",OBJPROP_WIDTH,2);
//---
//---最低点前的第一个高点画向下拇指
  ObjectCreate(0,"向下拇指",OBJ_ARROW_THUMB_DOWN,0,time[A点],最低点前的第一个高点);
//--- 设置符号颜色
  ObjectSetInteger(0,"向下拇指",OBJPROP_COLOR,clrYellow);
//--- 设置符号大小
  ObjectSetInteger(0,"向下拇指",OBJPROP_WIDTH,2);
//+------------------------------------------------------------------+
  ObjectCreate(0,"A点线",OBJ_HLINE,0,time[A点],A点值);
//+------------------------------------------------------------------+  
  ObjectCreate(0,"线性回归通道(旧)",OBJ_REGRESSION,0,time[a],low[a],time[b],high[b]);
//--- 设置影响通道宽度的偏差值
  ObjectSetDouble(0,"线性回归通道(旧)",OBJPROP_DEVIATION,1.0);
//--- 设置通道颜色
  ObjectSetInteger(0,"线性回归通道(旧)",OBJPROP_COLOR,clrBlue);
//--- 设置通道线的风格
  ObjectSetInteger(0,"线性回归通道(旧)",OBJPROP_STYLE,STYLE_SOLID);
//--- 设置通道线的宽度
  ObjectSetInteger(0,"线性回归通道(旧)",OBJPROP_WIDTH,2);
//--- 启用 (true) 或禁用 (false) 延续向右显示通道的模式
//---
  ObjectCreate(0,"线性回归通道(新)",OBJ_REGRESSION,0,time[b],low[b],time[0],high[0]);
//--- 设置影响通道宽度的偏差值
  ObjectSetDouble(0,"线性回归通道(新)",OBJPROP_DEVIATION,1.0);
//--- 设置通道颜色
  ObjectSetInteger(0,"线性回归通道(新)",OBJPROP_COLOR,clrYellow);
//--- 设置通道线的风格
  ObjectSetInteger(0,"线性回归通道(新)",OBJPROP_STYLE,STYLE_SOLID);
//--- 设置通道线的宽度
  ObjectSetInteger(0,"线性回归通道(新)",OBJPROP_WIDTH,1);
//--- 启用 (true) 或禁用 (false) 延续向右显示通道的模式
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|sitemap|智能交易网,程序化交易,自动交易,量化交易 ( 苏ICP备08108698号,苏州智德金网络科技股份有限公司版权所有 )

GMT+8, 2019-7-24 14:03 , Processed in 0.082571 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表