请问DxdCn老师,如何计算5位数报价MathAbs(Ask-Bid)?

 

Comment("DiscrepancyPoint=",MathAbs(Bid-Ask));

显示为小数点后5位数,可以吗?

 

为什么? 那要看服务器提供的数据有没有5位数,如果没有5位数,你从那里凭空计算5位数?

目前5位数 似乎只有部分公司如 Oanda 和dukascopy提供了,不是每个公司都使用5位数的。

 
MB Trading ---- MT4 Demo 是有5位数,动态点差,计算点差时,即使使用了NormalizeDouble(),也只能显示小数点后4位数.
 

MB是有5位,

Comment("DiscrepancyPoint=",DoubleToStr(NormalizeDouble(MathAbs(Bid-Ask),8),8)));
试试

 
谢谢DxdCn老师,请问一下老师认识杭州复杂美科技有限公司吗?这间公司在外汇智能交易领域是不是很强?好像都是用数学建模的,还有很强的博导做后盾,有这事吗?用的是混沌分形理论
 
知道这个公司, 但不了解详细情况。 这个领域对谁都是新的困难的未解决的事情。
 

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);

}

 


将ExtMapBuffer1[i]= tick[i]-tick[i+1];修改为:ExtMapBuffer1[i]= tick[i]-tick[i+5];

nows = tick[0]-tick[1];改为: nows = tick[0]-tick[5];

之后,就出现了不正常值.
 

不正常的值 是正常的, 因为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( ) ;

}

原因: