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)
-   -   TrailingStopEA für alle Charts funktioniert nicht (http://www.expert-advisor.com/forum/showthread.php?t=6853)

Elfenstein 02.12.20 13:48

TrailingStopEA für alle Charts funktioniert nicht
 
Hallo,

der folgende Code ist der vollständige EA um den es geht. Wenn ich beispielsweise den EA auf EURUSD installiere, dann setzt er nur TrailingStops bei EURUSD mit der MagicNumber von 1000, doch warum ignoriert der EA offene Order bei beispielsweise GBPUSD mit MagicNumber 1000? Die MagicNumber ist natürlich immer gleich. Ich lasse die Order mit einer MagicNumber von 1000 jeweils mit ein Buy und Sell - Script eröffnen.

Mit freundlichen Grüßen
Elfenstein

PHP-Code:

#property copyright ""
#property link      ""
extern int TrailingStop 20;
extern int Profit 80;
extern int TrailingStep 2;
int MN 1000;
int ir;
double stopcal;

int init() {
   return(
0);
}

int deinit() {
   return(
0);
}

int start() {
   for(
0OrdersTotal(); i++) {
      
OrderSelect(iSELECT_BY_POSMODE_TRADES);
      if (
OrderMagicNumber() == MN) {
         if (
OrderType() == OP_BUY) {
            if (
Ask OrderOpenPrice() > Profit Point) {
               if (
OrderStopLoss() < Ask - (TrailingStop TrailingStep) * Point) {
                  
stopcal Ask - (TrailingStop Point);
                  if (
stopcal OrderStopLoss()) OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,0);
                  }
               }
         }
         if (
OrderType() == OP_SELL) {
            if (
OrderOpenPrice() - Bid Profit Point) {
               if (
OrderStopLoss() > Bid + (TrailingStop TrailingStep) * Point) {
                  
stopcal Bid + (TrailingStop Point);
                  if (
stopcal OrderStopLoss()) OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,0);
                  }
               }
         }
      }
   }
   return(
0);



MA-EA 02.12.20 17:52

Wenn der für alle Orders funktionieren soll, dann versuchs mal ohne MagicNumber-Abfrage. Nur nach OrderType() gehn.

For-Loops sind echt nicht mein Gebiet, aber kanns sein, dass Deine immer nur eine Order sucht, und die Restlichen nicht?
Code:

for(i=OrdersTotal()-1;i>=0;i--){

  if(OrderSelect(i,SELECT_BY_POS)){


    if(OrderType()==OP_SELL{

      Sell-TS einrichten...}


    if(OrderType()==OP_BUY){

      Buy-TS einrichten...}

Beschwert Euch von mir aus, dass ich wieder nen Thread kapere, aber:

Wenn ein EA nur SL, TP, BreakEven, TrailingStop nachträglich einfügen/anpassen soll, er eigentlich nur Orders, die schon im Markt sind, modifizieren soll, muss er dann eigentlich Init/Deinit haben? Statt OnStart() könnte man vielleicht OnEvent() oder sowas benutzen? Man müsste man ihn nicht mal in den Chart ziehn, sondern nur im EA-Verzeichnis haben. Aktivieren oder Stoppen müsste man ihn auch nicht, oder? :confused:

:rolleyes:

traderdoc 02.12.20 18:13

Überlese mal das von @MA-EA ganz schnell!

Da muss nach OrderSelect() noch die Abfrage nach dem OrderSymbol(), um z.B. EURUSD von GBPUSD zu unterscheiden, weil für beide dieselbe MN gilt. Das ist per se schon mal ungünstig. Wenn möglich immer pro Chart eine eigene MN vergeben.

traderdoc

Elfenstein 09.12.20 09:09

Danke für die Hilfe @MA-EA.
Das "for(i=OrdersTotal()-1;i>=0;i--)" und das "for(i = 0; i < OrdersTotal(); i++)" macht genau das gleiche und bei beispielsweise 3 offenen Ordern, wird die For-Schleife auch 3 mal eine Schleife machen.
Und egal wie du den EA programmierst, dieser muss für die Ausführung immer erst auf ein Chart installiert sein. Init/Deinit muss für die korrekte Ausführung im Code generell nicht vorhanden sein.

@traderdoc, dein Beitrag konnte mir diesmal nicht helfen, doch natürlich danke trotzdem.

Hier ist nun der fertige EA, der genau das macht, so wie ich es möchte:

Code:

int Trailing = 20;
int Profit = 80;
int Step = 2;
int MN = 1000;
int i, r;
double pBid, pAsk, pp;
double cal;

int init() {
  return(0);
}

int deinit() {
  return(0);
}

int start() {
  for(i = 0; i < OrdersTotal(); i++) {
      r = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      pp = MarketInfo(OrderSymbol(), MODE_POINT);
      if (OrderMagicNumber() == MN) {
        if (OrderType() == OP_BUY) {
            pBid = MarketInfo(OrderSymbol(), MODE_BID);
            if (pBid - OrderOpenPrice() > Profit * pp) {
              if (OrderStopLoss() < pBid - (Trailing + Step) * pp) {
                  cal = pBid - (Trailing * pp);
                  if (cal > OrderStopLoss()) r = OrderModify(OrderTicket(),OrderOpenPrice(),cal,OrderTakeProfit(),0,0);
              }
            }
        }
        if (OrderType() == OP_SELL) {
            pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
            if (OrderOpenPrice() - pAsk > Profit * pp) {
              if (OrderStopLoss() > pAsk + (Trailing + Step) * pp) {
                  cal = pAsk + (Trailing * pp);
                  if (cal < OrderStopLoss()) r = OrderModify(OrderTicket(),OrderOpenPrice(),cal,OrderTakeProfit(),0,0);
              }
            }
        }
      }
  }
  return(0);
}


traderdoc 09.12.20 10:35

Und dennoch sollte saubererweise nach
if (OrderSymbol() == Symbol())
selektiert werden.

traderdoc

Elfenstein 11.12.20 09:07

Damit der EA alle Order modifiziert und nicht nur des Symbols, wo der EA installiert ist, muss ich ja "if (OrderSymbol() == Symbol())" weglassen. Das war ja mein Ziel, dass alle Order mit der MagicNumber von 1000 der Stoploss modifiziert wird, weshalb ich ja auch diese Frage stellte: "Wenn ich beispielsweise den EA auf EURUSD installiere, dann setzt er nur TrailingStops bei EURUSD mit der MagicNumber von 1000, doch warum ignoriert der EA offene Order bei beispielsweise GBPUSD mit MagicNumber 1000?"

Indikator-Trading 11.12.20 10:52

Na dann helfe ich dir mal...

Ich gehe davon aus, das du hier einfach nur ein Problem mit der nicht vorhanden Klammersetzung hast:
Code:

           
if(pBid - OrderOpenPrice() > Profit * pp)
{
 if(OrderStopLoss() < pBid - (Trailing + Step) * pp)

versuche es mal so:

Code:

         
if((pBid - OrderOpenPrice()) > (Profit * pp))
{
 if(OrderStopLoss() < (pBid - (Trailing + Step) * pp))


Elfenstein 12.12.20 08:05

Danke für deine Hilfe Indikator-Trading, doch es gibt kein Problem, denn ich schrieb doch schon: "Hier ist nun der fertige EA, der genau das macht, so wie ich es möchte" Und zwar alle Order aller Symbole mit Beachtung der MagicNumber den Trailingstop modifizieren zu lassen. Ich hatte nur noch dem traderdoc geantwortet. Thema kann geschlossen werden.


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