Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Logfile zur Fehler suche (http://www.expert-advisor.com/forum/showthread.php?t=3381)

Spyfire 14.12.13 15:53

Logfile zur Fehler suche
 
Hallo Leute,

ich bin ein absoluter Neuling im Bereich EA Programmierung.
Ich habe mir über die Webseite Expert Advisor Builder for MetaTrader 4
einen EA zusammengeschusstert. Wenn ich den EA einen test im mt4 unterziehe funtioniert alles, er tradet.
Wenn ich den EA aber beim Livetrading benutzen möchte verweigert er den dienst und tut einfach garnichts.
Um den Fehler zu finden möchte ich ein Logfile einbauen das mir ein Fehlerprotokoll liefert.
Könnte mir jemand da ein Beispiel geben ?

Mein Broker ist Sensus Capital falls das relevat ist.
Ich habe meinen EA auch dort getestet.


Hier ist der EA:

//+------------------------------------------------------------------+
//| This MQL is generated by Expert Advisor Builder |
//| Expert Advisor Builder for MetaTrader 4 |
//| |
//| In no event will author be liable for any damages whatsoever. |
//| Use at your own risk. |
//| |
//+------------------- DO NOT REMOVE THIS HEADER --------------------+

#define SIGNAL_NONE 0
#define SIGNAL_BUY 1
#define SIGNAL_SELL 2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4

#property copyright "Expert Advisor Builder"
#property link "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"

extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = False;
extern double Lots = 1.0;
extern int Slippage = 3;
extern bool UseStopLoss = True;
extern int StopLoss = 5;
extern bool UseTakeProfit = False;
extern int TakeProfit = 60;
extern bool UseTrailingStop = True;
extern int TrailingStop = 15;

int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init() {
BarCount = Bars;

if (EachTickMode) Current = 0; else Current = 1;

return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit() {
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start() {
int Order = SIGNAL_NONE;
int Total, Ticket;
double StopLossLevel, TakeProfitLevel;



if (EachTickMode && Bars != BarCount) TickCheck = False;
Total = OrdersTotal();
Order = SIGNAL_NONE;

//+------------------------------------------------------------------+
//| Variable Begin |
//+------------------------------------------------------------------+

double Var1 = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, Current + 0);
double Var2 = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, Current + 1);

double Buy1_1 = Var2 < 0;
double Buy1_2 = Var2 < 0;
double Buy2_1 = Var1 > 0;
double Buy2_2 = Var1 > 0;

double CloseBuy1_1 = iADX(NULL, 0, 14, PRICE_CLOSE, MODE_PLUSDI, Current + 1);
double CloseBuy1_2 = iADX(NULL, 0, 14, PRICE_CLOSE, MODE_MINUSDI, Current + 1);
double CloseBuy2_1 = iADX(NULL, 0, 14, PRICE_CLOSE, MODE_PLUSDI, Current + 0);
double CloseBuy2_2 = iADX(NULL, 0, 14, PRICE_CLOSE, MODE_MINUSDI, Current + 0);

//+------------------------------------------------------------------+
//| Variable End |
//+------------------------------------------------------------------+

//Check position
bool IsTrade = False;

for (int i = 0; i < Total; i ++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {
IsTrade = True;
if(OrderType() == OP_BUY) {
//Close
//+------------------------------------------------------------------+
//| Signal Begin(Exit Buy) |
//+------------------------------------------------------------------+

if (CloseBuy1_1 > CloseBuy1_2 && CloseBuy2_1 < CloseBuy2_2) Order = SIGNAL_CLOSEBUY;
//+------------------------------------------------------------------+
//| Signal End(Exit Buy) |
//+------------------------------------------------------------------+

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
if (!EachTickMode) BarCount = Bars;
IsTrade = False;
continue;
}
//Trailing stop
if(UseTrailingStop && TrailingStop > 0) {
if(Bid - OrderOpenPrice() > Point * TrailingStop) {
if(OrderStopLoss() < Bid - Point * TrailingStop) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
} else {
//Close

//+------------------------------------------------------------------+
//| Signal Begin(Exit Sell) |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Signal End(Exit Sell) |
//+------------------------------------------------------------------+

if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
if (!EachTickMode) BarCount = Bars;
IsTrade = False;
continue;
}
//Trailing stop
if(UseTrailingStop && TrailingStop > 0) {
if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
}
}
}

//+------------------------------------------------------------------+
//| Signal Begin(Entry) |
//+------------------------------------------------------------------+

if (Buy1_1 == Buy1_2 && Buy2_1 == Buy2_2) Order = SIGNAL_BUY;



//+------------------------------------------------------------------+
//| Signal End |
//+------------------------------------------------------------------+

//Buy
if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(!IsTrade) {
//Check free margin
if (AccountFreeMargin() < (1000 * Lots)) {
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}

if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
if(Ticket > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
Print("BUY order opened : ", OrderOpenPrice());
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
} else {
Print("Error opening BUY order : ", GetLastError());
}
}
if (EachTickMode) TickCheck = True;
if (!EachTickMode) BarCount = Bars;
return(0);
}
}

//Sell
if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(!IsTrade) {
//Check free margin
if (AccountFreeMargin() < (1000 * Lots)) {
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}

if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
if(Ticket > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
Print("SELL order opened : ", OrderOpenPrice());
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
} else {
Print("Error opening SELL order : ", GetLastError());
}
}
if (EachTickMode) TickCheck = True;
if (!EachTickMode) BarCount = Bars;
return(0);
}
}

if (!EachTickMode) BarCount = Bars;

return(0);
}
//+------------------------------------------------------------------+

feelfree 14.12.13 16:45

Hallo Spyfire,

hast du das LiveTrading in den MT4-Optionen auch zugelassen (Smiley im Chart)?

Alle Fehler, die durch den EA auftreten findest du in den Tabs "Experten" und "Journal" deines Terminals.

Grüße
Dan

P.S.: Der EA selbst weiß ja nicht das er einen Fehler macht und wird sie dir als solche auch nicht in einem Logfile ausgeben können.

Spyfire 15.12.13 00:55

Hey,

andere EAs laufen ja auch, deshalb bin ich sicher das es nicht dran liegt.
Ja das Livetrading habe ich zugelassen und er Smile wird angezeigt( :) ) auch bei dem EA.

In dem Ordner D:\Program Files (x86)\SENSUS MT4 Client Terminal\experts\include
liegen Datein die die fehler beschreiben und wenn man diese auslesen lässt müsste man doch eine fehlerbeschreibung in dem Logfile speicher können.

Ich habe dazu einen Code gefunden nur leider verstehe ich ihn nicht...

[C++] // smokin // Error-Beschreibung #include <stderror.mqh> #include <stdlib.m - Pastebin.com

feelfree 15.12.13 16:41

Hallo Spyfire,

nur in Kürze damit du den Fehler vielleicht schneller findest:

Die Fehlercodes dieses EA findest du auch automatisch im Experts Tab deines MT4.
In der von dir genannten stderror findest du folgende Errorcodes und deren Bedeutung:
Error codes - MQL4 Documentation

Ich vermute allerdings dass dieser EA nicht funktioniert weil er prüft ob eine irgendeine Order im Account offen ist und nur aktiv wird wenn er 0 offene Orders findet.
Das würde auch erklären warum er im Backtest problemlos durchläuft und im Livebetrieb streikt.

Hier der fehlerhafte Codeblock:
Code:

for (int i = 0; i < Total; i ++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {
IsTrade = True;

und hier die korrekte Variante:
Code:

for (int i = 0; i < Total; i ++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()
&& OrderMagicNumber() == MagicNumber) {
IsTrade = True;

Aber auch diese korrigierte Variante funktioniert nur wenn du eine MagicNummer > 0 für diesen EA wählst.

Grüße
Dan

traderdoc 15.12.13 17:11

Was soll die MagicNumber ändern?
Es wird bereits nach dem WP-Symbol selektiert und ist eine Order mir dem entsprechenden WP offen, dann ist sie halt offen, da spielt die MN auch keine Rolle mehr und mehrere TF bzw. mehrere EAs gleichzeitig sollen doch nicht vorkommen, oder?

Ne, daran kann es nicht liegen.

traderdoc

feelfree 15.12.13 17:22

Wenn er schreibt das andere EA's laufen vermute ich dass diese auch zeitgleich laufen sollen.

Die MagicNumber 0 hat auch jede manuell geöffnete Position.
Wenn er vermeiden will das dieser EA auch manuelle Positionen verwaltet sollte er eine MagicNumber vergeben.

traderdoc 15.12.13 18:43

Da gehe ich natürlich voll mit Dir.
Aber dann muß er sich mal ganz konkret dazu äußern, ob nun noch ein anderer EA läuft und ob da irgendwo manuell geöffnete Trades rumschwirren.

traderdoc

Spyfire 16.12.13 00:10

Hey Leute,

erst einmal möchte ich mich für die schnelle Hilfe bedanken.

"Andere eas laufen", damit meinte ich das die Beispiel eas die schon im mt4 integriert sind funtionieren(warscheinlich nicht hilfreich das sie das auch sollten).
Das war etwas missverständlich ausgedrückt.
Es soll nur dieser ea laufen und deshalb kann ich die MagicNumer =0 lassen oder?

traderdoc 16.12.13 09:44

Wenn nur dieser eine EA laufen soll und auch keine manuellen Trades gesetzt werden, dann spielt die MagicNumber keine Rolle.
Sollte der Code unverändert so bleiben, dann hätte die MN sowieso keine Bedeutung, weil sie gar nicht abgefragt wird. Das Schreiben der MN in die Order ist nur Makulatur.

traderdoc

Spyfire 16.12.13 20:49

Hey der ea läuft jetzt.
Auf dem Demokonto war nicht genug Geld für den ea.
Der ea fragt die freie Margin ab und diesen wert habe ich runter gesetzt schon gings.
Ich habe aber noch eine andere Frage.
Ich bekomme des öfteren den Fehler angezigt.
Was bedeutet er und wie bekomme ich ihn weg ?

http://img5.fotos-hochladen.net/uplo...uz8xbdw1ce.jpg


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:21 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum