本帖最后由 瞬间的光辉 于 2009-11-4 21:35 编辑 K6PC&+x C5W- B8> 这个问题要是在MT4里,简直是基础的不能再基础的东西了,但是到了MT5里,却是异常的复杂。
i&AXPq>` 要分两种情况:
Bk@_]a 1 在编写指标里:
3 8ls 4v3 是作为OnCalculate的参数带来的如下代码:
&El[ int OnCalculate (const int rates_total,
.5$V7t.t$\ const int prev_calculated,
:W1tIB const datetime& time[], // Time
cmC&s'/8`D const double& open[], // Open
<jg
wdbT"6 const double& high[], // High
xf3/<x!B const double& low[],// Low
\ &|w; const double& close[], // Close
:O_<K& const long& tick_volume[], // Tick Volume
\ {E;u'F const long& volume[], // Real Volume
,L;c{[*rh const int& spread[] // Spread
-$Z-hxs^ );
e?'k[ES^ 2 在EA里确实异常的复杂:
N"Nd $4 首先我做了如下测试:
"q#kh,-C fCo2".Tk void OnTick()
&JzF {
1x5CsmS double open,close,low,high;
Q $,kB<M int Spread;
hdWp open=SymbolInfoDouble(Symbol(),SYMBOL_ASK);//得到当前的ask价格
'/)_{Ly close=SymbolInfoDouble(Symbol(),SYMBOL_BID);//得到当前的bid价格
"I1M$^8n low=SymbolInfoDouble(Symbol(),SYMBOL_BIDLOW);//注意这里没有时间段参数,这里得到的是一天的最低价。
$@!&ML high=SymbolInfoDouble(Symbol(),SYMBOL_BIDHIGH);//注意这里没有时间段参数,这里得到的是一天的最高价。
|a~&E@0c }
z.F+$6 $ }bC$?^ 找了半天SymbolInfoDouble这个函数根本不能实现得到指定时间周期的open close low high 价格。 YQd&rkr 后来我终于找到了解决方法,如下: ,>EY9j 如果系统没有提供如何获得指定周期的开盘,最低价,最低价,那么我只能自己写函数来获得了。
tQ<2K*3] iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)//
此函数是我构造的,和MT4中系统自带的iOpen 一样用法。 %R5MAs&-5 iOpen(Symbol(),PERIOD_MN1,0);//
表示获得最近一根月线的开盘价。 -5B([jHgR <%5uzlp iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)//
此函数是我构造的,和MT4中系统自带的iLow 一样用法。 Ceb i9R[ iLow(Symbol(),PERIOD_MN1,0);//表示获得最近一根月线的最低价。
*wx^mB9 Wm/k(R`O< iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)//
此函数是我构造的,和MT4中系统自带的iHigh 一样用法。 M|u5Vs1 iHigh(Symbol(),PERIOD_MN1,0);//
表示获得最近一根月线的最高价。 $e\R5Lu aDEP_b; 至于收盘价其实,和bid价格是一样的所以完全就可以用系统自带的SymbolInfoDouble(Symbol(),SYMBOL_BID)获得。 &^>r<~]
下面是完整的代码:
4<HJD&@V ;sJ2K"c #property copyright \"2009, MetaQuotes Software Corp.\"
^ 9E(8DD #property link \"http://www.mt5.net.cn\"
351'l7F\ #property version \"1.00\"
2J <Z4Ap double Open[],High[],Low[];
+r"$?bw' int OnInit()
7Kjq1zl; {
?a(3~dh| return(0);
c9
c Nlp }
\x}UjHYIc& void OnDeinit(const int reason)
eU0-_3gN_ {
<NO~TBHF }
?;Qk!t2U void OnTick()
RCr:2
Iz {
~sD'pS double open,close,low,high;
YoA$Gw2 open=iOpen(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的开盘价。
98"N UT close=SymbolInfoDouble(Symbol(),SYMBOL_BID); //表示获得最近一根月线的收盘价。
z7o59& low=iLow(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的最低价。
"-sz7}Mb high=iHigh(Symbol(),PERIOD_MN1,0); //表示获得最近一根月线的最高价。
ececN{U/ }
t!tBN double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
DWG}}vN:& {
<_~`)t double open=0;
'4iu0ie>D ArraySetAsSeries(Open,true);
_]g6
3q int copied=CopyOpen(symbol,timeframe,0,Bars(symbol,timeframe),Open); //将指定时间周期的开盘价格复制到指定数组。
,aeFEsi if(copied>0 && index<copied) open=Open[index];
qXW5_iX return(open);
[M.Vu }
H:`r!5&Qb5 double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
;]gph)2cd {
`k+k&t double low=0;
F
1BPzRo` ArraySetAsSeries(Low,true);
W\"cp[b int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
,,?t>|3 if(copied>0 && index<copied) low=Low[index];
W!{uEH{%l return(low);
u{si }
{2,V3*NF double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
nD!^0? {
:
"UBeo<Z double high=0;
+!X^E9ra ArraySetAsSeries(High,true);
&.d~
M1Mz int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
zITXEorF!J if(copied>0 && index<copied) high=High[index];
`jP6;i return(high);
^K3{6}] }
JIK;/1
open,close,low,high.rar (1 K) 下载次数:11 Tmq:,.^} 原文来自:第一MT5编程论坛:
http://www.mt5.net.cn原文地址:
http://www.mt5.net.cn/read.php?tid=324