Скачать MetaTrader 5

Как при одном тике, закрыть все открытые позы?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114293
Forex Trader  
Как при одном тике, закрыть все открытые позы?
И неплохо было бы закрывать с начало парные (противоположные) позы
Forex Trader
114293
Forex Trader  
void init() {
}

void deinit() {
}

void start() {

  CloseOrders();
  DeleteOrders();

}

void CloseOrders() 
{  
  int cnt = OrdersTotal();
  for (int i=cnt-1; i >= 0; i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    
    int type = OrderType();
    
    if (type == OP_BUY) {
      RefreshRates();
      CloseOrder(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID));
    }
          
    if (type == OP_SELL) {
      RefreshRates();
      CloseOrder(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK));
    }
  }
  
}

void DeleteOrders() 
{
  int cnt = OrdersTotal();
  for (int i=cnt-1; i >= 0; i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
        
    int type = OrderType();
    
    if (type == OP_BUYSTOP || type == OP_SELLSTOP || type == OP_BUYLIMIT || type == OP_SELLLIMIT) {
      DeleteOrder(OrderTicket());
    }
  }
}

//-----

#include <stdlib.mqh>
#include <stderror.mqh>

int SleepOk = 2000;
int SleepErr = 6000;
int Slippage = 3;

bool CloseOrder(int ticket, double lot, double price) {

  if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) return(false);
  int dig = MarketInfo(OrderSymbol(), MODE_DIGITS);

  string _lot = DoubleToStr(lot, 1);
  string _price = DoubleToStr(price, dig);

  Print("CloseOrder ", ticket, ", ", _lot, ", ", _price, ", ", Slippage);
  
  bool res = OrderClose(ticket, lot, price, Slippage);
  if (res) {
    Sleep(SleepOk);
    return (res);
  } 	
   	
  int code = GetLastError();
  Print("CloseOrder failed: ", ErrorDescription(code), " (", code, ")");
  Sleep(SleepErr);
	
  return (false);
}

bool DeleteOrder(int ticket) {

  Print("DeleteOrder ", ticket);
  
  bool res = OrderDelete(ticket);
  if (res) {
    Sleep(SleepOk);
    return (res);
  } 	
   	
  int code = GetLastError();
  Print("DeleteOrder failed: ", ErrorDescription(code), " (", code, ")");
  Sleep(SleepErr);
	
  return (false);
}


Forex Trader
114293
Forex Trader  
Спасибо RickD, но данный эксперт закрывает одним тиком только один ордер.
Forex Trader
114293
Forex Trader  
Из функций можно собрать люой функционал, например так:

http://www.alpari-idc.ru/ru/experts/articles/9.html
Forex Trader
114293
Forex Trader  
Я закрываю так:
        if(условие)
               {
               cnt=0;
               while(cnt<1)
                        {
                        if(OrdersTotal()<1)break;
                        RefreshRates();                   
                        OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                               zz=0;
                               cmd=OrderType();
                               for(z=0;z<3;z++)
                                 {
                                 RefreshRates();
                                 if((cmd==0||cmd==1))lots=OrderLots();
                                 if(cmd==2||cmd==3||cmd==4||cmd==5)OrderDelete(OrderTicket());
                                 if(cmd==0) mod=OrderClose(OrderTicket(),lots,MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE);
                                 if(cmd==1) mod=OrderClose(OrderTicket(),lots,MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE);
                                 Sleep(1000);
                                 if(mod)
                                      { 
                                      str="Сбойная ситуация. Закрываем все ордера";
                                      Print(str);
                                      if(Sound==1)PlaySound("alert2.wav");
                                      zz=1;
                                      break;
                                      }
                                 }
                               if(zz==0)
                                    {
                                       str="Не могу закрыть ордер на паре "+OrderSymbol()+". Срочно проверьте связь терминала с ДЦ и закройте этот ордер!!!";
                                       Print(str);
                                       PlaySound("disconnect.wav");
                                    }
                                Sleep(5000);
                        }
              }
Forex Trader
114293
Forex Trader  
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий