Здравствуйте, начал использовать в советнике отложенные ордера и он перестал проходить валидатор.
Ситуация может возникнуть если вы проверяете маржу для каждого ордера отдельно и выставляете их. Так их можно выставить хоть 100 штук и маржи будет всё равно достаточно для выставления очередного ордера.
А вот когда эти ордера начнут срабатывать и превращаться в позиции, вот тогда появится дефицит маржи и вы получите сообщение- где бабки бл*! (not enough money)
Либо суммируйте маржу всех выставленных ордеров, либо при снижении маржи удаляйте ещё не сработавшие.
Ситуация может возникнуть если вы проверяете маржу для каждого ордера отдельно и выставляете их. Так их можно выставить хоть 100 штук и маржи будет всё равно достаточно для выставления очередного ордера.
А вот когда эти ордера начнут срабатывать и превращаться в позиции, вот тогда появится дефицит маржи и вы получите сообщение- где бабки бл*! (not enough money)
Либо суммируйте маржу всех выставленных ордеров, либо при снижении маржи удаляйте ещё не сработавшие.
Спасибо, думаю Вы правы, попробую как советуете.
Получилось!
Дело в том, что в документации:
bool OrderCalcMargin( |
Параметры
action
[in] Тип ордера, может принимать значения из перечисления ENUM_ORDER_TYPE.
Однако, если использовать тип отложенного ордера, например: ORDER_TYPE_SELL_STOP результат будет = 0.
То есть для отложенных ордеров надо использовать тип ORDER_TYPE_SELL и суммировать маржу всех отложенных для проверки с Free_margin на старте.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте, начал использовать в советнике отложенные ордера и он перестал проходить валидатор.
Причем ругает именно отложенные ордера.
Испробовал два варианта:
1. Адаптировал функцию проверки из документации к отложенным ордерам
bool CheckMoneyForTrade_Pend(string symb,double lots,double offset,ENUM_ORDER_TYPE type)
{
//--- получим цену открытия
MqlTick mqltick;
SymbolInfoTick(symb,mqltick);
double price=mqltick.ask+offset*_Point;
if(type==ORDER_TYPE_SELL_STOP)
price=mqltick.bid-offset*_Point;
//--- значения необходимой и свободной маржи
double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
double margin_pend=AccountInfoDouble(ACCOUNT_MARGIN_INITIAL);
double margin_position=AccountInfoDouble(ACCOUNT_MARGIN_MAINTENANCE);
//--- вызовем функцию проверки
if(!OrderCalcMargin(type,symb,lots,price,margin))
{
//--- что-то пошло не так, сообщим и вернем false
Print("Error in ",__FUNCTION__," code=",GetLastError());
return(false);
}
//--- если не хватает средств на проведение операции
if(margin+margin_pend+margin_position>free_margin)
{
//--- сообщим об ошибке и вернем false
Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
return(false);
}
//--- проверка прошла успешно
return(true);
}
2. Взял текст на форуме у гуру и превратил в функцию:
bool CheckMoneyForTrade(string symb,double lots,double offset,ENUM_ORDER_TYPE type)
{
//--- check volume before OrderSend to avoid "not enough money" error (CTrade)
double price=SymbolInfoDouble(symb,SYMBOL_ASK)+offset*_Point;
if(type==ORDER_TYPE_SELL_STOP)
price=SymbolInfoDouble(symb,SYMBOL_BID)-offset*_Point;
double free_margin_check=m_account.FreeMarginCheck(symb,
type,
lots,
price);
double margin_check=m_account.MarginCheck(symb,
type,
lots,
price);
if(free_margin_check>margin_check) return(true); else return(false);
}