这是我关于Stackoverflow的第一篇文章,尽管我已经来过这里多年了。
我已阅读邮件指南,因此我将尽可能简洁明了。
我一直试图将自定义指标的代码直接嵌入到EA中,而不必调用iCustom:
iCustom(Symbol(),60,"MB",3D,0,1)>0;
到目前为止,我已经失败了,尽管我相信对许多人来说这可能是一件微不足道的事情,如果您不知道,您也不知道。
有问题的iCustom代码如下,感谢您的帮助:
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_width1 5
#property indicator_width2 5
extern int 3D= 5
double AIAIAI[];
double B1B1B1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
SetIndexBuffer( 0, AIAIAI );
SetIndexEmptyValue( 0, 0.0 );
SetIndexStyle( 0, DRAW_ARROW );
SetIndexArrow( 0, 250 );
SetIndexLabel( 0, NULL );
SetIndexBuffer( 1, B1B1B1);
SetIndexEmptyValue( 1, 0.0 );
SetIndexStyle( 1, DRAW_ARROW );
SetIndexArrow( 1, 250 );
SetIndexLabel( 1, NULL );
IndicatorDigits( 5 );
//---- name for DataWindow and indicator subwindow label
IndicatorShortName( MB(" + 3D+ ")" );
return( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars = IndicatorCounted();
if (counted_bars < 0) return (-1);
if (counted_bars > 0) counted_bars--;
int intLimit = Bars - counted_bars;
int LO, HI;
for( int NINI = intLimit; NINI >= 0; NINI-- )
{
AIAIAI[NINI] = 0.0;
B1B1B1[NINI] = 0.0;
LO = iLowest( Symbol(), Period(), MODE_LOW, 3D, NINI );
if ( LO == NINI )
{
AIAIAI[NINI] = Low[NINI];
}
HI = iHighest( Symbol(), Period(), MODE_HIGH, 3D, NINI );
if ( HI == NINI )
{
B1B1B1[NINI] = High[NINI];
}
}
return( 0 );
}
谢谢
答案 0 :(得分:0)
如果仅将指标用作示例,则可能不是一个好的指标,因为它不使用缓冲区和总体上非常简单的指标。在需要时从ea重新计算缓冲区值应该很容易。
double iCustomValue(const int param,const int buffer,const int shift)
{
switch(buffer)
{
case 0:
if(iLowest(_Symbol,0,MODE_LOW,param,shift)==shift)
return iLow(_Symbol,0,shift);
break;
case 1:
if(iHighest(_Symbol,0,MODE_HIGH,param,shift)==shift)
return iLow(_Symbol,0,shift);
break;
}
return(0.0);
}
,然后使用该功能代替您的指标。对于更复杂的指标-请记住,调用指标当然较慢,但测试起来更容易。
答案 1 :(得分:0)
将指标代码与已编译的EA打包在一起的最佳方法是将其包含为资源,并继续使用icustom对其进行调用。通过这种方式进行操作时,无需重构和提取指示符逻辑。
语法如下:
#resource "MyCustomIndicator.ex4"
double my_custom_zero_buffer(string symbol, int period, int setting, int i)
{
return iCustom(symbol, period, "::MyCustomIndicator.ex4", setting, 0, i);
}
编译此EA时,指标也将被编译并打包在一起,因此您可以在不暴露指标逻辑的情况下使用/分发它