- Wie programmiert man?
- Backtest/Optimierung/MT4 Historische Daten
- benötige bitte Hilfe bei der Codierung
Ich bin sehr neu in der Programmierung von mql4 und habe meinen ersten EA fertiggestellt. Mein einziges Problem ist, dass ich ihn nicht dazu bringen kann, Trades für mehr als ein Paar zu öffnen. Im EA-Abschnitt des Terminals neben dem Journal wird der Fehler "Ungültiges Ticket für die Orderclose-Funktion" angezeigt, obwohl der EA die Geschäfte für ein Paar problemlos öffnet und schließt. Kann mir bitte jemand helfen.
Wie sollen wir das wissen, wenn Sie uns weder Ihren Code noch Ihr Fehlerprotokoll zeigen?
Wir sind keine Gedankenleser! Wenn Sie unsere Hilfe wollen, müssen Sie Ihren Code sowie die Fehler, die er verursacht (die Ergebnisse im Protokoll), zeigen. Es wäre auch hilfreich zu wissen, welche Währungspaare und Zeitrahmen Sie testen, wenn wir einen Blick auf Ihren Code werfen.
Bitte beachten Sie auch, dass Sie auf dem MetaTrader 4 nur eine einzige Währung gleichzeitig im Strategy Tester testen können. Wenn Ihr EA mehrere Währungen gleichzeitig von einem einzigen Chart aus handelt, können Sie ihn nicht im Strategietester testen - nur auf einem Live-Demo- oder Echtgeldkonto!
Matt_Townsend: obwohl der EA den Handel mit einem Paar problemlos öffnet und schließt. | Deshalb empfehle ich Handeln Sie nicht mehrere Währungen in einem EA
|
Bitte bearbeiten Sie Ihren Beitrag und verwenden Sie die SRC-Schaltfläche, um Ihren Code hinzuzufügen! Kopieren Sie den Code nicht einfach als Standardtext, da er schwer zu lesen ist. Ich bin sicher, dass Sie aus anderen Threads ersehen können, wie es gemacht werden sollte. Bitte benutzen Sie den SRC-Button, um Ihren Code zu posten.
EDIT: Wie bereits angefragt - . .. Es wäre auch hilfreich zu wissen, mit welchen Währungspaaren und Zeitrahmen Sie testen ...
EDIT2: Wie bereits angefragt - ... sowie die Fehler, die es gibt (die Ergebnisse im Log) ...
Bitte bearbeiten Sie Ihren Beitrag und verwenden Sie die SRC-Schaltfläche, um Ihren Code hinzuzufügen! Kopieren Sie den Code nicht einfach als Standardtext, da er schwer zu lesen ist. Ich bin sicher, Sie können aus anderen Threads ersehen, wie es gemacht werden sollte. Bitte verwenden Sie die SRC-Schaltfläche, um Ihren Code zu posten.
//| Simple Moving Average Crossover Strategy.mq4 |
//| Matthew Townsend |
//+------------------------------------------------------------------+
#property version "1.05"
#property strict
//---
//---Inputs
extern double Lots =0.01;
extern int FastMA =5;
input int FastMAMode =MODE_EMA;
extern int SlowMA =8;
input int SlowMAMode =MODE_SMA;
//+----------------------------------------+
//|undesirables |
//+----------------------------------------+
int init()
{
//----
//----
return(0);
}
int deinit()
{
//----
//----
return(0);
}
//+---------------------------------------------+
//|System start |
//+---------------------------------------------+
int start()
{
double fastma, slowma;
int ticket, total;
//---define Ma's
fastma = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
slowma = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
total = OrdersTotal();
//---Start operations
if(total < 1)
{
if(fastma > slowma)
{
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"",0,0,Blue);
if(ticket > 0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Buy order opened : ", OrderOpenPrice());
}
else
Print("Error opening order : ", GetLastError());
return(0);
}
if(fastma < slowma)
{
ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"",0,0,Red);
if(ticket > 0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Sell order opened : ", OrderOpenPrice());
}
else
Print("Error opening order : ", GetLastError());
return(0);
}
return(0);
}
bool ans;
if(OrderType()==OP_BUY)
{
while(fastma < slowma)
{
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
if(ticket < 1)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Buy order closed : ", OrderClosePrice());
}
else
Print("Error closing order : ", GetLastError());
return(0);
}
}
if(OrderType()==OP_SELL)
{
while(fastma > slowma)
{
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
if(ticket < 1)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Sell order closed : ", OrderClosePrice());
}
else
Print("Error closing order : ", GetLastError());
return(0);
}
}
return(0);
}
//+-----------------------------------------------------------------------------------+
Ich habe Sie gebeten, Ihren vorherigen Beitrag zu bearbeiten und nicht einen neuen hinzuzufügen, damit der Thread nicht so lang wird!
Ich habe auf dem 1-Stunden-Zeitrahmen, EURUSD und 1 Stunde GBPUSD getestet.
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...
Sie überprüfen das Ergebnis für die Close-Operation nicht richtig.
In Bezug auf die Logik gibt es mehrere Probleme mit Ihrem EA, aber so wie es im Moment aussieht, läuft er bei mir im Strategy Tester ohne Fehler, also liefern Sie bitte die Liste der Fehler, die Sie erhalten!
Es gibt bereits zwei Compiler-Warnungen für den folgenden Code:
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...
Sie überprüfen das Ergebnis des Schließvorgangs nicht korrekt.
In Bezug auf die Logik gibt es mehrere Probleme mit Ihrem EA, aber wie es im Moment steht, läuft es ohne Fehler auf meinem Ende, so liefern Sie bitte die Liste der Fehler, die Sie erhalten!
Die einzige Fehlermeldung, die ich vom EA bekomme, ist "invalid ticket for orderclose function", mit einer Zahl daneben. Ich würde gerne das aktuelle Log zeigen, aber auf dem zweiten Chart, auf dem der EA läuft, tut er nichts, denn normalerweise würde er versuchen, sofort einen Handel zu eröffnen. Falls und wenn sich das Protokoll mit dem Fehler füllt, wie würde ich vorgehen, um Ihnen das tatsächliche Protokoll zu zeigen?
Markieren Sie die betreffenden Zeilen mit Klick, Strg-Klick oder Umschalt-Klick (Standard-Windows-Bedienung), dann Rechts-Klick auf die Auswahl und wählen Sie "Kopieren"!
EDIT: In Bezug auf den Code, Sie sind mit dem OrderSelect, aber Sie sind immer davon ausgehen, dass es jedes Mal funktioniert. Und wenn es nicht funktioniert, verwenden Sie einfach weiterhin die Funktionen für die Bestelldetails wie OrderTicket() in Ihrem Abschluss, der fehlschlagen könnte, wenn der ursprüngliche OrderSelect() ebenfalls fehlgeschlagen ist. Wie ich schon sagte, haben Sie viele logische Probleme in Ihrem Code!
bool ans;
//You do not select an order
{
while(fastma < slowma) //Use if not while
{
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
if(ticket < 1) //ticket is a local variable and has not been assigned a value
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Buy order closed : ", OrderClosePrice());
}
else
Print("Error closing order : ", GetLastError());
return(0);
}
}
Der einzige Fehler, den ich von der EA bekommen habe, ist einungültiges Ticket für die Orderclose-Funktion, mit einer Zahl daneben. Ich würde gerne das aktuelle Protokoll zeigen, aber auf dem zweiten Chart, auf dem die EA läuft, tut sie nichts, denn normalerweise würde sie versuchen, sofort einen Handel zu eröffnen. Wenn sich das Protokoll mit dem Fehler füllt, wie kann ich Ihnen dann das tatsächliche Protokoll zeigen?
Ein weiterer sehr wichtiger Hinweis in Bezug auf die Verwendung Ihres EA auf mehrere Währungspaare oder Zeitrahmen.
Ihr Code verwendet weder die "Magic Number"-Auswahl noch prüft er das verwendete Symbol (oder die "Magic Number") bei der Überprüfung der offenen Aufträge in der Historie. So im Wesentlichen Ihre EA wird nicht korrekt funktionieren weder mit sich selbst noch andere EA's.
So wie es aussieht, können Sie diesen EA nur allein verwenden, ohne dass ein anderer EA läuft, nicht einmal selbst auf einem anderen Chart!

- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.