Как узнать курс инструмента к валюте игрового счета?
- Пишу мультивалютный эксперт
- авто определение типа лота
- стоймость пипса в кросс паре
А какой курс хотите узнать Ask или Bid ?:).
А какой курс хотите узнать " ... =Ask;" или " ... =Bid;" ? :о).
А на самом деле все оказалось намного сложнее и у меня такое впечатление, что об этом пока мало кто думал.
Такой вопрос мог возникнуть только у чайника (чисто мое мнение) - глаз не замылен. Во всех прогах при расчете позы курс не учитывается, только лоты. Я впервые наткнулся на эту проблему при попытке рассчитать "вес" поз при открытии нескольких автоматом по разным парам или при открытии одной позы на все свободные деньги на счете (тут же еще и округлять надо с точностью до минимально допустимого лота в данном ДЦ). Вот и стал пытать всех прогеров подряд на всех ветках, люблю (провокации) и вдруг понял, что меня многие даже не понимают - о чем спитч, не чайники уже. Частично это было решено с огромной помощью Рената в скриптах _OpenSell,.. .... посмотрите в КодеБазе. Но не до конца. Еще гляньте здесь 'Анализ японских свечей' продолжение разговора. Но проблема есть.
Немного изменю вопрос:
А какой курс хотите узнать " ... =Ask;" или " ... =Bid;" ? :о).
А на самом деле все оказалось намного сложнее и у меня такое впечатление, что об этом пока мало кто думал.
Такой вопрос мог возникнуть только у чайника (чисто мое мнение) - глаз не замылен.
Во всех прогах при расчете позы курс не учитывается, только лоты. Я впервые наткнулся на эту проблему при попытке рассчитать "вес" поз при открытии нескольких автоматом по разным парам или при открытии одной позы на все свободные деньги на счете (тут же еще и округлять надо с точностью до минимально допустимого лота в данном ДЦ). Вот и стал пытать всех прогеров подряд на всех ветках, люблю (провокации) и вдруг понял, что меня многие даже не понимают - о чем спитч, не чайники уже. Частично это было решено с огромной помощью Рената в скриптах _OpenSell,.. .... посмотрите в КодеБазе. Но не до конца. Еще гляньте здесь 'Анализ японских свечей' продолжение разговора. Но проблема есть.
Сейчас у меня проблема только с курсом осталась, т. к. размер лота и плечо можно узнать стандартными функциями языка...
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 сзади, если нет - проверяем спереди, если нет - считаем.
А так или иначе - еще не думал, а других вариантов не видел.
Просто мне непонятно, почему такой элементароной возможности вычисления нет в MQL. Ведь даже в самом МТ4 можно по правой кнопке сразу выбирать показ прибыли в валюте ордера, либо дипозита. Почему интерфейс это вычислять может, а программно такой возможности не предусмотрено?
Интересно, никто из модеров так и не прочтет топик, что ли?...:(
И что, по твоему, это вычисляет? Зачем в самом начале ты размер лота умножаешь на цену поинта? Ведь размер лота дается в базовой валюте интструмента и что ты вычисляешь еще умножая на поинты? Ведь MODE_LOTSIZE - "Размер контракта в базовой валюте инструмента". К тому же, насколько я смог понять (и по логике это тоже справедливо), базовая валюта инструмента это как раз та, что стоит первой, а у тебя как раз наоборот вычисляется.
Просто мне непонятно, почему такой элементароной возможности вычисления нет в MQL. Ведь даже в самом МТ4 можно по правой кнопке сразу выбирать показ прибыли в валюте ордера, либо дипозита. Почему интерфейс это вычислять может, а программно такой возможности не предусмотрено?
Интересно, никто из модеров так и не прочтет топик, что ли?...:(
Да ни хрена я здесь не вычисляю :). Я щас вне форекса, некогда. И после полугодовых отчетов думать неохота еще недельку будет. А здесь что спереди, что сзади - я вообще даже еще не смотрел, код чужой.
Потом:
1. Сейчас мои скрипты считают правильно для ***USD (я вообще имею дело только с EURUSD и GBPUSD - поэтому изначально так легло).
2. Из приведенного примера возьму if ( SecondPart == "USD" ) и if ( FirstPart == "USD" ) и сделаю "вторую редакцию". И скрипты будут правильно считать пары и ***USD, и USD***.
3. Сделаю блок: посчитать стоимость основной валюты в валюте счета (USD), ..., ... Может будет третья редакция, или закомментирую "ограничение".
Не думаю, что большая проблема, просто сейчас вообще не думаю. А насчет "модеров", так затрахали мы их уже своей простотой :). Может кто из тех, кто с арифметикой знаком подключится.
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
При таком есть недостатки:
1. MODE_MARGINREQUIRED работает только для ордеров на покупку (но не на продажу) 'Анонс: что нового в MQL4 в следующем билде 199'
2. В случае кроссов нужно чтобы базовые символы были открыты
в Market Watch, так как они нужны для пересчета маржевых требований
и профитов. 'Анонс: что нового в MQL4 в следующем билде 199'