新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 745

 

是否可以隐藏指标中的所有反转水平带,未测试和其余的,只留下测试的,即隐藏extern bool zone_show_weak = true;和下面的代码if (zone_strength[i] == ZONE_WEAK && zone_show_weak == false)和其他不能隐藏。也许有人理解并更正了代码或删除了我上面描述的级别。指标代码:

#property 版权所有“版权所有 © 2017 Andrew Sumner”

#属性链接“”

#property indicator_chart_window

#property 指标缓冲区 4

#property indicator_color1 红色

#property indicator_color2 红色

#property indicator_color3 DodgerBlue

#property indicator_color4 DodgerBlue


extern int BackLimit = 300; //返回-返回

extern int TimeFrame = 0;

extern string TimeString = "0=当前, 60=H1, 240=H4, 1440=天, 10080=周, 43200=月";


extern color color_support_weak = 中等海蓝宝石; //support - 支持弱 DarkSlateGray

外部颜色 color_support_untested = SeaGreen; // 未选中

外部颜色 color_support_verified = 绿色;

外部颜色 color_support_proven = LimeGreen;

extern color color_support_turncoat = 橄榄色;

外部颜色 color_resist_weak = 西耶娜;

外部颜色 color_resist_untested = 兰花;

外部颜色 color_resist_verified = 深红色;

外部颜色 color_resist_proven = 红色;

外部颜色 color_resist_turncoat = DarkOrange;


extern bool zone_show_weak = true;

外部双 zone_fuzzfactor = 0.2;

extern bool zone_solid = false; // true 如果为 false,则不会有完整的带区,而是由一个宽度宽度的矩形框起来

外部 int zone_linewidth = 2;

外部 int zone_style = 0;

extern bool zone_show_info = true;

外部 int zone_label_shift = 22; // 标签的水平偏移,但仅在移除指标之后

extern bool zone_show_alerts = false;

extern bool zone_alert_popups = true;

extern bool zone_alert_sounds = true;

extern bool send_email = false;

extern int zone_alert_waitseconds = 300;

extern bool zone_merge = true;

extern bool zone_extend = true;


extern bool fractals_show = false;

extern double fractal_fast_factor = 3.0;

extern double fractal_slow_factor = 6.0;

extern bool SetGlobals = true;


双 FastDnPts[], FastUpPts[];

双 SlowDnPts[],SlowUpPts[];


双 zone_hi[1000], zone_lo[1000];

int zone_start[1000], zone_hits[1000], zone_type[1000], zone_strength[1000], zone_count = 0;

boolzone_turn[1000];


#define ZONE_SUPPORT 1

#define ZONE_RESIST 2


#define ZONE_WEAK 0

#define ZONE_TURNCOAT 1

#define ZONE_UNTESTED 2

#define ZONE_VERIFIED 3

#define ZONE_PROVEN 4


#define UP_POINT 1

#define DN_POINT -1


int time_offset = 0;


初始化初始化()

{

指标缓冲区(4);


SetIndexBuffer(0, SlowDnPts);

SetIndexBuffer(1, SlowUpPts);

SetIndexBuffer(2, FastDnPts);

SetIndexBuffer(3, FastUpPts);


if (fractals_show == true)

{

SetIndexStyle(0, DRAW_ARROW, 0, 3);

SetIndexStyle(1, DRAW_ARROW, 0, 3);

SetIndexStyle(2, DRAW_ARROW, 0, 1);

SetIndexStyle(3, DRAW_ARROW, 0, 1);

SetIndexArrow(0, 218);

SetIndexArrow(1, 217);

SetIndexArrow(2, 218);

SetIndexArrow(3, 217);

}

别的

{

SetIndexStyle(0, DRAW_NONE);

SetIndexStyle(1, DRAW_NONE);

SetIndexStyle(2, DRAW_NONE);

SetIndexStyle(3, DRAW_NONE);

}


if (TimeFrame != 1 && TimeFrame != 5 && TimeFrame != 15 &&

时间帧!= 60 && 时间帧!= 240 && 时间帧!= 1440 &&

时间帧!= 10080 && 时间帧!= 43200)

时间范围 = 0;


如果(时间帧 < 期间())

时间范围 = 周期();


返回(0);

}


int deinit()

{

删除区域();

删除全局变量();

返回(0);

}


整数开始()

{

if (NewBar() == true)

{

int old_zone_count = zone_count;


快速分形();

慢分形();

删除区域();

查找区域();

绘图区();

如果 (zone_count < old_zone_count)

DeleteOldGlobalVars(old_zone_count);

}


如果(zone_show_info == true)

{

for (int i=0; i<zone_count; i++)

{

字符串 lbl;

if (zone_strength[i] == ZONE_PROVEN)

lbl=""; // 证明

else if (zone_strength[i] == ZONE_VERIFIED)

lbl=""; // 已检查

else if (zone_strength[i] == ZONE_UNTESTED)

lbl=""; // 不测试

else if (zone_strength[i] == ZONE_TURNCOAT)

lbl=""; // 反转

别的

lbl=""; // 虚弱的


if (zone_type[i] == ZONE_SUPPORT)

lbl = lbl +“下”; //支持

别的

lbl = lbl + "sop"; //反抗


if (zone_hits[i] > 0 && zone_strength[i] > ZONE_UNTESTED)

{

如果 (zone_hits[i] == 1)

lbl = lbl + ",T=" + zone_hits[i]; //测试计数

别的

lbl = lbl + ",T=" + zone_hits[i]; //测试计数

}


国际调整hpos;

int wbpc = WindowBarsPerChart();

诠释 k;

k = Period() * 60 + (20 + StringLen(lbl));

如果 (wbpc < 80)

adjust_hpos = 时间[0] + k * 4;

否则如果 (wbpc < 125)

adjust_hpos = 时间[0] + k * 8;

否则如果 (wbpc < 250)

adjust_hpos = 时间[0] + k * 15;

否则如果 (wbpc < 480)

adjust_hpos = 时间[0] + k * 29;

否则如果 (wbpc < 950)

adjust_hpos = 时间[0] + k * 58;

别的

adjust_hpos = 时间[0] + k * 115;


int shift = k * zone_label_shift;

双 vpos = zone_hi[i] - (zone_hi[i] - zone_lo[i]) / 2;


// 关卡描述文本

字符串 s = "SSSR#"+i+"LBL";

ObjectCreate(s, OBJ_TEXT, 0, 0, 0);

ObjectSet(s, OBJPROP_TIME1, adjust_hpos + shift);

ObjectSet(s, OBJPROP_PRICE1, vpos);

ObjectSetText(s, StringRightPad(lbl, 36, " "), 11, "Courier New",clrWhite); //黑色的

}

}


检查警报();


返回(0);

}


无效检查警报()

{

静态int lastalert = 0;


如果(zone_show_alerts == false)

返回;


if (Time[0] - lastalert > zone_alert_waitseconds)

if (CheckEntryAlerts() == true)

lastalert =时间[0];

}


布尔 CheckEntryAlerts()

{

// 检查记录

for (int i=0; i<zone_count; i++)

{

if (Close[0] >= zone_lo[i] && Close[0] < zone_hi[i])

{

如果(zone_show_alerts == true)

{

如果(zone_alert_popups == true)

{

if (zone_type[i] == ZONE_SUPPORT)

Alert(Symbol() + TimeFrameToString(TimeFrame) + ": Support Zone Entered"); //引入支持区

别的

Alert(Symbol() + TimeFrameToString(TimeFrame) + ": 阻力区进入"); //引入阻力区

}


如果(zone_alert_sounds == true)

PlaySound("alert.wav");

}

如果(发送电子邮件 == 真)

{

字符串目录 = "";

string msg = StringConcatenate(Symbol(), "-", TimeFrameToString(TimeFrame), " at ", TimeToStr(Time[0], TIME_DATE|TIME_SECONDS),

" ", dir, "已进入区域");

if (zone_type[i] == ZONE_SUPPORT)

{

dir = "支持";

SendMail("SS_SupRes_v04c 警报", msg);

}

别的

{

dir="阻力";

SendMail("SS_SupRes_v04c 警报", msg);

}

}

返回(真);

}

}


返回(假);

}


无效 DeleteGlobalVars()

{

如果(设置全局==假)

返回;


GlobalVariableDel("SSSR_Count_"+Symbol()+TimeFrame);

GlobalVariableDel("SSSR_Updated_"+Symbol()+TimeFrame);


int old_count = zone_count;

zone_count = 0;

DeleteOldGlobalVars(old_count);

}


无效 DeleteOldGlobalVars(int old_count)

{

如果(设置全局==假)

返回;


for (int i=zone_count; i<old_count; i++)

{

GlobalVariableDel("SSSR_HI_"+Symbol()+TimeFrame+i);

GlobalVariableDel("SSSR_LO_"+Symbol()+TimeFrame+i);

GlobalVariableDel("SSSR_HITS_"+Symbol()+TimeFrame+i);

GlobalVariableDel("SSSR_STRENGTH_"+Symbol()+TimeFrame+i);

GlobalVariableDel("SSSR_AGE_"+Symbol()+TimeFrame+i);

}

}


无效的 FindZones()

{

int i, j, shift, bustcount=0, testcount = 0;

双希瓦尔,可爱的;

布尔转身 = 假,已转身 = 假;


双 temp_hi[1000],temp_lo[1000];

int temp_start[1000],temp_hits[1000],temp_strength[1000],temp_count = 0;

bool temp_turn[1000],temp_merge[1000];

整数合并1 [1000],合并2 [1000],合并计数= 0;


// 循环从最旧到最小的区域(忽略最后 5 个柱),

// 寻找幸存至今的人...

for (shift=MathMin(iBars(NULL, TimeFrame)-1, BackLimit); shift>5; shift--)

{

双 atr = iATR(NULL, TimeFrame, 7, shift);

双 fu = atr/2 * zone_fuzzfactor;

布尔是弱;

布尔触摸确定 = 假;

布尔 isBust = false;

双重关闭 = iClose(NULL, TimeFrame, shift);

双高 = iHigh(NULL, TimeFrame, shift);

双低 = iLow(NULL, TimeFrame, shift);

双喜;

双 lo_i;


if (FastUpPts[shift] > 0.001)

{

// 高点之字形

isWeak = true;

if (SlowUpPts[shift] > 0.001)

isWeak = 假;


hival=高;

if (zone_extend == true)

hival += fu;


loval = MathMax(MathMin(close, high-fu), high-fu*2);

转=假;

已转=假;

isbust=假;


总线计数 = 0;

测试计数 = 0;


for (i=shift-1; i>=0; i--)

{

hi_i = iHigh(NULL, TimeFrame, i);

lo_i = iLow(NULL, TimeFrame, i);


if ((turned == false && FastUpPts[i] >= loval && FastUpPts[i] <= hival) ||

(turned == true && FastDnPts[i] <= hival && FastDnPts[i] >= loval))

{

// 潜在接触,只要确保自上次以来已经有 10 支以上的蜡烛

触摸确定 = 真;

对于 (j=i+1; j<i+11; j++)

{

if ((turned == false && FastUpPts[j] >= loval && FastUpPts[j] <= hival) ||

(turned == true && FastDnPts[j] <= hival && FastDnPts[j] >= loval))

{

触摸确定 = 假;

休息;

}

}


如果(触摸确定 == 真)

{

//我们有一个触摸。如果它被破坏一次,则删除 bustcount

// 因为我们知道这个级别仍然有效并且只是换了边

总线计数 = 0;

测试计数++;

}

}


if ((turned == false && hi_i > hival) ||

(转身 == true && lo_i < loval))

{

// 这个级别至少被破坏了一次

胸围++;


if (bustcount > 1 || isWeak == true)

{

// 两个或更多

isBust = 真;

休息;

}


如果(转身 == 真)

转=假;

否则如果(变成==假)

转=真;


hasturned =真;


// 忘记之前的点击

测试计数 = 0;

}

}


如果(是胸围==假)

{

// 级别仍然有效,添加到我们的列表中

temp_hi[temp_count] = hival;

temp_lo[temp_count] = 喜欢;

temp_turn[temp_count] = hasturned;

temp_hits[temp_count] = 测试计数;

temp_start[temp_count] = 班次;

temp_merge[temp_count] = 假;

如果(测试计数> 3)

temp_strength[temp_count] = ZONE_PROVEN;

else if (testcount > 0)

temp_strength[temp_count] = ZONE_VERIFIED;

else if (hasturned == true)

temp_strength[temp_count] = ZONE_TURNCOAT;

否则 if (isWeak == false)

temp_strength[temp_count] = ZONE_UNTESTED;

别的

temp_strength[temp_count] = ZONE_WEAK;


临时计数++;

}

}

else if (FastDnPts[shift] > 0.001)

{

// 低锯齿点

isWeak = true;

if (SlowDnPts[shift] > 0.001)

isWeak = 假;


爱=低;

if (zone_extend == true)

爱=福;


hival = MathMin(MathMax(close, low+fu), low+fu*2);

转=假;

已转=假;


总线计数 = 0;

测试计数 = 0;

isbust=假;


for (i=shift-1; i>=0; i--)

{

hi_i = iHigh(NULL, TimeFrame, i);

lo_i = iLow(NULL, TimeFrame, i);


if ((turned == true && FastUpPts[i] >= loval && FastUpPts[i] <= hival) ||

(turned == false && FastDnPts[i] <= hival && FastDnPts[i] >= loval))

{

// 潜在接触,只要确保自上次以来已经有 10 支以上的蜡烛

触摸确定 = 真;

对于 (j=i+1; j<i+11; j++)

{

if ((turned == true && FastUpPts[j] >= loval && FastUpPts[j] <= hival) ||

(turned == false && FastDnPts[j] <= hival && FastDnPts[j] >= loval))

{

触摸确定 = 假;

休息;

}

}


如果(触摸确定 == 真)

{

//我们有一个触摸。如果它被破坏一次,则删除 bustcount

// 因为我们知道这个级别仍然有效并且只是换了边

总线计数 = 0;

测试计数++;

}

}


if ((turned == true && hi_i > hival) ||

(转身 == 假 && lo_i < loval))

{

// 这个级别至少被破坏了一次

胸围++;


if (bustcount > 1 || isWeak == true)

{

// 两个或更多

isBust = 真;

休息;

}


如果(转身 == 真)

转=假;

否则如果(变成==假)

转=真;


hasturned =真;


// 忘记之前的点击

测试计数 = 0;

}

}


如果(是胸围==假)

{

// 级别仍然有效,添加到我们的列表中

temp_hi[temp_count] = hival;

temp_lo[temp_count] = 喜欢;

temp_turn[temp_count] = hasturned;

temp_hits[temp_count] = 测试计数;

temp_start[temp_count] = 班次;

temp_merge[temp_count] = 假;


如果(测试计数> 3)

temp_strength[temp_count] = ZONE_PROVEN;

else if (testcount > 0)

temp_strength[temp_count] = ZONE_VERIFIED;

else if (hasturned == true)

temp_strength[temp_count] = ZONE_TURNCOAT;

否则 if (isWeak == false)

temp_strength[temp_count] = ZONE_UNTESTED;

别的

temp_strength[temp_count] = ZONE_WEAK;


临时计数++;

}

}

}


// 寻找重叠区域...

如果(zone_merge == true)

{

合并计数 = 1;

int 迭代次数 = 0;

while (merge_count > 0 && 迭代次数 < 3)

{

合并计数 = 0;

迭代++;


对于 (i = 0; i < temp_count; i++)

temp_merge[i] = 假;


对于 (i = 0; i < temp_count-1; i++)

{

if (temp_hits[i] == -1 || temp_merge[j] == true)

继续;


对于 (j = i+1; j < temp_count; j++)

{

if (temp_hits[j] == -1 || temp_merge[j] == true)

继续;


if ((temp_hi[i] >= temp_lo[j] && temp_hi[i] <= temp_hi[j]) ||

(temp_lo[i] <= temp_hi[j] && temp_lo[i] >= temp_lo[j]) ||

(temp_hi[j] >= temp_lo[i] && temp_hi[j] <= temp_hi[i]) ||

(temp_lo[j] <= temp_hi[i] && temp_lo[j] >= temp_lo[i]))

{

合并1[合并计数] = i;

合并2[合并计数] = j;

temp_merge[i] = 真;

temp_merge[j] = 真;

合并计数++;

}

}

}


// ... 并结合它们 ...

对于 (i=0; i<merge_count; i++)

{

int 目标 = 合并 1[i];

int 源 = 合并 2[i];


temp_hi[目标] = MathMax(temp_hi[目标], temp_hi[源]);

temp_lo[目标] = MathMin(temp_lo[目标], temp_lo[源]);

temp_hits[目标] += temp_hits[源];

temp_start[target] = MathMax(temp_start[target], temp_start[source]);

temp_strength[target] = MathMax(temp_strength[target], temp_strength[source]);

如果 (temp_hits[目标] > 3)

temp_strength[目标] = ZONE_PROVEN;


if (temp_hits[target] == 0 && temp_turn[target] == false)

{

temp_hits[目标] = 1;

if (temp_strength[target] < ZONE_VERIFIED)

temp_strength[目标] = ZONE_VERIFIED;

}


if (temp_turn[target] == 假|| temp_turn[source] == false)

temp_turn [目标] = 假;

if (temp_turn[target] == true)

temp_hits[目标] = 0;


temp_hits [来源] = -1;

}

}

}


// 将列表的其余部分复制到我们的官方区域

zone_count = 0;

对于 (i=0; i<temp_count; i++)

{

如果 (temp_hits[i] >= 0 && zone_count < 1000)

{

zone_hi[zone_count] = temp_hi[i];

zone_lo[zone_count] = temp_lo[i];

zone_hits[zone_count] = temp_hits[i];

zone_turn[zone_count] = temp_turn[i];

zone_start[zone_count] = temp_start[i];

zone_strength[zone_count] = temp_strength[i];

if (zone_hi[zone_count] < 关闭[4])

zone_type[zone_count] = ZONE_SUPPORT;

else if (zone_lo[zone_count] > Close[4])

zone_type[zone_count] = ZONE_RESIST;

别的

{

对于 (j=5; j<1000; j++)

{

if (iClose(NULL, TimeFrame, j) < zone_lo[zone_count])

{

zone_type[zone_count] = ZONE_RESIST;

休息;

}

else if (iClose(NULL, TimeFrame, j) > zone_hi[zone_count])

{

zone_type[zone_count] = ZONE_SUPPORT;

休息;

}

}


如果(j == 1000)

zone_type[zone_count] = ZONE_SUPPORT;

}


zone_count++;

}

}

}


无效绘图区()

{

如果(设置全局==真)

{

GlobalVariableSet("SSSR_Count_"+Symbol()+TimeFrame, zone_count);

GlobalVariableSet("SSSR_Updated_"+Symbol()+TimeFrame, TimeCurrent());

}


for (int i=0; i<zone_count; i++)

{

if (zone_strength[i] == ZONE_WEAK && zone_show_weak == false)

继续;


字符串 s = "SSSR#"+i+" 强度 =";

if (zone_strength[i] == ZONE_PROVEN)

s = s + "经过验证,测试计数 =" + zone_hits[i];

else if (zone_strength[i] == ZONE_VERIFIED)

s = s + "已验证,测试计数 =" + zone_hits[i];

else if (zone_strength[i] == ZONE_UNTESTED)

s = s + "未测试";

else if (zone_strength[i] == ZONE_TURNCOAT)

s = s + "叛徒";

别的

s = s + "弱";


ObjectCreate(s, OBJ_RECTANGLE , 0, 0, 0, 0, 0);

ObjectSet(s, OBJPROP_TIME1, iTime(NULL, TimeFrame, zone_start[i]));

ObjectSet(s, OBJPROP_TIME2, TimeCurrent());

ObjectSet(s, OBJPROP_PRICE1, zone_hi[i]);

ObjectSet(s, OBJPROP_PRICE2, zone_lo[i]);

ObjectSet(s, OBJPROP_BACK, zone_solid);

ObjectSet(s, OBJPROP_WIDTH, zone_linewidth);

ObjectSet(s, OBJPROP_STYLE, zone_style);


if (zone_type[i] == ZONE_SUPPORT)

{

// 支持区

if (zone_strength[i] == ZONE_TURNCOAT)

ObjectSet(s, OBJPROP_COLOR, color_support_turncoat);

else if (zone_strength[i] == ZONE_PROVEN)

ObjectSet(s, OBJPROP_COLOR, color_support_proven);

else if (zone_strength[i] == ZONE_VERIFIED)

ObjectSet(s, OBJPROP_COLOR, color_support_verified);

else if (zone_strength[i] == ZONE_UNTESTED)

ObjectSet(s, OBJPROP_COLOR, color_support_untested);

别的

ObjectSet(s, OBJPROP_COLOR, color_support_weak);

}

别的

{

//阻力区

if (zone_strength[i] == ZONE_TURNCOAT)

ObjectSet(s, OBJPROP_COLOR, color_resist_turncoat);

else if (zone_strength[i] == ZONE_PROVEN)

ObjectSet(s, OBJPROP_COLOR, color_resist_proven);

else if (zone_strength[i] == ZONE_VERIFIED)

ObjectSet(s, OBJPROP_COLOR, color_resist_verified);

else if (zone_strength[i] == ZONE_UNTESTED)

ObjectSet(s, OBJPROP_COLOR, color_resist_untested);

别的

ObjectSet(s, OBJPROP_COLOR, color_resist_weak);

}




如果(设置全局==真)

{

GlobalVariableSet("SSSR_HI_"+Symbol()+TimeFrame+i, zone_hi[i]);

GlobalVariableSet("SSSR_LO_"+Symbol()+TimeFrame+i, zone_lo[i]);

GlobalVariableSet("SSSR_HITS_"+Symbol()+TimeFrame+i, zone_hits[i]);

GlobalVariableSet("SSSR_STRENGTH_"+Symbol()+TimeFrame+i, zone_strength[i]);

GlobalVariableSet("SSSR_AGE_"+Symbol()+TimeFrame+i, zone_start[i]);

}

}

}


布尔分形(int M,int P,int shift)

{

如果(时间帧 > P)

P = 时间范围;

P = P / TimeFrame*2 + MathCeil(P / TimeFrame / 2);

如果(移位<p)

返回(假);


if (shift > iBars(Symbol(), TimeFrame)-P)

返回(假);

for (int i=1; i<=P; i++)

{

如果(M == UP_POINT)

{

if (iHigh(NULL, TimeFrame, shift+i) > iHigh(NULL, TimeFrame, shift))

返回(假);

if (iHigh(NULL, TimeFrame, shift-i) >= iHigh(NULL, TimeFrame, shift))

返回(假);

}

如果(M == DN_POINT)

{

if (iLow(NULL, TimeFrame, shift+i) < iLow(NULL, TimeFrame, shift))

返回(假);

if (iLow(NULL, TimeFrame, shift-i) <= iLow(NULL, TimeFrame, shift))

返回(假);

}

}

返回(真);

}


无效快速分形()

{

换档;

int limit = MathMin(Bars-1, BackLimit);

int P = TimeFrame * fractal_fast_factor;


FastUpPts[0] = 0.0; FastUpPts[1] = 0.0;

FastDnPts[0] = 0.0; FastDnPts[1] = 0.0;


for (shift=limit; shift>1; shift--)

{

if (分形(UP_POINT, P, shift) == true)

FastUpPts[shift] = iHigh(NULL, TimeFrame, shift);

别的

FastUpPts[shift] = 0.0;


if (分形(DN_POINT, P, shift) == true)

FastDnPts[shift] = iLow(NULL, TimeFrame, shift);

别的

FastDnPts[shift] = 0.0;

}

}


无效的慢分形()

{

换档;

int limit = MathMin(iBars(Symbol(), TimeFrame) - 1, BackLimit);

int P = TimeFrame * fractal_slow_factor;


SlowUpPts[0] = 0.0; SlowUpPts[1] = 0.0;

SlowDnPts[0] = 0.0; SlowDnPts[1] = 0.0;


for (shift=limit; shift>1; shift--)

{

if (分形(UP_POINT, P, shift) == true)

SlowUpPts[shift] = iHigh(NULL, TimeFrame, shift);

别的

SlowUpPts[shift] = 0.0;


if (分形(DN_POINT, P, shift) == true)

SlowDnPts[shift] = iLow(NULL, TimeFrame, shift);

别的

SlowDnPts[shift] = 0.0;

}

}


布尔 NewBar()

{

静态日期时间 LastTime = 0;

if (iTime(NULL, TimeFrame, 0) != LastTime)

{

LastTime = iTime(NULL, TimeFrame, 0)+time_offset;

返回(真);

}

别的

返回(假);

}


无效删除区()

{

国际= 5;

诠释我;


而 (i < ObjectsTotal())

{

字符串 objName = ObjectName(i);

if (StringSubstr(objName, 0, len) != "SSSR#")

{

我++;

继续;

}

对象删除(对象名);

}

}


string TimeFrameToString(int tf) // 来自 TRO 的代码

{

字符串 tfs;


开关(tf)

{

案例 PERIOD_M1:

tfs="M1" ;

休息;

案例 PERIOD_M5:

tfs="M5" ;

休息;

案例 PERIOD_M15:

tfs="M15" ;

休息;

案例 PERIOD_M30:

tfs="M30" ;

休息;

案例 PERIOD_H1:

tfs="H1" ;

休息;

案例 PERIOD_H4:

tfs="H4" ;

休息;

案例 PERIOD_D1:

tfs="D1" ;

休息;

案例 PERIOD_W1:

tfs="W1" ;

休息;

案例 PERIOD_MN1:

tfs="MN";

}


返回(tfs);

}


字符串 StringRepeat(字符串 str,int n = 1)

{

字符串 outstr = "";

for(int i = 0; i < n; i++) outstr = outstr + str;

返回(输出);

}


字符串 StringRightPad(字符串 str,int n=1,字符串 str2="")

{

返回(str + StringRepeat(str2,n-StringLen(str)));


 

切换到MT5。用一个词来帮助我。在MT5中是如何用代码写的,有什么问题吗?

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
#property indicator_type1   DRAW_ARROW
#property indicator_color1  Blue
#property indicator_style1  STYLE_DASHDOTDOT
#property indicator_width1  0
#property indicator_label1  "Label 1"
//----
input int MAPeriod=13;
//---=
int handle_ma;
double ExtLineBuffer[];
double BufferPrice[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,BufferPrice,INDICATOR_CALCULATIONS);
//---- символы для индикатора
   PlotIndexSetInteger(0,PLOT_ARROW,108);
//---- создание метки для отображения в DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"PROBA");
//----
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   IndicatorSetString(INDICATOR_SHORTNAME," 123");
//---- массива будет производиться как в таймсериях
   ArraySetAsSeries(ExtLineBuffer,true);
   ArraySetAsSeries(BufferPrice,true);
//--- create MA's handles
   ResetLastError();
      handle_ma=iMA(NULL,Period(),MAPeriod,0,MODE_SMA,PRICE_CLOSE); 
   if(handle_ma==INVALID_HANDLE)
     {
      Print("The iMA (1) object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
 Comment("");
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
//--- Проверка количества доступных баров
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
   ArrayInitialize(ExtLineBuffer,EMPTY_VALUE);
   ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;
//----   
 for(int i=limit; i>0 && !IsStopped(); i--)
   {
//----------------------------------------- ОСНОВНОЙ МОДУЛЬ КОТОРЫЙ НЕ РАБОТАЕТ ----------------------------
 if(PERIOD_H1==Period())
  {
//--- High signal
 if(BufferPrice[i]>open[i] && BufferPrice[i]<close[i])   
   ExtLineBuffer[i]=high[i];
//--- Low signal
 if(BufferPrice[i]<open[i] && BufferPrice[i]>close[i])
   ExtLineBuffer[i]=low[i];
  } /*
  else
  {
  ExtLineBuffer[i]=0.0;
  ExtLineBuffer[i]=0.0;
  } */
  }    
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

问题:为什么各种垃圾会落入缓冲区?

我现在处于乐高建造者的阶段,即复制模块,通过经验了解MT%的特殊性。当然要有文件。

 
kopeyka2:

切换到MT5。用一个词来帮助我。在MT5中是如何用代码写的,有什么问题吗?

问题:为什么各种垃圾都落入缓冲区?

在mt5中,时间序列是反过来的
,如果你需要和mt4中一样的方式,那就是ArraySetAsSeries

 
kopeyka2:

切换到MT5。用一个词来帮助我。MT5的代码是怎么写的,有什么问题吗?

问题:为什么各种垃圾会落入缓冲区?

我现在处于乐高建造者的阶段,即复制模块,通过经验了解MT%的特殊性。当然要有文件。

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrBlue
#property indicator_width1  1
#property indicator_label1  "Label 1"
//----
input int MAPeriod=13;
//---=
int handle_ma;
double ExtLineBuffer[];
double BufferPrice[];
//---
int    period;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   period=(MAPeriod<1 ? 1 : MAPeriod);
//---
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferPrice,INDICATOR_CALCULATIONS);
//---- символы для индикатора
   PlotIndexSetInteger(0,PLOT_ARROW,108);
//---- создание метки для отображения в DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"PROBA");
//----
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   IndicatorSetString(INDICATOR_SHORTNAME," 123");
//---- массива будет производиться как в таймсериях
   ArraySetAsSeries(ExtLineBuffer,true);
   ArraySetAsSeries(BufferPrice,true);
//--- create MA's handles
   ResetLastError();
   handle_ma=iMA(NULL,PERIOD_CURRENT,period,0,MODE_SMA,PRICE_CLOSE);
   if(handle_ma==INVALID_HANDLE)
     {
      Print("The iMA (",(string)period,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//--- 
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true); 
//--- Проверка количества доступных баров
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(ExtLineBuffer,EMPTY_VALUE);
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;
//----   
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      //----------------------------------------- ОСНОВНОЙ МОДУЛЬ КОТОРЫЙ НЕ РАБОТАЕТ ----------------------------
      if(Period()==PERIOD_H1)
        {
         //--- High signal
         if(BufferPrice[i]>open[i] && BufferPrice[i]<close[i])
            ExtLineBuffer[i]=high[i];
         //--- Low signal
         if(BufferPrice[i]<open[i] && BufferPrice[i]>close[i])
            ExtLineBuffer[i]=low[i];
        }
/*
  else
  {
  ExtLineBuffer[i]=0.0;
  ExtLineBuffer[i]=0.0;
  } */
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin:

谢谢你的答复。

在MT5中检查了...真是一团糟...点以一种奇怪的方式散布在图表上,在历史深处的某处...我不明白MT5是什么,为什么不喜欢?问题很简单!!!。

在MT4平台上获取信息

.这是它在MT4中的样子


在MT5中也是如此。当然是在一个缓冲区。但问题是,指标在捕捉点,但不是那些,也不是那里......((()


请再告诉我一次。我在代码MT5中做错了什么????

我在MT5中得到了一些东西。但是,缓冲区...谜团

 
kopeyka2:

谢谢你的答复。

在MT5中检查了...真是一团糟...点以一种奇怪的方式散布在图表上,在历史深处的某处...我不明白MT5是什么,为什么不喜欢?问题很简单!!!。

在MT4平台上获取信息

.


在MT5中也是如此。当然是在一个缓冲区。但问题是,指标在捕捉点,但不是那些,也不是那里......((()


请再告诉我一次。我在代码MT5中做错了什么????

我在MT5中得到了一些东西。但是,缓冲区...谜团

没有什么神秘的。编号与mql4不同,指标缓冲区 没有自动归零。为了清除这些 "垃圾",程序员必须注意索引的清洁度,如果它们不包含数值。

 
Alexey Viktorov:

没有什么神秘的。编号与mql4不同,指标缓冲区 没有自动归零。为了清除 "垃圾",程序员必须注意索引的纯洁性,如果它们不包含值。

问题是,为什么要把标记(点)放在任何地方?我已经在代码中定义了算法!!!!蜡烛主体中的MA条件。这还不够吗?

 
kopeyka2:

问题是,为什么要把标记(点)放在任何地方?我已经在代码中定义了算法!!!!蜡烛主体中的MA条件。这还不够吗?

在这里看。

kopeyka2:
切换到MT5。 用一个词来帮助我。


Artem给出了完整的代码,而不是帮助这个词。每个人都有他自己的方法。我尽量不给现成的代码,但我有时还是会失败。

kopeyka2:

谢谢你的答复。

在MT5中检查了...这是一个有点混乱的问题...


但用于比较的图表是完全不同的时间。如何判断这些点是对是错呢?

因此,有一句话需要帮助

关于交易、自动交易系统和策略测试的论坛

任何关于MQL4初学者的问题,帮助和讨论算法和代码

Alexey Viktorov, 2019.01.21 11:04

没有什么神秘的。编号与mql4不同,指标缓冲区 不会自动归零。为了清除 "垃圾",如果索引不应该包含数值,程序员自己应该注意索引的清洁度。

帮助:在MT5中,他们对OnInit和OnDeinit的执行顺序做得不够好,因此也可能出现问题。但这是在一些特殊情况下,指标的重新计算应该永远是连续的。只要prev_calculated == 0,就应该对所有的条形图进行重新计算,在每次循环迭代时,如果缓冲区内没有任何数值,那么就根据PLOT_EMPTY_VALUE的设置,用EMPTY_VALUE或0的数值填充这个数组索引。
 
Alexey Viktorov:

下面我们来看看。

Artiom给出了完整的代码,而不是用这个词来帮助。每个人对此都有不同的方法。我尽量不给现成的代码,但有时还是会失败。

但用于比较的图表是完全不同的时间。如何判断这些观点是对还是错?

因此,有一句话需要帮助

更多帮助的话:在MT5中,他们对OnInit和OnDeinit的执行顺序做得不够,因此也可能出现问题。但这是在一些特殊情况下,指标的重新计算应该永远是连续的。如果prev_calculated == 0,在所有条形上重新计算,并且在循环的每个迭代中,如果缓冲区中没有值,则根据PLOT_EMPTY_VALUE的设置,用EMPTY_VALUE或0填充数组的这个索引。

Hallelujah!!!!! 将open[i]和close[i]改为iOpen(NULL,PERIOD_H1,i)



 
kopeyka2:

Hallelujah!!!!! 将open[i]和close[i]改为iOpen(NULL,PERIOD_H1,i)



有什么区别?如果指标在H1上,那只是在访问速度上--你有一个较慢的。在我的例子中,你一定忽略了你必须为打开和关闭数组设置串行索引。我强调了你没有的东西。你有一个从头到尾的循环--从极限到0,而且你没有对数组进行索引--所以它是向前和向后画的。