скрипт закрывающий все открытые позиции

 

Подскажите может у кого есть скрипт который бы закрывал абсолютно все открытые позиции по всем инструментам.

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

//+------------------------------------------------------------------+
//|                                             _CloseAllBuySell.mq4 |
//|                                           "СКРИПТЫ ДЛЯ ЛЕНИВОГО" |
//|         Скрипт закрывает все открытые Buy и Sell в активном окне |
//|                           Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
//#property show_confirm
extern int    Slippage      = 5;     // Проскальзывание
int start()
{
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);
}
//+------------------------------------------------------------------+
 

Потому, что цена закрытия берётся с текущего инструмента.

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

 
Могу сделать. Пиши на drknn_собака_mail.ru
 
//+------------------------------------------------------------------+
//|                                                        close.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       https://www.metaquotes.net// |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net//"
#property show_confirm
 
//+------------------------------------------------------------------+
//| script "close first market order if it is first in the list"     |
//+------------------------------------------------------------------+
void start() {
  bool   result;
  double price;
  int    cmd,error;
 
  for (int i=OrdersTotal()-1; i>=0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      cmd=OrderType();
      if (cmd==OP_BUY || cmd==OP_SELL)
      {
        while(true)
        {
          if (cmd==OP_BUY) price=MarketInfo(OrderSymbol(), MODE_BID);
          else             price=MarketInfo(OrderSymbol(), MODE_ASK);
          result=OrderClose(OrderTicket(), OrderLots(), price, 3, CLR_NONE);
          if(result!=TRUE) { error=GetLastError(); Print("LastError = ", error); }
          else error=0;
          if(error==135) RefreshRates();
          else break;
        }
      }
    }
    else Print( "Error when order select ", GetLastError());
  }
}
//+------------------------------------------------------------------+
 
в этом коде нехватает нормализации цены - я уже с этим сталкивался. Например, поза по евробаксу не закрывалась - когда я снял дамп данных, у меня получилось, что цена = например 1,32310000. С бидами и асками я ошибки не сделал, но вот чтоб уйти от этих лишних нулей пришлось делать нормализацию и только после этого скрипт заработал как часики.
 

Хотел наптсать твот какой эксперт.

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

Если копирую весь код в часть int init() , то все сразу закрывается, а вот в части int start по чему то не работает.

//+------------------------------------------------------------------+
//|                                                        мульт.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/"
extern int    Slippage      = 2;     // Проскальзывание
extern int Profit = 100;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
 
 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {  
//----
double rez_1, rez_2, total_rez;
bool   result;
double price;
int    cmd,error;
 
 
 OrderSelect(0, SELECT_BY_POS) ;  
  rez_1=OrderProfit();
 
  OrderSelect(1, SELECT_BY_POS) ;  
  rez_2=OrderProfit();
 
  total_rez = rez_1 +rez_2;
Print(total_rez);
  if (Profit>total_rez)  // сделал специально чтоб сразу проверить будет закрывать или нет
  {
    for (int i=OrdersTotal()-1; i>=0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      cmd=OrderType();
      if (cmd==OP_BUY || cmd==OP_SELL)
      {
        while(true)
        {
          if (cmd==OP_BUY) price=MarketInfo(OrderSymbol(), MODE_BID);
          else             price=MarketInfo(OrderSymbol(), MODE_ASK);
          result=OrderClose(OrderTicket(), OrderLots(), price, 3, CLR_NONE);
          if(result!=TRUE) { error=GetLastError(); Print("LastError = ", error); }
          else error=0;
          if(error==135) RefreshRates();
          else break;
        }
      }
    }
    else Print( "Error when order select ", GetLastError());
  }
}
  //----
   return(0);
  }
//+------------------------------------------------------------------+
 
В блок инициализации основной код советника совать не надо - код этого блока выполняется только 1 раз при старте эксперта.
 
смогли ли вы найти или написать данный скрипт?
 
telnet писал(а) >>

Подскажите может у кого есть скрипт который бы закрывал абсолютно все открытые позиции по всем инструментам.

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

Просто Вы взяли не тот скрипт :). О чем было в заголовке и написано

//+------------------------------------------------------------------+
//|                                             _CloseAllSymbols.mq4 |
//|                                           "СКРИПТЫ ДЛЯ ЛЕНИВОГО" |
//|        Скрипт закрывает все открытые Buy и Sell по всем символам |
//|                           Bookkeeper, 2007, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
//#property show_confirm // Если есть желание менять Slippage в процессе
// если желания нет - закоментировать так:    //#property show_confirm
//----
extern int Slippage = 3;     // Проскальзывание
//----
int start()
{
double price;
bool   Result;
int    i,pos,Error,Total;
string symbol_i;
color  c;
//----
  if(Slippage<1) Slippage=1;
  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<2) 
           {
              symbol_i=OrderSymbol();
              //RefreshRates();
              if(pos==OP_BUY)
              {
                 price=MarketInfo(symbol_i,MODE_BID);
                 //c=Blue;
              }
              else
              {
                 price=MarketInfo(symbol_i,MODE_ASK);
                 //c=Magenta;
              }
              Result=OrderClose(OrderTicket(),
                                OrderLots(),
                                price,
                                Slippage,
                                CLR_NONE);
              if(Result!=true) 
              { 
                 Error=GetLastError(); 
                 Alert("CloseAllSymbols LastError = ",Error); 
              }
              else Error=0;
           }
        }
     }
  }
  return(0);
}
 

Конкретно нужного Вам у меня нет, есть советник-полуавтомат для мультика на 14 открытых поз. Профит/лось я отслеживаю по-другому, а в нужный момент запускаю закрывашку, в отличии от скрипта он и крутится пока все свои (определяет по магику 1401) позы не закроет. Потом об этом сообщает и просит себя удалить. Попробуйте сделать нечто по образу и подобию, если понравится.

//+------------------------------------------------------------------+
//|                                               ea_closer_1401.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Bookkeeper"
#property link      "yuzefovich@gmail.com"
//----
extern int Slippage = 3;
extern int MagicNumber=1401;
bool count=true;
//----
int start()
{
  double price;
  bool   Result;
  int    i,pos,Error,Total;
  string symbol_i;
  if(count==false) return(0);
  if(Slippage<2) Slippage=2;
  Total=OrdersTotal();
  if(Total>0)
  {
     int NMagic=0;
     for(i=Total-1; i>=0; i--) 
     {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
        {
           pos=OrderType();
           if(pos<2 && OrderMagicNumber()==MagicNumber) 
           {
              NMagic++;
              symbol_i=OrderSymbol();
              if(pos==OP_BUY) price=MarketInfo(symbol_i,MODE_BID);
              else price=MarketInfo(symbol_i,MODE_ASK);
              Result=OrderClose(OrderTicket(),
                                OrderLots(),
                                price,
                                Slippage,
                                CLR_NONE);
              if(Result!=true) 
              { 
                 Error=GetLastError(); 
                 Alert("ea_closer_1401 LastError = ",Error); 
              }
              else Error=0;
           }
        }
     }
     if(NMagic==0)
     {
        count=false;
        MessageBox("ea_closer_1401: All 1401 are closed. Close me.",
                   "Information");
     }
  }
  else
  {
     count=false;
     MessageBox("ea_closer_1401: All 1401 are closed. Close me.",
                "Information");
  }
  return(0);
}
//+------------------------------------------------------------------+
Причина обращения: