- Вопросы от начинающих MQL5 MT5 MetaTrader 5
- Дурацкий вопрос и "никто не видел индикатор???"
- Не могу закрыть ордер

- www.mql5.com
Ну как-же нету? Вот...
так это надо сначала открыть противоположную позицию нужным объемом, а затем 2 позиции взаимно аннигилировать что-ли? ) А если объемы не совпадают, для частичного закрытия
ничо не понял как это должно работать
так это надо сначала открыть противоположную позицию нужным объемом, а затем 2 позиции взаимно аннигилировать что-ли? ) А если объемы не совпадают, для частичного закрытия
ничо не понял как это должно работать
Я не правильно понял вопрос.
Видимо действительно нету. Я тоже не нашёл.
Может допишут или исправят существующий класс. Делов-то...
Я не правильно понял вопрос.
Видимо действительно нету. Я тоже не нашёл.
Может допишут или исправят существующий класс. Делов-то...
ну а вообще механика какая? получается, через OrderSend() нужно отправить TRADE_ACTION_DEAL нужного объема, только противоположную, предварительно в MqlTradeRequest подставить тикет нужной позиции?
Разработчики не сделали частичное закрытие. Надо унаследоваться и написать самому. Только класс CTrade не правьте, при обновлении терминала все правки пропадут.
ну это я понял, я про то что получается что мы посылаем противоположный ордер по тому же тикету, другим объемом, и она должна частично закрыться? в мт4 просто нет такого. вроде да, в сTrade так и сделано, только полным объемом, т.е. закрытие полностью. Наследоваться не надо, можно самому запрос составить.
Сделал проверку, вот так можно частично закрыть позу:
Открываем бай позу 0.5 частично закрываем встречным селл ордером 0.25 остается бай 0.25
#include <Trade\Trade.mqh> #include <Trade\PositionInfo.mqh> #include <Trade\AccountInfo.mqh> CTrade m_Trade; CPositionInfo m_Position; CAccountInfo m_Account; MqlTradeRequest m_request; MqlTradeResult m_result; MqlTick fpprcurr; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(CountPosBuy(_Symbol)==0 && CountPosSell(_Symbol)==0) { double priceBuy=fpprcurr.ask; m_Trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,0.5,priceBuy,0,0,NULL); ulong ticket; for(int pos=PositionsTotal(); pos>=0; pos--) { string symb=PositionGetSymbol(pos); if(m_Position.Select(symb) && m_Position.Type()==POSITION_TYPE_BUY) { ticket=m_Position.Ticket(); } } m_request.position=PositionGetInteger(POSITION_TICKET); m_request.order=ticket; m_request.type =ORDER_TYPE_SELL; m_request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); m_request.action =TRADE_ACTION_DEAL; m_request.symbol =_Symbol; m_request.volume =0.25; OrderSend(m_request,m_result); } } //+------------------------------------------------------------------+ int CountPosBuy(string symbol) { int result=0; for(int k=0; k<PositionsTotal(); k++) { if(m_Position.Select(symbol)==true) { if(m_Position.PositionType()==POSITION_TYPE_BUY) {result++;} else {} } } return(result); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CountPosSell(string symbol) { int result=0; for(int k=0; k<PositionsTotal(); k++) { if(m_Position.Select(symbol)==true) { if(m_Position.PositionType()==POSITION_TYPE_SELL) {result++;} else {} } } return(result); }
Сделал проверку, вот так можно частично закрыть позу:
Открываем бай позу 0.5 частично закрываем встречным селл ордером 0.25 остается бай 0.25
#include <MT4Orders.mqh> void OnStart() { OrderSend(_Symbol, OP_BUY, 0.5, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0); for (int i = OrdersTotal() - 1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS) && (OrderType() == OP_BUY) && (OrderSymbol() == _Symbol)) OrderClose(OrderTicket(), 0.25, SymbolInfoDouble(_Symbol, SYMBOL_BID), 0); }

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования