В статье есть код функции проверка достаточности средств на совершение торговой операции:
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))
{
//--- что-то пошло не так, сообщим и вернем falsePrint("Error in ",__FUNCTION__," code=",GetLastError());
return(false);
}
//--- если не хватает средств на проведение операцииif(margin>free_margin)
{
//--- сообщим об ошибке и вернем falsePrint("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
return(false);
}
//--- проверка прошла успешноreturn(true);
}
Желтым выделено то, что сначала объявили переменную price и присвоили ей значение цены Ask, а буквально через строчку, где проверяется тип ордера, соответственно присваивается значение Bid.
Вопрос - а почему нельзя сразу присвоить Bid на стадии объявления переменной price или тут есть какой-то сакральный смысл?
В статье есть код функции проверка достаточности средств на совершение торговой операции:
Желтым выделено то, что сначала объявили переменную price и присвоили ей значение цены Ask, а буквально через строчку, где проверяется тип ордера, соответственно присваивается значение Bid.
Вопрос - а почему нельзя сразу присвоить Bid на стадии объявления переменной price или тут есть какой-то сакральный смысл?
С уважением, Владимир.
Владимир, а зачем такие извращения??? Проще попользовать функцию OrderCheck(). При том, структуру MqlTradeRequest можно держать объявленной на уровне глобальных переменных и после успешной проверки использовать не заполняя повторно перед OrderSend().
Когда получил размер маржи, ты должен произвести арифметические операции… А тут ы структуре всё уже посчитано.
structMqlTradeCheckResult
{
uint retcode; // Код ответа double balance; // Баланс после совершения сделкиdouble equity; // Эквити после совершения сделкиdouble profit; // Плавающая прибыль double margin; // Маржевые требованияdouble margin_free; // Свободная маржа double margin_level; // Уровень маржи string comment; // Комментарий к коду ответа (описание ошибки)
};
Владимир, а зачем такие извращения??? Проще попользовать функцию OrderCheck(). При том, структуру MqlTradeRequest можно держать объявленной на уровне глобальных переменных и после успешной проверки использовать не заполняя повторно перед OrderSend().
Когда получил размер маржи, ты должен произвести арифметические операции… А тут ы структуре всё уже посчитано.
Владимир, а зачем такие извращения??? Проще попользовать функцию OrderCheck(). При том, структуру MqlTradeRequest можно держать объявленной на уровне глобальных переменных и после успешной проверки использовать не заполняя повторно перед OrderSend().
Когда получил размер маржи, ты должен произвести арифметические операции… А тут ы структуре всё уже посчитано.
Привет, Алексей! Твой вариант мне понятен, подсказка Виталия тоже резонна.
И всё же! Тот код взят из статьи, которая написана специалистами компании MetaQuotes и, как бы, не доверять им у меня нет причин. Просто возник вопрос, на который хотелось бы получить ответ. ))
Желтым выделено то, что сначала объявили переменную price и присвоили ей значение цены Ask, а буквально через строчку, где проверяется тип ордера, соответственно присваивается значение Bid.
Вопрос - а почему нельзя сразу присвоить Bid на стадии объявления переменной price или тут есть какой-то сакральный смысл?
если сразу присвоить Bid то через строчку всё равно придётся проверять тип ордера и присваивать Ask :-)
переменной price должно быть присвоено одно из двух значений в зависимости от типа ордера. Начальное задали Ask, если тип не подошел поменяли на Bid.
просто авторы кода не любят тройной оператор : double price=(orderType==ORDER_TYPE_SELL?Bid:Ask) ; // так короче и на мой взгляд понятнее
Как то не понятно, вторая строка это утверждение или что?
Ну а какая разница на скольких парах установлен советник? Каждый код выполняется отдельно. Пусть даже на одном символе, на разных графиках, с разными магиками будут установлены… Никаких проблем…
Привет, Алексей! Твой вариант мне понятен, подсказка Виталия тоже резонна.
И всё же! Тот код взят из статьи, которая написана специалистами компании MetaQuotes и, как бы, не доверять им у меня нет причин. Просто возник вопрос, на который хотелось бы получить ответ. ))
С уважением, Владимир.
Специалисты MQ тоже люди и им также свойственно уставать и совершать некоторые «ошибки» которые не влияют на работоспособность кода.
Специалисты MQ тоже люди и им также свойственно уставать и совершать некоторые «ошибки» которые не влияют на работоспособность кода.
Так по факту ошибки никакой нет, просто код так написан, что сразу не "въехал" в его суть и поэтому попытался разобраться. )) Максим доходчивовсё по полочкам разложил. Короче говоря, ВСЕМ БОЛЬШОЕ СПАСИБО!!!
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Я ничего не понял.
Всем доброго дня и хорошего настроения!
В статье есть код функции проверка достаточности средств на совершение торговой операции:
Желтым выделено то, что сначала объявили переменную price и присвоили ей значение цены Ask, а буквально через строчку, где проверяется тип ордера, соответственно присваивается значение Bid.
Вопрос - а почему нельзя сразу присвоить Bid на стадии объявления переменной price или тут есть какой-то сакральный смысл?
С уважением, Владимир.
Всем доброго дня и хорошего настроения!
В статье есть код функции проверка достаточности средств на совершение торговой операции:
Желтым выделено то, что сначала объявили переменную price и присвоили ей значение цены Ask, а буквально через строчку, где проверяется тип ордера, соответственно присваивается значение Bid.
Вопрос - а почему нельзя сразу присвоить Bid на стадии объявления переменной price или тут есть какой-то сакральный смысл?
С уважением, Владимир.
Владимир, а зачем такие извращения??? Проще попользовать функцию OrderCheck(). При том, структуру MqlTradeRequest можно держать объявленной на уровне глобальных переменных и после успешной проверки использовать не заполняя повторно перед OrderSend().
Когда получил размер маржи, ты должен произвести арифметические операции… А тут ы структуре всё уже посчитано.
Владимир, а зачем такие извращения??? Проще попользовать функцию OrderCheck(). При том, структуру MqlTradeRequest можно держать объявленной на уровне глобальных переменных и после успешной проверки использовать не заполняя повторно перед OrderSend().
Когда получил размер маржи, ты должен произвести арифметические операции… А тут ы структуре всё уже посчитано.
А если установлен ЕА не на одной паре?
OrderCheck() как-то надёжнейВладимир, а зачем такие извращения??? Проще попользовать функцию OrderCheck(). При том, структуру MqlTradeRequest можно держать объявленной на уровне глобальных переменных и после успешной проверки использовать не заполняя повторно перед OrderSend().
Когда получил размер маржи, ты должен произвести арифметические операции… А тут ы структуре всё уже посчитано.
Привет, Алексей! Твой вариант мне понятен, подсказка Виталия тоже резонна.
И всё же! Тот код взят из статьи, которая написана специалистами компании MetaQuotes и, как бы, не доверять им у меня нет причин. Просто возник вопрос, на который хотелось бы получить ответ. ))
С уважением, Владимир.
Желтым выделено то, что сначала объявили переменную price и присвоили ей значение цены Ask, а буквально через строчку, где проверяется тип ордера, соответственно присваивается значение Bid.
Вопрос - а почему нельзя сразу присвоить Bid на стадии объявления переменной price или тут есть какой-то сакральный смысл?
если сразу присвоить Bid то через строчку всё равно придётся проверять тип ордера и присваивать Ask :-)
переменной price должно быть присвоено одно из двух значений в зависимости от типа ордера. Начальное задали Ask, если тип не подошел поменяли на Bid.
просто авторы кода не любят тройной оператор : double price=(orderType==ORDER_TYPE_SELL?Bid:Ask) ; // так короче и на мой взгляд понятнее
если сразу присвоить Bid то через строчку всё равно придётся проверять тип ордера и присваивать Ask :-)
переменной price должно быть присвоено одно из двух значений в зависимости от типа ордера. Начальное задали Ask, если тип не подошел поменяли на Bid.
просто авторы кода не любят тройной оператор : double price=(orderType==ORDER_TYPE_SELL?Bid:Ask) ; // так короче и на мой взгляд понятнее
Спасибо, Максим, за оказанную помощь! Теперь всё понятно и логично. Получилось так:
На две строчки меньше, но зато понятнее. ))
С уважением, Владимир.
А если установлен ЕА не на одной паре?
OrderCheck() как-то надёжнейКак то не понятно, вторая строка это утверждение или что?
Ну а какая разница на скольких парах установлен советник? Каждый код выполняется отдельно. Пусть даже на одном символе, на разных графиках, с разными магиками будут установлены… Никаких проблем…
Привет, Алексей! Твой вариант мне понятен, подсказка Виталия тоже резонна.
И всё же! Тот код взят из статьи, которая написана специалистами компании MetaQuotes и, как бы, не доверять им у меня нет причин. Просто возник вопрос, на который хотелось бы получить ответ. ))
С уважением, Владимир.
Специалисты MQ тоже люди и им также свойственно уставать и совершать некоторые «ошибки» которые не влияют на работоспособность кода.
Специалисты MQ тоже люди и им также свойственно уставать и совершать некоторые «ошибки» которые не влияют на работоспособность кода.
Так по факту ошибки никакой нет, просто код так написан, что сразу не "въехал" в его суть и поэтому попытался разобраться. )) Максим доходчиво всё по полочкам разложил. Короче говоря, ВСЕМ БОЛЬШОЕ СПАСИБО!!!
С уважением, Владимир.