Добрый день.
Не подскажите как можно определить безубыточный уровень ТП, если открыто несколько позиций?
:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Vladimir Karputov, 2017.11.26 13:45
Calculation Net Price.mq5 version "1.003" - так как сегодня выходные, то был встроен блок кода, который открывает позиции только если код запущен в тестере стратегий. В коде благодарность @Andrei Fandeev за предоставленную формулу:
//+------------------------------------------------------------------+ //| Calculation Net Price.mq5 | //| Copyright © 2017, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2017, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.003" #property description "Positions are only opened in the strategy tester!" #property description "Formula for \"Breakeven\" is provided Andrei Fandeev https://www.mql5.com/ru/users/andreifan" #property description "in: https://www.mql5.com/ru/forum/220911/page2#comment_6105972" //--- #include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> CPositionInfo m_position; // trade position object CTrade m_trade; // trading object CSymbolInfo m_symbol; // symbol info object
void OnTick() { double profit = 0.0, allLots = 0.0, tickValue; SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE, tickValue); for(int cnt=0; cnt<PositionsTotal(); cnt++) { if( PositionGetSymbol(cnt) != _Symbol ) continue; if( PositionGetInteger(POSITION_MAGIC) != 12345 ) continue; if( PositionGetInteger(POSITION_TYPE)!=ORDER_TYPE_BUY && PositionGetInteger(POSITION_TYPE)!=ORDER_TYPE_SELL) continue; profit += PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP); allLots += PositionGetDouble(POSITION_VOLUME); } int pipsProfit = (int)MathFloor(profit / (tickValue * allLots)); }Как-то так. Не проверял, но вроде все правильно.
P.S. Подобное хорошо применять если позиции одного типа. Тогда да стопы можно ставить. Но если они разные, то любой фиксированный сред, иногда становится плавающим. Что может привести к закрытию одного направления, при том что второе останется висеть.
При разнонаправленных позициях, лучший вариант ориентироваться на нужный профит и закрывать с лета.
int star() { //----+ double lots=0; double sum=0; for (i=0; i<OrdersTotal(); i++) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if (OrderSymbol()!=Symbol()) continue; if (OrderType()==OP_BUY) { lots=lots+OrderLots(); sum=sum+OrderLots()*OrderOpenPrice(); } if (OrderType()==OP_SELL) { lots=lots-OrderLots(); sum=sum-OrderLots()*OrderOpenPrice(); } } double price=0; if (lots!=0) price=sum/lots; //---- return(0); }
Добрый день.
Не подскажите как можно определить безубыточный уровень ТП, если открыто несколько позиций?
ну кроме как брать каждую позицию, и сравнивать ТП первой (в данном случае самой нижней) с ТП всех остальных, и двигать уровень ТП вверх пока пока общая сумма всех ТП не даст ноль или небольшую прибыль.....Ток такое приходит на ум...
:
Вам надо просто рассчитать среднюю цену открытия всех позиций.
Это очень плохая реализация, потому что есть 99.9% вероятность закрытия вроде по безубытку, а на самом деле в убытке, потому как не учитываются свопы и комиссии
Спасибо, ребят!)
Вот кусочек кода считает общую совокупную позицию и ее профит.
for (int i=0;i<=count-1;i++) { if (OrderSelect(OrderArray[i], SELECT_BY_TICKET, MODE_TRADES)) { if (OrderType()==OP_BUY) { BuyLot=BuyLot+OrderLots(); BuyProfit = BuyProfit + OrderProfit()+OrderCommission()+OrderSwap(); BuyCount++; } if (OrderType()==OP_SELL) { SellLot=SellLot+OrderLots(); SellProfit = SellProfit + OrderProfit()+OrderCommission()+OrderSwap(); SellCount++; } } Profit = Profit + OrderProfit()+OrderCommission()+OrderSwap(); //общий профит всех ордеров }
Далее рассчитываем уровень без убытка.
if (BuyLot > 0) { UrBezB = Bid - (BuyProfit / (TickValue * BuyLot) * Point); //уровень безубытка для BUY ордеров } if (SellLot > 0) { UrBezS = Ask + (SellProfit / (TickValue * SellLot) * Point); //уровень без убытка для SELL ордеров } double UrObBez = 0; if (BuyLot > 0 && SellLot > 0)//Без убыток для разнонаправленных ордеров { if (BuyLot > SellLot) { UrObBez = Bid - ((BuyProfit + SellProfit) / (TickValue * (BuyLot-SellLot)) * Point); } if (BuyLot < SellLot) { UrObBez = Ask + ((BuyProfit + SellProfit) / (TickValue * (SellLot-BuyLot)) * Point); } if (BuyLot == SellLot) UrObBez = 0; UrObBez = NormalizeDouble(UrObBez,Digits()); }
Для более точного определения уровня необходимо учитывать еще и спред.
P.S. Код сделан для 4-той версии терминала. Переменная TickValue это:
double TickValue = MarketInfo(Symbol(),MODE_TICKVALUE);
Вот кусочек кода считает общую совокупную позицию и ее профит.
Далее рассчитываем уровень без убытка.
Для более точного определения уровня необходимо учитывать еще и спред.
P.S. Код сделан для 4-той версии терминала. Переменная TickValue это:
Заполнение OrderArray[i] не показали.
Заполнение OrderArray[i] не показали.
Это не принципиально. Главное сам алгоритм. OrderArray[i] заполняется в другой функции и в нем содержатся тикеты всех открытых позиций и отложенных ордеров.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день.
Не подскажите как можно определить безубыточный уровень ТП, если открыто несколько позиций?
ну кроме как брать каждую позицию, и сравнивать ТП первой (в данном случае самой нижней) с ТП всех остальных, и двигать уровень ТП вверх пока пока общая сумма всех ТП не даст ноль или небольшую прибыль.....Ток такое приходит на ум...
: