Расчет цены 1 лота до его открытия.

 

Лотом как-то не наглядно открываться: на одной валюте он стоит 20$, на другой 200$.

Хотелось бы входить в рынок всегда фиксированной суммой, а не лотом.

Т.е. рассчитать лот так, чтобы при его открытии получить скажем спрэд в 20$.

Конечно можно:

- открыть позицию на 1 лот в тесте

- посмотреть какой по ней получился спредовый минус (Например: -222$)

- пересчитать процентное соотношение лота под 20$ ( 20$*1 лот / 225$ = 0,08888888888 )

- и открыть на продуктиве позицию на 0.09 лота на желаемые примерно -20$

Перебрал некоторые переменные, но никак не могу из них сообразить стоимость 1 лота.

// Минимальное изменение цены.
// MQL5: Модифицировано поведение свойства символа SYMBOL_TRADE_TICK_SIZE. Для символов, для которых явно не задан размер тика, возвращается размер пункта.
double   _SYMBOL_TRADE_TICK_SIZE = SymbolInfoDouble(lzSymbolName,SYMBOL_TRADE_TICK_SIZE);

// Минимальный шаг изменения объема для заключения сделки
double   _SYMBOL_VOLUME_STEP = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

//*********************************************

// Стоимость всех пунктов в спреде в валюте депозита
double   _SYMBOL_SPREAD_PRICE = SymbolInfoDouble(_Symbol,SYMBOL_ASK) - SymbolInfoDouble(_Symbol,SYMBOL_BID);

// Количество пунктов в спрэде
long     _SYMBOL_SPREAD = SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);

// Цена 1-го пункта
double   _SYMBOL_POINT_PRICE = _SYMBOL_SPREAD_PRICE / _SYMBOL_SPREAD;

// Цена 1-го лота?

double   _SYMBOL_LOT_PRICE = -222;

// Количество лотов для открытия на 20$ 

double   _SYMBOL_LOT_SEND_20 = 20/_SYMBOL_LOT_PRICE;
 
Я на все расчеты смотрю так: цена входа это 100%, все например вошли на отметки 1.5, цена ушла к 2, следовательно результат сделки (2-1.5)/1.5 = 33% от суммы контракта. Со спредом аналогично, например он 2 пипса, следовательно (1.5 - 1.4998)/1.5 = 0.00013 * 100 (%) от суммы контракта. Если один лот, то 100000 *  0.00013 = 13 $. А если найти лот = 13/ 0.00013  
 

Попробуйте, это скрипт для расчета лота исходя из заданной суммы.

//+------------------------------------------------------------------+
//|                                                      CalcLot.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#property script_show_inputs

//--- входные параметры
input double            InpMoney       =  200;              //Сумма, на которую открывается сделка
input ENUM_ORDER_TYPE   InpDirection   =  ORDER_TYPE_BUY;   //Тип ордера
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);

   double price;
   if(InpDirection==ORDER_TYPE_BUY) price=ask;
   else if(InpDirection==ORDER_TYPE_SELL) price=bid;
   else
     {
      printf("Расчет лота ведется только для значений %s и %s",EnumToString(ORDER_TYPE_BUY),EnumToString(ORDER_TYPE_SELL));
      return;
     }

   double calc_margin=0;
   if(OrderCalcMargin(InpDirection,_Symbol,1.0,price,calc_margin))
     {
      if(calc_margin>0.0)
        {
         double lot=InpMoney/calc_margin;
         printf("Для суммы %.2f(%s), лот равен %.2f",InpMoney,_Symbol,lot);
        }
     }
  }
//+------------------------------------------------------------------+

 

 
avoitenko:

Попробуйте этот скрипт.

 

Спасибки, скрипт навел на замечательную функцию OrderCalcProfit()

В результате нарисовал скрипт рассчитывающий лот исходя из желаемого минуса при открытии. БОЛЬШИМ СПРЕДАМ - МАЛЕНЬКИЕ ЛОТЫ !!!

double zLot (string zSymbol, string Shift)
{
double zSpeadProfit = 20;

double zMinLot= SymbolInfoDouble(zSymbol,SYMBOL_VOLUME_MIN);
if (zMinLot == 0) {zMinLot = SymbolInfoDouble(zSymbol,SYMBOL_VOLUME_STEP);}

double zOrderCalcProfit;

if (Shift == "Buy")  
{
OrderCalcProfit(ORDER_TYPE_BUY, zSymbol, 100 ,SymbolInfoDouble(zSymbol,SYMBOL_ASK), SymbolInfoDouble(zSymbol,SYMBOL_BID), zOrderCalcProfit);
}

if (Shift == "Sell") 
{
OrderCalcProfit(ORDER_TYPE_SELL, zSymbol, 100 , SymbolInfoDouble(zSymbol,SYMBOL_BID), SymbolInfoDouble(zSymbol,SYMBOL_ASK), zOrderCalcProfit);
}

if (Shift == "Wait") {Alert ("Не могу определить для лота тип ордера, возвращаю минимальный лот."); return (NormalizeDouble(zMinLot,2));}

//Alert (Shift, " zOrderCalcProfit = ",zOrderCalcProfit);

double Lot = - zSpeadProfit * 100 / zOrderCalcProfit;

Alert ("Lot =", Lot);

return (NormalizeDouble(Lot,2));
}
 
awkozlov:

Спасибки, скрипт навел на замечательную функцию OrderCalcProfit()

В результате нарисовал скрипт рассчитывающий лот исходя из желаемого минуса при открытии.


Круто, весь народ желает прибыли, а вы тут желаемые убытки рассчитываете :)

nothing personal, just life.

 
avoitenko:

Попробуйте, это скрипт для расчета лота исходя из заданной суммы.

Для покупок нужно учитывать ещё проскальзывание, если оно будет использоваться:

if(InpDirection==ORDER_TYPE_BUY) price=ask + slippage;

 

 

действительно, почему лота нет в MQL5 ?

ведь многим хочется знать цену пункта лотом 

так и придётся вычислять лот с помощью OrderCalcMargin и  OrderCalcProfit

 

Полотовая ,попипсовая, подолларовая логики в какой-то мере ущербны. Как и многое другое, что измеряется в абсолютных единицах. Переход к относительным единицам измерения особенно полезен при торговле портфелем разнокалиберных символов. Вообще тема перехода от одних единиц измерения к другим довольно простая, но слабо (вообще не встречал) освещена, т.к., видимо, почти не практикуется.

По сути задача при открытии позиции сначала должна ставиться так: какую часть имеющегося капиталла мы хотим инвестировать в позицию портфлеля (включая простейший случай портфеля - 1 символ)? Например, хотим инвестировать 50% от тех денежных средств, что имеем. Далее встает вопрос (грубо): какой профит мы хотим получить? Допустим, что хотим получить 5%.

И уже только потом встает вопрос, какие лоты и направления должны быть для различных символов портфеля, как должна измениться цена порфтеля (в абсолютных единицах).

Причем заметьте, все это распространяется на любые "символы", включая картошку, мебель и т.д. А не только FOREX+биржи. Подобная логика универсальна.

P.S. Представьте себе такую картину в терминале: 30% из ваших средств задействованы в торговле. Они распределены так: 100% = 10% (инвестированы в BUY EURUSD) + 20% (SELL GBPUSD) + 50% (BUY GOLD) + 30% (SELL OIL). И собственно, без разницы тогда, какие там лоты у каждого символа и чему равна цена каждого символа.

P.P.S. На FOREX еще бывает полезна другая система координат: сколько какой валюты (не пар, а именно валюты: USD, JPY, CHF и т.д.) у вас "имеется" (включая отрицательное количество). Например, при рыночно-нейтральной позиции BUY EURUSD, SELL GBPUSD и SELL EURGBP количество "имеющейся" каждой валюты (EUR, USD, GBP) должно быть нулевым. И тема взаимного перехода от имеющейся валюты к лотам их соответствующих пар-символов тоже интересна.

P.P.P.S. Нет на MQL5-форуме трейдерских тем. Один программинг. 

 
papaklass:

1. Мне ближе лоты ограничевать потерями, а не прибылью.

Дело в том, что без разницы, 5% прибыли или 5% убытка. Т.к. это просто соответствующее относительное изменение цены в какую-либо сторону. Например, при Margin = 1% (Leverage = 100) для  EURUSD (GOLD, OIL, картошка - не важно) это будет изменение цены на 0.005% (5% * Margin) от цены открытия. И лоты при такой системе координат вообще не при чем.
 

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

В вашем примере, допустим, вы вложились по 33% в EURUSD, USDJPY и AUDUSD. Так вот если вы поставите у всех символов, например, 5% стоп-лосс (0.005% изменение цены от цены открытия), то при срабатывании стоплоссов убыток по этим символам будет совпадать (в валюте депозита). Ключевое действие - вложиться по 33% (т.е. не лотовая система координат). И вам совершенно не понадобится рассчитывать "хитрым" образом SL, просто ставите для всех 5% и все.

Это не только крайне удобно, но и правильно с точки зрения логики торговли. Прибыль спекулянта измеряется в процентах от инвестированных в сделку средств. 

 

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

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

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