mql4 计算指标的方式

MT4/MT5 的指标计算都带缓存,不用每次都从头到尾的在每一根 bar 上计算。指标提供了 OnCalculate 回调函数。也就是在初次加载指标时,OnCalculate 回调函数会计算一下历史 bar,然后就等待 tick 更新最后一根 bar,tick 每更新一次就刷新一次 OnCalculate,这时可能还会出现断网再重连补数据的情况,那么就需要不光要绘制最后一根 bar, 要多绘制最后几根 bar。

那么在 OnCalculate 中就可以正向循环计算和反向循环计算两种方法。

从后往前计算

//+------------------------------------------------------------------+
//| Bill Williams' Alligator |
//+------------------------------------------------------------------+
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 limit = rates_total - prev_calculated;
//---- main loop
for(int i = 0; i < limit; i++) {
double Range = 0;
double AvgRange = 0;
for(int counter = 0; counter <= 0 + 9; counter++) {
AvgRange = AvgRange + MathAbs(High[counter] - Low[counter]);
}
Range = AvgRange / 10;
//---- ma_shift set to 0 because SetIndexShift called abowe
ExtBlueBuffer[i] = iMA(NULL, 0, InpJawsPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i);
ExtRedBuffer[i] = iMA(NULL, 0, InpTeethPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i);
ExtLimeBuffer[i] = iMA(NULL, 0, InpLipsPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i);
double rosokuValueCloseP = iClose(NULL, 0, i);
double JAW_ATAI_1 = ExtBlueBuffer[i];
double JAW_ATAI_2 = iMA(NULL, 0, InpJawsPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i + 1);
double TEETH_ATAI_1 = ExtRedBuffer[i];
double TEETH_ATAI_2 = iMA(NULL, 0, InpTeethPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i + 1);
double LIPS_ATAI_1 = ExtLimeBuffer[i];
double LIPS_ATAI_2 = iMA(NULL, 0, InpLipsPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i + 1);
if(LIPS_ATAI_1 > TEETH_ATAI_1 && LIPS_ATAI_1 > JAW_ATAI_1 && JAW_ATAI_2 < JAW_ATAI_1 && rosokuValueCloseP > LIPS_ATAI_1) {
CrossUp[i] = Low[i] - Range * 0.5;
}
else if(LIPS_ATAI_1 < TEETH_ATAI_1 && LIPS_ATAI_1 < JAW_ATAI_1 && JAW_ATAI_2 > JAW_ATAI_1 && rosokuValueCloseP < LIPS_ATAI_1) {
CrossDown[i] = High[i] + Range * 0.5;
} else {
}
}
return(rates_total);
}

从前往后计算

//+------------------------------------------------------------------+
//| Bill Williams' Alligator |
//+------------------------------------------------------------------+
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 limit = rates_total - prev_calculated - 1;
//---- main loop
for(int i = limit; i >= 0; i--) {
double Range = 0;
double AvgRange = 0;
for(int counter = 0; counter <= 0 + 9; counter++) {
AvgRange = AvgRange + MathAbs(High[counter] - Low[counter]);
}
Range = AvgRange / 10;
//---- ma_shift set to 0 because SetIndexShift called abowe
ExtBlueBuffer[i] = iMA(NULL, 0, InpJawsPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i);
ExtRedBuffer[i] = iMA(NULL, 0, InpTeethPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i);
ExtLimeBuffer[i] = iMA(NULL, 0, InpLipsPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i);
double rosokuValueCloseP = iClose(NULL, 0, i);
double JAW_ATAI_1 = ExtBlueBuffer[i];
double JAW_ATAI_2 = iMA(NULL, 0, InpJawsPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i + 1);
double TEETH_ATAI_1 = ExtRedBuffer[i];
double TEETH_ATAI_2 = iMA(NULL, 0, InpTeethPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i + 1);
double LIPS_ATAI_1 = ExtLimeBuffer[i];
double LIPS_ATAI_2 = iMA(NULL, 0, InpLipsPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i + 1);
if(LIPS_ATAI_1 > TEETH_ATAI_1 && LIPS_ATAI_1 > JAW_ATAI_1 && JAW_ATAI_2 < JAW_ATAI_1 && rosokuValueCloseP > LIPS_ATAI_1) {
CrossUp[i] = Low[i] - Range * 0.5;
}
else if(LIPS_ATAI_1 < TEETH_ATAI_1 && LIPS_ATAI_1 < JAW_ATAI_1 && JAW_ATAI_2 > JAW_ATAI_1 && rosokuValueCloseP < LIPS_ATAI_1) {
CrossDown[i] = High[i] + Range * 0.5;
} else {
}
}
return(rates_total);
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