Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 7
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Hallo, ich habe keinen Thread über die Aktualisierung des Metatrader 4-Terminals für Android 2.3 gefunden, also treten Sie mich bitte nicht zu sehr für das Posten in diesem Thread. Auf dem Markt Terminal nur für Android 4+. Wo kann ich ein Update bekommen, denn meins funktioniert nicht mehr.
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Terminal mt5 und mt4 funktionieren nicht
Renat Fatkhullin, 2016.11.13 23:51
Wir unterstützen leider keine Android-Versionen unter 4.0.3 mehr.Ich habe dort nichts zu erklären, also antwortet auch niemand. Das von Ihnen gezeigte Schaubild ist bedeutungslos, und es ist ein Rätsel, wie es zustande gekommen ist.
Die Option "Zweidimensionale Oberfläche" in der Registerkarte "Optimierungsgrafik" des Testers ist (imho) sinnvoll, wenn es darum geht, 2 Eingangsparameter eines EA zu optimieren, oder visuell zu sehen, bei welchen Werten von 2 Parametern in der Historie gute Ergebnisse erzielt wurden, ob diese Parameter voneinander abhängig sind und ob sie überhaupt Sinn machen.
Aus irgendeinem Grund haben Sie nur 0 auf beiden Achsen, und vertikal sind diese 0 in 3 Zwischenschritte unterteilt, so dass Sie "Würfel eins in der Mitte, zwei tiefer/höher und zwei/drei in einem Quadrat" haben. Und die Ergebnisse sehen zufällig aus - weiße und grüne "Würfel" sind zufällig verstreut. Das Diagramm ist also bedeutungslos und scheint nichts zu bedeuten.
Die Grafik macht vielleicht keinen Sinn, aber nach der Optimierung im Zeitraum von 2014-2015 und bei der Auswahl und Einstellung besserer Parameter und Re-Testing von 2014 bis heute, das Ergebnis der Verlust / Drawdown unverändert bleiben, gut, der Gewinn steigt im Verhältnis zu dem Zeitraum. Auch war der Bot auf eine Demo für einen Monat arbeiten, und während der Prüfung für den letzten Monat mit Standard-Parameter alle Angebote mit dem Tester = +5pp zusammenfallen. Ich werde also nicht mit Würfeln und ihrer Farbe spielen.
Danke für die Klarstellung.
Ich versuche, MQL4 zu erlernen und bitte daher um Verständnis für meine Frage.
Wie kann man SL und TP für eine schwebende Order korrekt berechnen, wenn diese nicht auf dem aktuellen Kurs, sondern auf dem während der Berechnungen erhaltenen Kurs platziert wird?
Sie sollten auf der Grundlage der Candlestick-Länge berechnet werden. Es ist ungefähr so:
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Point,Digits);
Ich danke Ihnen!
Hallo!
Ich versuche, MQL4 zu lernen, also fühlen Sie sich bitte nicht schlecht wegen meiner Frage.
Bitte teilen Sie mir mit, wie man SL und TP für eine schwebende Order korrekt berechnet, wenn diese nicht zum aktuellen Kurs, sondern zu dem während der Berechnungen ermittelten Kurs platziert wird.
Sie sollten auf der Grundlage der Candlestick-Länge berechnet werden. Es ist ungefähr so:
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Point,Digits);
Ich danke Ihnen!
Hier finden Sie die Funktionen, mit denen Sie die korrekten Stop-Orders für jede Art von Auftrag berechnen können:
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
return((lv==0)?sp*2:lv);
}
//+------------------------------------------------------------------+
{
//---
MqlDateTime server_time;
TimeToStruct(TimeCurrent(),server_time);
//--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
if(server_time.min%minutesBefore==0 || server_time.min==0) {
if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) {
//--- получили сигнал на покупку
Print("Сигнал на покупку ",TimeCurrent()); // Проверочное сообщение в журнал
//--- проверка наличия уже открытой позиции на покупку
if (OrdersTotal() == 0)
{
ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);
Alert ("Есть сигнал на покупку ", sim, per);
}
if (OrdersTotal() >0)
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
if(OrderType()==OP_SELL)
{
OrderClose(ticket, OrderLots(), Bid,0,Blue);
{
ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);
Alert ("Есть сигнал на закрытие продажи и открытие покупки ", sim, per);
}
}
//--- вызов функции открытия позиции на покупку
}
if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) {
//--- получили сигнал на продажу
Print("Сигнал на продажу ",TimeCurrent()); // Проверочное сообщение в журнал
//--- проверка наличия уже открытой позиции на продажу
if (OrdersTotal() == 0)
{
ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
Alert ("Есть сигнал на продажу ", sim, per);
}
if (OrdersTotal() >0)
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
if(OrderType()==OP_BUY)
{
OrderClose(ticket, OrderLots(), Ask,0,Red);
{
ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
Alert ("Есть сигнал на закрытие покупки и открытие продажи ", sim, per);
}
}
//--- вызов функции открытия позиции на продажу
}
}
}
Hier finden Sie die Funktionen, mit denen Sie die korrekten Stop-Orders für jede Art von Auftrag berechnen können:
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
return((lv==0)?sp*2:lv);
}
//+------------------------------------------------------------------+
Vielen Dank, Artem, ich werde mich darum kümmern.
Bitte sehr. Wenn Sie genaue Stop-Kurse benötigen, weil Sie den Eröffnungskurs eines Marktes oder einer schwebenden Order kennen, können Sie mit diesen Funktionen die erforderlichen Preise ermitteln - sie liefern bereits berechnete Preise für die gewünschte Stop-Order.
Angenommen, Sie haben den gesetzten Preis einer Pending Order:
double priseSet=1.12345;
Dann wird der StopLoss-Preis
int StopLoss=20; Punkte für BuyLimit sein:
double sl=CorrectStopLoss(Symbol(),OP_BUYLIMIT,priceSet,StopLoss);
Die sl-Variable wird den korrekt berechneten StopLoss für BuyLimit mit den StopLevel-Anforderungen übernehmen.
Hier ist ein Tipp. Angenommen, eine Short-Position wird eröffnet. Im Falle eines Kaufsignals schließen Sie die Short-Position und eröffnen die Long-Position.
Prüfen Sie, ob es eine offene Verkaufsposition gibt. Wenn ja, schließen Sie es.
Eröffnen Sie dann eine Kaufposition.
Es ist elementar.![](https://c.mql5.com/3/109/wink__2.gif)
Ich habe große Lust, mql4 zu verwenden, um einen solchen Algorithmus zu implementieren:
Es gibt zwei MT4-Terminals von verschiedenen Brokern. In einem von ihnen befindet sich ein "Exklusiv"-Indikator, der nicht auf ein anderes Terminal verschoben werden kann (wie in Market).
Na und! Ist es möglich, die Werte der "exklusiven" Indikatorpuffer zu übernehmen und in einem eigenen Indikator in einem eigenen Terminal zu implementieren?
Die Ressourcen funktionieren irgendwie nicht.