多币种顾问问题 - 页 2

 

alexjou,我看了一下帮助,发现。

"外部内存类 "定义了一个外部变量。在数据类型之前指定extern修饰符。外部变量 定义了程序的输入参数,它们可以从程序属性窗口访问。 数组不能作为外部变量。"

这里是自定义指标的所有代码。

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_minimum 0
#property indicator_maximum 100
//---- input parameters
//extern string    st="---Параметры Stochastic---";
extern int       KPeriod =12;
extern int       DPeriod =3;
extern int       Slowing =2;
//extern string    en="---Параметры Envelopes---";
extern int       EnvPeriod=17;
extern int       Deviation=15;
extern int       Shift=1;
//---- buffers
double Stochastic[];
double UP[];
double LOW[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Stochastic);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,UP);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,LOW);
//----
   return(0);
  }
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
     int limit;
     int counted_bars=IndicatorCounted();
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars--;
     limit=Bars-counted_bars;
  //---- основной цикл
     for(int i=0; i<limit; i++)
 
{
Stochastic[i]=iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
}
     for( i=0; i<limit; i++)
{
UP[i] =iMAOnArray(Stochastic,0, EnvPeriod, Shift,MODE_SMA,i)+Deviation;
LOW[i]=iMAOnArray(Stochastic,0, EnvPeriod, Shift,MODE_SMA,i)-Deviation;
)
 
  return(0);
  }

作为EA的外部变量,我设定

extern int     K__period        =6;
extern int     Env_period      =10; 
extern double  Env_deviation    =12;
 
//---------------------------------------------
int start()
  {
 
... ...
double Env_low[2];
//
double Stochastic[2];
 
Env_low[0]    = iCustom("USDJPY",0,"i-StochEnv",K__period,3,3,Env_period, Env_deviation,1,2,0);
Stochastic[0] = iCustom("USDJPY",0,"i-StochEnv",K__period,3,3,Env_period, Env_deviation,1,0,0);
Stochastic[1] = iCustom("USDJPY",0,"i-StochEnv",K__period,3,3,Env_period, Env_deviation,1,0,1);
在测试器中,这对组合是有效的。这里的错误可能是什么?

 
非常感谢你,我不会说不。:-)我在ICQ上给你写我的邮箱地址,给我号码。
我告诉你:我只是先做了回应,其他人来看了答案,并没有补充什么。所以不要以为这里的每个人都很生气,不想分享知识。
 
Эксперт: iCustom("USDJPY", ...


А индикатор откуда об этом знает? Лучше добавить в секцию extern индикатора строковую переменную вроде


extern string SymbolName = "USDJPY"; // инструмент по умолчанию 

и вызывать стохастик так 

Stochastic[i]=iStochastic(SymbolName, 0, ...

(Опять какие-то глюки форума. В Лисе стрелки не работают, оттго и пишу не по-людски) 
 
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_minimum 0
#property indicator_maximum 100
//---- input parameters
//extern string    st="---Параметры Stochastic---";
extern string    SymbolName = "USDJPY"; 
extern int       TimeFrame = 0; 
extern int       KPeriod =12;
extern int       DPeriod =3;
extern int       Slowing =2;
//extern string    en="---Параметры Envelopes---";
extern int       EnvPeriod=17;
extern int       Deviation=15;
extern int       Shift=1;
//---- buffers
double Stochastic[];
double UP[];
double LOW[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Stochastic);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,UP);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,LOW);
//----
   return(0);
  }
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
     int limit;
     int counted_bars=IndicatorCounted();
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars--;
     limit=Bars-counted_bars;
  //---- основной цикл
     for(int i=limit-1; i>=0; i--) // индикаторы лучше рассчитывать слева направо
 
{
Stochastic[i]=iStochastic(SymbolName, TimeFrame,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
}
     for(i=limit-1; i>=0; i--) // см. примечание
{
UP[i] =iMAOnArray(Stochastic,0, EnvPeriod, Shift,MODE_SMA,i)+Deviation;
LOW[i]=iMAOnArray(Stochastic,0, EnvPeriod, Shift,MODE_SMA,i)-Deviation;
)
 
  return(0);
  }


Вызов из эксперта:

iCustom("USDJPY", 0, ...

С iMAOnArray вообще надо обращаться аккуратно. Например, поэкспериментировать с порядком ее расчета. 
А лучше всего такие вещи делать самому. Кстати, для мультивалютного эксперта может потребоваться везде 
явно задавать имя символа и рабочий тайм-фрейм, чтобы избежать умолчательных сюрпризов вроде этого.
 

alexjou !

我对你的理解是否正确??????????

在一个多货币的EA中,当为一个特定的符号调用iCustom 指标时,最好在指标本身提供以下内容

外部字符串 SymbolName = "USDJPY"; // 默认符号

这是除了在专家顾问中的设置。

iCustom("USDJPY", 60, ...为这一对!

但是,如果我用其他外部参数为另一个货币对调用这个自定义指标,这意味着对于这个其他货币对,我必须用另一个名称输入一个自定义指标的副本,并在那里设置另一个货币对的符号

但这样一来,在专家顾问内部自己计算iMAOnArray确实更容易,不需要任何定制的诱导剂!这也是一个很好的例子。

 
这就对了。虽然,这是个业余的生意。例如,我的做法是使用自定义指标 来测试一个想法,如果这个想法被证明是可行的,那么就将指标代码转移到专家顾问中。这种方法几乎可以保证避免 "空 "指标值的陷阱,这些指标值很难被发现,如果编程时不小心,就会非常恼人。
 

谢谢你的解释!我马上去办...

klerk,我在周末的时候遇到了电子邮件的问题。

这是我给顾问的电子邮件地址。

rid200549@ya.ru

 
alexjou:
(Опять какие-то глюки форума. В Лисе стрелки не работают, оттго и пишу не по-людски) 
这些故障是在我的主板上的键盘连接器中出现的。论坛与此完全没有关系。很抱歉发出了错误的警报。
 

klerk,请在这里或邮件中确认你是否收到我的信息。

还有一个问题要问专家(如果太傻,请原谅)。

double bid_GBP = MarketInfo("GBPUSD", MODE_BID);
 double ask_GBP = MarketInfo("GBPUSD", MODE_ASK);
 double point_GBP =MarketInfo("GBPUSD",MODE_POINT);

而在每一对的尾部曲线中,你是否也要输入和替换这些数值?

.... ...
if (OrderType()==OP_BUY)                                            {
       if (!Profit_Trailing || (Bid-OrderOpenPrice())>Trailing_Stop*Point) {
        if (OrderStopLoss()<Bid-(Trailing_Stop+Trailing_Step-1)*Point)      {
.... ....
还是可以保持原样?
 
rid:

而在尾数对中,这些数值是否也需要输入和替换?

当然了。