Как запретить советнику закрывать последнюю открытую позицию - страница 3

 
Вот теперь всё. Проверил .
//+----------------------------------------------------------------------------------------------+
//|                                                                             Traling_Stop.mq4 |
//|                                                                          FOReignEXchange2008 |
//|                                                                    http://forexsignal.sk6.ru |
//+----------------------------------------------------------------------------------------------+
                                                        #property copyright "FOReignEXchange2008"
                                                      #property link      "FOReignEXchange@bk.ru"

extern double Lot=0.1;

int ticket_Buy,
    ticket_Sell,
    Ticket,  
    t_open_Buy,
    t_open_Sell,
    i;
  
string Symb;
//+--------------------------------------------------------------------------------------------+


int start()
  { 
  
  
  
//+--------------------------------------------------------------------------------------------+ 
Symb=Symbol();
if (ticket_Buy==0)
   {
   i=OrdersTotal() ;
   while (i>-1)
         {
         if (OrderSelect(i, SELECT_BY_POS)==true)
            {
            if (OrderSymbol()==Symb && OrderType()==0 && OrderOpenTime()>t_open_Buy)
               {
               t_open_Buy=OrderOpenTime();
               ticket_Buy=OrderTicket();            
               }
            }
         i--;
         }  
   }
if (ticket_Sell==0)
   {    
   i=OrdersTotal();
   while (i>-1)
         {
         if (OrderSelect(i, SELECT_BY_POS)==true)
            {
            if (OrderSymbol()==Symb && OrderType()==1 && OrderOpenTime()>t_open_Sell)
               {
               t_open_Sell=OrderOpenTime();
               ticket_Sell=OrderTicket();            
               }
            }
         i--;
         }         
   }  

  
//+--------------------------------------------------------------------------------------------+  

if (ticket_Buy!=0 && Ticket==0)
   {
   i=OrdersTotal();
   while (i>-1)
          {
          if (OrderSelect(i, SELECT_BY_POS)==true)
             {
             if (OrderTicket()!=ticket_Buy && OrderSymbol()==Symb && OrderType()==0)
                {
                Ticket=OrderTicket();
                OrderClose(Ticket,Lot,Bid,5);
                }            
             }
          i--;
          }
    }

  
if (ticket_Sell!=0 && Ticket==0)
   {
   i=OrdersTotal();
   while (i>-1)
          {
          if (OrderSelect(i, SELECT_BY_POS)==true)
             {
             if (OrderTicket()!=ticket_Sell && OrderSymbol()==Symb && OrderType()==1)
                {
                Ticket=OrderTicket();
                OrderClose(Ticket,Lot,Ask,5);
                }            
             }
          i--;
          }          
    } 
//+--------------------------------------------------------------------------------------------+
return;   
  }
 
FOReignEXchange >>:
Вот теперь всё. Проверил .

Это рабочий скрипт?

 
Это советник. Работает. Только главное чтоб лот при закрытии совпадал. Я его написал специально для Елены. Она встроет этот код в свой советник.
 
FOReignEXchange >>:
Это советник. Работает. Только главное чтоб лот при закрытии совпадал. Я его написал специально для Елены. Она встроет этот код в свой советник.

Скорее часть советника, верно? Та, которую допилить нужно.

Я если честно вообще не вкурил принцип действия =)

Непонятно - откуда в переменных будут появлятся значения.

Зачем 4 блока while, если хватило бы 2-х? Ну хотя это скорее вопрос компактности кода, реализовать можно по разному конечно.

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

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

FOReignEXchange писал(а) >>
Всё закрывается и всё работает.

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

Я этот код на скорую руку написал.

Все, разобрался как работает. Реально 1 и 2 блок while можно объеденить в один, 3 и 4 - тоже. Лишние циклы - лишнее затраченное непонятно на что время.

Даже кодя на скорую руку можно избегать лишних строк.

 

В первых двух блоках идёт поиск тикета последнего открытого ордера. По Бай и Селл отдельно идёт поиск

 if (OrderSymbol()==Symb && OrderType()==0 && OrderOpenTime()>t_open_Buy)

Здесь условия.Ордер должен быть по инструменту, на который прицепился советник.  

OrderType()==0
 Означает, что идёт поиск только среди ордеров Бай.

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

и время открытия этого тикета. Если следующий найденный ордер имеет большее время закрытия, то присваивается новый номар тикета и новое времяоткрытия этого тикета. И так далее. Так идёт поиск тикета последнего открытого ордера.

  t_open_Buy=OrderOpenTime();
  ticket_Buy=OrderTicket();

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

 
XinoXano >>:

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

Все, разобрался как работает. Реально 1 и 2 блок while можно объеденить в один, 3 и 4 - тоже. Лишние циклы - лишнее затраченное непонятно на что время.

Даже кодя на скорую руку можно избегать лишних строк.

Все мои советники уже несколько месяцев работают без контроля и никакой бороды не было. Главное ставить 5 в проскальзованиях, а не 3. 

Хотя, конечно, лучше делать контроль. Но я им не пользуюсь, а просто ставлю 5. И всё.

 
FOReignEXchange >>:

Все мои советники уже несколько месяцев работают без контроля и никакой бороды не было. Главное ставить 5 в проскальзованиях, а не 3.

Хотя, конечно, лучше делать контроль. Но я им не пользуюсь, а просто ставлю 5. И всё.

Тоже неплохой метод =)

 
Chernoelena >>:
Если открыто несколько покупок например, как сделать так чтобы закрывались все кроме последней.. не могу придумать. Видимо решение связано с номером тикета, но вот как это реализовать. С уважением, Елена

Добрый вечер всем присутствующим!

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

Функции можно глянуть вот здесь:  'Полезные функции от KimIV'

Функция GetTicketLastPos(). Стр.19
Эта функция возвращает тикет последней открытой позиции или -1. 
Функция GetTypeLastOpenPos(). Стп.20
Эта функция возвращает тип последней открытой позиции или -1.
Функция GetIndexLastPos(). Стр.17
Эта функция возвращает индекс последней открытой позиции или -1.
Функция GetLotLastPos(). Стр.17
Эта функция возвращает размер лота последней открытой позиции или -1
Функция GetMaxLotFromOpenPos(). Стр.17
Эта функция возвращает максимальный размер лота из числа открытых позиций
Функция GetMinLotFromOpenPos(). Стр.17
Эта функция возвращает минимальный размер лота из числа открытых позиций. 
Функция NumberOfPositions(). Стр.18
Функция IndexByTicket(). Стр.12
Возвращает индекс (порядковый номер в общем списке установленных ордеров или открытых позиций) ордера или позиции по тикету.


Функция ClosePosBySizeProfitInCurrency(). Стр.13
Эта функция выполняет закрытие только тех позиций, у которых профит в валюте депозита превысил некоторое заданное значение.
Функция ClosePositions(). Стр.14
Эта функция выполняет закрытие позиций, параметры которых удовлетворяют заданным значениям
Функция ClosePosFirstProfit(). Стр.14
Эта функция выполняет закрытие позиций в определённом порядке, то есть сначала прибыльные, а потом все остальные. 
Функция ClosePosWithMaxProfitInCurrency(). Стр.14
Эта функция выполняет закрытие одной позиции с максимальным положительным профитом в валюте депозита. То есть из пяти позиций, профит каждой из которых в данный момент составляет -34, 15, 73, -90, 41, будет закрыта позиция с профитом 73 единицы в валюте депозита
//--------------------

Удачи!


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