Объём лота ? - страница 2

 
new-rena:

Вот, небольшая поправка (у Вас не так):

объем = профит / (кол-во пунктов * стоимость пункта)

Действительно. Вы правильно подметили.
 
Lilita Bogachkova:

x = ((d*c)-a)/(b-d);

 

a += цена открытия открытого ордера * объем открытого ордера;

b = цена открытия противоположного ордера;  

c += объем открытого ордера;

d = цена ТП противоположного ордера;

x = объем противоположного ордера.

Формула записана в функцию. Лот получался со знаком минус, пришлось умножить на -1.

При тестировании (Т\П=50, Лот=1.00) получен убыток 35 единиц вместо запланированной прибыли 50 единиц.

Чего-то не хватает?
double newLot2(string sy="", int op=-1, int mn=-1)
{
  datetime o;
  double po, pp, Profit,lot,_a,_b,_c,_d,_X;
  
  double   l=-1;
  int      i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy==Symbol()) {
        if (OrderType()==OP_BUY ) {
           po=MarketInfo(OrderSymbol(), MODE_POINT);
           pp=MarketInfo(OrderSymbol(), MODE_BID);
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                lot=OrderLots();
                _a +=OrderOpenPrice()*lot;
                _b = MarketInfo(OrderSymbol(), MODE_ASK);
                _c += lot;
                _d = _b-_TP*po;
                _X=((_d*_c)-_a)/(_b-_d)*-1;
                _X= MathRound(_X / MarketInfo(Symbol(), MODE_LOTSTEP)) * MarketInfo(Symbol(), MODE_LOTSTEP);
                
              }
            }
          }
        }
      }
    }
  }
  return(_X);
}


 

 
new-rena:

Вот, небольшая поправка (у Вас не так):

объем = профит / (кол-во пунктов * стоимость пункта)

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

Причём, увеличивается многократно.

Profit= OrderProfit() + OrderCommission() + OrderSwap();
lot= Profit/(_TP*po*MarketInfo(_Symbol, MODE_TICKVALUE));


 

 

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

 
sile:

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

Причём, увеличивается многократно.

Profit= OrderProfit() + OrderCommission() + OrderSwap();
lot= Profit/(_TP*po*MarketInfo(_Symbol, MODE_TICKVALUE));


 


Вот набросок функции для получения лота противоположной позиции. Нужно передать тикет по текущей позиции и ТП для противоположной позиции

double getOpposLot(int ticketOrder, double OpposTP)
{
  if(!OrderSelect(ticketOrder, SELECT_BY_TICKET)) return -1;
  
   // --- Стоимость пункта по тек.символу за 1 лот
  double pipCost = MarketInfo(_Symbol, MODE_TICKVALUE);
   // --- Текущий профит по ордеру, м.б. отрицательным
  double curProfit = OrderProfit() + OrderCommission() + OrderSwap();
  
   // --- Находим по текущему ордеру планируемый профит в пунктах
  double profitPlanInPoint = 0;
  if(OrderType() == OP_BUY)  profitPlanInPoint = (OrderTakeProfit() - OrderOpenPrice()) / Point();
  if(OrderType() == OP_SELL) profitPlanInPoint = (OrderOpenPrice() - OrderTakeProfit()) / Point();
  
   // --- Находим по текущему ордеру планируемый профит в валюте
  double profitPlan = profitPlanInPoint * pipCost * OrderLots();

   // --- Разница между планируемой и достигнутой в данный момент прибылью/убытком
  double difToProfit = profitPlan - curProfit;
  
   // --- Вычисляем лот для противоположной позиции при известном значении тейкпрофита (OpposTP) для нее
  double lot = difToProfit / (OpposTP * pipCost) + OrderLots();
  
  return lot;
}
 
Lilita Bogachkova:

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

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

 
Vasiliy Pushkaryov:


Вот набросок функции  

Спасибо, большое.

Результат очень близок ожидаемому.

Отдельная благодарность, за комментарии.

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

Как это сделать?

Пожалуйста.

 
sile:

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

Как это сделать?

Захеджируйте Sell-ордер, возьмите текущий профит по ранее открытому Бай и захеджированному Sell, отнимите от планируемого первоначального профита. И можно по этой же функции (getOpposLot()) получить новый Бай-ордер.

Хотя, придется переделать ее, добавьте в формальные параметры double curProfit, и за пределами функции вычисляйте профит по тем ордерам, которые у Вас есть в наличии.

 
Vasiliy Pushkaryov:

Захеджируйте Sell-ордер, возьмите текущий профит по ранее открытому Бай и захеджированному Sell, отнимите от планируемого первоначального профита. И можно по этой же функции (getOpposLot()) получить новый Бай-ордер.

Хотя, придется переделать ее, добавьте в формальные параметры double curProfit, и за пределами функции вычисляйте профит по тем ордерам, которые у Вас есть в наличии.

Спасибо.
Причина обращения: