Точная прибыль в пунктах

 

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

что бы я не делал данные все рано запаздывают. 

Использую вот такую функцию

double Euro()
{ double rezult=0; int E=0;
double EURp  = MarketInfo("EURUSD",MODE_POINT);
double EURd  = MarketInfo("EURUSD",MODE_DIGITS);
int i;for (i=OrdersTotal()-1;i>=0;i--)
{if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true )
{
if ( OrderSymbol()== "EURUSD"    ) {
if ( OrderMagicNumber()== 0    ) {
if(OrderType() == OP_SELL ){
    
if(rezult!=NormalizeDouble(OrderClosePrice(), EURd) ){     
E = (NormalizeDouble(OrderOpenPrice(), EURd)-NormalizeDouble(OrderClosePrice(), EURd))/EURp;
rezult = NormalizeDouble(OrderClosePrice(), EURd); }}}}

}}return(E);}

 

 думал может функция там что-нибудь округляет и из за этого данные не сходятся.. так что все данные "Нормализовал" через NormalizeDoubleно ничего не изменилось

 Данные функции запаздывают :(

для  слежки за показаниями функции  вывел ее на график через  

Comment(StringFormat("Выводим Пункты\nsl = %G\npp = %G\ntp = %d",0,Euro(),0));
 
может у кого есть другие варианты похожих функций? или может я что-то не правильно написал?
 

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

Для рабочих ордеров текущая прибыль - это сумма OrderProfit() + OrderSwap() + OrderCommision(). Полученное значение переводите в пункты и получаете желаемое.

 

OrderClosePrice для открытого ордера возвращает текущую цену (при которой он закрылся бы)

 

а  OrderProfit() + OrderSwap() + OrderCommision()  не подходит... это общая прибыль в валюте депозита а мне нужна прибыль в пунктах...

 

может дело в самом "цикле"?

int i;for (i=OrdersTotal()-1;i>=0;i--)
{ if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true ){

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

 
Frostr:

OrderClosePrice для открытого ордера возвращает текущую цену (при которой он закрылся бы)

Ну да - это OrdeCloseTime() нулевой для рабочих ордеров.

 

а  OrderProfit() + OrderSwap() + OrderCommision()  не подходит... это общая прибыль в валюте депозита а мне нужна прибыль в пунктах...

Я же писал- переведите в пункты.

Или же так:

double point = Point();
if (point == 0.0)
   return;

int profit = 0;
....

// А в цикле:

if (OrderType() == OP_SELL)
   profit = (int)MathRound((OrderOpenPrice() - Ask) / point);
if (OrderType() == OP_BUY)
   profit = (int)MathRound((Bid - OrderOpenPrice()) / point);
 
Frostr:

OrderClosePrice для открытого ордера возвращает текущую цену (при которой он закрылся бы)

 

а  OrderProfit() + OrderSwap() + OrderCommision()  не подходит... мне нужна прибыль в пунктах а это общая прибыль в валюте депозита...

А тебе надо с учётом свопа и комиссии, но в пунктах?

А так, здесь мешает переменная rezult. получается что при каждом обращении к функции учитывается только первый ордер, потом переменной rezult присваивается значение и в следующей итерации цикла условие if(rezult != ***) не выполнено и следующий ордер не считается.

 

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

 

у меня мультивалютный сов ....

 

вот и получается ... советник стоит  на GBP а прибыль в пунктах считывает с ордера по EUR, и пока не будет нового  Тика на GBP -  данные с ордера EUR не обновляются!

 

вообще без понятия как решить эту проблему... 

 
Frostr:

вообще без понятия как решить эту проблему... 

Чтобы своевременно обновлять, можно использовать таймер (см. событие OnTimer) 

Для сбора данных другого символа используйте:

double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);
double ask = SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK);
double bid = SymbolInfoDouble(OrderSymbol(), SYMBOL_BID);
 

Вот весь Код вывода данных о прибыли в пунктах на график в виде комментария.

Если поставить на пару EUR, то никакой задержки нет  а если ставить на другую пару, то появляется задержка :(

 

никак нельзя добиться обработки данных с функции   double Euro() без задержки?


//+------------------------------------------------------------------+
//|                                                        Multy.mq4 |
//|                                                            Tiken |
//|                                                            Tiken |
//+------------------------------------------------------------------+
#property copyright "Tiken"
#property link      "Tiken"
#property version   "1.00"
//+------------------------------------------------------------------+


int start()
  {
  Comment("Выводим Пункты\nEUR = ",Euro());
  return(0);}
//+------------------------------------------------------------------+
double Euro()
{ double rezult=0; int E=0;
double EURp  = MarketInfo("EURUSD",MODE_POINT);
double EURd  = MarketInfo("EURUSD",MODE_DIGITS);
double EURAsk  = MarketInfo("EURUSD",MODE_ASK);

int i;for (i=OrdersTotal()-1;i>=0;i--)
{if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true )
{
if ( OrderSymbol()== "EURUSD"    ) {
if ( OrderMagicNumber()== 0    ) {
if(OrderType() == OP_SELL ){
    
    
E = (NormalizeDouble(OrderOpenPrice(), EURd)-EURAsk)/EURp;
 }}}

}}return(E);}
 
Frostr:

никак нельзя добиться обработки данных с функции   double Euro() без задержки? 

Чуть выше ответил.