Усреднение на фортс - страница 2

 
Aleksey Vyazmikin:


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

Спасибо.

Что значит нижняя строка на снимке? как программно узнать что позиция переоткрыта, как проверить на предмет клиринга?

рро

 
Sile Si:

Спасибо.

Что значит нижняя строка на снимке? как программно узнать что позиция переоткрыта, как проверить на предмет клиринга?


Нижняя строка значит перерасчет, он может быть как со стороны биржи, так и со стороны брокера. Там ряд причин, от изменения учетных цен на актив до списания комиссии брокером.

Логику, как это сделать я описал, а код, увы предоставить не могу, может кто-то другой поможет с этим.

Кстати, не пойму, что это за время у Вас 15-47 это что за клиринг в это время?

 
Aleksey Vyazmikin:

Нижняя строка значит перерасчет, он может быть как со стороны биржи, так и со стороны брокера. Там ряд причин, от изменения учетных цен на актив до списания комиссии брокером.

Логику, как это сделать я описал, а код, увы предоставить не могу, может кто-то другой поможет с этим.

Кстати, не пойму, что это за время у Вас 15-47 это что за клиринг в это время?

Это по терминальному времени, вечерний...

Не поняла логику, позиция закрыта, как узнаем лот последней сделки?

Может быть, тогда лучше запоминать количество сделок и лот последней открытой в локальные переменные, чтобы не зависеть от клиринга? Но если терминал перезагрузится, всё обнулится, тогда нужно искать как записывать в МТ5, лот и количество сделок в файл. 

 
Sile Si:

Это по терминальному времени, вечерний...

Не поняла логику, позиция закрыта, как узнаем лот последней сделки?

Может быть, тогда лучше запоминать количество сделок и лот последней открытой в локальные переменные, чтобы не зависеть от клиринга? Но если терминал перезагрузится, всё обнулится, тогда нужно искать как записывать в МТ5, лот и количество сделок в файл. 

Тогда тем более странно, что это за брокер то такой?

Методов решения задачи может быть много, у каждого есть свои плюсы и минусы.

Позиция на "бумаге" хоть и закрывается - так как осуществляются сделки на закрытие и открытие в объеме позиции в момент клиринга, но сама то позиция остаётся существовать и все ордера и сделки остаются к ней привязаны и дальше.

Поэтому я склоняюсь к тому, что:

1. По номеру позиции надо собрать все сделки.

2. Выкинуть сделки клиринга (как идентифицировать вроде написал - по комментариям и отсутствию номера в сделке).

3. Рассчитать среднюю стоимость текущий позиции по формуле (Цена_Сделки_на_открытие_Ордера_01*Объем+Цена_Сделки_на_открытие_Ордера_02*Объем)/Объем_всех_ордеров , а если были частичные закрытия, то и скорректировать на них.

 
Aleksey Vyazmikin:

Тогда тем более странно, что это за брокер то такой?

Методов решения задачи может быть много, у каждого есть свои плюсы и минусы.

Позиция на "бумаге" хоть и закрывается - так как осуществляются сделки на закрытие и открытие в объеме позиции в момент клиринга, но сама то позиция остаётся существовать и все ордера и сделки остаются к ней привязаны и дальше.

Поэтому я склоняюсь к тому, что:

1. По номеру позиции надо собрать все сделки.

2. Выкинуть сделки клиринга (как идентифицировать вроде написал - по комментариям и отсутствию номера в сделке).

3. Рассчитать среднюю стоимость текущий позиции по формуле (Цена_Сделки_на_открытие_Ордера_01*Объем+Цена_Сделки_на_открытие_Ордера_02*Объем)/Объем_всех_ордеров , а если были частичные закрытия, то и скорректировать на них.

"open broker", но я на противоположной стороне шарика, возможно это время ближайшего ко мне сервера. Честно говоря, не заморачивалась.

Может быть можно сразу узнать лот последней сделки, которая не без номера или по комментарию?

как сюда добавить проверку комментария - если не клиринг то вернуть лот?

double Lot()

  {
   string symb=_Symbol;
   int    total       =0;
   string deal_symbol ="";

   long did;
   for(int i=0; i<PositionsTotal(); i++)
     {
      ulong pt= PositionGetTicket(i);
      long ID=PositionGetInteger(POSITION_IDENTIFIER);
      if(PositionGetString(POSITION_SYMBOL)==symb && HistorySelect(PositionGetInteger(POSITION_TIME),TimeCurrent()+60))
        {
         total=HistoryDealsTotal();

         for(int i=0; i<total; i++)
           {
            ulong dt=HistoryDealGetTicket(i);
            did=HistoryDealGetDouble(dt,DEAL_VOLUME);

           }
        }
     }
//---
   return(did);
  }
 
Sile Si:

"open broker", но я на противоположной стороне шарика, возможно это время ближайшего ко мне сервера. Честно говоря, не заморачивалась.

Может быть можно сразу узнать лот последней сделки, которая не без номера или по комментарию?

как сюда добавить проверку комментария - если не клиринг то вернуть лот?

Весьма интересно, значит брокер дает возможность открывать счет вне РФ? Ну а само время, мне кажется писали в тех поддержке, что это время исполнения сделки по часам биржи...

По поводу кода, так из справки следует, что функция Comment() способна вытащить комментарий - попробуйте её, соответственно потом сравнить заготовку комментария с полученным результатом и тогда запросить лот. Но нужен не только лот но и цена совершения сделки.

 
Aleksey Vyazmikin:

Весьма интересно, значит брокер дает возможность открывать счет вне РФ? Ну а само время, мне кажется писали в тех поддержке, что это время исполнения сделки по часам биржи...

