Господа, прошу помощи - собственного соображения не хватает.
Имеется ли разница, из какой страны отправляется советник на валидацию?
Один и тот же советник отправляется из России и где-то из США.
Российский результат без ошибок:
В США результат с ошибками:
При этом советник однозначно проверяет остаток свободных средств:
PrevBalance: 1.00,
Скорее всего робот слился. Поэтому выдает ошибку.
Да и проверка свободной маржи, мягко говоря, у Вас неправильная.
MODE_MARGINREQUIRED | 32 | Размер свободных средств, необходимых для открытия 1 лота на покупку |
Эта функция возвращает размер только на BUy
и не учитывает то, сколько сейчас уже открыто позиций.
попробуйте использовать эту функцию:
AccountFreeMarginCheck
Возвращает размер свободных средств, которые останутся после открытия указанного ордера по текущей цене на текущем счете.
double AccountFreeMarginCheck( |
Не замечал, что отправлять с разных стран советника на валидацию - имеют разные результаты. Все везде одинаковое.
Я думаю этот вопрос лучше адресовать в сервисдеск. Тут Вам точно ничего не ответят.
попробуйте использовать эту функцию:
AccountFreeMarginCheck
Пробовал - та же самая беда
Пробовал - та же самая беда
У меня приблизительно такая конструкция получается:
int tickets=0; double _Price_Sell=Bid-_points*_Point; if(_Price_Sell!=0) { if(_stopLoss>0) _sl=NormalizeDouble(_Price_Sell+_stopLoss*_Point,_Digits); if(_takeProfit>0) _tp=NormalizeDouble(_Price_Sell-_takeProfit*_Point,_Digits); if(_MaxLotCheck(Symbol(),OP_SELL,_Price_Sell,85)>=Lots && AccountFreeMargin()>25) { tickets=OrderSend(Symbol(),OP_SELLSTOP,Lots,_Price_Sell,0,_sl+stoplvl*_Point,_tp-stoplvl*_Point,"",MAGICMA,0,0); if(tickets<0){Print("@@@!!! OP_SELLSTOP ",GetLastError());} } } //------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Access functions OrderCalcMargin(...). | //| INPUT: name - symbol name, | //| trade_operation - trade operation, | //| price - price of the opening position, | //| percent - percent of available margin [1-100%]. | //+------------------------------------------------------------------+ double _MaxLotCheck(string symbol,int trade_operation, double price,double percent) { double margin=0.0; //--- checks if(symbol=="" || price<=0.0 || percent<1 || percent>100) { Print("CAccountInfo::MaxLotCheck invalid parameters"); return(0.0); } //--- calculate margin requirements for 1 lot if(!_MarginCheck(symbol,trade_operation,1.0,price) || margin<0.0) { Print("CAccountInfo::MaxLotCheck margin calculation failed"); return(0.0); } //--- if(margin==0.0) // for pending orders return(MarketInfo(symbol,MODE_MAXLOT)); //--- calculate maximum volume double volume=NormalizeDouble(AccountFreeMargin()*percent/100.0/margin,2); //--- normalize and check limits double stepvol=MarketInfo(symbol,MODE_LOTSTEP); if(stepvol>0.0) volume=stepvol*MathFloor(volume/stepvol); //--- double minvol=MarketInfo(symbol,MODE_MINLOT); if(volume<minvol) volume=0.0; //--- double maxvol=MarketInfo(symbol,MODE_MAXLOT); if(volume>maxvol) volume=maxvol; //--- return volume return(volume); } //+------------------------------------------------------------------+ //| Access functions OrderCalcMargin(...). | //| INPUT: name - symbol name, | //| trade_operation - trade operation, | //| volume - volume of the opening position, | //| price - price of the opening position. | //+------------------------------------------------------------------+ double _MarginCheck(string symbol,int trade_operation, double volume,double price) { return(AccountFreeMargin()-AccountFreeMarginCheck(symbol,trade_operation,volume)); }
У меня приблизительно такая конструкция получается:
а чем эти цифры вычислили?
if(_MaxLotCheck(Symbol(),OP_SELL,_Price_Sell,85)>=Lots && AccountFreeMargin()>25)
У меня приблизительно такая конструкция получается:
AccountFreeMarginCheck(symb, ((isbuy) ? OP_BUY : OP_SELL), lot) > 0
Всегда так прокатывает. И при работе и при валидации.
а чем эти цифры вычислили?
85 - процент от маржи, 25 - остаток на счете... как-то так
Это понятно. Я про цифры. Почему не 78 процент маржи? И 24 остаток?
Господа, прошу помощи - собственного соображения не хватает.
Имеется ли разница, из какой страны отправляется советник на валидацию?
Один и тот же советник отправляется из России и где-то из США.
Российский результат без ошибок:
В США результат с ошибками:
При этом советник однозначно проверяет остаток свободных средств:
Я использую вот эти функции
MQL5 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); } MQL4 bool CheckMoneyForTrade(string symb, double lots,int type) { double free_margin=AccountFreeMarginCheck(symb,type,lots); //-- если денег не хватает if(free_margin<0) { string oper=(type==OP_BUY)? "Buy":"Sell"; Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError()); return(false); } //-- проверка прошла успешно return(true); }
- 2016.07.19
- MetaQuotes Software Corp.
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Господа, прошу помощи - собственного соображения не хватает.
Имеется ли разница, из какой страны отправляется советник на валидацию?
Один и тот же советник отправляется из России и где-то из США.
Российский результат без ошибок:
В США результат с ошибками:
При этом советник однозначно проверяет остаток свободных средств: