Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Не понимаешь, как работает сервис Торговых Сигналов? Прочти соответствующую статью!
hozaiin
33
hozaiin 2006.11.13 20:52 
Уважаемые, как  при помощи советника  (скрипта) произвести  одноразово или одновременно (если это возможно) закрытие всех открытых позиций.
Ronen Kagan
807
Ronen Kagan 2006.11.13 20:56  
hozaiin
33
hozaiin 2006.11.13 21:53  

Если можно  подскажите еще как правильно прописать закрытие всех  открытых позиций  при условии увеличения депо скажем на 20% или 1/5 часть
Ronen Kagan
807
Ronen Kagan 2006.11.13 22:16  
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);
}
hozaiin
33
hozaiin 2006.11.14 13:52  
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%, открытые позиции при принудительном закрытии могут иметь отрицательный профит, что и нивелирует указанное увеличение. Вопрос - можно ли закрывать в тот момент, когда средства по открытым позициям превышают текущий баланс на указаную величину? И как это прописать?
Заранее благодарен за оказанную помощь.
С Уважением
Александр
Ronen Kagan
807
Ronen Kagan 2006.11.14 18:12  

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

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

hozaiin
33
hozaiin 2006.11.15 11:27  
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
 
Ronen Kagan
807
Ronen Kagan 2006.11.15 12:22  

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

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);
}
ANDREAS BOURINARIS
278
ANDREAS BOURINARIS 2006.11.15 17:02  
2 hoziain:

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

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

Доброй ночи,:)
Я попрбовал  последовать Вашему совету, не идти против рынка, т.е. заменил доливку на встречную, если получится прикрепить файл, см.
hozaiin
33
hozaiin 2006.11.15 22:12  
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий