Клиринг в тестере - страница 4

 
Roman Shiredchenko #:

На списания во время клиринга можно не обращать внимания.

Пример. Открыта сделка бай по цене 50,  в момент начала клиринга цена допустим 70. Во время клиринга вашу сделку удалят и начислят вам 20 тугриков, после клиринга ваша сделка будет открыта по цене 70.

Если вы закроете её по цене 100, то в итоге в терминале отразится одна сделка с прибылью 50 тугриков. 

Проблема обычно возникает при написании трала или БУ. Допустим мы когда сделка 15+ хотим поставить БУ  в +5. 

Тогда если брать цифры из примера, получится, что перед клирингом у нас стоп лосс уже будет стоять в +5 пунктов, а после клиринга, он окажется  -5 пунктов.  Но если сделка в итоге закроется по стопу, то мы всё равно получим свои 5 тугриков плюса.

Поэтому в тестере клиринг можно не учитывать.

 
Aleksandr Slavskii #:

Реально просто, а главное надёжно. 


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

Проблема такая: брокер открывашка, во время клиринга удаляет отложенные ордера, а поле клиринга по новой их не выставляет.

Не знаю как на фьючах, но на акциях клиринг заканчивается в разное время.

Так вот, програмно я так и не смог определить момент окончания клиринга по конкретной бумаге.

Тупо отправляю по таймеру приказ на выставление ордера, до тех пор пока он не откроется.

Мне такой подход не нравится, а другого у меня нет.

Да все в порядке - обсуждайте и обсуждаем совместно - тема для всех открыта!!!!!
 
Aleksandr Slavskii #:

На списания во время клиринга можно не обращать внимания.

Пример. Открыта сделка бай по цене 50,  в момент начала клиринга цена допустим 70. Во время клиринга вашу сделку удалят и начислят вам 20 тугриков, после клиринга ваша сделка будет открыта по цене 70.

Если вы закроете её по цене 100, то в итоге в терминале отразится одна сделка с прибылью 50 тугриков. 

Проблема обычно возникает при написании трала или БУ. Допустим мы когда сделка 15+ хотим поставить БУ  в +5. 

Тогда если брать цифры из примера, получится, что перед клирингом у нас стоп лосс уже будет стоять в +5 пунктов, а после клиринга, он окажется  -5 пунктов.  Но если сделка в итоге закроется по стопу, то мы всё равно получим свои 5 тугриков плюса.

Поэтому в тестере клиринг можно не учитывать.

О! как интересно... надо будет углубиться и опробовать! :-)

написал (взял из статьи) ф-ию именно out считать из сделок по истори, по факту (это у кого поза кроется в плюса) - считаем последовательный минус и выводим на экран - типа УЧЕТ клиринга, может конечно не совсем это будет все корректно при торгах - просто пока смотрю...

В итоге чтобы ТОЧНО закрыть например позицию с учетом прошлого клиринга, если он был минусовой - то надо сравнивать значения закрываемого профита и предыдущего лосса по клирингу.

//+------------------------------------------------------------------+
//|                 УЧЕТ КЛИРИНГА
//+------------------------------------------------------------------+
double Calc_Clearing() // вычисление лота
  {
   bool ord;
   double TotalLot=0;
    for(int i=HistoryDealsTotal()-1; i>=0; i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);
      if(ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol
       //  && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC
         && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT)
        {
         if(HistoryDealGetDouble(ticket,DEAL_PROFIT) <= 0)
           {
            TotalLot+=HistoryDealGetDouble(ticket,DEAL_VOLUME);
           }
         else
           {
            break;
           }
        }
     }
   return TotalLot == 0 ? TotalLot: TotalLot;
  }

нашел ошибку - исправить:

TotalLot+=HistoryDealGetDouble(ticket,DEAL_PROFIT);

в итоге вот такая картина на экране вверху до этого вставить:

   Comment(" SPREAD текущий по символу ", _Symbol, " составляет: ", SymbolInfoInteger(_Symbol,SYMBOL_SPREAD),
    "      СВЕРКА по клирингу:  ", NormalizeDouble(Calc_Clearing(),0));

сверка по клирингу

потому что не было еще убытка по клирингу:

09.11.2021 года: все "out" - в плюса:


 
Roman Shiredchenko #:

Ужас! Слишком много не правильно, чтоб комментировать.

Давайте по другому.

Зачем вам история сделок, если вас интересует позиция?

Имхо, достаточно при каждой новой сделке в переменную записать цену последней позиции, а когда придёт клиринг, скорректировать БУ на разницу между ценой записанной в переменной и ценой последнего перед клирингом тика.

Пример:

lot = 1;

double end_position=0;

первая сделка по  цене 30,      end_position = 30;

вторая сделка по цене  60,      end_position = 45;

третья сделка по цене  90,      end_position = 60;


То есть у вас есть позиция по цене 60 объёмом 3.  

Допустим клиринг пришёл когда цена была 70, прибыль получается 30 тугриков.

double clearing_price = 70;

После клиринга у вас откроется позиция по цене 70, но мы то помним, что реальная цена этой позиции    end_position == 60;  соответственно именно от этой цены нужно рассчитывать трал или БУ.

Соответственно во время клиринга заполнить переменную 

double  corrector =  0;

corrector =  clearing_price - end_position;

Допустим стар БУ у вас когда сделка будет в +20 пунктов , соответственно в функцию БУ дописываем, что старт БУ равен:  20 - corrector;

А также БУ ставится сколько то пунктов в плюс, их тоже надо скорректировать на значение   corrector.

После закрытия любой позиции   corrector =  0;


Но это будет работать, только если после клиринга нет частичных закрытий или доливок. Если есть, то нужно по другому.

 
Aleksandr Slavskii #:

Реально просто, а главное надёжно. 


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

Проблема такая: брокер открывашка, во время клиринга удаляет отложенные ордера, а поле клиринга по новой их не выставляет.

Не знаю как на фьючах, но на акциях клиринг заканчивается в разное время.

Так вот, програмно я так и не смог определить момент окончания клиринга по конкретной бумаге.

Тупо отправляю по таймеру приказ на выставление ордера, до тех пор пока он не откроется.

Мне такой подход не нравится, а другого у меня нет.

У меня тоже открывашка, но на фьючах. Тоже проблема окончания клиринга, как определить - не знаю, просто беру 19:05.

Отложки же можно выставлять до даты, не только на сегодня. По крайней мере, на фьючах.

 
Aleksandr Slavskii #:

1. Ужас! Слишком много не правильно, чтоб комментировать.

Давайте по другому.

Зачем вам история сделок, если вас интересует позиция?

Имхо, достаточно при каждой новой сделке в переменную записать цену последней позиции, а когда придёт клиринг, скорректировать БУ на разницу между ценой записанной в переменной и ценой последнего перед клирингом тика.

Пример:

lot = 1;

double end_position=0;

первая сделка по  цене 30,      end_position = 30;

вторая сделка по цене  60,      end_position = 45;

третья сделка по цене  90,      end_position = 60;


То есть у вас есть позиция по цене 60 объёмом 3.  

Допустим клиринг пришёл когда цена была 70, прибыль получается 30 тугриков.

double clearing_price = 70;

После клиринга у вас откроется позиция по цене 70, но мы то помним, что реальная цена этой позиции    end_position == 60;  соответственно именно от этой цены нужно рассчитывать трал или БУ.

Соответственно во время клиринга заполнить переменную 

double  corrector =  0;

corrector =  clearing_price - end_position;

Допустим стар БУ у вас когда сделка будет в +20 пунктов , соответственно в функцию БУ дописываем, что старт БУ равен:  20 - corrector;

А также БУ ставится сколько то пунктов в плюс, их тоже надо скорректировать на значение   corrector.

После закрытия любой позиции   corrector =  0;


2. Но это будет работать, только если после клиринга нет частичных закрытий или доливок. Если есть, то нужно по другому.

1. Спс, что расписали. Я хочу пока посмотреть без корректора, т.к. у меня есть доливки и трал с бу + например, 30 пп, также после выставления трала могут быть частичные закрытия согласно логике работы робота. Т.е. после открытия стартовой, запомнил цену открытия, после доливки - усреднения - опять запомнил НОВУЮ цену открытия позиции совокупкой. И по сути уже клиринг и выставление после него новой цены открытия позиции брокером  не будет иметь значения.

Я правильно понимаю, что такой подход тоже может иметь место быть согласно  логики торгов выше здесь написанной в этом моем посте...

Далее уже если текущая цена актива позволяет, то перенос СЛ в БУ + 30 пп от ранее запомненной цены совокупной позиции.

И по фигу на актуальную цену открытия позиции по фьючу, выставленную брокером?


2.

" Но это будет работать, только если после клиринга нет частичных закрытий или доливок. Если есть, то нужно по другому. "

У меня есть доливки... и до и после - пока не переведет в БУ + 30 пп - неужели считать актуальную среднюю цену по всем ордерам рыночным через массивы, ведь нужна будет

и цена открытия ордера рыночного и их кол-во и объемы контрактов по каждому ордеру... чтобы вывести среднюю цену общую по ним - откуда перевод в БУ - считать...


СРЕДНЯЯ_ЦЕНА = ((OPEN_1 * VOLUME_1) +(OPEN_2 * VOLUME_2) +(OPEN_3 * VOLUME_3)+n) / (VOL_1+VOL_2 + VOL_3 + n), вот и получается что мне пока не перевел СЛ в БУ + 30 пп по всей совокупной позиции - необходимо все эти значения писать в массивы что ли? Веди при открытии N-ой доливки по рыночному ордеру - надо поднимать всю эту цепь, чтобы рассчитать СРЕДНЮЮ по всем?

или как- то можно обыграть через:

HistoryOrderSelect ()
HistoryOrderGetTicket ()

но там возникает вопрос, как брать начало и конец цикла АКТУАЛЬНЫХ  ордеров рыночных, которые участвуют в формировании АКТУАЛЬНОЙ совокупной позиции?

 
Roman Shiredchenko #:

ЕДНЯЯ_ЦЕНА = ((OPEN_1 * VOLUME_1) +(OPEN_2 * VOLUME_2) +(OPEN_3 * VOLUME_3)+n) / (VOL_1+VOL_2 + VOL_3 + n), вот и получается что мне пока не перевел СЛ в БУ + 30 пп по всей совокупной позиции - необходимо все эти значения писать в массивы что ли? Веди при открытии N-ой доливки по рыночному ордеру - надо поднимать всю эту цепь, чтобы рассчитать СРЕДНЮЮ по всем?

Увы, именно так.

 

Roman Shiredchenko #:

СРЕДНЯЯ_ЦЕНА = ((OPEN_1 * VOLUME_1) +(OPEN_2 * VOLUME_2) +(OPEN_3 * VOLUME_3)+n) / (VOL_1+VOL_2 + VOL_3 + n), вот и получается что мне пока не перевел СЛ в БУ + 30 пп по всей совокупной позиции - необходимо все эти значения писать в массивы что ли? Веди при открытии N-ой доливки по рыночному ордеру - надо поднимать всю эту цепь, чтобы рассчитать СРЕДНЮЮ по всем?

или как- то можно обыграть через:

но там возникает вопрос, как брать начало и конец цикла АКТУАЛЬНЫХ  ордеров рыночных, которые участвуют в формировании АКТУАЛЬНОЙ совокупной позиции?

Достаточно хранить последнюю среднюю цену.

 
JRandomTrader #:

Достаточно хранить последнюю среднюю цену.

ОК а если я доливаю например, любым объемом - то как считать ее АКТУАЛЬНУЮ?
 
Roman Shiredchenko #:
ОК а если я доливаю например, любым объемом - то как считать ее АКТУАЛЬНУЮ?

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