Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1577

 
Vitaly Muzichenko #:

Я ничего не понял.

Посмотри как матрицу рисуют двумя циклами, только задавай значения по отдельному индексу в одном цикле
 

Всем доброго дня и хорошего настроения!

В статье есть код функции проверка достаточности средств на совершение торговой операции:

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

Желтым выделено то, что сначала объявили переменную price и присвоили ей значение цены Ask, а буквально через строчку, где проверяется тип ордера, соответственно присваивается значение Bid.

Вопрос - а почему нельзя сразу присвоить Bid на стадии объявления переменной  price или тут есть какой-то сакральный смысл?

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

 
MrBrooklin #:

Всем доброго дня и хорошего настроения!

В статье есть код функции проверка достаточности средств на совершение торговой операции:

Желтым выделено то, что сначала объявили переменную price и присвоили ей значение цены Ask, а буквально через строчку, где проверяется тип ордера, соответственно присваивается значение Bid.

Вопрос - а почему нельзя сразу присвоить Bid на стадии объявления переменной  price или тут есть какой-то сакральный смысл?

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

Владимир, а зачем такие извращения??? Проще попользовать функцию OrderCheck(). При том, структуру MqlTradeRequest можно держать объявленной на уровне глобальных переменных и после успешной проверки использовать не заполняя повторно перед OrderSend().

Когда получил размер маржи, ты должен произвести арифметические операции… А тут ы структуре всё уже посчитано.

struct MqlTradeCheckResult 
  { 
   uint         retcode;             // Код ответа 
   double       balance;             // Баланс после совершения сделки 
   double       equity;              // Эквити после совершения сделки 
   double       profit;              // Плавающая прибыль 
   double       margin;              // Маржевые требования 
   double       margin_free;         // Свободная маржа 
   double       margin_level;        // Уровень маржи 
   string       comment;             // Комментарий к коду ответа (описание ошибки) 
  };
 
Alexey Viktorov #:

Владимир, а зачем такие извращения??? Проще попользовать функцию OrderCheck(). При том, структуру MqlTradeRequest можно держать объявленной на уровне глобальных переменных и после успешной проверки использовать не заполняя повторно перед OrderSend().

Когда получил размер маржи, ты должен произвести арифметические операции… А тут ы структуре всё уже посчитано.

А если установлен ЕА не на одной паре?

OrderCheck() как-то надёжней
 
Alexey Viktorov #:

Владимир, а зачем такие извращения??? Проще попользовать функцию OrderCheck(). При том, структуру MqlTradeRequest можно держать объявленной на уровне глобальных переменных и после успешной проверки использовать не заполняя повторно перед OrderSend().

Когда получил размер маржи, ты должен произвести арифметические операции… А тут ы структуре всё уже посчитано.

Привет, Алексей! Твой вариант мне понятен, подсказка Виталия тоже резонна.

И всё же! Тот код взят из статьи, которая написана специалистами компании MetaQuotes и, как бы, не доверять им у меня нет причин. Просто возник вопрос, на который хотелось бы получить ответ. )) 

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

 
MrBrooklin #:

Желтым выделено то, что сначала объявили переменную price и присвоили ей значение цены Ask, а буквально через строчку, где проверяется тип ордера, соответственно присваивается значение Bid.

Вопрос - а почему нельзя сразу присвоить Bid на стадии объявления переменной  price или тут есть какой-то сакральный смысл?

если сразу присвоить Bid то через строчку всё равно придётся проверять тип ордера и присваивать Ask :-)

переменной price должно быть присвоено одно из двух значений в зависимости от типа ордера. Начальное задали Ask, если тип не подошел поменяли на Bid. 

просто авторы кода не любят тройной оператор : double price=(orderType==ORDER_TYPE_SELL?Bid:Ask) ; // так короче и на мой взгляд понятнее

 
Maxim Kuznetsov #:

если сразу присвоить Bid то через строчку всё равно придётся проверять тип ордера и присваивать Ask :-)

переменной price должно быть присвоено одно из двух значений в зависимости от типа ордера. Начальное задали Ask, если тип не подошел поменяли на Bid. 

просто авторы кода не любят тройной оператор : double price=(orderType==ORDER_TYPE_SELL?Bid:Ask) ; // так короче и на мой взгляд понятнее

Спасибо, Максим, за оказанную помощь! Теперь всё понятно и логично. Получилось так:

//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb, mqltick);
   double price = (type == ORDER_TYPE_SELL ? mqltick.bid : mqltick.ask);

На две строчки меньше, но зато понятнее. ))

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

 
Vitaly Muzichenko #:

А если установлен ЕА не на одной паре?

OrderCheck() как-то надёжней

Как то не понятно, вторая строка это утверждение или что?

Ну а какая разница на скольких парах установлен советник? Каждый код выполняется отдельно. Пусть даже на одном символе, на разных графиках, с разными магиками будут установлены… Никаких проблем…

 
MrBrooklin #:

Привет, Алексей! Твой вариант мне понятен, подсказка Виталия тоже резонна.

И всё же! Тот код взят из статьи, которая написана специалистами компании MetaQuotes и, как бы, не доверять им у меня нет причин. Просто возник вопрос, на который хотелось бы получить ответ. )) 

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

Специалисты MQ тоже люди и им также свойственно уставать и совершать некоторые «ошибки» которые не влияют на работоспособность кода.

 
Alexey Viktorov #:

Специалисты MQ тоже люди и им также свойственно уставать и совершать некоторые «ошибки» которые не влияют на работоспособность кода.

Так по факту ошибки никакой нет, просто код так написан, что сразу не "въехал" в его суть и поэтому попытался разобраться. )) Максим доходчиво всё по полочкам разложил. Короче говоря, ВСЕМ БОЛЬШОЕ СПАСИБО!!!

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