本帖最后由 瞬间的光辉 于 2009-11-4 21:35 编辑 UuGv= yC^6
.@'Vz;&mQ
这个问题要是在MT4里,简直是基础的不能再基础的东西了,但是到了MT5里,却是异常的复杂。 ]CjODa
要分两种情况: DVd/OU
1 在编写指标里: ZfU_4Pl->
是作为OnCalculate的参数带来的如下代码: .JE7vPv%!
int OnCalculate (const int rates_total, Z5Cv$bUc
const int prev_calculated, 6x 0>E^~
const datetime& time[], // Time })B)-8
const double& open[], // Open (ZYOm
const double& high[], // High dx^3(#B
const double& low[],// Low pmC@ fB
const double& close[], // Close IX}l)t[:(
const long& tick_volume[], // Tick Volume L>B0%TP^
const long& volume[], // Real Volume sb1/4u/W
const int& spread[] // Spread &7 ,wdG
); MIgIt"M jz
2 在EA里确实异常的复杂: .+y#7-#6
首先我做了如下测试: |^ qW
wdg[pt
/>
void OnTick() KksbhN{AB
{ _u>+H#
double open,close,low,high; o` e~1
int Spread; 6c2fqAF>i
open=SymbolInfoDouble(Symbol(),SYMBOL_ASK);//得到当前的ask价格 r
)T`?y
close=SymbolInfoDouble(Symbol(),SYMBOL_BID);//得到当前的bid价格 /fX]Yu
low=SymbolInfoDouble(Symbol(),SYMBOL_BIDLOW);//注意这里没有时间段参数,这里得到的是一天的最低价。 .8"o&%$`V
high=SymbolInfoDouble(Symbol(),SYMBOL_BIDHIGH);//注意这里没有时间段参数,这里得到的是一天的最高价。 2]@U$E='s
} ^#G>P0mG%
&?~> I[^~
找了半天SymbolInfoDouble这个函数根本不能实现得到指定时间周期的open close low high 价格。 CSs3l
后来我终于找到了解决方法,如下: +Y.As
如果系统没有提供如何获得指定周期的开盘,最低价,最低价,那么我只能自己写函数来获得了。 "MyYu}AD
iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)//此函数是我构造的,和MT4中系统自带的iOpen 一样用法。 `aCcTs7~]p
iOpen(Symbol(),PERIOD_MN1,0);//表示获得最近一根月线的开盘价。 #oHHKl=M
Wjj'yqBO^
iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)//此函数是我构造的,和MT4中系统自带的iLow 一样用法。 sUg7
iLow(Symbol(),PERIOD_MN1,0);//表示获得最近一根月线的最低价。 uz%rWN`{
U7{,
*
iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)//此函数是我构造的,和MT4中系统自带的iHigh 一样用法。 " I:j a7
iHigh(Symbol(),PERIOD_MN1,0);//表示获得最近一根月线的最高价。 HSTtDTo
Z{%h6""
至于收盘价其实,和bid价格是一样的所以完全就可以用系统自带的SymbolInfoDouble(Symbol(),SYMBOL_BID)获得。 P,,@&*
:
下面是完整的代码: XrYz[h*)!
3Y>!e#
#property copyright \"2009, MetaQuotes Software Corp.\" ,KZ_#9[>
#property link \"http://www.mt5.net.cn\" v\Q${6kEtx
#property version \"1.00\" ~~>D=~B0'
double Open[],High[],Low[]; e5MX5 T^
int OnInit() ,b2Cl[
{ 9^ )=N=wV
return(0); Fz-Bd*uS
} fAYm3+.l3
void OnDeinit(const int reason) kAU[lPt*R
{ ga VWfG
} }VdohX-
void OnTick() LY/K,6^a
{ h8Kri}z; M
double open,close,low,high; G,%R`Xns
open=iOpen(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的开盘价。 5^*I]5t8
close=SymbolInfoDouble(Symbol(),SYMBOL_BID); //表示获得最近一根月线的收盘价。 <t&0[l
low=iLow(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的最低价。 *JUP~/Nr
high=iHigh(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的最高价。 3`$-
} NO8)XJ3s
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index) _|`S9Nms
{ w>J|416
double open=0; .e~17}Ka}
ArraySetAsSeries(Open,true); :[?hU}9
int copied=CopyOpen(symbol,timeframe,0,Bars(symbol,timeframe),Open); //将指定时间周期的开盘价格复制到指定数组。 9])dLL0
if(copied>0 && index<copied) open=Open[index]; l`4hWs\I
return(open); V*"-@
} U@Y0 z.Y
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index) 4f:B 2x{
{ uzr(gFd
double low=0; |VQ17*4ff1
ArraySetAsSeries(Low,true); wsYvbI!
int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low); >|'u:`A
if(copied>0 && index<copied) low=Low[index]; Bf1,(^3XH
return(low); bz <f u
} -|YG**i/
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index) @8{-B;
{ F9IrbLS9c
double high=0; wVX]"o
ArraySetAsSeries(High,true); I7,5ID4pn
int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High); GCm(3%{V%(
if(copied>0 && index<copied) high=High[index]; .5*5S[
return(high); Is57)(^.-
} A:!_ &