Как узнать курс инструмента к валюте игрового счета?

 
Человеки, помажите кто знает... Какой функцией (или набором) можно узнать текущий курс заданного интсрумента к валюте игрового счета? Ведь при покупке лота снимается некая сумма уже в игровой валюте, которая нередко отличается от базовой валюты инструмента. А как узнать это в программе, скока будет снято? Сипасиба...
 
А какой курс хотите узнать Ask или Bid ?:).
 
Тот, по которому работает ДЦ. Он как считает, в зависимости от направления ордера, по некоему среднему или по БИД? Я то не знаю, мне нужно именно как ведутся расчеты счета...
 
Bookkeeper писал (а):
А какой курс хотите узнать Ask или Bid ?:).
Немного изменю вопрос:
А какой курс хотите узнать " ... =Ask;" или " ... =Bid;" ? :о).
А на самом деле все оказалось намного сложнее и у меня такое впечатление, что об этом пока мало кто думал.
Такой вопрос мог возникнуть только у чайника (чисто мое мнение) - глаз не замылен. Во всех прогах при расчете позы курс не учитывается, только лоты. Я впервые наткнулся на эту проблему при попытке рассчитать "вес" поз при открытии нескольких автоматом по разным парам или при открытии одной позы на все свободные деньги на счете (тут же еще и округлять надо с точностью до минимально допустимого лота в данном ДЦ). Вот и стал пытать всех прогеров подряд на всех ветках, люблю (провокации) и вдруг понял, что меня многие даже не понимают - о чем спитч, не чайники уже. Частично это было решено с огромной помощью Рената в скриптах _OpenSell,.. .... посмотрите в КодеБазе. Но не до конца. Еще гляньте здесь 'Анализ японских свечей' продолжение разговора. Но проблема есть.
 
