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)
-   -   Berücksichtigung der/des Kommission/Swap (http://www.expert-advisor.com/forum/showthread.php?t=5806)

romario 06.08.17 17:55

Berücksichtigung der/des Kommission/Swap
 
Hallo zusammen, ich habe einen eigenen EA und versuche beim Schliessen der Positionen Kommission und Swap zu berücksichigen.
Nun habe ich 2 verschiedene Möglichkeiten mit ebenso verschiedenen Resultaten. Die Ergebnisse unterscheiden sich interessanterweise nicht gross im Endresultat, jedoch habe ich bei der Anzahl gewonnener Positionen (Sell&Buy) einmal ~83% und mit der anderen "Version" ~93%... Vllt. kann mir jemand dabei helfen zu bestimmen welche der 2 Möglichkeiten denn nun die Richtige ist, bzw. ob es da sonst noch Fehler drin hat:

Code:

  for (pos = OrdersTotal()-1; pos >= 0; pos--) {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {

        cOrderProfit=OrderProfit()+OrderSwap()+OrderCommission();

//----

if (UseCloseIndicator == 1) {

        if(OrderType()==OP_BUY) {

          if(cOrderProfit > 0 && PriceBid >= channel_main) {
          RefreshRates();
          if(OrderClose(OrderTicket(), OrderLots(), PriceBid, 3, Blue)==true)
          pos--;
        }
    }


und:

Code:

  for (pos = OrdersTotal()-1; pos >= 0; pos--) {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {

//----

if (UseCloseIndicator == 1) {

        if(OrderType()==OP_BUY) {

          if(Profit() > 0 && PriceBid >= channel_main) {
          RefreshRates();
          if(OrderClose(OrderTicket(), OrderLots(), PriceBid, 3, Blue)==true)
          pos--;
        }
    }

//----

bool Profit()
{
  double TotalProfit = 0;
  for(int iPos = OrdersTotal()-1; iPos >= 0; iPos--)
  if(OrderSelect(iPos, SELECT_BY_POS)
  && OrderMagicNumber() == Magic
  && OrderSymbol()      == Symbol())
  TotalProfit += OrderProfit()+OrderSwap()+OrderCommission();
  return (TotalProfit);
}


traderdoc 06.08.17 22:27

Also, erstens darf in das pos-- nach der OrderType()-Abfrage nicht erscheinen.
Und zweitens unterscheiden sich die beiden Varianten gravierend voneinander.
Im ersten Fall wird nur der cOrderProfit einer! Order berechnet und im zweiten Fall wird, falls OrderType() == OP_BUY ist, danach über alle offenen Orders die TotalProfits addiert. Wobei da wohl einige Klammern fehlen!

Deshalb musst Du Dir erst einmal einig werden, ob nun nur eine Order oder alle Orders berücksichtigt werden sollen.

traderdoc

romario 07.08.17 14:50

Danke für Deine Antwort traderdoc. Da ich die Berechnung für jede einzelne Position bevorzuge und bez. pos-- hab ich das mal wie folgt geändert:

Code:

  for (pos = OrdersTotal()-1; pos >= 0; pos--) {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {

        bOrderProfit=OrderProfit()+OrderSwap()+OrderCommission();

//----

if (UseCloseIndicator == 1) {

        if(OrderType()==OP_BUY) {

          if(bOrderProfit > 0 && PriceBid >= channel_main) {
          RefreshRates();
          bOrderClose = OrderClose(OrderTicket(), OrderLots(), PriceBid, 3, Blue);
        }
    }

        if(OrderType()==OP_SELL) {

          if(bOrderProfit > 0 && PriceAsk <= channel_main) {
          RefreshRates();
          bOrderClose = OrderClose(OrderTicket(), OrderLots(), PriceAsk, 3, Red);
        }
    }
}

Eigentlich sollte alles seine Richtigkeit haben da ich die mq4-Datei mit #property strict kompiliere und weder einen Fehler noch eine Warnung habe...?

traderdoc 07.08.17 20:59

Ich habe das mal der besseren Lesbarkeit etwas geschmeidiger geschrieben:

Code:

for (pos = OrdersTotal()-1; pos >= 0; pos--) {
  if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {

        dOrderProfit = OrderProfit() + OrderSwap() + OrderCommission();

        if (UseCloseIndicator == 1) {
            if (OrderType() == OP_BUY) {
              if (dOrderProfit > 0 && PriceBid >= channel_main) {
                  bOrderClose = OrderClose(OrderTicket(), OrderLots(), PriceBid, 3, Blue);
              }
            }

            if (OrderType() == OP_SELL) {
              if (dOrderProfit > 0 && PriceAsk <= channel_main) {
                  bOrderClose = OrderClose(OrderTicket(), OrderLots(), PriceAsk, 3, Red);
              }
            }
        }
      }
  }
}

Das RefreshRate() fällt weg, weil es an dieser Stelle nicht zu refreshen gab, denn die Übergabe des Bid- und Ask-Werte an PriceBid und PriceAsk muss irgendwo anders stattfinden.
Und aus bOrderProfit habe ich konsequenterweise dOrderProfit gemacht, weil der zurückgegebene Wert ein double-Wert ist.

Also, immer darauf achten, dass die Klammerstruktur konsequent eingehalten wird, dann ist der Code für alle auch besser lesbar.

traderdoc

romario 08.08.17 21:41

ok. vielen Dank für Deine Hilfe traderdoc und für die "geschmeidigere" Darstellung des Ganzen - sieht wirklich besser aus:D. Und sorry für die fehlenden Klammern, die wären eigentlich etwas weiter unten im EA.


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