Ошибки, баги, вопросы - страница 3668
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Проверил с 0 работает, с иными числами в этом запросе нет, брокеры разные.
Потому что цену вы ставите аск, а стоплос и тейкпрофит 1000
в то время как тейкпрофит вам нужно указать аск+1000, а стоплосс аск-1000.
Проверил с 0 работает, с иными числами в этом запросе нет, брокеры разные.
О чудо после перекулючения брокеров заработали логи где пишет инвалид стоп.
Причину понял видно тут нужны абсолютные числа а не относительные?
в то время как тейкпрофит вам нужно указать аск+1000, а стоплосс аск-1000.
И не забыть домножить на величину одного пункта: Ask + 1000 * _Point и Ask - 1000 * _PointСпасиьбо
Спасибо всем, эта окончательная форма и подошла в конце.
Спасибо всем, эта окончательная форма и подошла в конце.
И даже нормализация не понадобилась?
Здравствуйте.
CAccountInfo MaxLotCheck не возвращает правильное значение на некоторых символах, например GOLD и BITCOIN. Рисует 500, что является значением SYMBOL_VOLUME_MAX, то есть Максимальным объемом из Спецификации.
Прочитал мнение аксакалов форума о том, что многое зависит от конкретного брокера и конкретного инструмента. Если это так, то как вообще можно доверять какой-то информации, если её могут подменять как угодно или вовсе не возвращать.
Если кто-то сталкивался с подобным, то с благодарностью приму совет как и мне решить эту проблему. Если остается только уповать на брокера, то хотелось бы получить подтверждения и этого. Спасибо.
Продолжаю расследование.
Смотрю в исходник CAccountInfo::MaxLotCheck.
Он опирается на функцию OrderCalcMargin:
double CAccountInfo::MaxLotCheck(const string symbol,const ENUM_ORDER_TYPE trade_operation, const double price,const double percent) const { double margin=0.0; //--- проверки if(symbol=="" || price<=0.0 || percent<1 || percent>100) { Print("CAccountInfo::MaxLotCheck invalid parameters"); return(0.0); } //--- calculate margin requirements for 1 lot if(!OrderCalcMargin(trade_operation,symbol,1.0,price,margin) || margin<0.0) { Print("CAccountInfo::MaxLotCheck margin calculation failed"); return(0.0); } //--- if(margin==0.0) // для отложенных ордеров return(SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX)); //--- вычисление максимального объема double volume=NormalizeDouble(FreeMargin()*percent/100.0/margin,2); //--- нормализация и проверка лимитов double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); if(stepvol>0.0) volume=stepvol*MathFloor(volume/stepvol); //--- double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN); if(volume<minvol) volume=0.0; //--- double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX); if(volume>maxvol) volume=maxvol; //--- возвращается объем return(volume); }Обращаю внимание на фрагмент кода:
//--- calculate margin requirements for 1 lot if(!OrderCalcMargin(trade_operation,symbol,1.0,price,margin) || margin<0.0) { Print("CAccountInfo::MaxLotCheck margin calculation failed"); return(0.0); } //--- if(margin==0.0) // для отложенных ордеров return(SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX));Вызываю отдельно OrderCalcMargin, возвращает значение выше нуля. Но при этом MaxLotCheck ведет себя так, как будто margin==0.0 и возвращает мне SYMBOL_VOLUME_MAX.
Здравствуйте.
CAccountInfo MaxLotCheck не возвращает правильное значение на некоторых символах, например GOLD и BITCOIN. Рисует 500, что является значением SYMBOL_VOLUME_MAX, то есть Максимальным объемом из Спецификации.
Прочитал мнение аксакалов форума о том, что многое зависит от конкретного брокера и конкретного инструмента. Если это так, то как вообще можно доверять какой-то информации, если её могут подменять как угодно или вовсе не возвращать.
Если кто-то сталкивался с подобным, то с благодарностью приму совет как и мне решить эту проблему. Если остается только уповать на брокера, то хотелось бы получить подтверждения и этого. Спасибо.
Думаю это проблема брокера, так как лимиты на торговые обьемы ставит именно брокер. Терминалу абсолютно все равно хоть лимит 10 хоть 100500.
Заметил интересное.
OrderCalcMargin
(Вычисляет размер маржи, необходимой для указанного типа ордера на текущем счете и при текущем рыночном окружении без учета текущих отложенных ордеров и открытых позиций. Позволяет оценить размер маржи для планируемой торговой операции. Значение возвращается в валюте счета.)
возвращает мне 0.37 на GOLD, цена которому 3700. Купить 1 лот золота по 37 центов я никак не могу, хотя хотелось бы :)
Из-за этого в дальнейшем вычислении максимальный лот начинает сильно превышать SYMBOL_VOLUME_MAX, который мне функция и возвращает.
Складывается ощущение, что функция OrderCalcMargin ошибочно работает с ценами больше какой-то суммы.
Например, 1 лот EURUSD можно купить за 2355, что верно.
Но купить 1 лот NVIDIA по 7 долларов при цене 175 за акцию, если верить тому же OrderCalcMargin, никак не получится.
Дополню.
OrderCalcMargin рассчитывается по-разному в зависимости от способа вычисления. Думаю, ошибка (моя или не моя, пока не разобрался) в этом.
ENUM_SYMBOL_CALC_MODEДействительно, опираясь на SYMBOL_TRADE_CALC_MODE, стало понятно, что маржа за лот высчитывается по формуле Margin: Lots * InitialMargin * Margin_Rate
Библиотечная функция MaxLotCheck прекрасно работает, когда начальная маржа равна 1.
А если взять, например, GOLD, то по спецификации начальная маржа там 0.000001 а лот 0.38. Простое перемножение дает 0,00000038.
Нужно умножать начальную маржу на размер контракта. В данном случае он 100. Сумма взята из спецификации символа.
И только после этого мы можем правильно запросить OrderCalcMargin, который честно вернет цену около 3700, которая является 1.0 лотом при покупке.
Препарировал MaxLotCheck, вывалив его в OnTick() и слегка доработав напильником под сложившуюся ситуацию.
Возможно, я изобрел велосипед. Подскажите, пожалуйста, готовое решение, если оно есть.