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)
-   -   Buy Limit Sell Limit (http://www.expert-advisor.com/forum/showthread.php?t=7102)

blackjack01 28.10.21 05:54

Buy Limit Sell Limit
 
Hallo

Ich habe einen EA geschriebn der den Stop mit einen EMA , SMA usw nacchzieht . jetzt möchte ich ihn erweitern das ich ein BUYLIMIT SELLLIMIT setzten kann und es ebenso nachgezogen wird bis es ausgelöst wird . Könnte mir bitte jemand helfen .

Danke

Hier der EA bis jetzt .

////+------------------------------------------------------------------+
//| 19.10.2021
//| V1.0 |
//+------------------------------------------------------------------+




#property strict


input ENUM_TIMEFRAMES Timeframe = PERIOD_CURRENT;
input int PeriodMA = 50;
input ENUM_MA_METHOD Methode;

input int Magic = 7777;

int OnInit() {

return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason){

}

void OnTick() {

double ma = iMA (_Symbol,Timeframe,PeriodMA,0,Methode,PRICE_CLOSE, 0 );




for(int i = OrdersTotal()-1; i >= 0; i--){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol() ==_Symbol) {
if (OrderType()== OP_BUY){


double sl = ma;
sl = NormalizeDouble(sl,_Digits);
if(sl > OrderStopLoss()){
if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,O rderTakeProfit(),OrderExpiration())){
Print(__FUNCTION__," > Order #",OrderTicket()," wurde angepasst ...");
}
}
}else if(OrderType() == OP_SELL){
double sl = ma;
sl = NormalizeDouble(sl,_Digits);
if(sl < OrderStopLoss() || OrderStopLoss () == 0){
if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,O rderTakeProfit(),OrderExpiration())){
Print(__FUNCTION__," > Order #",OrderTicket()," wurde angepasst ...");
}
}
}
}
}
}
}

traderdoc 28.10.21 09:36

Auch eine etwas komprimierte Version des alten Codes.
In Zukunft bitte den Code mittels Benutzung des Icons #
schreiben und auch Leerzeichen und Leerzeilen benutzen. Das erleichtert sehr die Lesbarkeit.

Code:

void OnTick() {
  double ma = NormalizeDouble(iMA (_Symbol, Timeframe, PeriodMA, 0, Methode, PRICE_CLOSE, 0), _Digits);

  for (int i = OrdersTotal()-1; i >= 0; i--){
      if (OrderSelect(i, SELECT_BY_POS)){
        if (OrderSymbol() == _Symbol) {

            if (OrderType() == OP_BUY) {
              if (ma > OrderStopLoss()) {
                  if (OrderModify(OrderTicket(), OrderOpenPrice(), ma, OrderTakeProfit(), OrderExpiration())) {
                    Print(__FUNCTION__, " > Order #", OrderTicket(), " wurde angepasst ...");
                  }
              }
            }
           
            if (OrderType() == OP_SELL) {
              if (ma < OrderStopLoss() || OrderStopLoss () == 0) {
                  if (OrderModify(OrderTicket(), OrderOpenPrice(), ma, OrderTakeProfit(), OrderExpiration())) {
                    Print(__FUNCTION__, " > Order #", OrderTicket(), " wurde angepasst ...");
                  }
              }
            }

            if (OrderType() == OP_BUYLIMIT) {
              if (ma > OrderOpenPrice()) {
                  if (OrderModify(OrderTicket(), ma, OrderStopLoss(), OrderTakeProfit(), OrderExpiration())) {
                    Print(__FUNCTION__, " > Order #", OrderTicket(), " wurde angepasst ...");
                  }
              }
            }

            if (OrderType() == OP_SELLLIMIT) {
              if (ma < OrderOpenPrice()) {
                  if (OrderModify(OrderTicket(), ma, OrderStopLoss(), OrderTakeProfit(), OrderExpiration())) {
                    Print(__FUNCTION__, " > Order #", OrderTicket(), " wurde angepasst ...");
                  }
              }
            } 
        }
      }
  }
}

traderdoc

blackjack01 03.11.21 04:52

hallo
 
Danke für die super Hilfe .

Jetzt hätte ich noch ein Problem .

Was muss ich eingeben das der EA nur auf den Aktuellen Chart Arbeitet .

Danke

traderdoc 03.11.21 10:21

Nichts! Mit der Verwendung von _Symbol oder auch Symbol() wir immer auf die Basis des Charts zugegriffen, auf dem sich der EA befindet.

Traderdoc

blackjack01 03.11.21 10:29

Hallo
 
Ok danke . Er hat mir zum dax wenn ich einen offen trade im h4 habe ohne EA . Und ich starte den ea im dax zb D1 zieht er mir da den stop nach obwohl es ein neues Fenster ist . Lg

traderdoc 03.11.21 17:06

Aha, das ist ein anderer, spezieller Fall.

Wenn da steht:

Code:

for (int i = OrdersTotal()-1; i >= 0; i--){
  if (OrderSelect(i, SELECT_BY_POS)){
      if (OrderSymbol() == _Symbol) {

dann werden all die Orders berücksichtigt, die bereits als MarketOrder offen im Markt liegen und die gesetzten Pendingorders des Handelsinstrumentes, welches hinter der Variablen _Symbol liegt. In Deinem Fall werden also alle o.g. Orders des Handelsinstrumentes DAX selektiert, egal auf welchem Chart und welchem TimeFrame sie sich befinden. Insofern werden nun auch Orders des H4 berücksichtigt, obwohl der EA auf dem TimeFrame D1 liegt. Das kann ggf. auch zu Beeinflussungen bzgl. SL, TP, Close etc. führen.

Der Ausweg besteht darin, jedem Chart eine sog. MagicNumber als Variable zu vergeben, die bei der Orderöffnung in der Funktion OrderSend dann unbedingt mit anzugeben ist.
Und dann würde der Code erweitert zu:

Code:

for (int i = OrdersTotal()-1; i >= 0; i--){
  if (OrderSelect(i, SELECT_BY_POS)){
      if (OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNumber) {

Nun werden nur die Orders berücksichtigt, die dem Symbol _Symbol und der in der Order stehenden MagicNumber entsprechen.

traderdoc

blackjack01 03.11.21 19:46

EA
 
Danke für die Top Hilfe

Ist das so Richtig ???

Danke

Code:

////+------------------------------------------------------------------+
//|  03.11.2021
//|  V4.0                                                            |
//+------------------------------------------------------------------+




#property strict


input ENUM_TIMEFRAMES  Timeframe = PERIOD_CURRENT;
input ENUM_TIMEFRAMES  TimeframeLimit = PERIOD_CURRENT;

input int PeriodMA = 50;
input int PeriodLimit = 10;

input ENUM_MA_METHOD Methode;
input ENUM_MA_METHOD MethodeLimit;

input ENUM_MA_METHOD MagicNumber;

input int Magic = 12345;

int OnInit() {

  return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason){

}

void OnTick() {

 
  double ma = NormalizeDouble(iMA (_Symbol, Timeframe, PeriodMA, 0, Methode, PRICE_CLOSE, 0), _Digits);

  for (int i = OrdersTotal()-1; i >= 0; i--){
      if (OrderSelect(i, SELECT_BY_POS)){
        if (OrderSymbol()  == _Symbol && OrderMagicNumber() == MagicNumber) {

            if (OrderType() == OP_BUY) {
              if (ma > OrderStopLoss()) {
                  if (OrderModify(OrderTicket(), OrderOpenPrice(), ma, OrderTakeProfit(), OrderExpiration())) {
                    Print(__FUNCTION__, " > Order #", OrderTicket(), " wurde angepasst ...");
                  }
              }
            }
           
            if (OrderType() == OP_SELL) {
              if (ma < OrderStopLoss() || OrderStopLoss () == 0) {
                  if (OrderModify(OrderTicket(), OrderOpenPrice(), ma, OrderTakeProfit(), OrderExpiration())) {
                    Print(__FUNCTION__, " > Order #", OrderTicket(), " wurde angepasst ...");
                  }
              }
            }

  double maLimit = NormalizeDouble(iMA (_Symbol,TimeframeLimit, PeriodLimit, 0, MethodeLimit, PRICE_CLOSE, 0), _Digits);


            if (OrderType() == OP_BUYLIMIT) {
              if (maLimit > OrderOpenPrice()) {
                  if (OrderModify(OrderTicket(), maLimit, OrderStopLoss(), OrderTakeProfit(), OrderExpiration())) {
                    Print(__FUNCTION__, " > Order #", OrderTicket(), " wurde angepasst ...");
                  }
              }
            }

            if (OrderType() == OP_SELLLIMIT) {
              if (maLimit < OrderOpenPrice()) {
                  if (OrderModify(OrderTicket(), maLimit, OrderStopLoss(), OrderTakeProfit(), OrderExpiration())) {
                    Print(__FUNCTION__, " > Order #", OrderTicket(), " wurde angepasst ...");
                  }
              }
            } 
        }
      }
  }
}


traderdoc 03.11.21 19:54

Code:

input ENUM_MA_METHOD MagicNumber;

input int Magic = 12345;

input ENUM_MA_METHOD MagicNumber;
fliegt raus!

input int Magic = 12345;
muss lauten
input int MagicNumber = 12345;

Und ganz wichtig: in der Funktion OrderSend() muss dann bei der Orderaufgabe auch die MagicNumber mit eingegeben werden.

traderdoc

blackjack01 03.11.21 20:27

Zitat:

Zitat von traderdoc (Beitrag 45775)
Code:

input ENUM_MA_METHOD MagicNumber;

input int Magic = 12345;

input ENUM_MA_METHOD MagicNumber;
fliegt raus!

input int Magic = 12345;
muss lauten
input int MagicNumber = 12345;

Und ganz wichtig: in der Funktion OrderSend() muss dann bei der Orderaufgabe auch die MagicNumber mit eingegeben werden.

traderdoc


Hallo

Und ganz wichtig: in der Funktion OrderSend() muss dann bei der Orderaufgabe auch die MagicNumber mit eingegeben werden.


Das verstehe ich nicht . Könntest mir das genau zeigen .

Danke !!!!!

traderdoc 03.11.21 21:57

Naja, ich schrieb doch, dass die Orders jedes Charts eine eigene MagicNumber bekommen müssen, um eine Unterscheidung der Orders unterschiedlicher TimeFrames bzw. Charts vornehmen zu können.
Und damit der EA entsprechend korrekt selektieren kann, müssen die Orders die jeweilige MagicNumber bekommen. Und die müssen sie über die Funktion OrderSend() bekommen.
Ein Blick in diese Funktion per Hilfe-F1 zeigt folgende Funktionsstruktur:

Code:

int  OrderSend(
  string  symbol,              // symbol
  int      cmd,                // operation
  double  volume,              // volume
  double  price,              // price
  int      slippage,            // slippage
  double  stoploss,            // stop loss
  double  takeprofit,          // take profit
  string  comment=NULL,        // comment
  int      magic=0,            // magic number
  datetime expiration=0,        // pending order expiration
  color    arrow_color=clrNONE  // color
  );

traderdoc


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