为什么? 那要看服务器提供的数据有没有5位数,如果没有5位数,你从那里凭空计算5位数?
目前5位数 似乎只有部分公司如 Oanda 和dukascopy提供了,不是每个公司都使用5位数的。
MB是有5位,
用
Comment("DiscrepancyPoint=",DoubleToStr(NormalizeDouble(MathAbs(Bid-Ask),8),8)));
试试
DxdCn老师,有关tick指标的修改:
下面是tick指标两个相邻值差的代码,画出后却出现了不正常的值(大于10000的值),还请DxdCn老师指导!
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_color2 Aqua
#property indicator_color3 CornflowerBlue
#property indicator_color4 Gold
#property indicator_color5 SkyBlue
//---- input parameters
extern int Tbars = 1000; //只记录最近1000点
//---- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function tick |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_SECTION);
SetIndexBuffer(0,ExtMapBuffer1);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
double nows=0;
int num=0,i=0;
int start()
{
double tick[100];
for(i=99;i>=0;i--)
{
tick[i]=iCustom(NULL,0,"okwhticks",1000,0,i);
}
int Ncounted_bars = Bars-IndicatorCounted();
if (Ncounted_bars == Bars) //首次,复制close数据 并且有时多数据变化,MT仅调用指标一次
{
num = Ncounted_bars;
for (int i=num;i>0;i--)
ExtMapBuffer1[i]= tick[i]-tick[i+1]; //以队列方式记录ticks 价格
return(0);
}
nows = tick[0]-tick[1];//MarketInfo(Symbol(),MODE_ASK);//+MarketInfo(Symbol(),MODE_BID))/2.0;
SetLevelValue(0, nows) ;
if (Ncounted_bars>1) //有时多数据变化,MT仅调用指标一次,需填充空白 由于MT的数据更新方式
{
for ( i=Ncounted_bars;i>0;i--)
ExtMapBuffer1[i-1]= ExtMapBuffer1[i]; //以队列方式记录ticks 价格
}
if (num>0)
{
if (nows == ExtMapBuffer1[0]) return (0);//只记录有变化的数据
if (num>Tbars)num = Tbars;
for ( i=num;i>0;i--)
{
ExtMapBuffer1[i]= ExtMapBuffer1[i-1]; //以队列方式记录ticks 价格
}
}
ExtMapBuffer1[0] = nows;
num++;
WindowRedraw( ) ;
return(0);
}
不正常的值 是正常的, 因为MT中数组元素的缺省值是 很大的值。
另外主要,tick数据从加入指标初始化后才开始有数据,没有历史数据,所以历史数据是不确定的(很可能就是那很大很小的值,所有Y坐标轴范围会判断不符合你人以为的....), 需要等待tick数据收集的足够多于横坐标范围(大约10到30分钟后),才会显示正常。我在tick指标那里这中情况了。
在init中加一行也许应该就可以了
int init()
{
......
SetIndexEmptyValue(0,0.0);
return(0);
}
不知道你用相邻差值干什么,大部分情况下差值只是0~5点,几个别情况下才有跳空的大变动。
本来MT不提供tick序列,所以tick数据是不会完整的。
想想MT可能如何实现当前时间周期总是下标0,
仔细理解 我为什么说:
//有时多数据变化,MT仅调用指标一次,需填充空白 由于MT的数据更新方式
//只记录有变化的数据
//以队列方式记录ticks 价格
对这个指标,我没法保证你用iCustom得到对的,若你一定要用相邻差值,就在原tick中, WindowRedraw( )前直接算自己的指标数组。
不要在其它文件用iCustom来调,却还模仿ticks的设计。
ticks的设计是针对获取ticks设计的,用了 iCustom 还模仿获取ticks可能会不对。MT设计MQL本来不是为这样设计使用的,没人能保证这样的另类使用MQL总会对。
别人也写有ticks指标,你也可以参考其它人写的 ticks指标。
原来这样,谢谢老师提点!
这个差值指标是为了方便统计!
还有一个问题就是如果我在客户端里运行自定义智能交易代码,外汇商的服务器会不会知道我的代码运作情况,或者看到客户端的自定义智能交易代码?
int start()
{
for ( i=Tbars-5;i>0;i--)
{
ExtMapBuffer1[i]= iCustom(NULL,0,"okwhticks",Tbars,0,i)-iCustom(NULL,0,"okwhticks",Tbars,0,i+1);
}
WindowRedraw( ) ;
}
Comment("DiscrepancyPoint=",MathAbs(Bid-Ask));
显示为小数点后5位数,可以吗?