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 ){
может в нем есть какая-то задержка в обновлении данных, а для точности нужно обновлять данные с каждым тиком.
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);
OrderClosePrice для открытого ордера возвращает текущую цену (при которой он закрылся бы)
а OrderProfit() + OrderSwap() + OrderCommision() не подходит... мне нужна прибыль в пунктах а это общая прибыль в валюте депозита...
А тебе надо с учётом свопа и комиссии, но в пунктах?
А так, здесь мешает переменная rezult. получается что при каждом обращении к функции учитывается только первый ордер, потом переменной rezult присваивается значение и в следующей итерации цикла условие if(rezult != ***) не выполнено и следующий ордер не считается.
я понял... проблема задержки в том, что сов стоит на одной валюте а пункты считывает с другой валюты, вот и получается, что Тики не совпадают из-за этого задержка в изменениях данных.
у меня мультивалютный сов ....
вот и получается ... советник стоит на GBP а прибыль в пунктах считывает с ордера по EUR, и пока не будет нового Тика на GBP - данные с ордера EUR не обновляются!
вообще без понятия как решить эту проблему...
вообще без понятия как решить эту проблему...
Чтобы своевременно обновлять, можно использовать таймер (см. событие 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);}
никак нельзя добиться обработки данных с функции double Euro() без задержки?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Никак не могу добиться, что бы функция точно выводила прибыль в пунктах с текущих ордеров.
что бы я не делал данные все рано запаздывают.
Использую вот такую функцию
думал может функция там что-нибудь округляет и из за этого данные не сходятся.. так что все данные "Нормализовал" через NormalizeDouble. но ничего не изменилось
Данные функции запаздывают :(
для слежки за показаниями функции вывел ее на график через