Probleme bei Umstellung Lot -> SL

 

Die Aufgabe des EA ist simpel:

Alle Positionen durchgehen, und den SL anhand der Equity und eines Risikos in % Setzen insofern kein SL existiert bzw =0 ist.


Dabei muss der EA beachten welches symbol und damit auch welche Profitwährung die Position hat. Ist de Profitwährung eine andere als die des Konto so muss dies Korrekt umgerechnet werden damit der Verlust durch die nicht erfolgte Umrechnung nicht gößer ist als die angegebene % der Equity

aller dings funktioniert das nicht so wie ich es denke.


kann mir jemand en Tipp geben wo es klemmt?


input double PercentfromEquity = 2.0; //Percent from Equity
input ENUM_POSITION_TYPE TestForPositionType = POSITION_TYPE_BUY;
#include <Trade\Trade.mqh>
CTrade trade;
double SL = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnTick()
  {
   if(PositionsTotal() == 0)

     {
      switch(TestForPositionType)
        {
         case  POSITION_TYPE_BUY:
            trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, 0.2, SymbolInfoDouble(Symbol(), SYMBOL_ASK), 0, 0);
            break;

         case  POSITION_TYPE_SELL:
            trade.PositionOpen(Symbol(), ORDER_TYPE_SELL, 0.2, SymbolInfoDouble(Symbol(), SYMBOL_BID), 0, 0);
            break;
        }
     }
     
   for(int i = PositionsTotal() - 1; i >= 0; i--)
     {
      ulong posTicket = PositionGetTicket(i);
      if(PositionSelectByTicket(posTicket))
        {
         Print("diged ", posTicket);
         // Einstandspreis und Positionsvolumen abrufen
         double entry_price = PositionGetDouble(POSITION_PRICE_OPEN);
         double position_volume = PositionGetDouble(POSITION_VOLUME);
         string Symbolpos = PositionGetString(POSITION_SYMBOL);
         double max_loss_money = (PercentfromEquity / 100) * AccountInfoDouble(ACCOUNT_EQUITY);
         ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
         ENUM_SYMBOL_CALC_MODE mode=(ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(Symbolpos,SYMBOL_TRADE_CALC_MODE);
         if(PositionGetDouble(POSITION_SL) == 0)
         {
          SL = GetSL(Symbolpos, entry_price, max_loss_money, position_volume, type,mode);
         trade.PositionModify(posTicket, SL, 0.0);
         }
           
        }
     }
   Print(SL);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetSL(string symbol, double entry_price, double max_loss, double volume_lots, ENUM_POSITION_TYPE Pos_type, ENUM_SYMBOL_CALC_MODE symbol_calc_mode)
  {
   double result_exit_price = 0.0;

//--- Main values ---
   //ENUM_SYMBOL_CALC_MODE symbol_calc_mode = (ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_CALC_MODE);
   double ContractSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
   double TickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
   double TickPrice = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
   string account_currency = AccountInfoString(ACCOUNT_CURRENCY);
   string pair_base_currency = SymbolInfoString(symbol, SYMBOL_CURRENCY_PROFIT);
   int symdigits= (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

   double currency_compensation_factor = 0.0;

   if(account_currency == "USD")
     {
      if(pair_base_currency == "USD")
         currency_compensation_factor = SymbolInfoDouble("EURUSD", SYMBOL_BID);
      if(pair_base_currency == "JPY")
         currency_compensation_factor = SymbolInfoDouble("EURJPY", SYMBOL_BID);
      if(pair_base_currency == "CAD")
         currency_compensation_factor = SymbolInfoDouble("USDCAD", SYMBOL_BID);
      if(pair_base_currency == "AUD")
         currency_compensation_factor = SymbolInfoDouble("EURAUD", SYMBOL_BID);
      if(pair_base_currency == "GBP")
         currency_compensation_factor = SymbolInfoDouble("EURGBP", SYMBOL_BID);
      if(pair_base_currency == "CHF")
         currency_compensation_factor = SymbolInfoDouble("USDCHF", SYMBOL_BID);
      if(pair_base_currency == "NZD")
         currency_compensation_factor = SymbolInfoDouble("EURNZD", SYMBOL_BID);
      if(pair_base_currency == "EUR")
         currency_compensation_factor = SymbolInfoDouble("EURUSD", SYMBOL_ASK);
     }
   else
      if(account_currency == "EUR")
        {
         if(pair_base_currency == "USD")
            currency_compensation_factor = SymbolInfoDouble("EURUSD", SYMBOL_BID);
         if(pair_base_currency == "JPY")
            currency_compensation_factor = SymbolInfoDouble("EURJPY", SYMBOL_BID);
         if(pair_base_currency == "CAD")
            currency_compensation_factor = SymbolInfoDouble("EURCAD", SYMBOL_BID);
         if(pair_base_currency == "AUD")
            currency_compensation_factor = SymbolInfoDouble("EURAUD", SYMBOL_BID);
         if(pair_base_currency == "GBP")
            currency_compensation_factor = SymbolInfoDouble("EURGBP", SYMBOL_BID);
         if(pair_base_currency == "CHF")
            currency_compensation_factor = SymbolInfoDouble("EURCHF", SYMBOL_BID);
         if(pair_base_currency == "NZD")
            currency_compensation_factor = SymbolInfoDouble("AUDNZD", SYMBOL_BID);
         if(pair_base_currency == "EUR")
            currency_compensation_factor = SymbolInfoDouble("EURUSD", SYMBOL_ASK);
        }

   if(pair_base_currency != account_currency)
      max_loss = max_loss * currency_compensation_factor;

   if(pair_base_currency == account_currency)
      max_loss = max_loss / currency_compensation_factor;

   if(Pos_type == POSITION_TYPE_BUY)

     {
      if(symbol_calc_mode == SYMBOL_CALC_MODE_FOREX
         || symbol_calc_mode == SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE
         || symbol_calc_mode == SYMBOL_CALC_MODE_CFD
         || symbol_calc_mode == SYMBOL_CALC_MODE_CFDINDEX
         || symbol_calc_mode == SYMBOL_CALC_MODE_CFDLEVERAGE
         || symbol_calc_mode == SYMBOL_CALC_MODE_EXCH_STOCKS)
         result_exit_price = NormalizeDouble(entry_price - ((max_loss) / (volume_lots * ContractSize)), symdigits);
      else
         if(symbol_calc_mode == SYMBOL_CALC_MODE_FUTURES
            || symbol_calc_mode == SYMBOL_CALC_MODE_EXCH_FUTURES)
            result_exit_price = NormalizeDouble((entry_price - ((max_loss * TickSize) / (volume_lots * TickPrice))), symdigits);
     }
   else
      if(Pos_type == POSITION_TYPE_SELL)

        {
         if(symbol_calc_mode == SYMBOL_CALC_MODE_FOREX
            || symbol_calc_mode == SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE
            || symbol_calc_mode == SYMBOL_CALC_MODE_CFD
            || symbol_calc_mode == SYMBOL_CALC_MODE_CFDINDEX
            || symbol_calc_mode == SYMBOL_CALC_MODE_CFDLEVERAGE
            || symbol_calc_mode == SYMBOL_CALC_MODE_EXCH_STOCKS)
            result_exit_price = NormalizeDouble(entry_price + ((max_loss) / (volume_lots * ContractSize)), symdigits);
         else
            if(symbol_calc_mode == SYMBOL_CALC_MODE_FUTURES
               || symbol_calc_mode == SYMBOL_CALC_MODE_EXCH_FUTURES)
               result_exit_price = NormalizeDouble(entry_price + ((max_loss * TickSize) / (volume_lots * TickPrice)), symdigits);
        }

//Print(__FUNCTION__"Wurde abgefragt, Wert ist: ",result_exit_price);
   return NormalizeDouble(result_exit_price, symdigits);
  }
 

Naja, Fehler finden sollte man schon selbst, im Prinzip! Wir kennen die Daten nicht und was genau das Ziel ist. Und was genau der Fehler ist. " aller dings funktioniert das nicht so wie ich es denke " ist doch sehr wage und kann alles mögliche heißen.

Üblicherweise wird SL und vor allem Volumen vor der Eröffnung gesetzt.
Außerdem werden TP und SL meist vorgegeben durch den Chart und die verwendeten Indikatoren, sodass al 3 Größe das Volumen bleibt, um (vor der Eröffnung) es entsprechend zu wählen.

Wenn ein EA nicht tut was er soll setzt man den Debugger ein, um genau zu kontrollieren, wann welche Variablen durch welche anderen Variablen welche Werte annehmen, die dann zu dem führen, was man nicht will!
Man kann allerdings auch Comment() und Print verwenden. Mehr zu dieser Technik:

    https://www.metatrader5.com/de/metaeditor/help/development/debug
    Zur Fehlerbehebung von MQL5-Programmen (Debugging) : https://www.mql5.com/de/articles/654
    Einführung in MQL5: Schreiben eines einfachen Expert Advisor und benutzerdefinierten Indikators, Siehe Ende: Starten und Debuggen     https://www.mql5.com/de/articles/35
    Die Fehlerverarbeitung und Protokollierung in MQL5:     https://www.mql5.com/de/articles/2041
    https://www.mql5.com/de/articles/272
    Fehler finden und Protokollierung     https://www.mql5.com/de/articles/150

Code-Debugging - Programme entwickeln - MetaEditor Hilfe
  • www.metatrader5.com
MetaEditor hat einen eingebauten Debugger, mit dem Sie die Programmausführung Schritt für Schritt (durch einzelne Funktionen) ü...
 
Warum verwendest du nicht tickvalue? Das wäre ja soweit umgerechnet in kontowährung
 

Eigentlich wird der SL vom Balance berechnet. Weil  Equity und Balance bevor ein Order gesetzt wird immer gleichbleibend. Und wenn ein anderes Symbol (Beispielweise) geöffnet ist und in großen Gewinn ist wird der SL einfach zu Groß sein. 

Equity SL ist was neues.  Equity Tralling-Stoploss wird beim Proptrading verwendet, aber das ist ganz andere Geschichte.

Grund der Beschwerde: