追星 发表于 2024-4-23 16:50:54

4、接第三贴

读取数据下面提供了通过指标句柄获取数据的一般函数,在关于将振荡指标连接到EA的文章中,已经对这些函数进行了回顾。所提供的函数可以在自定义程序中“按原样”使用:
//+------------------------------------------------------------------+//| Return the indicator data on the specified bar                   |//+------------------------------------------------------------------+double IndicatorValue(const int ind_handle,const int index,const int buffer_num){   double array[1]={0};   ResetLastError();   if(CopyBuffer(ind_handle,buffer_num,index,1,array)!=1)   {      PrintFormat("%s: CopyBuffer failed. Error %ld",__FUNCTION__,GetLastError());      return EMPTY_VALUE;   }   return array[0];}//+------------------------------------------------------------------+//| Return the state of the indicator line                           |//+------------------------------------------------------------------+ENUM_LINE_STATE LineState(const int ind_handle,const int index,const int buffer_num){//--- Get the values of the indicator line with the shift (0,1,2) relative to the passed index   const double value0=IndicatorValue(ind_handle,index,buffer_num);   const double value1=IndicatorValue(ind_handle,index+1,buffer_num);   const double value2=IndicatorValue(ind_handle,index+2,buffer_num);//--- If at least one of the values could not be obtained, return an undefined value    if(value0==EMPTY_VALUE || value1==EMPTY_VALUE || value2==EMPTY_VALUE)      return LINE_STATE_NONE;//--- Line upward reversal (value2>value1 && value0>value1)   if(NormalizeDouble(value2-value1,ind_digits)>0 && NormalizeDouble(value0-value1,ind_digits)>0)      return LINE_STATE_TURN_UP;//--- Line upward direction (value2<=value1 && value0>value1)   else if(NormalizeDouble(value2-value1,ind_digits)<=0 && NormalizeDouble(value0-value1,ind_digits)>0)      return LINE_STATE_UP;//--- Line upward stop (value2<=value1 && value0==value1)   else if(NormalizeDouble(value2-value1,ind_digits)<=0 && NormalizeDouble(value0-value1,ind_digits)==0)      return LINE_STATE_STOP_UP;//--- Line downward reversal (value2<value1 && value0<value1)   if(NormalizeDouble(value2-value1,ind_digits)<0 && NormalizeDouble(value0-value1,ind_digits)<0)      return LINE_STATE_TURN_DOWN;//--- Line downward direction (value2>=value1 && value0<value1)   else if(NormalizeDouble(value2-value1,ind_digits)>=0 && NormalizeDouble(value0-value1,ind_digits)<0)      return LINE_STATE_DOWN;//--- Line downward stop (value2>=value1 && value0==value1)   else if(NormalizeDouble(value2-value1,ind_digits)>=0 && NormalizeDouble(value0-value1,ind_digits)==0)      return LINE_STATE_STOP_DOWN;//--- Undefined state   return LINE_STATE_NONE;}//+------------------------------------------------------------------+//| Return the state of the line relative to the specified level   |//+------------------------------------------------------------------+ENUM_LINE_STATE LineStateRelative(const int ind_handle,const int index,const int buffer_num,const double level0,const double level1=EMPTY_VALUE){//--- Get the values of the indicator line with the shift (0,1) relative to the passed index   const double value0=IndicatorValue(ind_handle,index,buffer_num);   const double value1=IndicatorValue(ind_handle,index+1,buffer_num);//--- If at least one of the values could not be obtained, return an undefined value    if(value0==EMPTY_VALUE || value1==EMPTY_VALUE)      return LINE_STATE_NONE;//--- Define the second level to compare   double level=(level1==EMPTY_VALUE ? level0 : level1);//--- The line is below the level (value1<level && value0<level0)   if(NormalizeDouble(value1-level,ind_digits)<0 && NormalizeDouble(value0-level0,ind_digits)<0)      return LINE_STATE_UNDER;//--- The line is above the level (value1>level && value0>level0)   if(NormalizeDouble(value1-level,ind_digits)>0 && NormalizeDouble(value0-level0,ind_digits)>0)      return LINE_STATE_ABOVE;//--- The line crossed the level upwards (value1<=level && value0>level0)   if(NormalizeDouble(value1-level,ind_digits)<=0 && NormalizeDouble(value0-level0,ind_digits)>0)      return LINE_STATE_CROSS_UP;//--- The line crossed the level downwards (value1>=level && value0<level0)   if(NormalizeDouble(value1-level,ind_digits)>=0 && NormalizeDouble(value0-level0,ind_digits)<0)      return LINE_STATE_CROSS_DOWN;//--- The line touched the level from below (value1<level0 && value0==level0)   if(NormalizeDouble(value1-level,ind_digits)<0 && NormalizeDouble(value0-level0,ind_digits)==0)      return LINE_STATE_TOUCH_BELOW;//--- The line touched the level from above (value1>level0 && value0==level0)   if(NormalizeDouble(value1-level,ind_digits)>0 && NormalizeDouble(value0-level0,ind_digits)==0)      return LINE_STATE_TOUCH_BELOW;//--- Line is equal to the level value (value1==level0 && value0==level0)   if(NormalizeDouble(value1-level,ind_digits)==0 && NormalizeDouble(value0-level0,ind_digits)==0)      return LINE_STATE_EQUALS;//--- Undefined state   return LINE_STATE_NONE;}//+------------------------------------------------------------------+//| Return the indicator line state description                      |//+------------------------------------------------------------------+string LineStateDescription(const ENUM_LINE_STATE state){   switch(state)   {      case LINE_STATE_UP         :return "Up";      case LINE_STATE_STOP_UP    :return "Stop Up";      case LINE_STATE_TURN_UP    :return "Turn Up";      case LINE_STATE_DOWN       :return "Down";      case LINE_STATE_STOP_DOWN:return "Stop Down";      case LINE_STATE_TURN_DOWN:return "Turn Down";      case LINE_STATE_ABOVE      :return "Above level";      case LINE_STATE_UNDER      :return "Under level";      case LINE_STATE_CROSS_UP   :return "Crossing Up";      case LINE_STATE_CROSS_DOWN :return "Crossing Down";      case LINE_STATE_TOUCH_BELOW:return "Touch from Below";      case LINE_STATE_TOUCH_ABOVE:return "Touch from Above";      case LINE_STATE_EQUALS   :return "Equals";      default                  :return "Unknown";   }}

兔斯基_5912 发表于 2024-4-23 16:53:18

写得好
页: [1]
查看完整版本: 4、接第三贴