Как работает - PositionCloseBy?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vjacheslav Lapaev
1455
Vjacheslav Lapaev  

Кто может подсказать ответ на следующий вопрос:

 

Условие для закрытия встречных ордеров, Buy и Sell - метки наличия позиций.

 Например, пусть, позиция Buy = 1 лот, позиция Sell = 2 лота.

if(Buy!=0 && Sell!=0)  m_Trade.PositionCloseBy(Sell_Ticket, Buy_Ticket);

 Выражение то работает, то нет. Почему?

Не работает в том случае, если цена открытия позиции Sell ниже цены открытия позиции Buy.

Возможно, это существенно, так как, если с точностью до наоборот :), позиции закрываются.

Вот такие вот загадочные дела :) 

Vladimir Karputov
Модератор
181791
Vladimir Karputov  
Vjacheslav Lapaev:

Кто может подсказать ответ на следующий вопрос:

 

Условие для закрытия встречных ордеров, Buy и Sell - метки наличия позиций.

 Например, пусть, позиция Buy = 1 лот, позиция Sell = 2 лота.

if(Buy!=0 && Sell!=0)  m_Trade.PositionCloseBy(Sell_Ticket, Buy_Ticket);

1) Выражение то работает, то нет. Почему?

2) Не работает в том случае, если цена открытия позиции Sell ниже цены открытия позиции Buy.

Возможно, это существенно, так как, если с точностью до наоборот :), позиции закрываются.

Вот такие вот загадочные дела :) 

  1. Проверяете коды возврата?
  2. Специально проверочный тест (тестировать на периоде с 2016.12.19 по сегодня, символ EURUSD,D1):
//+------------------------------------------------------------------+
//|                                              PositionCloseBy.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property description "PositionCloseBy(Sell_Ticket, Buy_Ticket) когда цена Sell_Ticket ниже цены  Buy_Ticket)"
#property description "позиция Buy = 0.01 лот, позиция Sell = 0.02 лота."
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#property version   "1.00"
//---
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
bool           BuyIsOpen=false;              // false - позиция Buy ещё не открыта
bool           SellIsOpen=false;             // false - позиция Sell ещё не открыта
bool           CloseBy=false;                // false - CloseBy ещё не выполняли
ulong          BuyTicket=0;                  // тикет позиции Buy
ulong          SellTicket=0;                 // тикет позиции Sell
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   BuyTicket=0;
   SellTicket=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!BuyIsOpen)
     {
      if(iTime(0)>=D'2016.12.19 09:00:00')
        {
         if(m_trade.Buy(0.01))
           {
            if(m_trade.ResultRetcode()==TRADE_RETCODE_DONE && m_trade.ResultDeal()!=0)
              {
               BuyTicket=m_trade.ResultDeal();
               BuyIsOpen=true;
              }
           }
        }
     }
//---
   if(!SellIsOpen)
     {
      if(iTime(0)>=D'2016.12.19 11:00:00')
        {
         if(m_trade.Sell(0.02))
           {
            if(m_trade.ResultRetcode()==TRADE_RETCODE_DONE && m_trade.ResultDeal()!=0)
              {
               SellTicket=m_trade.ResultDeal();
               SellIsOpen=true;
              }
           }
        }
     }
//---
   if(BuyIsOpen && SellIsOpen && !CloseBy)
     {
      if(iTime(0)>=D'2016.12.19 13:00:00')
        {
         if(m_trade.PositionCloseBy(SellTicket,BuyTicket))
           {
            Print("PositionCloseBy -> true. Result Retcode: ",m_trade.ResultRetcode(),
                  ", description of result: ",m_trade.ResultRetcodeDescription());
            CloseBy=true;
           }
         else
           {
            Print("PositionCloseBy -> false. Result Retcode: ",m_trade.ResultRetcode(),
                  ", description of result: ",m_trade.ResultRetcodeDescription());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Get Time for specified bar index                                 |
//+------------------------------------------------------------------+
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[1];
   datetime time=0;
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied>0) time=Time[0];
   return(time);
  }
//+------------------------------------------------------------------+

Результат:

15:31:08.081    Tester  EURUSD,H1: testing of Experts\MyExp\CTrade\PositionCloseBy.ex5 from 2016.12.19 00:00 to 2016.12.20 00:00 started
15:31:46.218    Trade   2016.12.19 09:00:11   price corrected from 1.04762 to 1.04753, deviation: 10 (instant buy 0.01 EURUSD at 1.04762)(1.04746 / 1.04753 / 1.04746)
15:31:46.218    Trade   2016.12.19 09:00:11   instant buy 0.01 EURUSD at 1.04753 (1.04746 / 1.04753 / 1.04746)
15:31:46.218    Trades  2016.12.19 09:00:11   deal #2 buy 0.01 EURUSD at 1.04753 done (based on order #2)
15:31:46.218    Trade   2016.12.19 09:00:11   deal performed [#2 buy 0.01 EURUSD at 1.04753]
15:31:46.218    Trade   2016.12.19 09:00:11   order performed buy 0.01 at 1.04753 [#2 buy 0.01 EURUSD at 1.04753]
15:31:46.224    PositionCloseBy (EURUSD,H1)     2016.12.19 09:00:11   CTrade::OrderSend: instant buy 0.01 EURUSD at 1.04762 [done at 1.04753]
15:32:01.445    Trade   2016.12.19 11:00:01   instant sell 0.02 EURUSD at 1.04629 (1.04629 / 1.04638 / 1.04629)
15:32:01.445    Trades  2016.12.19 11:00:01   deal #3 sell 0.02 EURUSD at 1.04629 done (based on order #3)
15:32:01.445    Trade   2016.12.19 11:00:01   deal performed [#3 sell 0.02 EURUSD at 1.04629]
15:32:01.445    Trade   2016.12.19 11:00:01   order performed sell 0.02 at 1.04629 [#3 sell 0.02 EURUSD at 1.04629]
15:32:01.445    PositionCloseBy (EURUSD,H1)     2016.12.19 11:00:01   CTrade::OrderSend: instant sell 0.02 EURUSD at 1.04629 [done at 1.04629]
15:32:42.939    Trade   2016.12.19 13:00:02   close position #3 sell 0.02 EURUSD by position #2 buy 0.01 EURUSD (1.04441 / 1.04448 / 1.04441)
15:32:42.939    Trades  2016.12.19 13:00:02   deal #4 buy 0.01 EURUSD at 1.04753 done (based on order #4)
15:32:42.939    Trades  2016.12.19 13:00:02   deal #5 sell 0.01 EURUSD at 1.04629 done (based on order #4)
15:32:42.939    PositionCloseBy (EURUSD,H1)     2016.12.19 13:00:02   CTrade::OrderSend: close position #3 by #2 [done]
15:32:44.262    PositionCloseBy (EURUSD,H1)     2016.12.19 13:00:02   PositionCloseBy -> true. Result Retcode: 10009, description of result: done


 


Файлы:
Vjacheslav Lapaev
1455
Vjacheslav Lapaev  
Vladimir Karputov:
  1. Проверяете коды возврата?
  2. Специально проверочный тест (тестировать на периоде с 2016.12.19 по сегодня, символ EURUSD,D1):
Красиво. Спасибо. Разобрался.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий