来自一个 "傻瓜 "的问题 - 页 53

 
不要把无条件的、愚蠢的(来自无知的)在每一个刻度上重新创建指标与智能的(罕见的和必要的)创建指标 混为一谈。在第一种情况下,你会得到百倍的刹车和资源泄漏,而在第二种情况下,你会得到完美的性能。
 
Renat:
不要把无条件的、愚蠢的(来自无知的)在每一个刻度上重新创建指标与智能的(罕见的和必要的)创建指标 混为一谈。在第一种情况下,你会得到百倍的刹车和资源的泄漏,而在第二种情况下 - 完美的工作。

我很清楚,卡尔森 无知地犯了一个错误,我也明白这个错误的性质。

但要建议一个合理的方案来解决他的问题。这个人需要使用指标中写的代码,但这个代码的参数是在每次访问指标数据之前动态确定的?

我有一个解决方案,它确实包含dll,但你想使用纯mql,所以提出一个mql的解决方案。

HZ我已经提到了OnCalculate()和事件中的计算,但你可以通过事件传递三个参数。在我的解决方案中,一个长的dll可以传递一个带参数的数组的地址,指标将在这个地址接收数据。

如果你有mql的解决方案,就指点一下。

 
Urain:

我很清楚,卡尔森 无知地犯了一个错误,我也明白这个错误的性质。

但要建议一个合理的方案来解决他的问题。该人需要使用写在指标中的代码,但该代码的参数在每次引用指标数据之前都是动态确定的?

现实中应该建立多少个不同的指标?可能不超过10个,否则将是毫无意义的资源浪费。

由于没有参数变化,你可以创建一个指标集合,必要时将会把必要的指标加入其中。如果指标少于10个,并且它们有明确的含义(初始、确认、纠正等),你可以用需要的参数创建手柄的命名变量。

 
Urain:

但要建议一个合理的方案来解决他的问题。该人需要使用写在指标中的代码,但该代码的参数在每次引用指标数据之前都是动态确定的?

我已经考虑过这个问题了。如果代码参数是在每次调用指标数据前动态确定的,那么为什么不在指标代码中也包括确定这些参数的程序?换句话说,所有的计算都应该在指标中实现。

或者在某些情况下,这种方法在原则上是不可能的?

 
你能告诉我,为什么在这样一个简单的指标中,除了周线之外, 零条(右起第一条)没有到处计算?

#include <MovingAverages.mqh>
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_color1 LightBlue
#property indicator_type1   DRAW_LINE
#property indicator_width1 2

input int PERIOD = 80;
input ENUM_MA_METHOD  method = MODE_SMA;
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE;
double Uptrend[];
double ExtRsiArray_TF2[];
double mabuf[];
int handleMA,handleMA2;

int OnInit()
  {
   SetIndexBuffer(0, Uptrend);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);  
   ArraySetAsSeries(Uptrend,true);
   handleMA=iMA(NULL, 0, PERIOD, 0, method, PRICE);
   handleMA2=iMA(NULL, 0, PERIOD/2, 0, method, PRICE);
   return(0);
  }
  
double WMA(int ai_0,int a_period_4) {
int some;
if(a_period_4==PERIOD)
 if(CopyBuffer(handleMA,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
some=PERIOD/2;
if(a_period_4==some)
 if(CopyBuffer(handleMA2,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
return (ExtRsiArray_TF2[0]);
}

int OnCalculate (const int rates_total,      
                 const int prev_calculated, 
                 const int begin,          
                 const double& price[] 
   )
  { ArraySetAsSeries(price,true);
    int counted_bars = prev_calculated; 
    if(counted_bars < 0) return(-1); 
    int x = 0; 
    int p = MathSqrt(PERIOD);              
    int e = rates_total - counted_bars + PERIOD + 1; 
    double vect[], trend[]; 
    if(e > rates_total) e = rates_total;    
    ArrayResize(vect, e); 
    ArraySetAsSeries(vect, true);
    ArrayResize(trend, e); 
    ArraySetAsSeries(trend, true);
    ArrayResize(mabuf, e); 
    ArraySetAsSeries(mabuf, true);
    for(x = 0; x < e; x++)        vect[x] = 2*WMA(x, PERIOD/2) - WMA(x, PERIOD);
    if(method==MODE_SMA)
    SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf);

    for(x = 0; x < e-PERIOD; x++) Uptrend[x] = mabuf[x];
    return(rates_total);                
  }
 
Yedelkin:

我已经想了很久了。如果代码参数是在每次使用指标数据之前动态确定的,那么我们为什么不把确定这些参数的程序纳入指标代码中呢?换句话说,所有的计算都应该在指标中实现。

或者在某些情况下,这种方法在原则上是不可能的?

有些情况下,参数由另一个指标计算并返回给专家顾问,专家顾问根据神经元决定使用哪个模型。我们事先不知道哪一套参数会被应用。

 
Expert:
你能告诉我,为什么在这样一个简单的指标中,除了周线之外, 其他地方都没有计算零点(右起第一条)?


Oops)我在这里写了:SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); 而不是e - rates_total,一切正常)
 
Expert:
Oops)在此替换为:SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); 而不是e - rates_total,一切正常)

修复错误的人与昵称专家? 它应该是在主题幽默。
 

我正试图建立一个多货币专家顾问。到目前为止,我已经决定采用Nikolay Kositsin在他的文章《创建一个在不同符号上交易的专家顾问》中提出的方案。我面临的问题是,使用不同的符号但使用相同的参数运行测试时,结果是不同的。我翻阅了论坛,发现许多人得出的结论是,这个问题可以用OnTimer() 函数来解决。安德烈-哈蒂姆兰斯基在此 建议。

Отвяжитесь от тиков конкретного инструмента (OnTick) - это же мультивалютник! Работайте по таймеру или ловите момент образования бара на всех рабочих инструментах, это будет надежнее.

我试着在所有工具上捕捉条形结构的瞬间,但我没能达到预期的效果。

比如说。

在旨在检测新条形的函数中,我明确指定了工具和时间框架。

bool isNewBar(string Symbol_, ENUM_TIMEFRAMES Timeframe)
{
 // В статической переменной будем помнить время открытия последнего бара
 static datetime last_time = 0;
 // Текущее время
 datetime lastbar_time = (ENUM_SERIES_INFO_INTEGER)SeriesInfoInteger(Symbol_,Timeframe,SERIES_LASTBAR_DATE);

 // Если это первый вызов функции
 if(last_time == 0)
   {
    // Установим время и выйдем 
    last_time = lastbar_time;
    return(false);
   }

 // Если время отличается
 if(last_time != lastbar_time)
   {
    // Запомним время и вернем true
    last_time = lastbar_time;
    return(true);
   }
 // Дошли до этого места - значит бар не новый, вернем false
 return(false);
}

OnTick() 函数中,由Nikolay Kositsin建议的方案。

比如说。

void OnTick()
{ 
 // Объявление массивов переменных для торговых сигналов  
 static bool UpSignal[2], DnSignal[2];

 // Получение торговых сигналов
 TradeSignalCounter(0, остальные параметры);
 TradeSignalCounter(1, остальные параметры);

 // Совершение торговых операций
 TradePerformer(0, остальные параметры);
 TradePerformer(1, остальные параметры);
}


isNewBar(Symbol,Timeframe) 函数在执行交易的函数中被调用,即TradePerformer(参数)

比如说。

bool TradePerformer(параметры)
{

...

 if(isNewBar(Symbol_,Timeframe))
   {
    Trailing_Stop(параметры);
   
    Open_Source_Position(параметры);
   }
 return(true);
}


也就是说,每一个符号都要单独检查一个新的条形图。如果没有新栏,我们就检查下一个符号。就这样,每一次打勾都会发生。但这个变体并不奏效。

请告知如何在给定的方案中正确实现多货币专家顾问中的新条形的检查。
 
Urain:
应该在幽默线程中,纠正被称为专家 的人所犯的错误?
在这个论坛上,你可以而且应该纠正专家代码中的错误,不管是什么种族或时间框架 :)