使用预建库无法使MT4指示灯工作

时间:2015-10-01 12:03:11

标签: indicator algorithmic-trading metatrader4 forex

我正在使用本文https://www.mql5.com/en/articles/159中的代码来计算新栏何时打开,但它没有显示指标的历史数据。

我已将 TimeCurrent() 修改为 iTime( _Symbol, _Period, shift ) ,以便尝试处理此问题,但它无效。

你能告诉我,我做错了吗?

#property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 RoyalBlue #include <Lib_CisNewBar.mqh> CisNewBar current_chart; //---- input parameters extern int Length=18; // Bollinger Bands Period extern int Deviation=2; // Deviation was 2 extern double MoneyRisk=1.00; // Offset Factor extern int Signal=1; // Display signals mode: 1-Signals & Stops; 0-only Stops; 2-only Signals; extern int Line=1; // Display line mode: 0-no,1-yes extern int Nbars=1000; //---- indicator buffers double TrendBuffer[]; extern bool SoundON=true; bool TurnedUp = false; bool TurnedDown = false; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- indicator line SetIndexBuffer(0,TrendBuffer); SetIndexStyle(0,DRAW_LINE,0,1); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)); short_name="Example ("+Length+","+Deviation+")"; IndicatorShortName(short_name); SetIndexLabel(0,"Trend Value"); //---- SetIndexDrawBegin(0,Length); //---- return(INIT_SUCCEEDED); } void deinit() { } int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { int shift; for (shift=Nbars;shift>=0;shift--) { TrendBuffer[shift]=0; } for (shift=Nbars-Length-1;shift>=0;shift--) { int period_seconds=PeriodSeconds(_Period); datetime new_time=iTime(_Symbol,_Period,shift)/period_seconds*period_seconds; if(current_chart.isNewBar(new_time)) { Print("time[shift] = "+TimeToString(time[shift])); if( Close[shift] > Close[shift+1] ) TrendBuffer[shift]=1; else if(Close[shift] < Close[shift+1] ) TrendBuffer[shift]=-1; else TrendBuffer[shift]=0; } } return(0); }

感谢。

1 个答案:

答案 0 :(得分:1)

a)&#34; new &#34; - MQL4.56789有另一种语法

对于自定义指标,&#34; &#34; - MQL4.56789来源应阅读
void OnInit(){ ... }

void OnDeinit( const int anMT4_Reason2callDeinit ){ ... }

b)datetime

您的代码定义了一个变量 new_time ,输入为 datetime

  

日期时间类型用于存储自1970年1月1日以来经过的秒数的日期和时间。

  

值范围从1970年1月1日到12月31日,3000

因此,如果您进行了new_time分配,则正确的 iTime() 值除以PeriodSeconds()的数量,然后接下来重新乘以使用完全相同的值,不应更改iTime()结果的值。

这样的操作虽然对结果没有理论上的影响,但在实践中代码执行可能会带来数值不准确的风险,范围溢出/下溢以及关于8字节类存储的分辨率的理论注意事项不是帮助超过上限,在文档中指出为3000年12月31日。

在类似情况下,预计会出现不可预测的结果,甚至MT4未处理的异常和MQL4代码终止。

生产级软件可能会出现什么更糟糕的情况?因此,避免,避免和避免任何此类风险。

此类自定义指标计算步骤没有直接的正值。

c)TimeCurrent() / PeriodSeconds()舍入的副作用

虽然iTime()总是可被{&#34}所拥有&#34;时间范围PeriodSeconds() TimeCurrent()不是

因此,人们可以阅读

的原始(假设)构造
TimeCurrent() / PeriodSeconds()   // .DIV is subject to rounding to int
              * PeriodSeconds();  //      before the forthcoming .MUL

&#34;黑客&#34;需要调整[ 上次已知服务器时间 ,最后一次报价收据的时间,用于&#34;市场中选择的其中一个符号观看&#34;窗口 ]来自某人&#34;拥有&#34;开始当前条形时间的时间帧值。

d)文章是2010年10月11日(!) - 在MQL4

中要非常小心

当前的MQL4代码执行引擎是Build 890(2015年9月25日),因此您引用的源代码使用了大约5年的MQL5语言语法(!!),即{{} 1}} - domain表示_be_very_carefull _

与此同时 MQL4 -s 不再是string -s,
许多GUI函数并行地有几个调用协议,
由于类似移动的沙子,无数人*年的DLL / API代码库开发/ maint丢失了。

所以5年的差距本身就是一个警告。

一个人永远不会进入同一条河流

&#34; new &#34; - string的近期状态允许一个干净的方法:

如果您的动机只是为了能够按需检测新条形码已开始的情况,Build-890/1174编译器可以采用更清晰的方法:

MQL4.56789