我正在使用本文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);
}
感谢。
答案 0 :(得分:1)
MQL4.56789
有另一种语法对于自定义指标,&#34; 新&#34; - MQL4.56789
来源应阅读
的 void OnInit(){ ... }
强>
和
的 void OnDeinit( const int anMT4_Reason2callDeinit ){ ... }
强>
datetime
您的代码定义了一个变量 new_time
,输入为 datetime
日期时间类型用于存储自1970年1月1日以来经过的秒数的日期和时间。
和
值范围从1970年1月1日到12月31日,3000
因此,如果您进行了new_time
分配,则正确的 iTime()
值除以PeriodSeconds()
的数量,然后接下来重新乘以使用完全相同的值,不应更改iTime()
结果的值。
这样的操作虽然对结果没有理论上的影响,但在实践中代码执行可能会带来数值不准确的风险,范围溢出/下溢以及关于8字节类存储的分辨率的理论注意事项不是帮助超过上限,在文档中指出为3000年12月31日。
在类似情况下,预计会出现不可预测的结果,甚至MT4未处理的异常和MQL4代码终止。
生产级软件可能会出现什么更糟糕的情况?因此,避免,避免和避免任何此类风险。
此类自定义指标计算步骤没有直接的正值。
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;开始当前条形时间的时间帧值。
MQL4
当前的MQL4
代码执行引擎是Build 890(2015年9月25日),因此您引用的源代码使用了大约5年的MQL5
语言语法(!!),即{{} 1}} - domain表示_be_very_carefull _
与此同时 MQL4
-s 不再是string
-s,
许多GUI函数并行地有几个调用协议,
由于类似移动的沙子,无数人*年的DLL / API代码库开发/ maint丢失了。
所以5年的差距本身就是一个警告。
一个人永远不会进入同一条河流
string
的近期状态允许一个干净的方法:如果您的动机只是为了能够按需检测新条形码已开始的情况,Build-890/1174编译器可以采用更清晰的方法:
MQL4.56789