Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 100

 

Hallo an alle, können Sie mir bitte helfen, einen Fehler im Code des EA zu finden, ich denke, ich habe alles durchgeschaut, es scheint alles richtig im Code geschrieben zu sein, aber das Programm handelt aus irgendeinem Grund nicht richtig! Die Idee ist folgende: Der Advisor muss nach zwei langen Kerzen der gleichen Richtung suchen (die Länge zwischen den Kerzen ist im Advisor einstellbar, d.h. zwischen den beiden Minimum- oder Maximum-Kerzen, je nach Richtung), wenn der Preis in der Gegenrichtung das Minimum oder Maximum der letzten Kerze durchbricht, sollte ein Geschäft eröffnet werden (Beispielbildsituationen auf dem Chart im Anhang der Datei). Der Berater sollte in jeder geeigneten Situation Geschäfte eröffnen, aber aus irgendeinem Grund eröffnet er nur in den Handelsfenstern zwischen den Tagen Geschäfte. Hier ist die Situation, die nicht schwierig ist, von Programmierern, bitte helfen, beheben Sie den Fehler. EA-Code siehe unten, sowie in der angehängten Datei.


//+-----------------------------------------------------------------------------------------------+

//| Abstand_Kerzen.mq4 |

//| Copyright 2017, Vladim |

//| vk.com/id229534564 |

//| Post: Vladim120385@yandex.ru |

//+-----------------------------------------------------------------------------------------------+

#property copyright "Copyright 2017, Vladim"

#property link "vk.com/id229534564"

#Eigenschaft Version "1.00"

#Eigenschaft streng


//--- EA-Parameter

extern string paramEA = ""; // Parameter EA

extern double volume = 0.01; // Volumen

extern double stopLoss = 5; // StopLoss.

extern double takeProfit = 1.5; // TakeProfit

extern double maxSpacing = 150; // MaxAbstand

extern double minSpacing = 30; // MinAbstand

extern double TrailingStop = 0; // TrailingStop

extern int magic = 127; // Magie


//--- globale Variablen

datetime newCandle;

int Tipp;


//+-----------------------------------------------------------------------------------------------+

int OnInit()

{

return(INIT_SUCCEEDED);

}

//+-----------------------------------------------------------------------------------------------+

void OnDeinit(const int reason)

{

}

//+-----------------------------------------------------------------------------------------------+

void OnTick()

{

if(newCandle != Time[0]) FindPattern();

newCandle = Time[0];

}

//+-----------------------------------------------------------------------------------------------+

void OpenOrder(int type) // Eröffnen einer Marktorder

{

if(type == OP_BUY) if(OrderSend(_Symbol, OP_BUY, volume, Ask, 0, 0, 0, 0, "", magic, 0)) SetSLTP(OP_BUY);

if(type == OP_SELL) if(OrderSend(_Symbol, OP_SELL, volume, Bid, 0, 0, 0, 0, 0, "", magic, 0)) SetSLTP(OP_SELL);

}

//+-----------------------------------------------------------------------------------------------+

void SetSLTP(int type) //set stop orders

{

double sl = 0;

double tp = 0;

if(Typ == OP_BUY)

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

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_BUY && OrderStopLoss() == 0)

{

sl = NormalizeDouble(Low[1] - stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() + (OrderOpenPrice() - Low[1]) * takeProfit, Digits);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return;

}

if(Typ == OP_SELL)

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

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_SELL && OrderStopLoss() == 0)

{

sl = NormalizeDouble(High[1] + stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() - (High[1] - OrderOpenPrice()) * takeProfit, Digits);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return;

}

}

//+-----------------------------------------------------------------------------------------------+

void FindPattern() // Suche nach langem Abstand zwischen Kerzenständern

{

if(Hoch[1] < Hoch[2] && Gebot > Hoch[1] && Tief[1] < Tief[2])

{

double spacing = NormalizeDouble((High[2] - High[1]) / _Point, 0);

if(maxSpacing >= spacing && minSpacing <= spacing)

OpenOrder(OP_BUY);

}

if(Tief[1] > Tief[2] && Gebot < Tief[1] && Hoch[1] > Hoch[2])

{

double spacing = NormalizeDouble((Low[1] - Low[2]) / _Point, 0);

if(maxSpacing >= spacing && minSpacing <= spacing)

OpenOrder(OP_SELL);

}

{

if(TrailingStop!=0) TrailingStop();

}

}

//+-----------------------------------------------------------------------------------------------+

void TrailingStop()

{

doppelt StLo,OSL,OOP;

bool error=true;

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

{

if (OrderSelect(i, SELECT_BY_POS))

{

tip = OrderType();

if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

{

OSL = NormalizeDouble(OrderStopLoss(),Digits);

OOP = NormalizeDouble(OrderOpenPrice(),Digits);

wenn (Tipp==0)

{

StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits);

wenn (StLo < OOP) weiter;

wenn (StLo > OSL)

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);


}

wenn (Tipp==1)

{

StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);

wenn (StLo > OOP) weiter;

wenn (StLo < OSL || OSL==0 )

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);

}

if (!error) Alert("Fehler TrailingStop ",GetLastError()," ",Symbol()," SL ",StLo);

}

}

}

}

//+-----------------------------------------------------------------------------------------------+

Dateien:
 
Vladim1203:

Hallo an alle, können Sie mir bitte helfen, einen Fehler im Code des EA zu finden, ich denke, ich habe alles durchgeschaut, es scheint alles richtig im Code geschrieben zu sein, aber das Programm handelt aus irgendeinem Grund nicht richtig! Die Idee ist folgende: Der Advisor muss nach zwei langen Kerzen der gleichen Richtung suchen (die Länge zwischen den Kerzen ist im Advisor einstellbar, d.h. zwischen den beiden Minimum- oder Maximum-Kerzen, je nach Richtung), wenn der Preis in der Gegenrichtung das Minimum oder Maximum der letzten Kerze durchbricht, sollte ein Geschäft eröffnet werden (Beispielbildsituationen auf dem Chart im Anhang der Datei). Der Berater sollte in jeder geeigneten Situation Geschäfte eröffnen, aber aus irgendeinem Grund eröffnet er nur in den Handelsfenstern zwischen den Tagen Geschäfte. Hier ist die Situation, die nicht schwierig ist, von Programmierern, bitte helfen, beheben Sie den Fehler. EA-Code siehe unten und auch in der angehängten Datei.

Vielleicht reicht es schon, dass Sie in jedem Thema Beiträge verfassen und gleichzeitig Ihre eigenen erstellen.

 
kuzhakov:

Hallo.
Können Sie mir sagen, wie ich den EA-Handel zeitlich begrenzen kann?
Ich habe viele Methoden aus dem Forum ausprobiert, aber nichts hat funktioniert, ich verstehe nichts vom Schreiben.
Es wäre schön, wenn Sie einfach mit dem Finger darauf zeigen könnten, was Sie einfügen sollen.


Fügen Sie es nach dem Start ein. und der eXpert wird jeden Tag in einem bestimmten Zeitintervall auf dem Terminal handeln


int val=Hour();
 double min=Minute();
 double Dl = val + min/100;  
 double L = xxxx+xxxx/100; //час + минуты вместо хххх - это начало времени
 double P = xxxx+xxxx/100; //час + минуты вместо хххх - это конец времени
 if(Dl<L)return;
 if(Dl>P)return;
 
Vladim1203:

Hallo an alle, können Sie mir bitte helfen, einen Fehler im Code des EA zu finden, ich denke, ich habe alles durchgeschaut, es scheint alles richtig im Code geschrieben zu sein, aber das Programm handelt aus irgendeinem Grund nicht richtig! Die Idee ist folgende: Der Advisor muss nach zwei langen Kerzen der gleichen Richtung suchen (die Länge zwischen den Kerzen ist im Advisor einstellbar, d.h. zwischen den beiden Minimum- oder Maximum-Kerzen, je nach Richtung), wenn der Preis in der Gegenrichtung das Minimum oder Maximum der letzten Kerze durchbricht, sollte ein Geschäft eröffnet werden (Beispielbildsituationen auf dem Chart im Anhang der Datei). Der Berater sollte in jeder geeigneten Situation Geschäfte eröffnen, aber aus irgendeinem Grund eröffnet er Geschäfte nur in den Handelsfenstern zwischen den Tagen. Hier ist die Situation, die nicht schwierig ist, von Programmierern, bitte helfen, beheben Sie den Fehler. Siehe den EA-Code unten und auch in der angehängten Datei.


Bedingung für Kauf- und Verkaufseintrag prüfen

 
Vladim1203:

Hallo an alle, können Sie mir bitte helfen, einen Fehler im Code des EA zu finden, ich denke, ich habe alles durchgesehen, es scheint richtig in den Code geschrieben worden zu sein, aber das Programm handelt nicht korrekt aus irgendeinem Grund! Die Idee ist folgende: Der Advisor muss nach zwei langen Kerzen der gleichen Richtung suchen (die Länge zwischen den Kerzen ist im Advisor einstellbar, d.h. zwischen den beiden Minimal- oder Maximal-Kerzen, je nach Richtung), wenn der Preis in der entgegengesetzten Richtung das Minimum oder Maximum der letzten Kerze durchbricht, sollte ein Geschäft eröffnet werden (Beispielbildsituationen auf dem der Datei beigefügten Chart). Der Berater sollte in jeder geeigneten Situation Geschäfte eröffnen, aber aus irgendeinem Grund eröffnet er nur in den Handelsfenstern zwischen den Tagen Geschäfte. Hier ist die Situation, die nicht schwierig ist, von Programmierern, bitte helfen, beheben Sie den Fehler. Siehe den EA-Code unten und in der angehängten Datei.

Es ist besser, zuerst den Teil des EAs zu schreiben, der die gefundenen Kerzen auf dem Chart markiert, damit alles klar wird. Und die folgenden Zeilen sind in Ihrem Fall unnötig:

extern string paramEA    = "";     // Parameters EA

и

//+-----------------------------------------------------------------------------------------------+
int OnInit()
{
   
   return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   
}
//+-----------------------------------------------------------------------------------------------+
 

Bitte helfen Sie der Gemeinschaft ...
*
Ich habe den Kalman-Filter-Indikator aus dem Forum heruntergeladen (Quellcode im Anhang).
In der Karte ist alles in Ordnung.


Wenn ich versuche, sie in Expert Advisor zu lesen, erscheint folgende Zeile



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

Gibt die gleiche große Zahl aus, die offensichtlich nichts mit dem Indikator zu tun hat:

Was kann das sein?

Dateien:
 
MikeZv:

Hilfe aus der Gemeinschaft ...
*
Ich habe den Kalman-Filter-Indikator aus dem Forum heruntergeladen (Quellcode im Anhang).
In der Karte ist alles in Ordnung.


Wenn ich versuche, sie in Expert Advisor zu lesen, erscheint folgende Zeile



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

Gibt die gleiche große Zahl aus, die offensichtlich nichts mit dem Indikator zu tun hat:

Was kann das sein?

EMPTY_VALUE

Leerer Wert im Indikatorpuffer

2147483647 (0x7FFFFFFFF)

 
Alekseu Fedotov:

EMPTY_VALUE

Leerer Wert im Indikatorpuffer

2147483647 (0x7FFFFFFFF)


:) Ich habe es bereits gefunden ...
Warum kommt es heraus?

 
MikeZv:

:) Ich habe es bereits gefunden ...
Aber warum kommt es heraus?


Der Indikator hat 2 Arrays, weil 2 Farben. Solange sich eine Zeile der ersten Farbe auf dem Balken befindet, ist das Feld mit der zweiten Farbe gleich EMPTY_VALUE,

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1);

iValue = EMPTY_VALUE, dann ist die Linie auf 1 bar orange. (weil Feld blau = EMPTY_VALUE)

 
Nikolay Ivanov:

Der Indikator hat 2 Felder, weil es 2 Farben gibt. Solange sich eine Zeile der ersten Farbe auf dem Balken befindet, ist das Feld mit der zweiten Farbe gleich EMPTY_VALUE,

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1);

iValue = EMPTY_VALUE, dann ist die Linie auf 1 bar orange. (Weil blaues Feld = EMPTY_VALUE)


Danke, Nikolai...
Ich habe von beiden Linien genommen.
Dann habe ich sie zu einem einzigen zusammengefügt (einen Puffer gelassen). Gleiches Ergebnis.
*
Ich habe eine solche Frage:
Der Indikator hat eine Variable draw_begin=500, d.h. die Anzahl der Candlesticks vom Ende (von der frischesten Candlestick), wo der Chart gezeichnet wird.
Und wenn wir den Indikatorwert mit der iCustom()-Methode extrahieren, werden diese 500 Punkte ab welchem Candlestick gezählt?
Warum es wichtig ist - draw_begin wird nicht nur zum Zeichnen verwendet, sondern ist auch an der Berechnung des Indikators beteiligt ...