Покупка максимально возможного количества лотов инструмента по рыночной цене.

 

Всем привет.

Использую в торговом советнике функцию PositionOpen для открытия позиции по рыночной цене. Выглядит это примерно так:

if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lots,0,0,0,"Comment"))
               Print("Ошибка при открытии позиции: ",GetLastError());

В переменной Lots содержится количество лотов на покупку инструмента.

Задача: Как грамотно рассчитать количество лотов, чтобы их было ровно столько, чтобы купить инструмента на все доступные средства по рыночной цене?

PS: никаких плечей не используем.

Спасибо.

 
canonier:

Всем привет.

Использую в торговом советнике функцию PositionOpen для открытия позиции по рыночной цене. Выглядит это примерно так:

В переменной Lots содержится количество лотов на покупку инструмента.

Задача: Как грамотно рассчитать количество лотов, чтобы их было ровно столько, чтобы купить инструмента на все доступные средства по рыночной цене?

PS: никаких плечей не используем.

Спасибо.

на вскидку, где-то так: lots=AccountBalance()/(tickValue+marginRequired+marginMantainance); // и чуть-чуть уменьшить, а то пара пунктов не в ту сторону и стопаут

 
canonier:

PS: никаких плечей не используем.

А как это без плечей? Без плечей и посчитать нельзя. Или это не Форекс.
 
canonier:

Всем привет.

Использую в торговом советнике функцию PositionOpen для открытия позиции по рыночной цене. Выглядит это примерно так:

В переменной Lots содержится количество лотов на покупку инструмента.

Задача: Как грамотно рассчитать количество лотов, чтобы их было ровно столько, чтобы купить инструмента на все доступные средства по рыночной цене?

PS: никаких плечей не используем.

Спасибо.


AccountFreeMargin/(price*tickvakue/ticksize)

 
canonier:

Всем привет.

Использую в торговом советнике функцию PositionOpen для открытия позиции по рыночной цене. Выглядит это примерно так:

В переменной Lots содержится количество лотов на покупку инструмента.

Задача: Как грамотно рассчитать количество лотов, чтобы их было ровно столько, чтобы купить инструмента на все доступные средства по рыночной цене?

PS: никаких плечей не используем.

Спасибо.

Для МТ5 (MT4 внизу) , без нормализации , округления и без ограничение на минимум и максимум :

Lots = AccountInfoDouble(ACCOUNT_EQUITY) / SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
Lots = AccountEquity() / MarketInfo(_Symbol,MODE_LOTSIZE);
 
Ivan Ivanov:

Для МТ5 (MT4 внизу) , без нормализации , округления и без ограничение на минимум и максимум :

А в чём отличие, и почему не использовать в мт4 современную запись, то есть первую

 
Vitaly Muzichenko:

А в чём отличие, и почему не использовать в мт4 современную запись, то есть первую

Я просто нашол и себя код и скопировал. Да МТ4 довольно старой. но все таки работает .
 
Ivan Ivanov:

Для МТ5 (MT4 внизу) , без нормализации , округления и без ограничение на минимум и максимум :

вы забыли цену, если работать чисто на свои при плече 1:1 получаем:
допустим размер вашего депозита 1000, в 1 контракте 100 000, если вы поставите лот 0.01 при покупке EURUSD по цене 1.35432 он не отработает по причине цена 0,01 контракта больше чем вы можете себе позволить.

с уважением.
 
Andrey Kisselyov:
вы забыли цену, если работать чисто на свои при плече 1:1 получаем:
допустим размер вашего депозита 1000, в 1 контракте 100 000, если вы поставите лот 0.01 при покупке EURUSD по цене 1.35432 он не отработает по причине цена 0,01 контракта больше чем вы можете себе позволить.

с уважением.

Да я согласен , вот корекция :

double Ask;                                                      // Текущая цена
double LotMin = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);     // Мимимальной лот
double MarginBuy;                                                // Марджин для мимимального лота
if ( SymbolInfoDouble(_Symbol,SYMBOL_ASK,Ask) )                       // Получаем Текущая цена
  if ( OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,LotMin,Ask,MarginBuy) ) // Вычиляме Марджин дла Минимального лота
  { MarginBuy = MarginBuy*AccountInfoInteger(ACCOUNT_LEVERAGE);       // Изключаем Леверидж
    Lots = AccountInfoDouble(ACCOUNT_EQUITY) / MarginBuy;             // Сколько Минимальныь лотов можем купить
    Lots = NormalizeDouble(LotMin*MathFloor(Lots),2);                 // Округляем резултат к менщее
  }

Пояснение : Марджин должен учитывать текущую цену актива, в валюте депозита.

 

Нет нет нет!

Мой косяк в том, что я не указал рынок. Рынок FORTS московской биржи. Там как-то по-другому считается. Ну, вот смотрите, например инструмент RTS-9.17:

Текущая цена: 109350

Начальная маржа: 12806 

Допустим, я имею 100 000 рублей. Я знаю точно, что могу купить несколько штук. Если 100 000 / 12 806 = 7.8088

Но могу ли я купить 7 лотов? Или смогу меньше? 

 
canonier:

Нет нет нет!

Мой косяк в том, что я не указал рынок. Рынок FORTS московской биржи. Там как-то по-другому считается. Ну, вот смотрите, например инструмент RTS-9.17:

Текущая цена: 109350

Начальная маржа: 12806 

Допустим, я имею 100 000 рублей. Я знаю точно, что могу купить несколько штук. Если 100 000 / 12 806 = 7.8088

Но могу ли я купить 7 лотов? Или смогу меньше? 


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Биржевые премудрости

Aleksey Vyazmikin, 2017.08.17 16:54

Может кто не знает - я вот не знал.

Оказывается, открыть единовременно позицию по рынку и отложенными ордерами можно не на одинаковое количество лотов, при одинаковом количестве средств.

Комментарий брокера:

"

...

Дело в том, что рыночные заявки требуют большего обеспечения, чем лимитированные.

Например: ГО на лимитные заявки по Si-9.17 составляет 3558, а на рыночные 5388, в связи с этим вы можете купить меньше.

...

"

Таким образом, по рынку открывать нужно в пару заходов, если торговля идет под максимальную загрузку депозита.