DEan:
Как видно из скриншота, на указанных парах тестер неверно подсчитывает размер лота!
Из скриншота не видно, что это делает тестер.Как видно из скриншота, на указанных парах тестер неверно подсчитывает размер лота!
DEan:
Это баг или как?
Это баг. Однозначно.
Это баг или как?
Взгляните в левый нижний угол скрина, там явно читается!
К сожалению, этого недостаточно. Опубликуйте полный код эксперта, пожалуйста.
Думаю полный код Вам врятли нужен, а вот подпрограммы, отвечающие
за открытие ордера, привожу:
//=======================================================================================================// int CheckForOpen() { double sStopLoss,sTakeProfit,bStopLoss,bTakeProfit; if(StopLoss==0) {sStopLoss=0; bStopLoss=0;} if(TakeProfit==0) {sTakeProfit=0; bTakeProfit=0;} if(StopLoss!=0) {sStopLoss=Bid+StopLoss*Point; bStopLoss=Ask-StopLoss*Point;} if(TakeProfit!=0) {sTakeProfit=Bid-TakeProfit*Point; bTakeProfit=Ask+TakeProfit*Point;} if (a2==a22) { CheckForFreeMarging (); ticket=OrderSend(Symbol(),OP_SELL,vol,Bid,3,sStopLoss,sTakeProfit,"",MAGICMA,0,Red); if (ticket==-1) Print("Error opening SELL order : ",GetLastError()); return(0); } if (a3==a33) { CheckForFreeMarging (); ticket=OrderSend(Symbol(),OP_BUY,vol,Ask,3,bStopLoss,bTakeProfit,"",MAGICMA,0,Blue); if (ticket==-1) Print("Error opening BUY order : ",GetLastError()); return(0); } return (0); } //=============================================================================================// int CheckForFreeMarging () { int a; string para = Symbol(); double ask =MarketInfo(para,MODE_ASK); double lotsize =MarketInfo(para,MODE_LOTSIZE); double minlot =MarketInfo(para,MODE_MINLOT); a=(ask*lotsize/AccountLeverage()*minlot); if (AccountFreeMargin()<a) {Comment ("Недостаточно средств на счете для открытия ордера!!!"); return (0);} CalculateVolume(); return (0); } //=============================================================================================// //--- calculate current volume double CalculateVolume() { double lot_min =MarketInfo(Symbol(),MODE_MINLOT); double lot_max =MarketInfo(Symbol(),MODE_MAXLOT); double lot_step=MarketInfo(Symbol(),MODE_LOTSTEP); //--- check data if(lot_min<0 || lot_max<=0.0 || lot_step<=0.0) { Print("CalculateVolume: invalid MarketInfo() results [",lot_min,",",lot_max,",",lot_step,"]"); return(0); } if(AccountLeverage()<=0) { Print("CalculateVolume: invalid AccountLeverage() [",AccountLeverage(),"]"); return(0); } //--- basic formula vol=NormalizeDouble(AccountFreeMargin()*RiskSize/AccountLeverage()/10.0,2); //--- additional calculation // ... //--- check min, max and step vol=NormalizeDouble(vol/lot_step,0)*lot_step; if(vol<lot_min) vol=lot_min; if(vol>lot_max) vol=lot_max; if(AutoLots==false) vol=Lots; //--- return(0); } //===========================================================================================//
Пробовал на 198 билде, советник работает, проблем нет!
Два вопроса:
Очень важно знать:
- А Вы не переключались между торговыми счетами во время повторных запусков тестера?
Могло быть так, что на предыдущем счете были ограничения на минимальный лот не 0.10 , а 1.00 (например). Проверьте основные логи терминала на коннеты.
- Было ли подключение к серверу до 01:52 (когда код стал срабатывать)?
Если терминал не имел рыночных данных на момент старта до 01:52, то такое поведение (неспособность совершить операцию) возможно.
Очень важно знать:
Для тестера необходима вся рыночная информация по счету, инструментам и истории чартов, чтобы все правильно рассчитывать. Рыночная информация кешируется на клиенте в терминале. Для успешного тестирования терминал должен иметь данные по текущему используемому счету (из настроек).
Счет на MetaQuotes-Demo - MetaQuotes Software Corp., впрочем, пробовал и на MIG-Demo -
MIG Investments SA - результат тот же.
Пробовал разные размеры лота (0.1-5). Пробовал снова, вот скрин.
Пробовал разные размеры лота (0.1-5). Пробовал снова, вот скрин.
Тогда вышлите мне на renat AT metaquotes . ru полный код эксперта - я самостоятельно
протестируюсь, опубликую результаты, а затем удалю код.
Сообщение "invalid lots amount" выдаётся в том случае, когда количество
лотов <=0
Даже из приведённого фрагмента видно, что Вы неправильно используете функции. Что это за код?
Даже из приведённого фрагмента видно, что Вы неправильно используете функции. Что это за код?
if (AccountFreeMargin()<a) {Comment ("Недостаточно средств на счете для открытия ордера!!!"); return (0);} CalculateVolume(); return (0);
Средств не хватает, поэтому Вы не рассчитываете объём. Тем не менее пытаетесь открыть ордер. Всегда!
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Обновился до 200 билда, решил потестить советника и столкнулся с такой проблемой. При запуска советника на парах USDJPY и EURJPY в журнале появляется следующее: