возвращаемое значение orderSend должно быть проверено. Как????
В Финаме по другому рассчитывается ГО, вернее так же но исходные данные указаны по другому. И для того, чтобы правильно рассчитать возможное количество лотов необходимо вытащить из спецификации инструмента "коэффициент маржи".
Пляски с бубном вокруг функции "SymbolInfoMarginRate" к результату не привели (опыта и мозгов видимо не достаточно). Если кто знаком с использованием функции или есть другой путь буду благодарен за помощь
double K1,K2=0; if (!SymbolInfoMarginRate(_Symbol,ORDER_TYPE_BUY,K1,K2)) Print ("Проблемы с коэффициентами маржи"); if (K1<=0 || K1>1) K1=1;
Вам нужен K1. Если он равен 1, значит вы рассчитываете на покупку по номиналу.
На фьючерсах К1 был равен 1 в БКС и Открытии, поэтому этот коэффициент был не нужен. Номинал там был указан уже с учетом ГО. У Финам значение коэффициента маржи на фьючерсах обычно в пределах 0.15-0.25, вот его и не удается никак получить.
Не все так просто. Эта функция может быть расположена только в "global" или в обозначенном разделе. Скорее всего именно с этим связано, что никак не получается получить абсолютное значение.
Проблема с ордерами ШОРТ была из разряда "сам дурак". Хорошо, что редко так "клинит" мозги.
Вы бы привели что-ли логи, что возвращает SymbolInfoMarginRate и SymbolInfoDouble(...SYMBOL_MARGIN...), потому что заявления типа "к результату не привели" слишком неопределенные.
Также есть функция OrderCheck, которая в структуре MqlTradeCheckResult возвращает маржу.
На фьючерсах К1 был равен 1 в БКС и Открытии, поэтому этот коэффициент был не нужен. Номинал там был указан уже с учетом ГО. У Финам значение коэффициента маржи на фьючерсах обычно в пределах 0.15-0.25, вот его и не удается никак получить.
Не все так просто. Эта функция может быть расположена только в "global" или в обозначенном разделе. Скорее всего именно с этим связано, что никак не получается получить абсолютное значение.
Проблема с ордерами ШОРТ была из разряда "сам дурак". Хорошо, что редко так "клинит" мозги.
Если не затруднит, запустите советничка. Там разные варианты расчёта маржи, интересно узнать есть ли среди них правильный для финама.
Во блин. Пропала возможность править коммент. Жаль.
Дополнение к посту выше, в открывашке правильно показывал маржу на фьючерсах, пятый вариант.
Счёта в финаме у меня пока ещё нет.
Ага ещё и сов не правильный прикрепился, но теперь не поменять.
Вот этот вроде правильный.
P.S. Мне уже написали, что всё не правильно :(
Это все не то. Имеем вот такой расчет возможного количества лотов при котором не надо следить за средствами. Количество контрактов открывается в зависимости от состояния счета и свободных средств. Недостаток в том, что InpGO приходится в начале торгового дня вводить вручную, а величина эта динамическая и может в течении этого дня меняться. Единственная функция имеющая доступ к "коэффициенту маржи" это SymbolInfoMarginRate, имеющая специфические требования к использованию. Вот с этим мне и не удается справиться. Результат желательно видеть визуально в момент инициализации робота, а уж динамическое изменение рассчитывать при каждом открытии сделки. Такой расчет был бы универсален для всех брокеров и рынков где используется "гарантийное обеспечение".
InpLots - макс. количество заданное пользователем
Pos_volume - открыто контрактовdouble One_Lots = MathFloor(SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_INITIAL)); // начальная маржа для открытия 1 лота
// --- Расчет максимального размера лота
double Free = AccountInfoDouble(ACCOUNT_MARGIN_FREE); //свободные средства
double maxlots = MathFloor(NormalizeDouble(Free*InpRisk/100/(One_Lots*InpGO),2)); //где InpRisk - ограничение в % используемых средств, InpGO - коэфф. маржи.
if(total==0)
{
if(InpLots<maxlots)
{ExLots=InpLots;}
if(InpLots>=maxlots)
{ExLots=maxlots;}
}
if(Buy_opened)
{
if((InpLots<=Pos_volume) || (maxlots<1))
{ExLots=0;}
if(InpLots>Pos_volume && maxlots>=1 && maxlots<=(InpLots-Pos_volume))
{ExLots=maxlots;}
if(InpLots>Pos_volume && maxlots>=1 && maxlots>(InpLots-Pos_volume))
{ExLots=InpLots-Pos_volume;}
}
if(Sell_opened)
{
if((InpLots<=Pos_volume) || (maxlots<1))
{ExLots=0;}
if(InpLots>Pos_volume && maxlots>=1 && maxlots<=(InpLots-Pos_volume))
{ExLots=maxlots;}
if(InpLots>Pos_volume && maxlots>=1 && maxlots>(InpLots-Pos_volume))
{ExLots=InpLots-Pos_volume;}
}
Вы бы привели что-ли логи, что возвращает SymbolInfoMarginRate и SymbolInfoDouble(...SYMBOL_MARGIN...), потому что заявления типа "к результату не привели" слишком неопределенные.
Также есть функция OrderCheck, которая в структуре MqlTradeCheckResult возвращает маржу.
Ничего не возвращает. Даже корректно расположить и написать SymbolInfoMarginRate что бы не выдавало ошибок не получается. С SymbolInfoDouble и "начальной маржой" проблем нет.
Возвращать надо не маржу, а коэффициент маржи, т.к. "гарантийное обеспечение" определяется как "начальная или поддерживающая маржа" умноженная на "коэфф. маржи.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В Финаме по другому рассчитывается ГО, вернее так же но исходные данные указаны по другому. И для того, чтобы правильно рассчитать возможное количество лотов необходимо вытащить из спецификации инструмента "коэффициент маржи".
Пляски с бубном вокруг функции "SymbolInfoMarginRate" к результату не привели (опыта и мозгов видимо не достаточно). Если кто знаком с использованием функции или есть другой путь буду благодарен за помощь.
Вторая проблема - робот несколько лет исправно работавший в БКС и Открытии перестал открывать ШОРТЫ. В журнале пишет "invalid stops" . Величины котировок, стопов и профитов при этом корректные. ЛОНГИ при идентичном коде открываются нормально без ошибок.