Bookkeeper писал (а):
Немного изменю вопрос:
А какой курс хотите узнать " ... =Ask;" или " ... =Bid;" ? :о).
Так я же уже писал, что сам не знаю. Как ДЦ рассчитывает сколько средств со счета записать в залог? Какой курс инструмента к валюте счета он при этом использует? Это некий средний курс за какоее-то время или еще от каких-то параметров? Или это тиковый Ask, Bid, их среднее или в зависимости от направления ордера? Не зная точно, как они высчитывают, приближенно я бы брал по среднему между тикомыми Ask и Bid, чтоб меньше заморачиваться, но в идеале хотелось бы максимально точно рассчитывать.
Bookkeeper писал (а):
А на самом деле все оказалось намного сложнее и у меня такое впечатление, что об этом пока мало кто думал.
Такой вопрос мог возникнуть только у чайника (чисто мое мнение) - глаз не замылен.
Да чайник, самовар или паравоз - мне побарабану, мне бы до истины добраться. Навыки кодера у меня есть, а алгоритмистика у меня ИМХО неплохо поставлена. Просто я раньше, пока Форексом не занимался, то и вопросы эти не вставали. Щас вот наткнулся на MQL4, но выясняется, что в нем нет некоторых элиментарных, с моей т. з., инструментов. Вот ели бы в MarketInfo была включена возможность запроса курса инструмента к валюте счета, либо размер лота не только в базовой валюте инструмента, но и в валюте счета, тогда все было бы элементарно...:(


Bookkeeper писал (а):
Во всех прогах при расчете позы курс не учитывается, только лоты. Я впервые наткнулся на эту проблему при попытке рассчитать "вес" поз при открытии нескольких автоматом по разным парам или при открытии одной позы на все свободные деньги на счете (тут же еще и округлять надо с точностью до минимально допустимого лота в данном ДЦ). Вот и стал пытать всех прогеров подряд на всех ветках, люблю (провокации) и вдруг понял, что меня многие даже не понимают - о чем спитч, не чайники уже. Частично это было решено с огромной помощью Рената в скриптах _OpenSell,.. .... посмотрите в КодеБазе. Но не до конца. Еще гляньте здесь 'Анализ японских свечей' продолжение разговора. Но проблема есть.
Спасибо, это я все смотрел. Там действительно только частичное решение, да к тому же неправильное на некоторых инструментах. Ипользование Ask в том виде, как у тебя предполагается, справедливо только в случае, если вторая валюта инструмента соответствует валюте счета. Если базовая валюта инструмента и валюта счета совпадают, то курс будет равен 1. Ну а вариант, когда в инструменте вообще отсутствует валюта счета вообще выпал из внимания...

Сейчас у меня проблема только с курсом осталась, т. к. размер лота и плечо можно узнать стандартными функциями языка...
 
Еще не смотрел, но решение типа (ссылку я дал):
    string FirstPart  = StringSubstr( _Symbol, 0, 3 );
    string SecondPart = StringSubstr( _Symbol, 3, 3 );
 
    double Base = MarketInfo ( _Symbol, MODE_LOTSIZE ) * MarketInfo ( _Symbol, MODE_POINT );
    if ( SecondPart == "USD" )
    { Cost = Base; }
    else
    {
        if ( FirstPart == "USD" )
        { Cost = Base / MarketInfo ( _Symbol, MODE_BID ); }
        else
        {
            if ( MarketInfo( "USD" + SecondPart, MODE_BID ) > 0 )
            { Cost = Base / MarketInfo( "USD" + SecondPart, MODE_BID ); }
            else
            { Cost = Base * MarketInfo( SecondPart + "USD", MODE_BID ); }
        }
    }
Сначала проверка на наличие USD сзади, если нет - проверяем спереди, если нет - считаем.

А так или иначе - еще не думал, а других вариантов не видел.
 
И что, по твоему, это вычисляет? Зачем в самом начале ты размер лота умножаешь на цену поинта? Ведь размер лота дается в базовой валюте интструмента и что ты вычисляешь еще умножая на поинты? Ведь MODE_LOTSIZE - "Размер контракта в базовой валюте инструмента". К тому же, насколько я смог понять (и по логике это тоже справедливо), базовая валюта инструмента это как раз та, что стоит первой, а у тебя как раз наоборот вычисляется.

Просто мне непонятно, почему такой элементароной возможности вычисления нет в MQL. Ведь даже в самом МТ4 можно по правой кнопке сразу выбирать показ прибыли в валюте ордера, либо дипозита. Почему интерфейс это вычислять может, а программно такой возможности не предусмотрено?



Интересно, никто из модеров так и не прочтет топик, что ли?...:(
 
Greyman:
И что, по твоему, это вычисляет? Зачем в самом начале ты размер лота умножаешь на цену поинта? Ведь размер лота дается в базовой валюте интструмента и что ты вычисляешь еще умножая на поинты? Ведь MODE_LOTSIZE - "Размер контракта в базовой валюте инструмента". К тому же, насколько я смог понять (и по логике это тоже справедливо), базовая валюта инструмента это как раз та, что стоит первой, а у тебя как раз наоборот вычисляется.

Просто мне непонятно, почему такой элементароной возможности вычисления нет в MQL. Ведь даже в самом МТ4 можно по правой кнопке сразу выбирать показ прибыли в валюте ордера, либо дипозита. Почему интерфейс это вычислять может, а программно такой возможности не предусмотрено?



Интересно, никто из модеров так и не прочтет топик, что ли?...:(

Да ни хрена я здесь не вычисляю :). Я щас вне форекса, некогда. И после полугодовых отчетов думать неохота еще недельку будет. А здесь что спереди, что сзади - я вообще даже еще не смотрел, код чужой.

Потом:
1. Сейчас мои скрипты считают правильно для ***USD (я вообще имею дело только с EURUSD и GBPUSD - поэтому изначально так легло).
2. Из приведенного примера возьму if ( SecondPart == "USD" ) и if ( FirstPart == "USD" ) и сделаю "вторую редакцию". И скрипты будут правильно считать пары и ***USD, и USD***.
3. Сделаю блок: посчитать стоимость основной валюты в валюте счета (USD), ..., ... Может будет третья редакция, или закомментирую "ограничение".
Не думаю, что большая проблема, просто сейчас вообще не думаю. А насчет "модеров", так затрахали мы их уже своей простотой :). Может кто из тех, кто с арифметикой знаком подключится.
 
А функция AccountFreeMarginCheck не подходит?
double AccountFreeMarginCheck( string symbol, int cmd, double volume)
Возвращает размер свободных средств, которые останутся после открытия указанной позиции по текущей цене на текущем счете. Если свободных средств не хватает, то будет сгенерирована ошибка 134 (ERR_NOT_ENOUGH_MONEY).
Параметры:
symbol - Наименование финансового инструмента, с которым должна проводиться торговая операция.
cmd - Торговая операция. Может быть либо OP_BUY, либо OP_SELL.
volume - Количество лотов

Таким образом, AccountFreeMargin() - AccountFreeMarginCheck( string symbol, int cmd, double volume)= скока будет снято в валюте счета
 
Можно еще проще: Залог = MarketInfo(Symbol(), MODE_MARGINREQUIRED) * Lot
 
PSmith:
Можно еще проще: Залог = MarketInfo(Symbol(), MODE_MARGINREQUIRED) * Lot


При таком есть недостатки:

1. MODE_MARGINREQUIRED работает только для ордеров на покупку (но не на продажу) 'Анонс: что нового в MQL4 в следующем билде 199'

2. В случае кроссов нужно чтобы базовые символы были открыты в Market Watch, так как они нужны для пересчета маржевых требований и профитов. 'Анонс: что нового в MQL4 в следующем билде 199'

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