Ошибки, баги, вопросы - страница 3359

 
Dmitrii Troshin #:

Как найти размер маржи под один лот?

Forum on trading, automated trading systems and testing trading strategies

SymbolInfoMarginRate - I can't understand it

fxsaber, 2023.07.18 22:28

double GetMarginRequired2( const string Symb )
{
  const double MinVolume = ::SymbolInfoDouble(Symb, SYMBOL_VOLUME_MIN);
  double Margin;
              
  return(::OrderCalcMargin(ORDER_TYPE_BUY, Symb, MinVolume, ::SymbolInfoDouble(Symb, SYMBOL_ASK), Margin)
          ? (MinVolume ? Margin / MinVolume : 0) : 0);  
}

double GetMarginRequired( const string Symb )
{  
  MqlTick Tick;
  double MarginInitRate, MarginMainRate, MarginInfo;

  return(((::SymbolInfoInteger(Symb, SYMBOL_TRADE_CALC_MODE) == SYMBOL_CALC_MODE_FOREX) &&
          ::SymbolInfoTick(Symb, Tick) &&
          ::SymbolInfoMarginRate(Symb, ORDER_TYPE_BUY, MarginInitRate, MarginMainRate) && MarginInitRate &&
          (bool)(MarginInfo = ::MathMax(::SymbolInfoDouble(Symb, SYMBOL_MARGIN_INITIAL), ::SymbolInfoDouble(Symb, SYMBOL_MARGIN_HEDGED))))
            ? MarginInitRate * Tick.ask * ::SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE) *
              (MarginInfo / ::SymbolInfoDouble(Symb, SYMBOL_TRADE_CONTRACT_SIZE)) /
              (::SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE) * ::AccountInfoInteger(ACCOUNT_LEVERAGE))
            : GetMarginRequired2(Symb));
}
 

uchar переменная может принимать значения от 0 до 255. Почему после 0 не происходит завершение цикла, а переменной с присваивается значение 255? Ведь переход с 0 на 255 это не уменьшение, а увеличение значения переменной.

   uchar c = 2;
   for(c; c >= 0; c--){
   Print("c = ",c);
   if(c == 254) break;}

Результат:


 
Andrei Iakovlev #:

uchar переменная может принимать значения от 0 до 255. Почему после 0 не происходит завершение цикла, а переменной с присваивается значение 255? Ведь переход с 0 на 255 это не уменьшение, а увеличение значения переменной.

Результат:


Это нормальное поведение с целочисленными типами и называется оно переполнение. У uchar 255+1 = 0; 0-1  = 255.
 Ведь не существует в uchar чисел меньше 0 и больше 255.
Каждый программист должен знать об этом и учитывать в своих алгоритмах.
 
Nikolai Semko #:
Это нормальное поведение с целочисленными типами и называется оно переполнение. У uchar 255+1 = 0; 0-1  = 255.
 Ведь не существует в uchar чисел меньше 0 и больше 255.

С учётом этого может быть стоит сделать так, чтобы тот цикл завершался после того, как переменная с стала равна 0?

 
Nikolai Semko #:
Это нормальное поведение с целочисленными типами и называется оно переполнение. У uchar 255+1 = 0; 0-1  = 255.
 Ведь не существует в uchar чисел меньше 0 и больше 255.
Каждый программист должен знать об этом и учитывать в своих алгоритмах.

Спасибо за разъяснение, я этого не знал, видимо потому, что я не каждый программист…

Проверять лениво, но думаю такой вариант 

   uchar c;
   for(c = 2; c >= 0; c--){
   Print("c = ",c);
   if(c == 254) break;}

исправит положение. Я правильно думаю?

 
Andrei Iakovlev #:

С учётом этого может быть стоит сделать так, чтобы тот цикл завершался после того, как переменная с стала равна 0?

конечно. Как душа пожелает

 uchar c = 2;
 for(; c >= 0; c--){
 ...
 if(c == 255 ) break;}

//или 

 uchar c = 2;
 while(c != 255 ){
 ...
 c--;}
или для полного набора
uchar c = 255;
do {
  ...
  c--;
} while (c!=255);
 
Nikolai Semko #:
конечно. Как душа пожелает

Я имел в виду автоматически, без указания доп. проверок.

 
Alexey Viktorov #:

Спасибо за разъяснение, я этого не знал, видимо потому, что я не каждый программист…

Проверять лениво, но думаю такой вариант 

исправит положение. Я правильно думаю?

Привет, Алексей! Блин, тоже заинтересовался данным моментом, поэтому не поленился и попробовал запустить скрипт по твоему варианту. Положение не исправило!

С уважением, Владимир.

 
Alexey Viktorov #:

исправит положение. Я правильно думаю?

Нет, то же самое будет.

 
Andrei Iakovlev #:

Я имел в виду автоматически, без указания доп. проверок.

for (uint i = HistoryDealsTotal(); (bool)i--; )
  Print(HistoryDealGetTicket(i));

Перебор всех сделок.

Причина обращения: