Частичное закрытие ордеров - страница 4

 
Aleksey Semenov:
 но никто ей не пользуется

Пользуются.

Я, к примеру, пользуюсь.

Но, да, поддерживается не у всех.

 
PapaYozh:

Она не у всех работает.

Пишите для себя или для Маркета? Там, где не работает, не надо торговать.

 
fxsaber:

Пишите для себя или для Маркета? Там, где не работает, не надо торговать.

Пока для себя.

 
PapaYozh:

Пока для себя.

Себя не надо обижать - торгуйте через самых выгодных по торговым условиям брокеров. Там CloseBy работает.

 
   ticket = OrderSend(Symbol(), OP_BUY, lotsize, Ask, slippage,0, 0,"Comment", Magic+no, 0,clrBlue);//no - номер ордера

   if(ticket >0)
     {
      GlobalVariableSet(Symbol()+" "+Magik+no, 0); // ведение статуса
     }

   for(int i=0; i < OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol())
           {
            if(GlobalVariableCheck(Symbol()+" "+OrderMagicNumber())==true)
              {
               int Status = GlobalVariableGet(Symbol()+" "+OrderMagicNumber()); // получение статуса

               for(int f=0; f < 6; f++)
                 {
                  if(Status == f && массивусловий[f]==true)
                    {
                     if(lotClose[f]>OrderLots())
                       {
                        lotClose[f]=OrderLots();
                       }
                     rez = OrderClose(OrderTicket(), lotClose[f], OrderClosePrice(), slippage);

                     if(rez==true)
                       {
                        if(lotClose[f]<OrderLots())
                          {
                           GlobalVariableSet(Symbol()+" "+OrderMagicNumber(),f+1);
                           break; // перезапись статуса
                          }
                        if(lotClose[f]==OrderLots())
                          {
                           GlobalVariableDel(Symbol()+" "+OrderMagicNumber());   //удаление статуса по исчерпанию лота
                           break;
                          }

                       }
                    }
                 }
              }
           }
        }
     }

как-то так вижу учёт частичного закрытия

 
Viktar Dzemikhau:

Roman Shiredchenko, у вас так, при беглом обзоре этого мессива, нет того, что мне нужно. К тому же, там слишком много чего набросано и как-то хаотично. Трейлинги, как я понимаю,

Юрия Дзюбана и тд, в перемешку с чем-то ещё.

Так не факт, что закроется та позиция, которую нужно закрыть. Хотя, конечно, теоритически это вариант.

конкретно напишите, что вам нужно - у меня да. Массива нет. Вариант работает для одной позиции рыночной. Какие проблемы?

Перепишите условия закрытия частичного под свои и все.

Я хочу одно еще подсказать, что действуйте через (я так сам буду делать) через цену открытия позиции.  Все. Тикет меняется - цена открытия нет. Пока не закроете все части позиции рыночной.

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

Там также придется набрасывать этого работа на графики каждой позиции - во внешних переменных указывая тикет соответствующей позиции для частичного закрытия.

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

" Хотя, конечно, теоритически это вариант. "

Вот, я и предлагаю Вам свой подход к рассмотрению. Как у меня это организовано, каждый вид трала имеет 20% от позиции рыночной к закрытию объема  при сработке условия трала.

Имеет тикет, который будет меняться, пока он СТАРТОВЫЙ - получаем его цену открытия, и далее уже закрываем частично по условиям,как условие закрытия сработало, то флаг его сработки сбрасываем, потом уже проверяем наличие позиции по цене (ранее запомненной)   и проверяем условия сработки частичного закрытия. При сработке одного из условий - опять часть кроете позиции. Далее снова проверяете наличие позиции в рынке по заранее запомненной цене открытия. Все.

(это уже можно юзать для варианта, когда несколько поз с одним магиком надо закрывать частично, то есть если есть позиция в рынке по заранее сохраненной цене открытия, то продолжаете проверять условия ее частичного закрытия) 


ПС В итоге, тема такая - сюда выложу текущий вариант для одной рыночной позиции: вводится тикет (если нет, 0), то юзается самый свежий открытый ордер - рыночная позиция по магику, далее уже без привлечения цены ее открытия, просто по флагу ее существования в рынке - происходит прямая и обратная ее разгрузка по сигналам (сейчас сделана разгрузка тралами по 20 % с переводом в бу).   Т.е. выставляется тейк и стоп - лосс в безубытке +   и далее уже  тралится разгружается профит частями, по СЛ или ТР закрывается вся рыночная позиция.

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

 

Коллеги - проверил в тестере (кому надо подобрать значения параметров) - все работает. Сразу - это РАБОЧИЙ вариант, кому надо причесанный вариант - будет в коде базе.  Выложу сюда.

Изначально, тема такая, при частичном закрытии - если ОДИН тикет, то вводите его номер во внешние переменные, если он равен  нулю, то закрываются по частичному закрытию все позиции с самой крайней (свежей),  проверял - для однонаправленных, также здесь нужен магик рыночным позициям - для их частичного закрытия. Кто не доволен или с глупыми вопросами - сразу - лесом.

--------------------

после теста на истории эти строки закомментить:

extern double Lot              = 2.56;     // Lot - вспомогат-ая  переменная для открытия позы ЭТИМ объемом  при тесте

extern int    TakeProfit       = 10000;     // Takeprofit
extern int    StopLoss         = 300;      // SL 

и

695 - 698 строки - там сейчас селл для теста в тестере:

if (NumberOfPositions(Symbol(), -1, Magic) == 0) 
     if (OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,
                NormalizeDouble(Ask + StopLoss*Point,Digits),  NormalizeDouble(Bid - TakeProfit*Point,Digits)," АССИСТЕНТ ",Magic,0,clrRed)==-1) 
                 Print("Ошибка ",GetLastError()," открытия ордера ");

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


Вот скрин закрытий частичных селлов:



вот баи в тестере


бай

изначально подход такой: позиция для частичного закрытия делится на 5 частей по видам трала (по названию внешних переменных все понятно):

  Trailing_ATR = true; Trailing_MA = true;  TrailingByShadow = true; Traling_Fractal = true;  

+ TrailingStop, например, 100 для пятизнака, его объем закрытия (20% стартового, т.к. всего 5 видов трала) -  делится на десять частей:


  //--- ПРОВЕРКА УСЛОВИЙ И закрытие по TrailingStop бай позиции -----------------------------------------  
     if (Flag_установки_бу_buy == true && Bid < SL_бу_B_нов && Flag_установки_простого_трала_buy == true)   
       {
        Print(" закрытие части бай ПОЗЫ по TrailingStop ", SL_бу_B_нов, "  Bid = ", NormalizeDouble(Bid,Digits)); 
        Print(" lots_sample_tral ",  NormalizeDouble(lots5 - lots_1to9*9,2), "  lots_1to9 = ", NormalizeDouble(lots_1to9,2)); 
        if (счетчик_st ==0) ClosePositions (Symbol(), OP_BUY, Magic,lots_sample_tral); 
        if (счетчик_st > 0 && счетчик_st < 10) ClosePositions (Symbol(), OP_BUY, Magic,lots_1to9); 
        //Flag_установки_простого_трала_buy = false;  // зануляем простой трал, потому что он уже сработал - больше не активируется
        счетчик_st ++;                               
       } 


ну, и собственно - позиция закрывается частями.

Сейчас еще проверю и выложу здесь экспа. На реале еще не проверял, но подобная схема экспа на реале - работает.

Где в названии -  ... на форум, строки уже закомментированы - пишете значения магика, тикета и тралов и вперед - к частичному закрытию! :-)

 
Viktar Dzemikhau:

Понадобилось реализовать закрытие позиции на мкл4 частями рандомного размера.

В принципе, я вижу это как-то так:

В данном случае, у меня реализовано частичное закрытие лонговой позиции ( 50% исходного лота ) на расстоянии 30% от цены покупки. Когда мы снова попадает в функцию частичного закрытия, перед этим самым закрытием я добавил вышеуказанный цикл:

Здесь я по истории пробегаю и просматриваю комментарии закрытого ордера. Например, вижу:

Понимаю, что этот ордер отщепнулся от позиции с тикетом № 1. Здесь всё понятно. Но откуда мне знать, тикет какой позиция остался в рынке? Ведь в рынке может быть не одна позиция. Я к тому веду, что при торговле одной позицией в конкретное время, всё элементарно. А если позиций несколько, это вопрос. Ведь нужно будет, перебираю ордера понять какой объём какой позиции закрывать и закрывать ли вообще что-либо у этой позиции.. т.к., возможно, на определённом уровне уже закрыт лот требуемый и нужно ждать другого уровня или условия, чтобы закрыть ещё часть, но, ни в кое случае, не закрывать ничего до этого момента.

все можно сделать на 4-рке, не знаю чо Вам чешут

на словах объясните необходимый алгоритм закрытия, пока без кода

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