编码帮助 - 页 743

 
mladen:
奇异频谱分析(SSA)会重新计算,除非它是端点版本。由于该指标使用 "常规 "的SSA,它也会重新计算。
非常感谢
 
mladen:

恐怕从代码中我根本看不出你的意图是什么

如果你想拥有带水平的平均数,请使用我发布的模板

你好。

是的,我将使用你的高级带水平的MA,(它有更多的价格,等等......彩色的MA,等等。)

但我试图自己创建一个,以了解如何创建一个自定义指标

我的想法是创建相同的组件(基本上是一个有两个级别的MA......)。

我使用一个中央MA,和另外两个MA,用点线绘制,以达到与水平线相同的效果......
对于每个级别,我使用计算事件来填充缓冲区......就像你告诉我的那样,但有些事情是错误的;-(
模拟水平的两个MAs将被垂直移动......但这并不奏效。

 
baraozemo:

你好。

是的,我将使用你的高级指数,(它有更多的价格,等等,彩色指数,等等)。

但我试图自己创建一个,以了解如何创建一个自定义指标。

我的想法是创建相同的组件(基本上是一个有两个级别的MA......)。

我使用一个中央MA,和另外两个MA,用点线绘制,以达到与水平线相同的效果......
对于每个级别,我使用计算事件来填充缓冲区......就像你告诉我的那样,但有些事情是错误的;-(
模拟水平的两个MAs将被垂直移动......但这并不奏效。

是的,这就是我的意思

这件事很简单,因为它得到了。

  • 创建MA(平均)。
  • 为第1级添加一些向上和向下的差异(制造两个更多的缓冲区)
  • 为第2级增加一些差异(再做两个缓冲区)。

在平均数计算或其他方面不需要做任何改变:只是从中央(MA)缓冲区中简单的加减。

 

double pipLevel1 = -10;
double pipLevel2 = 10;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA); //MA Buffer
   SetIndexBuffer(1,ExtLv1Buffer,INDICATOR_DATA); //MA lv1 Buffer
   SetIndexBuffer(2,ExtLv2Buffer,INDICATOR_DATA); //MA lv2 Buffer
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- sets first bar from what index will be drawn

   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); //MA Style
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_DOT);   //MA lvl1 Style
   PlotIndexSetInteger(2,PLOT_LINE_STYLE,STYLE_DOT);   //MA lvl2 Style

                                                       //IndicatorSetInteger(INDICATOR_LEVELS,1,InpLevel1); //MA lvl1 Value
//IndicatorSetInteger(INDICATOR_COLOR2,1,Cyan);
//IndicatorSetInteger(INDICATOR_STYLE2,1,STYLE_DOT);
//IndicatorSetInteger(INDICATOR_IDTH,1,1);

//IndicatorSetInteger(INDICATOR_LEVELS,2,InpLevel2); //MA lvl2 Value
//IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,Cyan);
//IndicatorSetInteger(INDICATOR_LEVELSTYLE,2,STYLE_DOT);
//IndicatorSetInteger(INDICATOR_LEVELWIDTH,2,1);  

   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod); //MA
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpMAPeriod); //MA lvl1
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpMAPeriod); //MA lvl2
//---- line shifts when drawing

   PlotIndexSetInteger(0,PLOT_SHIFT,InpMAShift); //MA
   PlotIndexSetInteger(1,PLOT_SHIFT,InpMAShift); //MA lvl1
   PlotIndexSetInteger(2,PLOT_SHIFT,InpMAShift); //MA lvl2

//--- name for DataWindow
   string short_name="unknown ma";
   switch(InpMAMethod)
     {
      case MODE_EMA :  short_name="EMA";  break;
      case MODE_LWMA : short_name="LWMA"; break;
      case MODE_SMA :  short_name="SMA";  break;
      case MODE_SMMA : short_name="SMMA"; break;
     }
   IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod)+")");
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);  //MA
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);  //MA lvl1
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0.0);  //MA lvl2
//---- initialization done
  }
//+------------------------------------------------------------------+
//|  Moving Average                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   double pipMultiplier=_Point*MathPow(10,MathMod(_Digits,2));
   pipLevel1 = InpLevel1 * pipMultiplier;
   pipLevel2 = InpLevel2 * pipMultiplier;
//Print("point:"+_Point+" Digits:"+_Digits+ "pipMul:"+pipMultiplier);
//pipLevel1 = InpLevel1 / 10;
//pipLevel2 = InpLevel2 / 10;  

//--- check for bars count
   if(rates_total<InpMAPeriod-1+begin)
      return(0);// not enough bars for calculation
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      ArrayInitialize(ExtLineBuffer,0);  //MA
      ArrayInitialize(ExtLv1Buffer,1);  //MA level1
      ArrayInitialize(ExtLv2Buffer,2);  //MA level2
     }
//--- sets first bar from what index will be draw
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod-1+begin); //MA
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpMAPeriod-1+begin); //MA lvl1
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpMAPeriod-1+begin); //MA lvl2

//--- calculation
   switch(InpMAMethod)
     {
      case MODE_EMA:  
                      CalculateEMA(rates_total,prev_calculated,begin,price);
                      ExtLv1Buffer[rates_total-1]=price[rates_total-1]+pipLevel1;
                      ExtLv2Buffer[rates_total-1]=price[rates_total-1]+pipLevel2;
                      //Print ("rates_total:"+rates_total+" prev:"+prev_calculated+" begin:"+begin+" price:"+price[rates_total-1]);
                      break;
      case MODE_LWMA:
                      CalculateLWMA(rates_total,prev_calculated,begin,price);
                      ExtLv1Buffer[rates_total-1]=price[rates_total-1]+pipLevel1;
                      ExtLv2Buffer[rates_total-1]=price[rates_total-1]+pipLevel2;
                      break;
      case MODE_SMMA:
                      CalculateSmoothedMA(rates_total,prev_calculated,begin,price);
                      ExtLv1Buffer[rates_total-1]=price[rates_total-1]+pipLevel1;
                      ExtLv2Buffer[rates_total-1]=price[rates_total-1]+pipLevel2;
                      break;
      case MODE_SMA:  
                      CalculateSimpleMA(rates_total,prev_calculated,begin,price);
                      ExtLv1Buffer[rates_total-1]=price[rates_total-1]+pipLevel1;
                      ExtLv2Buffer[rates_total-1]=price[rates_total-1]+pipLevel2;
                      break;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
mladen
:

是的,这就是我的意思

这件事简单得不能再简单了。

  • 创建ma(平均)。
  • 为第1级增加一些上下的差异(再做两个缓冲)。
  • 为第2级添加一些差值(再做两个缓冲区)。

不需要改变平均计算或其他任何东西:只是简单地从中央(ma)缓冲区加或减。

你能不能展示一个加/减(垂直)马的示例代码? 我试过,但我的代码失败了。

 
baraozemo:

你能展示一个加/减(垂直)马的示例代码吗? 我试过,但我的代码失败了。

你在我发布的版本中有这个功能。请再次检查 代码
 
mladen:
该指标使用居中的TMA - 它重新计算。警报将是毫无意义的

好的,当颜色改变时,箭头是什么?

 
dotmund:

好的,当颜色改变时,箭头是什么?

由于其重新计算/重新绘制的性质,信号(箭头)将是毫无意义的。
 
mladen:
信号(箭头)由于其重新计算/重新绘制的性质,将是毫无意义的。

亲爱的@mladen,

一个没有Ecn支持的专家,在使用Ecn类型的经纪商时能不能没有问题?

在一些专家中,有Ecn类型经纪商的选项。

这使我想到,最好是为Ecn型经纪商优化或添加一些代码。

 
oguz:

亲爱的@mladen,

一个没有Ecn支持的专家,在使用Ecn类型的经纪商时能不能没有问题?

在一些专家中,有Ecn类型经纪商的选项。

这使我想到,最好是为Ecn型经纪商优化或添加一些代码。

是的,如果你在开单时不使用止损和止盈 的话。

如果它是为ECN/STP制作的,它在任何经纪商上工作都没有问题。唯一的区别是在开立订单的时候 - 根本不需要其他的改变(或优化)。

 
oguz:

谢谢你的详细回答。

据我所知,附件中的EA并不支持ECN类型的经纪商。

我想通过使用SL和TP在Ecn型经纪商中使用这个EA。

如果你能提供ECN型经纪商支持,我将非常高兴。

该EA将需要重写,以便每个人都能理解它。

但由于我不会说其中使用的语言,所以我无法帮助。抱歉