И снова про публикацию в маркете - Volume limit reached

Dmytryi Voitukhov  

Уже месяц(!) не могу опубликовать сов.

OrderCalcMargin...Вычисляет размер маржи, ... без учета текущих ... открытых позиций. Но если сравнивать с ФриМарджин - логически верно? Что и указано в примере.

Просто использовал штатный(!) образец почти без изменений и хотел чтоб разрабы ткнули носом.

П.С. Я пробовал и через 10 мин, и через час, и через день ....:)

double CheckVolume(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
   if(type==ORDER_TYPE_SELL)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      string errmess=GetLastError();
      Print("Error in ",__FUNCTION__," code=",errmess," lots=",lots);
      return(0);
     }
   //--- если не хватает средств на проведение операции
//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(lots>max_volume)
     {
      lots=lots-SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
      CheckVolume(symb,lots,type);
     }   
   
   
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      //Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      //return(false);
      lots=lots-SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
      CheckVolume(symb,lots,type);
     }
//--- проверка прошла успешно
lots=(NormalizeDouble(MathRound(lots / SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP)), 0)) * SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
double volume_limit=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_LIMIT);
if(SumLotAll>volume_limit && volume_limit>0) //
lots=0;
   return(lots);
  }


Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Файлы:
Iurii Tokman  
Dmytryi Voitukhov:

Уже месяц(!) не могу опубликовать сов.

OrderCalcMargin...Вычисляет размер маржи, ... без учета текущих ... открытых позиций. Но если сравнивать с ФриМарджин - логически верно? Что и указано в примере.

Просто использовал штатный(!) образец почти без изменений и хотел чтоб разрабы ткнули носом.

П.С. Я пробовал и через 10 мин, и через час, и через день ....:)


а другие проверки вы делаете ?
там есть целая статья об этом

пробовать через час или день и т.д. - это все ненужное и лишнее
Dmytryi Voitukhov  
Iurii Tokman:

а другие проверки вы делаете ?
там есть целая статья об этом

пробовать через час или день и т.д. - это все ненужное и лишнее

Максимальный объем лотов - крайние 3 строки.

Достаточность средств - командой 

OrderCalcMargin

Отложенных не использую.

Нехватка средств для проведения торговой операции - проверка есть

Неправильные объемы в торговых операциях  - проверка есть

Ограничение на количество отложенных ордеров - не используется

Ограничение на количество лотов по одному символу - проверка есть

Установка уровней TakeProfit и StopLoss в пределах минимального уровня SYMBOL_TRADE_STOPS_LEVEL - на это замечаний нет.

Попытка модификации ордера или позиции в пределах уровня заморозки SYMBOL_TRADE_FREEZE_LEVEL  - на это замечаний нет.

Ошибки, возникающие при работе с символами с недостаточной историей котировок  - на это замечаний нет.

Выход за пределы массива (array out of range) -   - на это замечаний нет.

Деление на ноль (zero divide)  - на это замечаний нет.

Отправка запроса на модификацию уровней без фактического их изменения  - на это замечаний нет.

Попытка импорта скомпилированных файлов (даже EX4/EX5) и DLL   - не используется

Обращение к пользовательским индикаторам через iCustom()  - не используется

Передача недопустимого параметра в функцию (ошибки времени выполнения)  - на это замечаний нет.

Access violation

Потребление ресурсов процессора и памяти  - на это замечаний нет.

И какой же проверки не хватает?

Dmytryi Voitukhov  
Iurii Tokman:
1. советник выставляете отложенные ордера ?
2. с увеличенным лотом выставляет ?

Если всё-таки прочесть мое сообщение - там дважды указано - 

отложенные НЕ использую.


+ в коде так-же видно что какой бы объём ни был - он корректируется под имеющиеся средства. 10-я строка с конца.

Aleksey Mavrin  

что-то жесть какая-то. Интересно таких кодов на маркете полно? какая жаль.

в чём смысл этих действий в коде ниже. Значение, возвращаемое функцией никуда не принимается. Или уж по ссылке параметр подавайте.

 Дальше с free_margin такая же петрушка

   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(lots>max_volume)
     {
      lots=lots-SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
      CheckVolume(symb,lots,type);
     } 
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Информация об инструменте - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Dmytryi Voitukhov  
Aleksey Mavrin:

что-то жесть какая-то. Интересно таких кодов на маркете полно? какая жаль.

в чём смысл этих действий в коде ниже. Значение, возвращаемое функцией никуда не принимается. Или уж по ссылке параметр подавайте.

 Дальше с free_margin такая же петрушка

lots - глобальная. Всё прекрасно возвращает (return(lots);). А где принимается - понять не сложно.

Вызов - рекурсия с шаговым уменьшением. До выполнения условия. Предельно прозрачно. Исходник тут

Итак - по существу снова ничего?

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку для обеспечения единого стандарта качества. В этой статье мы расскажем о наиболее частых ошибках, которые допускают разработчики в своих технических индикаторах и торговых роботах. А также покажем как самостоятельно проверить свой продукт перед отправкой в Маркет.
Aleksey Mavrin  
Dmytryi Voitukhov:

lots - глобальная. Всё прекрасно возвращает (return(lots);). А где принимается - понять не сложно.

Вызов - рекурсия с шаговым уменьшением. До выполнения условия. Предельно прозрачно. Исходник тут

Итак - по существу снова ничего?

Глобальная lots говоришь?

double CheckVolume(string symb,double lots,ENUM_ORDER_TYPE type)

Ну тогда всё ок, не мешаю, чего я лезу, тут человек уже рекурсию (похоже телепатическую) освоил.

Dmytryi Voitukhov  
Aleksey Mavrin:

Глобальная lots говоришь?

Ну тогда всё ок, не мешаю, чего я лезу, тут человек уже рекурсию (похоже телепатическую) освоил.

Я уже обрадовался - думал нашелся косяк. Но увы, вызов такой

LotBuy=CheckVolume(_Symbol,LotBuy,ORDER_TYPE_BUY); 

Так шо как бы и да, но всё таки нет.

Dmytryi Voitukhov  

Заметил такое - в какой-то момент после отработки функции выполнение возвращается в эту же функцию, на последние 3 троки, изменяя значение переменной с приростом. Не выполняя ни одной строки вначале функции. Там просто задАние умолчаний. Код в первом сообщении.

При этом ни один вызов этой функции не происходит. Таких итераций проходит 10-15. Могу видео дебага приложить.

Aleksey Mavrin  
Dmytryi Voitukhov:

Заметил такое - в какой-то момент после отработки функции выполнение возвращается в эту же функцию, на последние 3 троки, изменяя значение переменной с приростом. Не выполняя ни одной строки вначале функции. Там просто задАние умолчаний. Код в первом сообщении.

При этом ни один вызов этой функции не происходит. Таких итераций проходит 10-15. Могу видео дебага приложить.

Ты же знаток рекурсии, забыл?))

Причина обращения: