Подскажите, какая функция или скрипт описывает закрытие перекрытых ордеров?

 
Уважаемые, как  при помощи советника  (скрипта) произвести  одноразово или одновременно (если это возможно) закрытие всех открытых позиций.
 

Если можно  подскажите еще как правильно прописать закрытие всех  открытых позиций  при условии увеличения депо скажем на 20% или 1/5 часть
 
hoziain писал (а):

Если можно подскажите еще как правильно прописать закрытие всех открытых позиций при условии увеличения депо скажем на 20% или 1/5 часть

 
extern int percents = 25;     // Закрывает все при увилечении депо на 25 процентов
extern int Slippage =  5;     // Проскальзывание
 
double balance;
int start(){
 
   if (OrdersTotal()==0){
   balance=AccountBalance();   
   return(0);
   }
 
   if ((AccountEquity()/balance-1)*100>percents) _CloseAllBuySell();
}
 
 
//+------------------------------------------------------------------+
//|                                             _CloseAllBuySell.mq4 |
//|                                           "СКРИПТЫ ДЛЯ ЛЕНИВОГО" |
//|         Скрипт закрывает все открытые Buy и Sell в активном окне |
//|                           Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
int _CloseAllBuySell(){
bool   Result;
int    i,Pos,Error,Total;
//----
  Total=OrdersTotal();
  if(Total>0)
  {
     for(i=Total-1; i>=0; i--) 
     {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) 
        {
           Pos=OrderType();
           if(Pos==OP_BUY || Pos==OP_SELL) // Только Buy и Sell
           {
              if(Pos==OP_BUY) 
              Result=OrderClose(OrderTicket(),
                                OrderLots(),
                                Bid,
                                Slippage,
                                CLR_NONE);
              else
              Result=OrderClose(OrderTicket(),
                                OrderLots(),
                                Ask,
                                Slippage,
                                CLR_NONE);
              if(Result!=true) 
              { 
                 Error=GetLastError(); 
                 Print("LastError = ",Error); 
              }
              else Error=0;
           }
        }
     }
  }
  return(0);
}
 
Ronen:
hoziain писал (а):

Если можно подскажите еще как правильно прописать закрытие всех открытых позиций при условии увеличения депо скажем на 20% или 1/5 часть

 
extern int percents = 25;     // Закрывает все при увилечении депо на 25 процентов
extern int Slippage =  5;     // Проскальзывание
 
double balance;
int start(){
 
   if (OrdersTotal()==0){
   balance=AccountBalance();   
   return(0);
   }
 
   if ((AccountEquity()/balance-1)*100>percents) _CloseAllBuySell();
}
 
 
//+------------------------------------------------------------------+
//|                                             _CloseAllBuySell.mq4 |
//|                                           "СКРИПТЫ ДЛЯ ЛЕНИВОГО" |
//|         Скрипт закрывает все открытые Buy и Sell в активном окне |
//|                           Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
int _CloseAllBuySell(){
bool   Result;
int    i,Pos,Error,Total;
//----
  Total=OrdersTotal();
  if(Total>0)
  {
     for(i=Total-1; i>=0; i--) 
     {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) 
        {
           Pos=OrderType();
           if(Pos==OP_BUY || Pos==OP_SELL) // Только Buy и Sell
           {
              if(Pos==OP_BUY) 
              Result=OrderClose(OrderTicket(),
                                OrderLots(),
                                Bid,
                                Slippage,
                                CLR_NONE);
              else
              Result=OrderClose(OrderTicket(),
                                OrderLots(),
                                Ask,
                                Slippage,
                                CLR_NONE);
              if(Result!=true) 
              { 
                 Error=GetLastError(); 
                 Print("LastError = ",Error); 
              }
              else Error=0;
           }
        }
     }
  }
  return(0);
}


Добрый день. Вставил данный скрипт в советник, работает, но проблема оптимального выхода не получается, т.к. при выполнении условия (увеличение баланса на 25%, открытые позиции при принудительном закрытии могут иметь отрицательный профит, что и нивелирует указанное увеличение. Вопрос - можно ли закрывать в тот момент, когда средства по открытым позициям превышают текущий баланс на указаную величину? И как это прописать?
Заранее благодарен за оказанную помощь.
С Уважением
Александр
 

Не понял вопроса..... Приведите пример...

Этот код,сначала проверяет,а потом закрывает все позиции...
Допустим депо 100 и 3 поз. +25 +20 -20... вместе они дадут прибыль 25%.. . и все закроются..

 
Ronen:

Не понял вопроса..... Приведите пример...

Этот код,сначала проверяет,а потом закрывает все позиции...
Допустим депо 100 и 3 поз. +25 +20 -20... вместе они дадут прибыль 25%.. . и все закроются..


Добрый день Ronen. Вот та часть программы. При движении цены в противоположном направлении от открытой позиции, я пытаюсь доливаться некоторым колличеством ордеров. В них нет ограничений по стоплосу и профиту. Бывает так , что баланс еще не изменился(нет закрытых позиций), а средства (текущее состояние) превышают депо в 2-3 раза. Как можно добиться того. чтобы
велся контроль над текущими позициями по профиту и при получении положительного результата ,превышающего отрицательные позиции, закрывать их все одноразово в конце всего цикла.Затем советник начинает сначала.
Извеняюсь, если, что не так сформулировал.

for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
if(OrderType()==OP_BUY) // long position is opened
{
// should it be closed?

if(Bid-OrderOpenPrice()<Point*3)
{
total=OrdersTotal();
if(total<11)
{
OrderSend(Symbol(),OP_BUY,LotsOptimized(), Ask,3, 0,0, "reverse", Magic_№, 0,Red);
Sleep(10000);
}

else

if(Bid-OrderOpenPrice()>=Point*4)
{
OrderClose(OrderTicket(), OrderLots(), Ask, 3,Violet); // close position
return(0);
}


// check for trailing stop
if(StopLoss>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()>Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Point*TrailingStop, OrderTakeProfit(), 0,Green);
return(0);
}
}
}
}
}
else // go to short position
 
 

Надеюсь это поможет...

extern int percents = 25;     // Закрывает все при увилечении депо на 25 процентов
extern int Slippage =  5;     // Проскальзывание
 
double balance;
int start(){
 
   // Тут сохраняется последний известный баланс,до первой открытой позиции
   if (OrdersTotal()==0){
   balance=AccountBalance();   
   return(0);
   }
 
   //потом проверяет сколько процентов прибыли дают все открытые позиции вместе
   
   //---
   //...велся контроль над текущими позициями по профиту и при получении положительного результата,
   //превышающего отрицательные позиции, закрывать их все одноразово  в конце всего цикла.Затем советник начинает сначала.
   
   // "получении положительного результата" = увеличьте значение percents на чтото больше нуля!
   // и тогда когда эквити будет больше баланса,будет все закрывать...
   //---
   if ((AccountEquity()/balance-1)*100>percents) _CloseAllBuySell();
   
   
   // а тут нужно вставить код который будет добавлять позиции в случае если все
   // позиции вместе все еще в минусе
   
   //---
   // ... код...
   //---
   
}
 
 
//+------------------------------------------------------------------+
//|                                             _CloseAllBuySell.mq4 |
//|                                           "СКРИПТЫ ДЛЯ ЛЕНИВОГО" |
//|         Скрипт закрывает все открытые Buy и Sell в активном окне |
//|                           Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
int _CloseAllBuySell(){
bool   Result;
int    i,Pos,Error,Total;
//----
  Total=OrdersTotal();
  if(Total>0)
  {
     for(i=Total-1; i>=0; i--) 
     {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) 
        {
           Pos=OrderType();
           if(Pos==OP_BUY || Pos==OP_SELL) // Только Buy и Sell
           {
              if(Pos==OP_BUY) 
              Result=OrderClose(OrderTicket(),
                                OrderLots(),
                                Bid,
                                Slippage,
                                CLR_NONE);
              else
              Result=OrderClose(OrderTicket(),
                                OrderLots(),
                                Ask,
                                Slippage,
                                CLR_NONE);
              if(Result!=true) 
              { 
                 Error=GetLastError(); 
                 Print("LastError = ",Error); 
              }
              else Error=0;
           }
        }
     }
  }
  return(0);
}
 
2 hoziain:

Для начала - усреднение ПРОТИВ рынка ИМХО не есть хорошо.
Все, предупредил. :)
Теперь по сути проблемы.
Как я понял для примера у Вас открыт Buy а цена идет вниз, Вы открываете дополнительный Buy с точки пониже (усредняете суммарную точку открытия), цена опять вниз, Вы опять Buy и т.п. Я все правильно понял?
Далее Вы хотите при движении цены в вашем направлении, когда суммарная прибыль по всем позам станет положительной - прикрыть все позиции. Так?
Если я все понял правильно, то Вам надо контролировать Баланс (Balance) и Средства (Equity). Баланс показывает состояние только по закрытым позам. Средства показывают состояние с учетом прибыли/убытка по открытым позам. Т.е. Когда Средства превышают Баланс на нужную величину и нужно крыть все открытые позы. Теперь непосредственно о способе закрытия. Ордеров может быть много и одновременно закрыть их в одной точке циклом достаточно проблематично (никакой гарантии), поэтому лучше открыть встречную позицию (Sell в нашем примере) объемом равным СУММАРНОМУ объему ВСЕХ открытых Buy-позиций. Получаем ЛОК. А дальше спокойно разруливаем его взаимозакрытиями (лишний спред при этом аннулируется). Соответственно в результате получаем позы закрытые РОВНО в нужной точке.
Да, не забываем учитывать что возможно понадобится дополнительная маржа для встречной позиции (но это уже в зависимости от того как брокер считает маржевый залог под локи).
 
Simca:
2 hoziain:

Для начала - усреднение ПРОТИВ рынка ИМХО не есть хорошо.
Все, предупредил. :)
Теперь по сути проблемы.
Как я понял для примера у Вас открыт Buy а цена идет вниз, Вы открываете дополнительный Buy с точки пониже (усредняете суммарную точку открытия), цена опять вниз, Вы опять Buy и т.п. Я все правильно понял?
Далее Вы хотите при движении цены в вашем направлении, когда суммарная прибыль по всем позам станет положительной - прикрыть все позиции. Так?
Если я все понял правильно, то Вам надо контролировать Баланс (Balance) и Средства (Equity). Баланс показывает состояние только по закрытым позам. Средства показывают состояние с учетом прибыли/убытка по открытым позам. Т.е. Когда Средства превышают Баланс на нужную величину и нужно крыть все открытые позы. Теперь непосредственно о способе закрытия. Ордеров может быть много и одновременно закрыть их в одной точке циклом достаточно проблематично (никакой гарантии), поэтому лучше открыть встречную позицию (Sell в нашем примере) объемом равным СУММАРНОМУ объему ВСЕХ открытых Buy-позиций. Получаем ЛОК. А дальше спокойно разруливаем его взаимозакрытиями (лишний спред при этом аннулируется). Соответственно в результате получаем позы закрытые РОВНО в нужной точке.
Да, не забываем учитывать что возможно понадобится дополнительная маржа для встречной позиции (но это уже в зависимости от того как брокер считает маржевый залог под локи).

Доброй ночи,:)
Я попрбовал  последовать Вашему совету, не идти против рынка, т.е. заменил доливку на встречную, если получится прикрепить файл, см.
 
Причина обращения: