//+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ voidOnInit() { //--- 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
//--- 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
奇异频谱分析(SSA)会重新计算,除非它是端点版本。由于该指标使用 "常规 "的SSA,它也会重新计算。
恐怕从代码中我根本看不出你的意图是什么
如果你想拥有带水平的平均数,请使用我发布的模板
你好。
是的,我将使用你的高级带水平的MA,(它有更多的价格,等等......彩色的MA,等等。)
但我试图自己创建一个,以了解如何创建一个自定义指标。
我的想法是创建相同的组件(基本上是一个有两个级别的MA......)。
我使用一个中央MA,和另外两个MA,用点线绘制,以达到与水平线相同的效果......
对于每个级别,我使用计算事件来填充缓冲区......就像你告诉我的那样,但有些事情是错误的;-(
模拟水平的两个MAs将被垂直移动......但这并不奏效。
你好。
是的,我将使用你的高级指数,(它有更多的价格,等等,彩色指数,等等)。
但我试图自己创建一个,以了解如何创建一个自定义指标。
我的想法是创建相同的组件(基本上是一个有两个级别的MA......)。
我使用一个中央MA,和另外两个MA,用点线绘制,以达到与水平线相同的效果......
对于每个级别,我使用计算事件来填充缓冲区......就像你告诉我的那样,但有些事情是错误的;-(
模拟水平的两个MAs将被垂直移动......但这并不奏效。
是的,这就是我的意思
这件事很简单,因为它得到了。
在平均数计算或其他方面不需要做任何改变:只是从中央(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);
}
//+------------------------------------------------------------------+
是的,这就是我的意思
这件事简单得不能再简单了。
不需要改变平均计算或其他任何东西:只是简单地从中央(ma)缓冲区加或减。
你能不能展示一个加/减(垂直)马的示例代码? 我试过,但我的代码失败了。
你能展示一个加/减(垂直)马的示例代码吗? 我试过,但我的代码失败了。
该指标使用居中的TMA - 它重新计算。警报将是毫无意义的
好的,当颜色改变时,箭头是什么?
好的,当颜色改变时,箭头是什么?
信号(箭头)由于其重新计算/重新绘制的性质,将是毫无意义的。
亲爱的@mladen,
一个没有Ecn支持的专家,在使用Ecn类型的经纪商时能不能没有问题?
在一些专家中,有Ecn类型经纪商的选项。
这使我想到,最好是为Ecn型经纪商优化或添加一些代码。
亲爱的@mladen,
一个没有Ecn支持的专家,在使用Ecn类型的经纪商时能不能没有问题?
在一些专家中,有Ecn类型经纪商的选项。
这使我想到,最好是为Ecn型经纪商优化或添加一些代码。
是的,如果你在开单时不使用止损和止盈 的话。
如果它是为ECN/STP制作的,它在任何经纪商上工作都没有问题。唯一的区别是在开立订单的时候 - 根本不需要其他的改变(或优化)。
谢谢你的详细回答。
据我所知,附件中的EA并不支持ECN类型的经纪商。
我想通过使用SL和TP在Ecn型经纪商中使用这个EA。
如果你能提供ECN型经纪商支持,我将非常高兴。
该EA将需要重写,以便每个人都能理解它。
但由于我不会说其中使用的语言,所以我无法帮助。抱歉