По поводу кода, так из справки следует, что функция Comment() способна вытащить комментарий - попробуйте её, соответственно потом сравнить заготовку комментария с полученным результатом и тогда запросить лот. Но нужен не только лот но и цена совершения сделки.

Открывала, ещё в Москве)

а, зачем цена? мне нужно продолжить усреднение лотом последней сделки, которая была перед клирингом.

наверное вы имели ввиду POSITION_COMMENT. 

Так правильно будет?

double Lot_l()

  {
   string symb=_Symbol;
   int    total       =0; 
   long did;
   for(int i=0; i<PositionsTotal(); i++)
     {
      ulong pt= PositionGetTicket(i);
      long ID=PositionGetInteger(POSITION_IDENTIFIER);
      if(PositionGetString(POSITION_SYMBOL)==symb &&
       HistorySelect(PositionGetInteger(POSITION_TIME),TimeCurrent()+60)&&
       PositionGetString(POSITION_COMMENT)!="variation margin open")
        {
         total=HistoryDealsTotal();
         for(int i=0; i<total; i++)
           {
            ulong dt=HistoryDealGetTicket(i);
            did=HistoryDealGetDouble(dt,DEAL_VOLUME);

           }
        }
     }
//---
   return(did);
  }
 
Sile Si:

Открывала, ещё в Москве)

а, зачем цена? мне нужно продолжить усреднение лотом последней сделки, которая была перед клирингом.

наверное вы имели ввиду POSITION_COMMENT. 

Так правильно будет?

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

Если у Вас примитивное усреднение, то можно в комментарий писать шаг усреднения (или размер последнего лота) и искать сделку с подобным комментарием в позиции.

Сейчас же, судя по коду, Вы выявляете текущий комментарий позиции, который если не будет о клиринге, то начнется перебор всех сделок. А вам надо найти последнюю позицию и смотреть комментарии к сделке, а не позиции, ведь позиция то закрывается только технически, но фактически то она остаётся.

 
Sile Si:

Открывала, ещё в Москве)

а, зачем цена? мне нужно продолжить усреднение лотом последней сделки, которая была перед клирингом.

наверное вы имели ввиду POSITION_COMMENT. 

Так правильно будет?

Лучше так

//+------------------------------------------------------------------+
//| Expert Get position price function                               |
//+------------------------------------------------------------------+
double GetPositionPrice( const string aSymbol )
{
  double price_in = 0;
  double volume_in = 0;
  double price_out = 0;
  double volume_out = 0;
  double price = 0;
  double volume = 0;
  
  if ( PositionSelect( aSymbol ) )
  {
    ulong pos_id = ulong( PositionGetInteger( POSITION_IDENTIFIER ) );
    
    if ( pos_id > 0 )
    {
      if ( HistorySelectByPosition( pos_id ) )
      {
        int deals = HistoryDealsTotal();
      
        for( int i = 0; i < deals; i++ )
        {
          ulong deal_ticket = HistoryDealGetTicket( i );
          ulong order_ticket = ulong( HistoryDealGetInteger( deal_ticket, DEAL_ORDER ) );
        
          if ( order_ticket > 0 )
          {
            ENUM_DEAL_ENTRY deal_entry = ENUM_DEAL_ENTRY( HistoryDealGetInteger( deal_ticket, DEAL_ENTRY ) );
              
            if ( deal_entry == DEAL_ENTRY_IN )
            {
              price = HistoryDealGetDouble( deal_ticket, DEAL_PRICE );
              volume = HistoryDealGetDouble( deal_ticket, DEAL_VOLUME );
                                
              price_in += price * volume;
              volume_in += volume;  
            }
            else
            if ( deal_entry == DEAL_ENTRY_OUT )
            {
              price = HistoryDealGetDouble( deal_ticket, DEAL_PRICE );
              volume = HistoryDealGetDouble( deal_ticket, DEAL_VOLUME );
                                
              price_out += price * volume;
              volume_out += volume;  
            }
          }
        }
        if ( volume_out > 0 )
        {
          if ( volume_in > 0 ) { price_in = price_in / volume_in; } else return( 0 );
          price_out = price_out / volume_out;
          price = ( price_in - price_out ) * ( volume_in - volume_out );
        }
        else
        {
          if ( volume_in > 0 ) { price = price_in / volume_in; } else return( 0 );
        }
        return( NormalizeDouble( price, _Digits ) );
      }
      else
      {
        Print( "GetPositionPrice: Невозможно получить историю позиции по символу ", aSymbol );
      }
    }
    else
    {
      Print( "GetPositionPrice: Невозможно определить идентификатор позиции по символу ", aSymbol );
    }
  }
  return( 0 );
} 

И вот здесь много полезных функций для ФОРТС

https://www.mql5.com/ru/forum/67298

ФОРТС: В помощь начинающим
ФОРТС: В помощь начинающим
  • 2015.11.18
  • www.mql5.com
Установка отложенного ордера командой OrderSend().
 
Aleksey Vyazmikin:

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

Если у Вас примитивное усреднение, то можно в комментарий писать шаг усреднения (или размер последнего лота) и искать сделку с подобным комментарием в позиции.

Сейчас же, судя по коду, Вы выявляете текущий комментарий позиции, который если не будет о клиринге, то начнется перебор всех сделок. А вам надо найти последнюю позицию и смотреть комментарии к сделке, а не позиции, ведь позиция то закрывается только технически, но фактически то она остаётся.

Так, я ставлю лимитники, когда они становятся сделками комментарии пропадают, ил нет?

Причина обращения: