Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 745

 

Ist es möglich, alle Umkehrniveaubänder im Indikator auszublenden, nicht getestet und den Rest, und nur getestete zu belassen, d. H. Hide extern bool zone_show_weak = true; und unten im Code if (zone_strength[i] == ZONE_WEAK && zone_show_weak == false) und andere können nicht ausgeblendet werden. Vielleicht versteht und korrigiert jemand den Code oder entfernt die Ebenen, die ich oben beschrieben habe. Indikatorcode:

#property copyright "Copyright © 2017 Andrew Sumner"

#property link ""

#property Indicator_Chart_Window

#Eigenschaftsindikator_Puffer 4

#Eigenschaftsanzeige_Farbe1 Rot

#Eigenschaftsanzeige_Farbe2 Rot

#Eigenschaftsanzeige_Farbe3 DodgerBlue

#Eigenschaftsanzeige_Farbe4 DodgerBlue


extern int BackLimit = 300; //Zurück zurück

extern int TimeFrame = 0;

extern string TimeString = "0=Aktuell, 60=H1, 240=H4, 1440=Tag, 10080=Woche, 43200=Monat";


extern color color_support_weak = MittelAquamarin; //support - Unterstützung für schwaches DarkSlateGray

extern color color_support_untested = SeaGreen; // ungeprüft

externe Farbe color_support_verified = Grün;

extern color color_support_proven = LimeGreen;

extern color color_support_turncoat = Olivgrün;

extern color color_resist_weak = Sienna;

extern color color_resist_untested = Orchidee;

externe Farbe color_resist_verified = Purpur;

extern color color_resist_proven = Rot;

externe Farbe color_resist_turncoat = DarkOrange;


extern bool zone_show_weak = wahr;

extern double zone_fuzzfactor = 0,2;

extern bool zone_solid = falsch; // true wenn false, gibt es keine vollen Bandzonen, sondern eingerahmt von einem Rechteck mit width width

extern int zone_linewidth = 2;

extern int zone_style = 0;

extern bool zone_show_info = wahr;

extern int zone_label_shift = 22; // horizontaler Versatz der Labels, aber erst nach dem Entfernen des Indikators

extern bool zone_show_alerts = falsch;

extern bool zone_alert_popups = wahr;

extern bool zone_alert_sounds = true;

extern bool send_email = falsch;

extern int zone_alert_waitseconds = 300;

extern bool zone_merge = wahr;

extern bool zone_extend = wahr;


extern bool fractals_show = falsch;

extern double fractal_fast_factor = 3.0;

extern double fractal_slow_factor = 6.0;

extern bool SetGlobals = wahr;


double FastDnPts[], FastUpPts[];

double SlowDnPts[], SlowUpPts[];


double 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;


int init()

{

Indikatorpuffer (4);


SetIndexBuffer(0, SlowDnPts);

SetIndexBuffer(1, SlowUpPts);

SetIndexBuffer(2, FastDnPts);

SetIndexBuffer(3, FastUpPts);


if (fractals_show == wahr)

{

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);

}

anders

{

SetIndexStyle(0, DRAW_NONE);

SetIndexStyle(1, DRAW_NONE);

SetIndexStyle(2, DRAW_NONE);

SetIndexStyle(3, DRAW_NONE);

}


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

Zeitrahmen != 60 && Zeitrahmen != 240 && Zeitrahmen != 1440 &&

Zeitrahmen != 10080 && Zeitrahmen != 43200)

Zeitrahmen = 0;


if(Zeitrahmen <Periode())

Zeitrahmen = Zeitraum ();


Rückgabe (0);

}


int deinit()

{

Zonen löschen();

DeleteGlobalVars();

Rückgabe (0);

}


int start()

{

if (NewBar() == wahr)

{

int old_zone_count = zone_count;


Schnelle Fraktale();

SlowFractals();

Zonen löschen();

FindZones();

DrawZones();

if (zone_count < old_zone_count)

DeleteOldGlobalVars(old_zone_count);

}


wenn (zone_show_info == true)

{

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

{

Zeichenkette lbl;

if (zone_strength[i] == ZONE_PROVEN)

lbl=""; // Bewährt

sonst wenn (zone_strength[i] == ZONE_VERIFIED)

lbl=""; // Geprüft

sonst wenn (zone_strength[i] == ZONE_UNTESTED)

lbl=""; // NICHT testen

sonst wenn (zone_strength[i] == ZONE_TURNCOAT)

lbl=""; // Umkehrung

anders

lbl=""; // Schwach


if (Zonentyp[i] == ZONE_SUPPORT)

lbl = lbl + "unter"; //Unterstützung

anders

lbl = lbl + "sop"; //Widerstand


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

{

if (zone_hits[i] == 1)

lbl = lbl + ",T=" + zone_hits[i]; //Zählung testen

anders

lbl = lbl + ",T=" + zone_hits[i]; //Zählung testen

}


int adjust_hpos;

int wbpc = WindowBarsPerChart();

int k;

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

wenn (wbpc < 80)

adjust_hpos = Zeit[0] + k * 4;

sonst wenn (wbpc < 125)

adjust_hpos = Zeit[0] + k * 8;

sonst wenn (wbpc < 250)

adjust_hpos = Zeit[0] + k * 15;

sonst wenn (wbpc < 480)

adjust_hpos = Zeit[0] + k * 29;

sonst wenn (wbpc < 950)

adjust_hpos = Time[0] + k * 58;

anders

adjust_hpos = Zeit[0] + k * 115;


int shift = k * zone_label_shift;

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


// Text der Ebenenbeschreibungen

string 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); //Schwarz

}

}


CheckAlerts();


Rückgabe (0);

}


ungültig CheckAlerts ()

{

statisch int lastalert = 0;


if (zone_show_alerts == false)

Rückkehr;


if (Time[0] - lastalert > zone_alert_waitseconds)

if (CheckEntryAlerts() == true)

letzterAlarm = Zeit[0];

}


bool CheckEntryAlerts()

{

// Aufzeichnungen prüfen

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

{

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

{

if (zone_show_alerts == true)

{

if (zone_alert_popups == true)

{

if (Zonentyp[i] == ZONE_SUPPORT)

Alert(Symbol() + TimeFrameToString(TimeFrame) + ": Supportzone betreten"); //Unterstützungszone eingeführt

anders

Alert(Symbol() + TimeFrameToString(TimeFrame) + ": Widerstandszone betreten"); //Widerstandszone eingeführt

}


if (zone_alert_sounds == true)

PlaySound("alert.wav");

}

if (send_email == true)

{

string dir = "";

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

" ", dir, "Zone betreten");

if (Zonentyp[i] == ZONE_SUPPORT)

{

dir = "Unterstützung";

SendMail("SS_SupRes_v04c-Alarm", msg);

}

anders

{

dir="Widerstand";

SendMail("SS_SupRes_v04c-Alarm", msg);

}

}

zurück (wahr);

}

}


falsch zurückgeben);

}


void DeleteGlobalVars()

{

if(SetGlobals==false)

Rückkehr;


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

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


int old_count = zone_count;

zone_count = 0;

DeleteOldGlobalVars(old_count);

}


void DeleteOldGlobalVars(int old_count)

{

if(SetGlobals==false)

Rückkehr;


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

{

GlobalVariableDel("SSSR_HI_"+Symbol()+Zeitrahmen+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);

}

}


void FindZones()

{

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

doppelt hival, loval;

bool gedreht = falsch, hasturned = falsch;


doppelt 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];

int merge1[1000], merge2[1000], merge_count = 0;


// Schleife durch die Zonen vom ältesten zum kleinsten (ignoriere die letzten 5 Balken),

// diejenigen finden, die bis heute überlebt haben...

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

{

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

double fu = atr/2 * zone_fuzzfactor;

bool isWeak;

bool touchOk = falsch;

bool isBust = falsch;

double close = iClose(NULL, TimeFrame, shift);

double high = iHigh(NULL, TimeFrame, shift);

Double Low = iLow (NULL, TimeFrame, Verschiebung);

doppelt hallo_i;

doppeltes lo_i;


if (FastUpPts[shift] > 0.001)

{

// Höhepunkt Zickzack

isWeak = true;

if (SlowUpPts[shift] > 0.001)

isWeak = falsch;


hival=hoch;

if (zone_extend == wahr)

hival += fu;


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

drehen = falsch;

hasturned=false;

isbust=false;


Buszahl = 0;

testcount = 0;


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

{

hi_i = iHigh(NULL, Zeitrahmen, i);

lo_i = iLow(NULL, Zeitrahmen, i);


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

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

{

// Mögliche Berührung, stellen Sie einfach sicher, dass es seit dem letzten Mal mehr als 10 Kerzen waren

touchOk = wahr;

für (j=i+1; j<i+11; j++)

{

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

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

{

touchOk = falsch;

brechen;

}

}


if (touchOk == true)

{

// Wir haben eine Berührung. Wenn es einmal gesprengt wurde, entferne den Bustcount

// da wir wissen, dass dieses Level noch gültig ist und gerade die Seite gewechselt hat

Buszahl = 0;

testcount++;

}

}


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

(gedreht == wahr && lo_i < loval))

{

// Dieses Level wurde mindestens einmal gesprengt

Büstenzahl++;


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

{

// zwei oder mehr

isBust = wahr;

brechen;

}


if (gedreht == wahr)

drehen = falsch;

sonst wenn (gedreht == falsch)

drehen = wahr;


hasturned = wahr;


// Vorherige Treffer vergessen

testcount = 0;

}

}


if(isBust==false)

{

// Level ist noch gültig, zu unserer Liste hinzufügen

temp_hi[temp_count] = hival;

temp_lo[temp_count] = loval;

temp_turn[temp_count] = hasturned;

temp_hits[temp_count] = testcount;

temp_start [temp_count] = Schicht;

temp_merge[temp_count] = falsch;

if (testcount > 3)

temp_strength[temp_count] = ZONE_PROVEN;

sonst wenn (testcount > 0)

temp_strength[temp_count] = ZONE_VERIFIED;

sonst wenn (hasturned == true)

temp_strength[temp_count] = ZONE_TURNCOAT;

sonst wenn (isWeak == false)

temp_strength[temp_count] = ZONE_UNTESTED;

anders

temp_strength[temp_count] = ZONE_WEAK;


temp_count++;

}

}

sonst wenn (FastDnPts[shift] > 0.001)

{

// niedriger Zickzackpunkt

isWeak = true;

if (SlowDnPts[shift] > 0.001)

isWeak = falsch;


loval = niedrig;

if (zone_extend == wahr)

loval = fu;


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

drehen = falsch;

hasturned=false;


Buszahl = 0;

testcount = 0;

isbust=false;


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

{

hi_i = iHigh(NULL, Zeitrahmen, i);

lo_i = iLow(NULL, Zeitrahmen, i);


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

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

{

// Mögliche Berührung, stellen Sie einfach sicher, dass es seit dem letzten Mal mehr als 10 Kerzen waren

touchOk = wahr;

für (j=i+1; j<i+11; j++)

{

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

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

{

touchOk = falsch;

brechen;

}

}


if (touchOk == true)

{

// Wir haben eine Berührung. Wenn es einmal gesprengt wurde, entferne den Bustcount

// da wir wissen, dass dieses Level noch gültig ist und gerade die Seite gewechselt hat

Buszahl = 0;

testcount++;

}

}


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

(gedreht == falsch && lo_i < loval))

{

// Dieses Level wurde mindestens einmal gesprengt

Büstenzahl++;


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

{

// zwei oder mehr

isBust = wahr;

brechen;

}


if (gedreht == wahr)

drehen = falsch;

sonst wenn (gedreht == falsch)

drehen = wahr;


hasturned = wahr;


// Vorherige Treffer vergessen

testcount = 0;

}

}


if(isBust==false)

{

// Level ist noch gültig, zu unserer Liste hinzufügen

temp_hi[temp_count] = hival;

temp_lo[temp_count] = loval;

temp_turn[temp_count] = hasturned;

temp_hits[temp_count] = testcount;

temp_start [temp_count] = Schicht;

temp_merge[temp_count] = falsch;


if (testcount > 3)

temp_strength[temp_count] = ZONE_PROVEN;

sonst wenn (testcount > 0)

temp_strength[temp_count] = ZONE_VERIFIED;

sonst wenn (hasturned == true)

temp_strength[temp_count] = ZONE_TURNCOAT;

sonst wenn (isWeak == false)

temp_strength[temp_count] = ZONE_UNTESTED;

anders

temp_strength[temp_count] = ZONE_WEAK;


temp_count++;

}

}

}


// nach überlappenden Zonen suchen...

if (zone_merge == wahr)

{

merge_count = 1;

int Iterationen = 0;

while (merge_count > 0 && Iterationen < 3)

{

merge_count = 0;

Iterationen++;


für (i = 0; i < temp_count; i++)

temp_merge[i] = falsch;


für (i = 0; i < temp_count-1; i++)

{

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

fortsetzen;


für (j = i+1; j < temp_count; j++)

{

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

fortsetzen;


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]))

{

merge1[merge_count] = i;

merge2[merge_count] = j;

temp_merge[i] = wahr;

temp_merge[j] = wahr;

merge_count++;

}

}

}


// ... und kombiniere sie ...

for (i=0; i<merge_count; i++)

{

int Ziel = merge1[i];

int Quelle = merge2[i];


temp_hi[Ziel] = MathMax(temp_hi[Ziel], temp_hi[Quelle]);

temp_lo[Ziel] = MathMin(temp_lo[Ziel], temp_lo[Quelle]);

temp_hits[Ziel] += temp_hits[Quelle];

temp_start[Ziel] = MathMax(temp_start[Ziel], temp_start[Quelle]);

temp_strength[Ziel] = MathMax(temp_strength[Ziel], temp_strength[Quelle]);

if (temp_hits[Ziel] > 3)

temp_strength[Ziel] = ZONE_PROVEN;


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

{

temp_hits[Ziel] = 1;

if (temp_strength[Ziel] < ZONE_VERIFIED)

temp_strength[Ziel] = ZONE_VERIFIED;

}


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

temp_turn[Ziel] = falsch;

if (temp_turn[target] == true)

temp_hits[Ziel] = 0;


temp_hits[Quelle] = -1;

}

}

}


// Kopieren Sie den Rest der Liste in unsere offiziellen Zonen

zone_count = 0;

für (i=0; i<temp_count; i++)

{

if (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] < Schließen[4])

zone_type[zone_count] = ZONE_SUPPORT;

sonst wenn (zone_lo[zone_count] > Close[4])

zone_type[zone_count] = ZONE_RESIST;

anders

{

für (j=5; j<1000; j++)

{

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

{

zone_type[zone_count] = ZONE_RESIST;

brechen;

}

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

{

zone_type[zone_count] = ZONE_SUPPORT;

brechen;

}

}


wenn (j == 1000)

zone_type[zone_count] = ZONE_SUPPORT;

}


zone_count++;

}

}

}


Ungültige DrawZones ()

{

if(SetGlobals==true)

{

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)

fortsetzen;


Zeichenfolge s = "SSSR#"+i+" Stärke=";

if (zone_strength[i] == ZONE_PROVEN)

s = s + "Bewährt, Testanzahl = " + zone_hits[i];

sonst wenn (zone_strength[i] == ZONE_VERIFIED)

s = s + "Verifiziert, Testanzahl = " + zone_hits[i];

sonst wenn (zone_strength[i] == ZONE_UNTESTED)

s = s + "ungetestet";

sonst wenn (zone_strength[i] == ZONE_TURNCOAT)

s = s + "Überläufer";

anders

s = s + "schwach";


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 (Zonentyp[i] == ZONE_SUPPORT)

{

// Unterstützungszone

if (zone_strength[i] == ZONE_TURNCOAT)

ObjectSet(s, OBJPROP_COLOR, color_support_turncoat);

sonst wenn (zone_strength[i] == ZONE_PROVEN)

ObjectSet(s, OBJPROP_COLOR, color_support_proven);

sonst wenn (zone_strength[i] == ZONE_VERIFIED)

ObjectSet(s, OBJPROP_COLOR, color_support_verified);

sonst wenn (zone_strength[i] == ZONE_UNTESTED)

ObjectSet(s, OBJPROP_COLOR, color_support_ungetested);

anders

ObjectSet(s, OBJPROP_COLOR, color_support_weak);

}

anders

{

// Widerstandszone

if (zone_strength[i] == ZONE_TURNCOAT)

ObjectSet(s, OBJPROP_COLOR, color_resist_turncoat);

sonst wenn (zone_strength[i] == ZONE_PROVEN)

ObjectSet(s, OBJPROP_COLOR, color_resist_proven);

sonst wenn (zone_strength[i] == ZONE_VERIFIED)

ObjectSet(s, OBJPROP_COLOR, color_resist_verified);

sonst wenn (zone_strength[i] == ZONE_UNTESTED)

ObjectSet(s, OBJPROP_COLOR, color_resist_untested);

anders

ObjectSet(s, OBJPROP_COLOR, color_resist_weak);

}




if(SetGlobals==true)

{

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]);

}

}

}


bool Fractal(int M, int P, int shift)

{

wenn (Zeitrahmen > P)

P = Zeitrahmen;

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

if(shift<p)

falsch zurückgeben);


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

falsch zurückgeben);

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

{

if (M == OBEN_PUNKT)

{

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

falsch zurückgeben);

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

falsch zurückgeben);

}

wenn (M == DN_POINT)

{

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

falsch zurückgeben);

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

falsch zurückgeben);

}

}

zurück (wahr);

}


void FastFractals()

{

int-Verschiebung;

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 (Fractal(UP_POINT, P, shift) == true)

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

anders

FastUpPts [Verschiebung] = 0,0;


if (Fractal(DN_POINT, P, shift) == true)

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

anders

FastDnPts [Verschiebung] = 0,0;

}

}


void SlowFractals()

{

int-Verschiebung;

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 (Fractal(UP_POINT, P, shift) == true)

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

anders

SlowUpPts [Verschiebung] = 0,0;


if (Fractal(DN_POINT, P, shift) == true)

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

anders

SlowDnPts [Verschiebung] = 0,0;

}

}


bool NewBar()

{

Statisches datetime LastTime = 0;

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

{

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

zurück (wahr);

}

anders

falsch zurückgeben);

}


void DeleteZones()

{

intlen = 5;

int ich;


while (i < ObjectsTotal())

{

string objName = Objektname(i);

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

{

i++;

fortsetzen;

}

ObjectDelete(objName);

}

}


string TimeFrameToString(int tf) // Code von TRO

{

Zeichenkette tfs;


Schalter (tf)

{

Fall PERIODE_M1:

tfs="M1" ;

brechen;

Fall PERIODE_M5:

tfs="M5" ;

brechen;

Fall PERIODE_M15:

tfs="M15" ;

brechen;

Fall PERIOD_M30:

tfs="M30" ;

brechen;

Fall PERIODE_H1:

tfs="H1" ;

brechen;

Fall PERIODE_H4:

tfs="H4" ;

brechen;

Fall PERIODE_D1:

tfs="D1" ;

brechen;

Fall PERIODE_W1:

tfs="W1" ;

brechen;

Fall PERIOD_MN1:

tfs="MN";

}


Rückkehr (tfs);

}


string StringRepeat(string str, int n = 1)

{

string outstr = "";

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

return(outstr);

}


string StringRightPad(string str, int n=1, string str2=" ")

{

return(str + StringRepeat(str2,n-StringLen(str)));


 

Umstellung auf MT5. Hilf mir mit einem Wort. Wie in MT5 ist es in Code geschrieben, was ist falsch?

//+------------------------------------------------------------------+
//|                                                          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);
  }
//+------------------------------------------------------------------+

FRAGE: Warum fällt so viel Müll in den Puffer?

Ich bin auf der Stufe des Lego-Konstrukteurs, d.h. ich kopiere das Modul und verstehe die Eigenheiten von MT% aus Erfahrung. Dokumentation natürlich.

 
kopeyka2:

Umstellung auf MT5. Hilf mir mit einem Wort. Wie schreibt MT5 im Code, was ist falsch?

FRAGE: Warum fällt so viel Müll in den Puffer?

in mt5 geht die Zeitreihe in die andere Richtung
wenn Sie es auf die gleiche Weise wie in mt4 brauchen, das istArraySetAsSeries

 
kopeyka2:

Umstellung auf MT5. Hilf mir mit einem Wort. Wie in MT5 ist es in Code geschrieben, was ist falsch?

FRAGE: Warum fällt so viel Müll in den Puffer?

Ich bin auf der Stufe des Lego-Konstrukteurs, d.h. ich kopiere das Modul und verstehe die Eigenheiten von MT% aus Erfahrung. Dokumentation natürlich.

//+------------------------------------------------------------------+
//|                                                          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:

Vielen Dank für die Antwort.

Überprüft in MT5... Was für ein Chaos... Die Punkte sind auf seltsame Weise über das ganze Diagramm verstreut, irgendwo tief in der Geschichte... Ich verstehe nicht, was und warum MT5 nicht mag? Das Problem ist einfach!!!

NIMM ES IN MT4

.SO SIEHT ES IN MT4 AUS


UND SO IN MT5. Natürlich in einem Puffer. Aber das Problem ist, dass der Indikator Punkte fängt, aber nicht diese und nicht dort...(((


Bitte sagen Sie es mir noch einmal. Was ich im Code MT5???? falsch gemacht habe

Ich habe etwas in MT5. Aber Puffer ... ein Rätsel

 
kopeyka2:

Vielen Dank für die Antwort.

Überprüft in MT5... Was für ein Chaos... Die Punkte sind auf seltsame Weise über das ganze Diagramm verstreut, irgendwo tief in der Geschichte... Ich verstehe nicht, was und warum MT5 nicht mag? Das Problem ist einfach!!!

NIMM ES IN MT4

.


UND SO IN MT5 . Natürlich in einem Puffer. Aber das Problem ist, dass der Indikator Punkte fängt, aber nicht diese und nicht dort...(((


Bitte helfen Sie mir noch einmal. Was ich im Code MT5???? falsch gemacht habe

Ich habe etwas in MT5. Aber Puffer ... ein Rätsel

Es gibt kein Geheimnis. Die Nummerierung ist anders als bei mql4 und die Indikatorpuffer werden nicht automatisch auf Null gesetzt. Um den "Müll" zu beseitigen, muss der Programmierer für die Sauberkeit der Indizes sorgen, wenn sie keine Werte enthalten sollen.

 
Alexey Viktorov:

Kein Geheimnis. Die Nummerierung ist anders als bei mql4 und die Indikatorpuffer werden nicht automatisch auf Null gesetzt. Um den "Müll" zu beseitigen, muss der Programmierer auf die Reinheit der Indizes achten, wenn sie keine Werte enthalten sollen.

Die Frage ist, WARUM werden die Markierungen (Punkte) irgendwo angebracht? Ich habe im Code den Algorithmus !!!! definiert. Die MA-Bedingung im Körper der Kerze. Ist das nicht genug?

 
kopeyka2:

Die Frage ist, WARUM werden die Markierungen (Punkte) irgendwo angebracht? Ich habe im Code den Algorithmus !!!! definiert. Die MA-Bedingung im Körper der Kerze. Ist das nicht genug?

Sehen Sie hier.

kopeyka2:
Umstellung auf MT5. Hilf mir mit einem Wort.


Artem hat den vollständigen Code anstelle des Wortes Hilfe angegeben. Jeder hat seinen eigenen Zugang dazu. Ich versuche, keinen vorgefertigten Code zu geben, aber ich scheitere trotzdem manchmal.

kopeyka2:

Vielen Dank für die Antwort.

Überprüft in MT5... Es ist ein ziemliches Durcheinander...


Aber die Vergleichsgrafiken sind völlig unterschiedliche Zeiten. Wie kann man beurteilen, ob die Punkte richtig oder falsch sind???

Daher ein Wort der Hilfe.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Alle MQL4 Anfänger Fragen, Hilfe und Diskussion über Algorithmen und Codes

Alexey Viktorov, 2019.01.21 11:04

Kein Geheimnis. Die Nummerierung ist anders als bei mql4 und die Indikatorpuffer werden nicht automatisch auf Null gesetzt. Um den "Müll" zu beseitigen, sollte der Programmierer selbst für die Sauberkeit der Indizes sorgen, wenn sie keine Werte enthalten sollen.

Hilfe: In MT5 wurde eine unzureichende Abfolge von OnInit- und OnDeinit-Ausführungen vorgenommen, daher kann es auch hier zu Problemen kommen. In einigen Sonderfällen ist dies jedoch der Fall, und die Neuberechnung des Indikators sollte IMMER fortlaufend erfolgen. Unter der Voraussetzung, dass prev_calculated == 0 ist, sollte die Neuberechnung für alle Balken durchgeführt werden und bei jeder Schleifeniteration, wenn kein Wert im Puffer sein sollte, dieser Array-Index mit dem Wert EMPTY_VALUE oder 0 gefüllt werden, je nach PLOT_EMPTY_VALUE-Einstellung
 
Alexey Viktorov:

Hier ist ein Blick darauf.

Artiom gab den vollständigen Code an, anstatt mit dem Wort zu helfen. Jeder hat eine andere Herangehensweise an dieses Thema. Ich versuche, keinen vorgefertigten Code zu geben, aber trotzdem schlägt es manchmal fehl.

Aber die Vergleichsgrafiken sind völlig unterschiedliche Zeiten. Wie kann man beurteilen, ob die Punkte richtig oder falsch sind?

Daher ein Wort der Hilfe.

Mehr Hilfe in Worten: In MT5 wurde die Reihenfolge der OnInit- und OnDeinit-Ausführungen unzureichend gestaltet, daher kann es auch hier zu Problemen kommen. In einigen Sonderfällen ist dies jedoch der Fall, und die Neuberechnung der Indikatoren sollte IMMER fortlaufend erfolgen. Sofern prev_calculated == 0, Neuberechnung für alle Balken und bei jeder Iteration der Schleife, wenn kein Wert im Puffer vorhanden ist, füllen Sie diesen Index des Arrays mit dem Wert EMPTY_VALUE oder 0, je nach Einstellung von PLOT_EMPTY_VALUE

Halleluja!!!!! Geändert open[i] und close[i] zu iOpen(NULL,PERIOD_H1,i)



 
kopeyka2:

Halleluja!!!!! Geändert open[i] und close[i] zu iOpen(NULL,PERIOD_H1,i)



Was ist der Unterschied? Wenn die Anzeige auf H1 steht, liegt das nur an der Zugriffsgeschwindigkeit - Sie haben eine langsamere. In meinem Beispiel haben Sie wahrscheinlich übersehen, dass Sie die Arrays open und close auf serielle Indizierung einstellen müssen. Ich habe hervorgehoben, was Sie nicht hatten. Sie haben eine Schleife vom Anfang bis zum Ende - vom Grenzwert bis 0, und Sie haben keine Arrays indiziert - also wurde sie vorwärts und rückwärts gezeichnet.

Grund der Beschwerde: