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)
-   -   EA is not trading alone (http://www.expert-advisor.com/forum/showthread.php?t=2533)

bengaagneb 22.11.12 17:15

EA is not trading alone
 
Hallo,

ich bin noch neu und fange gerade an mich mit eas und der programmierung zu beschäftigen :)

Ich habe mit erst mal einen einfach mit dem ExpertAdvisorBuilder gebastelt und versuche den nun zu verstehen und am Code zu verändern.

Dabei habe ich sofort ein Problem festgestellt. Mein EA handelt nicht alleine, ich kann AKS manuell bestätigen, aber sobald ich ihn alleine handeln lassen möchte, macht er garnichts mehr. Ich vermute der Fehler liegt irgendwo in dem folgenden Code, aber ich verstehe den nicht:

Zitat:

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(!IsTrade) {
//Check free margin
if (AccountFreeMargin() < (100 * Lots)) {
Print("Risiko ist zu hoch! ", 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);
}
}
Ich würde mich freuen, wenn mir jemand weiter helfen kann.

VG Benga

Trabo 23.11.12 09:11

Vielelicht hast du ja unter der option nciht alle hacken gesetzt.. Sodass er nur trades eingeht die du auch manuell bestätigts...

bengaagneb 23.11.12 15:50

Ne, ich habe 4 andere EAs am laufen. nur der macht so ein unsinn. Wenn ich manuell bestätigen anmache, dann tradet er (ich muss es halt nur manuell bestätigen). Er soll das aber alleine machen. und wenn ich die manuell trading option weg mache, die live trading aber anlasse, dann macht er garnichts mehr. außer meine manuell gemachten trades einfach zu schließen ^^

naranjoe 24.11.12 07:20

Hallo,

hast du einen ECN Broker?
Dann must du eine Order erst ohne SL und TP setzen und anschließend per OrderModify hinzufügen.

z.B.
Code:

ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
OrderModify(ticket,OrderOpenPrice(),StopLossLevel,TakeProfitLevel,0,0);

Gruß
naranjoe

bengaagneb 24.11.12 11:53

DANKE!

Ich habe einen ECN Broker, aber ich dachte er ignorierte die SL und TP einfach, dass er dann die Punkte einfach nur nicht einträgt.

Mast83 30.11.12 11:07

Zitat:

Zitat von naranjoe (Beitrag 17859)
Hallo,

hast du einen ECN Broker?
Dann must du eine Order erst ohne SL und TP setzen und anschließend per OrderModify hinzufügen.

z.B.
Code:

ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
OrderModify(ticket,OrderOpenPrice(),StopLossLevel,TakeProfitLevel,0,0);

Gruß
naranjoe

Kann ich diese Modifikation auch dann machen wenn ich keinen ECN Broker habe oder geht das nur in dieser Kombination?

VG und Danke Marc

naranjoe 30.11.12 21:38

Das sollte so mit jedem Broker funktionieren.

Gruß
naranjoe

Mizu13 28.11.13 03:33

Hallo zusammen

Das Thema scheint zwar schon etwas älter zu sein, aber ich denke mein Probem passt hier am besten hinein:

Ich bin gerade dabei mich ein wenig in mql4 ein zu arbeiten und habe mal versucht einen EA zu programmieren, der (der einfachheit halber bei der Initialisierung) einen Kaufbefehl ausführt.
nach langem herumbasteln und durch miteinbeziehen der Info dieses Threads hab ich jetzt folgenden Code:

Code:

extern double    lot=0.1;
extern int    takeprofit=40;
extern int    stoploss=40;
extern int    magic=12331;
int            ticket=0;
//+------------------------------------------------------------------+
//| expert initialization function                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
  Alert("EA erfolgreich geladen!");
  openbuy();
 
//----
  return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                |
//+------------------------------------------------------------------+
int deinit()
  {
//----
 
//----
  return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
 
//----
  return(0);
  }
//+------------------------------------------------------------------+





void openbuy()
{
  ticket=OrderSend(Symbol(), OP_BUY, lot, Ask, 3, NULL, NULL, NULL, magic, Blue);
  OrderModify(ticket, OrderOpenPrice(), Ask-stoploss*Point, Ask+takeprofit*Point,0, Blue);
  OrderPrint();
}

Leider musste ich beim testen feststellen, dass der SL und der TP nicht angepasst werden :/
Kann mir vieleicht jemand sagen, was ich falsch gemacht habe?

Liebe Grüsse Mizu


PS: Das Konto ist überigens ein Demokonto von easy-forex, falls das eine Rolle spielen sollte...

feelfree 28.11.13 09:38

Moin Mizu,

der Aufruf openbuy() gehört in die int start() Sektion.

int init() wird nur ein Mal bei der Initialisierung aufgerufen und dann nicht mehr.
Der OrderModify Befehl wird vermutlich nicht ausgeführt weil er erstens unmittelbar auf OrderSend folgt aber die Bestätigung/Rückmeldung deines Brokers noch nicht erfolgt ist.
Und zweitens du die Ticketnummer gar nicht kennen kannst weil sie von deinem Broker vergeben wird.

Für den zweiten Versuch musst du also erst die gültige Ticketnummer ermitteln bevor du sie an die OrderModify Funktion übergibst und dann klappt's auch mit der Änderung.

Ich würde die Funktionen sauber trennen.
Grob skizziert:
if Order < 1 {OpenBuy()}
if Order > 0 {OrderModifiy()}

Grüße
Dan

JoeDormann 29.11.13 01:45

@feelfree

ticket=OrderSend(...)
gibt natürlich erstmal die Tickernummer zurück.
Alles läuft beim MQL der Reihe nach, also sequenziell ab.
ticket ist dann mit der vergebenen Ticketnummer belegt.

Allerdings sollte man vor einem OrderModify(...)
zuerst OrderSelect(ticket,...) benutzen.
Wenn der OrderSelect positiv ist, dann erst sollte man OrderModify(...) aufrufen.

Gruß Joe


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:45 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