新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 745 1...738739740741742743744745746747748749750751752...1953 新评论 Konstantin Lebedev 2019.01.20 10:26 #7441 是否可以隐藏指标中的所有反转水平带,未测试和其余的,只留下测试的,即隐藏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))); 多时间框架指标 编码帮助 [存档!]我将免费撰写任何专家或指标。 kopeyka2 2019.01.20 18:50 #7442 切换到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%的特殊性。当然要有文件。 Taras Slobodyanik 2019.01.20 18:54 #7443 kopeyka2:切换到MT5。用一个词来帮助我。在MT5中是如何用代码写的,有什么问题吗?问题:为什么各种垃圾都落入缓冲区?在mt5中,时间序列是反过来的,如果你需要和mt4中一样的方式,那就是ArraySetAsSeries。 Artyom Trishkin 2019.01.20 21:25 #7444 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); } //+------------------------------------------------------------------+ kopeyka2 2019.01.21 08:48 #7445 Artyom Trishkin: 谢谢你的答复。 在MT5中检查了...真是一团糟...点以一种奇怪的方式散布在图表上,在历史深处的某处...我不明白MT5是什么,为什么不喜欢?问题很简单!!!。 在MT4平台上获取信息 . 在MT5中也是如此。当然是在一个缓冲区。但问题是,指标在捕捉点,但不是那些,也不是那里......((() 请再告诉我一次。我在代码MT5中做错了什么???? 我在MT5中得到了一些东西。但是,缓冲区...谜团 Alexey Viktorov 2019.01.21 10:04 #7446 kopeyka2:谢谢你的答复。 在MT5中检查了...真是一团糟...点以一种奇怪的方式散布在图表上,在历史深处的某处...我不明白MT5是什么,为什么不喜欢?问题很简单!!!。 在MT4平台上获取信息 . 在MT5中也是如此。当然是在一个缓冲区。但问题是,指标在捕捉点,但不是那些,也不是那里......((() 请再告诉我一次。我在代码MT5中做错了什么???? 我在MT5中得到了一些东西。但是,缓冲区...谜团没有什么神秘的。编号与mql4不同,指标缓冲区 没有自动归零。为了清除这些 "垃圾",程序员必须注意索引的清洁度,如果它们不包含数值。 kopeyka2 2019.01.21 15:49 #7447 Alexey Viktorov:没有什么神秘的。编号与mql4不同,指标缓冲区 没有自动归零。为了清除 "垃圾",程序员必须注意索引的纯洁性,如果它们不包含值。问题是,为什么要把标记(点)放在任何地方?我已经在代码中定义了算法!!!!蜡烛主体中的MA条件。这还不够吗? Alexey Viktorov 2019.01.21 16:25 #7448 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的数值填充这个数组索引。 kopeyka2 2019.01.21 17:59 #7449 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) Artyom Trishkin 2019.01.21 18:16 #7450 kopeyka2:Hallelujah!!!!! 将open[i]和close[i]改为iOpen(NULL,PERIOD_H1,i) 有什么区别?如果指标在H1上,那只是在访问速度上--你有一个较慢的。在我的例子中,你一定忽略了你必须为打开和关闭数组设置串行索引。我强调了你没有的东西。你有一个从头到尾的循环--从极限到0,而且你没有对数组进行索引--所以它是向前和向后画的。 1...738739740741742743744745746747748749750751752...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
是否可以隐藏指标中的所有反转水平带,未测试和其余的,只留下测试的,即隐藏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中是如何用代码写的,有什么问题吗?
问题:为什么各种垃圾会落入缓冲区?
我现在处于乐高建造者的阶段,即复制模块,通过经验了解MT%的特殊性。当然要有文件。
切换到MT5。用一个词来帮助我。在MT5中是如何用代码写的,有什么问题吗?
问题:为什么各种垃圾都落入缓冲区?
在mt5中,时间序列是反过来的
,如果你需要和mt4中一样的方式,那就是ArraySetAsSeries。
切换到MT5。用一个词来帮助我。MT5的代码是怎么写的,有什么问题吗?
问题:为什么各种垃圾会落入缓冲区?
我现在处于乐高建造者的阶段,即复制模块,通过经验了解MT%的特殊性。当然要有文件。
谢谢你的答复。
在MT5中检查了...真是一团糟...点以一种奇怪的方式散布在图表上,在历史深处的某处...我不明白MT5是什么,为什么不喜欢?问题很简单!!!。
在MT4平台上获取信息
.
在MT5中也是如此。当然是在一个缓冲区。但问题是,指标在捕捉点,但不是那些,也不是那里......((()
请再告诉我一次。我在代码MT5中做错了什么????
我在MT5中得到了一些东西。但是,缓冲区...谜团
谢谢你的答复。
在MT5中检查了...真是一团糟...点以一种奇怪的方式散布在图表上,在历史深处的某处...我不明白MT5是什么,为什么不喜欢?问题很简单!!!。
在MT4平台上获取信息
.
在MT5中也是如此。当然是在一个缓冲区。但问题是,指标在捕捉点,但不是那些,也不是那里......((()
请再告诉我一次。我在代码MT5中做错了什么????
我在MT5中得到了一些东西。但是,缓冲区...谜团
没有什么神秘的。编号与mql4不同,指标缓冲区 没有自动归零。为了清除这些 "垃圾",程序员必须注意索引的清洁度,如果它们不包含数值。
没有什么神秘的。编号与mql4不同,指标缓冲区 没有自动归零。为了清除 "垃圾",程序员必须注意索引的纯洁性,如果它们不包含值。
问题是,为什么要把标记(点)放在任何地方?我已经在代码中定义了算法!!!!蜡烛主体中的MA条件。这还不够吗?
问题是,为什么要把标记(点)放在任何地方?我已经在代码中定义了算法!!!!蜡烛主体中的MA条件。这还不够吗?
在这里看。
切换到MT5。 用一个词来帮助我。
Artem给出了完整的代码,而不是帮助这个词。每个人都有他自己的方法。我尽量不给现成的代码,但我有时还是会失败。
谢谢你的答复。
在MT5中检查了...这是一个有点混乱的问题...但用于比较的图表是完全不同的时间。如何判断这些点是对是错呢?
因此,有一句话需要帮助。
关于交易、自动交易系统和策略测试的论坛
任何关于MQL4初学者的问题,帮助和讨论算法和代码
Alexey Viktorov, 2019.01.21 11:04
没有什么神秘的。编号与mql4不同,指标缓冲区 不会自动归零。为了清除 "垃圾",如果索引不应该包含数值,程序员自己应该注意索引的清洁度。
下面我们来看看。
Artiom给出了完整的代码,而不是用这个词来帮助。每个人对此都有不同的方法。我尽量不给现成的代码,但有时还是会失败。
但用于比较的图表是完全不同的时间。如何判断这些观点是对还是错?
因此,有一句话需要帮助。
Hallelujah!!!!! 将open[i]和close[i]改为iOpen(NULL,PERIOD_H1,i)
Hallelujah!!!!! 将open[i]和close[i]改为iOpen(NULL,PERIOD_H1,i)
有什么区别?如果指标在H1上,那只是在访问速度上--你有一个较慢的。在我的例子中,你一定忽略了你必须为打开和关闭数组设置串行索引。我强调了你没有的东西。你有一个从头到尾的循环--从极限到0,而且你没有对数组进行索引--所以它是向前和向后画的。