Кривая логика скрипта или предвзятое отношение его исполнения в зависимости от лота (АДСКИЕ числа 0.03 и 0.06)
Здравствуйте.
Столкнулся с неприятным непредсказуемым исполнением элементарного "переворотного" скрипта в МТ5 2093 на Win7x32.
Имеем открытую позицию с установленными стопом и тейком, а скрипт: 1) удаляет стоп открытой позиции 2) по цене бывшего стопа открывает противоположный ордер с размером, стопом, тейком указанными в тексте скрипта.
И почему-то при нормальной работе скрипта со многими размерами лота, если устанавливаемый ордер или позиция равны 0,03 или 0,06 - вылетает ошибка "failed buy(или sell) stop 0.00...[Invalid volume]" и "Order send error 4756"
Ошибка проявляется рандомно. Только с указанными цифрами сам столкнулся, а сколько их еще - неизвестно.
Может скрипт кривой? Ну почему же тогда он на ура работает с другими лотами?
HELP форумчане-разработчики
Проблема в том как Вы сравниваете лоты.
if(pos_lot==lot1) ord_lot=lot2; if(pos_lot==lot3) ord_lot=lot4; if(pos_lot==lot5) ord_lot=lot6; //if(pos_lot==lot4) ord_lot=lot5; //if(pos_lot==lot5) ord_lot=lot6;
== не работает с некоторыми даблами... Поищите, как сравнивать вещественные числа.
Реализация нормализации цены с учётом квантования (взято из CSymbolInfo )
//+------------------------------------------------------------------+ //| Normalize price | //+------------------------------------------------------------------+ double CSymbolInfo::NormalizePrice(const double price) const { if(m_tick_size!=0) return(NormalizeDouble(MathRound(price/m_tick_size)*m_tick_size,m_digits)); //--- return(NormalizeDouble(price,m_digits)); }
и проверка корректности лота (здесь m_symbol - объект класса CSymbolInfo )
//+------------------------------------------------------------------+ //| Lot Check | //+------------------------------------------------------------------+ double LotCheck(double lots) { //--- calculate maximum volume double volume=NormalizeDouble(lots,2); double stepvol=m_symbol.LotsStep(); if(stepvol>0.0) volume=stepvol*MathFloor(volume/stepvol); //--- double minvol=m_symbol.LotsMin(); if(volume<minvol) volume=0.0; //--- double maxvol=m_symbol.LotsMax(); if(volume>maxvol) volume=maxvol; return(volume); }
Вот спасибо, добрый человек.
Слона то я и не заметил.
Всего то строчка NormalizeDouble в коде, которая была в аналогичном скрипте МТ4, здесь была пропущена.
Теперь всё работает как и задумывалось.
Еще раз, FANKS!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
Столкнулся с неприятным непредсказуемым исполнением элементарного "переворотного" скрипта в МТ5 2093 на Win7x32.
Имеем открытую позицию с установленными стопом и тейком, а скрипт: 1) удаляет стоп открытой позиции 2) по цене бывшего стопа открывает противоположный ордер с размером, стопом, тейком указанными в тексте скрипта.
И почему-то при нормальной работе скрипта со многими размерами лота, если устанавливаемый ордер или позиция равны 0,03 или 0,06 - вылетает ошибка "failed buy(или sell) stop 0.00...[Invalid volume]" и "Order send error 4756"
Ошибка проявляется рандомно. Только с указанными цифрами сам столкнулся, а сколько их еще - неизвестно.
Может скрипт кривой? Ну почему же тогда он на ура работает с другими лотами?
HELP форумчане-разработчики