Подсчет OrderProfit. - страница 2

 
Vinin:

Формулы у Вас странные. Может попытаетесь в одном значении считать прибыль
Намекните пожалуйста, как это сделать (я с другой планеты)?
 
fore-x:
Намекните пожалуйста, как это сделать (я с другой планеты)?

Повторю вопрос - чем вас OrderProfit() не устраивает ?
 
FAQ:

Повторю вопрос - чем вас OrderProfit() не устраивает ?
#property indicator_chart_window

double bidline, askline, percent, margin_level;

void start()
  {
  if(AccountEquity()==0)return;
  if(IndicatorCounted()==0)return;
  
  double tickvalue = MarketInfo(Symbol(), MODE_TICKVALUE); 
  double spread    = MarketInfo(Symbol(), MODE_SPREAD)*Point; 
  double profit;
  
  if(ObjectFind("BID") < 0)
    {ObjectCreate("BID",OBJ_HLINE, 0, Time[0], NormalizeDouble(Bid,Digits));
     ObjectSet("BID", OBJPROP_COLOR, Aqua);}
  if(ObjectFind("ASK") < 0)
    {ObjectCreate("ASK",OBJ_HLINE, 0, Time[0], NormalizeDouble(Ask,Digits));
     ObjectSet("ASK", OBJPROP_COLOR, Red);}
     
  if(bidline != NormalizeDouble(ObjectGet("BID", OBJPROP_PRICE1), Digits)){
  bidline = NormalizeDouble(ObjectGet("BID", OBJPROP_PRICE1), Digits);
  askline = NormalizeDouble(bidline + spread, Digits);
  ObjectSet("ASK", OBJPROP_PRICE1, NormalizeDouble(askline,Digits));}
  
  if(askline != NormalizeDouble(ObjectGet("ASK", OBJPROP_PRICE1), Digits)){
  askline = NormalizeDouble(ObjectGet("ASK", OBJPROP_PRICE1), Digits);
  bidline = NormalizeDouble(askline - spread, Digits);
  ObjectSet("BID", OBJPROP_PRICE1, NormalizeDouble(bidline,Digits));}
  
  for(int i = OrdersTotal()-1; i >= 0;i--)
    {
    if(!OrderSelect(i,SELECT_BY_POS)) continue;
    if(OrderSymbol()!=Symbol() || OrderType() >= 2) continue;
    if(OrderType() == 0)
      {
      profit += (bidline - OrderOpenPrice())/Point*tickvalue*OrderLots() + OrderSwap();
      }
    if(OrderType() == 1)
      {
      profit += (OrderOpenPrice() - askline)/Point*tickvalue*OrderLots() + OrderSwap();
      }
    }
    
  percent = (AccountBalance()+profit+AccountMargin())*100/AccountBalance();
  margin_level = ((AccountBalance()+profit)/AccountMargin())*100;
  
  Comment("\nпрофит сумма = " ,profit,
          "\nпроцент = "      ,percent,
          "\nмаржин уровень = ",margin_level,
          "\nask = " ,DoubleToStr(Ask,6),
          "\nbid = " ,DoubleToStr(Bid,6),
          "\nclose = ",DoubleToStr(Close[0],6)
          
          );
  }

Хочу вот такую штуку сделать, но с результатом пока висяк.
 

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

Вы бы лучше простыми словами объяснили, что вы хотите и что у вас не получается...

Вам задали вопрос : чем вас не устраивает функция OrderProfit() для получения текущего профита позиции.

 
lexandros:

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

Вы бы лучше простыми словами объяснили, что вы хотите и что у вас не получается...

Вам задали вопрос : чем вас не устраивает функция OrderProfit() для получения текущего профита позиции.

Извините, думал так удобнее получится. Значит суть такая:

- имеем на графике две горизонтальные линии, одна - это потенциальный ask, другая - bid

- перетягиваем одну из линий на какую-либо котировку, вторая линия автоматом подтягивается к первой (симулируя предпологаюмую позицию линий ask и bid)

- далее, индикатор нам сообщает, какой будет профит в этом месте и всю остальную информацию.

Все завязано на профите, а его я не могу поймать, мои результаты расходятся с результатами терминала.

 
для каждого ордера ?
 
FAQ:
для каждого ордера ?

Результаты разнятся? ---> Нет, для некоторых ордеров.

А считать нужно по одной паре, выложенный ранее код - это лишь пример. Вот код для проверки:

void start()
  {
  double tickvalue = MarketInfo(Symbol(), MODE_TICKVALUE);
  double ticksize  = MarketInfo(Symbol(), MODE_TICKSIZE);
  
  for(int i = OrdersTotal()-1; i >= 0;i--)
    {
    if(!OrderSelect(i,SELECT_BY_POS)) continue;
    if(OrderSymbol()!=Symbol() || OrderType() >= 2) continue;
    if(OrderType() == 0)
      {
      Alert(
      NormalizeDouble((OrderClosePrice() - OrderOpenPrice())/Point*tickvalue*OrderLots() + OrderSwap(),2),
      " <---> ",OrderProfit()+OrderSwap()
      );
      }
    if(OrderType() == 1)
      {
      Alert(
      NormalizeDouble((OrderOpenPrice() - OrderClosePrice())/Point*tickvalue*OrderLots() + OrderSwap(),2),
      " <---> ",OrderProfit()+OrderSwap()
      );
      }
    }
  }

Вот результат:


 

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

Стоит кстати подождать пару часов когда пойдут котировки.

И да, я бы не стал заморачиватся на каждый цент.

Вы за деревьями леса не видите.

 
FAQ:

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

Стоит кстати подождать пару часов когда пойдут котировки.

И да, я бы не стал заморачиватся на каждый цент.

Вы за деревьями леса не видите.

Ну подскажите плиз, что тут дописать или дайте ссылку на тему - не могу найти, я уже третий день с этой штуковиной маюсь:

NormalizeDouble((OrderOpenPrice() - OrderClosePrice())/Point,0)*???*OrderLots() // формула не правильная была?
 

Если вам нужно посчитать прибыль каждого ордера отдельно, на текущий момент времени, то используйте ОрдерПрофит, если вам нужно посчитать прибыль в синтетической точке, тогда вместо ОрдерКлозеПрайс нужно подставить синтетическую цену закрытия. Нужно не забыть, что ордера закрываются по разным ценам Бид/Аск, и при плавающем спреде нужно учесть и это. Вообще очень много тонкостей. Я например считаю общую прибыль для массива ордеров в нужной точке, а не для каждого в отдельности.

На самом деле это уже коды продвинутого уровня.

Я могу дать вам код моего индикатора, но разобраться в нем будет довольно сложно (код без комментариев), и визуальная часть работать не будет (эту библу дать не могу)

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