Thema: Lot abrunden
Einzelnen Beitrag anzeigen
  #2 (permalink)  
Alt 29.06.22
Benutzerbild von Indikator-Trading
Indikator-Trading Indikator-Trading ist offline
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

Hier ist die Funktion, welche ich dafür programmiert habe.

Code:
//+------------------------------------------------------------------+
//| Helperfunction to get a valid Lotsize                                  |
//+------------------------------------------------------------------+
double RoundLotsizeDown(CSymbolInfo &Local_symbol, double TempLotsize)
{
  int LotRoundSize = 0;
  double MinStep = 0;
  int Multiplier = 1;

  if(Local_symbol.LotsMin() < Local_symbol.LotsStep())
  {
    MinStep = Local_symbol.LotsMin();
    if(MinStep >= 1)
    {
      LotRoundSize = 0;

      if(MinStep > 1)
      {
        if(MathMod(MinStep, 10) == 0)
          Multiplier = 10;
        if(MathMod(MinStep, 100) == 0)
          Multiplier = 100;
        if(MathMod(MinStep, 1000) == 0)
          Multiplier = 1000;
      }
      else
        Multiplier = 1;
    }
    else
      LotRoundSize = (int)log10(1 / Local_symbol.LotsMin());
  }
  else
  {
    MinStep = Local_symbol.LotsStep();
    if(MinStep >= 1)
    {
      LotRoundSize = 0;

      if(MinStep > 1)
      {
        if(MathMod(MinStep, 10) == 0)
          Multiplier = 10;
        if(MathMod(MinStep, 100) == 0)
          Multiplier = 100;
        if(MathMod(MinStep, 1000) == 0)
          Multiplier = 1000;
      }
      else
        Multiplier = 1;
    }
    else
      LotRoundSize = (int)log10(1 / Local_symbol.LotsMin());
  }
// Print("LotRoundSize: ", LotRoundSize, " Multiplier: ", Multiplier);


  double Loto_ = 0;
  double LotNormalized = 0;
  int TempInterger = 0;
  if(LotRoundSize == 0)
  {
    Loto_ = TempLotsize;
    TempInterger = (int)(Loto_ / Multiplier);
    LotNormalized = NormalizeDouble(TempInterger * Multiplier, 0);
  }
  else
  {
    Loto_ = Local_symbol.LotsMin() * TempLotsize * MathPow(10, LotRoundSize);
    LotNormalized = NormalizeDouble(Loto_, (int)log10(1 / Local_symbol.LotsMin()));
  }

//Print("Loto_: ",  Loto_);
// Print("LotNormalized: ",  LotNormalized);

  if(LotNormalized > Loto_)
    LotNormalized = LotNormalized - MinStep; // Only decrease, not increase the risk!

  if(LotNormalized > Local_symbol.LotsMax())
    LotNormalized = Local_symbol.LotsMax();

  if(LotNormalized < Local_symbol.LotsMin())
  {
    //LotNormalized= Local_symbol.LotsMin();
    /* Print("#################################################################################");
     Print("Calculated Lot smaller than MINLOT");
     Print("#################################################################################");
     Print("Lotsize Set to 0 to avoid to open the Trade!");*/
    LotNormalized = 0;
  }
  return(LotNormalized);
}