Navigation:Home > Content >

yuraz_closeprc_v3.mq5

Time: 2016-04-24 | Download file:yuraz_closeprc_v3.mq5

//+------------------------------------------------------------------+
//|                                            YURAZ_CLOSEPRC_V1.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+

//
// Выставляем % профита 
// закрываются ВСЕ открытые позиции при достижении определенного нами % от депозита
// интересно то что если поставить 1% в день , 24 торговых дня дают 24% в месяц
//  
// 1 на графике создаем кнопку закрыть все сделки - ручной режим
// 2 на графике создаем поле ввода , в которое вносим % 
// 


//
// Идея данного советника в том что он работает в режиме событий
//  

#property copyright "2009, YURAZ"
#property link      "http://www.masterforex-v.org"
#property version   "1.00"

input string gpsPrcClose="10"; // 10% профита по умолчанию
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// MT5 
//
class CYurazTrade
  {
public:
   int               AllCloseMonitor;
   double            PrcClose;

   void CYurazTrade()
     {
      AllCloseMonitor=0; //  тут для монитора событий информация
      LastCloseCode=0;
      LastCodePS=0;

      PrcClose=100000000000;

     } // конструктор
   void              CloseAll();
private:
   int               LastCloseCode;
   int               LastCodePS;

   string            sCodeError(int code);
   void              ClosePosition(string sSymbol,int ip);
  };
//
// по коду вернем строку ошибки
//
string CYurazTrade::sCodeError(int retcode)
  {
   string sRetCode;
   switch(retcode)
     {
      case TRADE_RETCODE_REQUOTE: sRetCode=(string)retcode+" Реквота"; break;// 10004
      case TRADE_RETCODE_REJECT: sRetCode=(string)retcode+" Запрос отвергнут";  break;
      case TRADE_RETCODE_CANCEL: sRetCode = (string)retcode+" Запрос отменен трейдером"; break;
      case TRADE_RETCODE_PLACED: sRetCode = (string)retcode+" Ордер размещен"; break;
      case TRADE_RETCODE_DONE: sRetCode=(string)retcode+" Заявка выполнена"; break;
      case TRADE_RETCODE_DONE_PARTIAL: sRetCode=(string)retcode+" Заявка выполнена частично"; break;
      case TRADE_RETCODE_ERROR: sRetCode=(string)retcode+" Ошибка обработки запроса"; break;
      case TRADE_RETCODE_TIMEOUT: sRetCode = (string)retcode+" Запрос отменен по истечению времени"; break;
      case TRADE_RETCODE_INVALID: sRetCode = (string)retcode+" Неправильный запрос"; break;
      case TRADE_RETCODE_INVALID_VOLUME: sRetCode=(string)retcode+" Неправильный объем в запросе"; break;
      case TRADE_RETCODE_INVALID_PRICE: sRetCode = (string)retcode+" Неправильная цена в запросе"; break;
      case TRADE_RETCODE_INVALID_STOPS: sRetCode = (string)retcode+" Неправильные стопы в запросе"; break;
      case TRADE_RETCODE_TRADE_DISABLED: sRetCode=(string)retcode+" Торговля запрещена"; break;
      case TRADE_RETCODE_MARKET_CLOSED: sRetCode =(string)retcode+" Рынок закрыт"; break;
      case TRADE_RETCODE_NO_MONEY: sRetCode=(string)retcode+" Нет достаточных денежных средств для выполнения запроса"; break;
      case TRADE_RETCODE_PRICE_CHANGED: sRetCode=(string)retcode+" Цены изменились"; break;
      case TRADE_RETCODE_PRICE_OFF: sRetCode=(string)retcode+" Отсутствуют котировки для обработки запроса"; break;
      case TRADE_RETCODE_INVALID_EXPIRATION: sRetCode=(string)retcode+" Неверная дата истечения ордера в запросе"; break;
      case TRADE_RETCODE_ORDER_CHANGED: sRetCode=(string)retcode+" Состояние ордера изменилось"; break;
      case TRADE_RETCODE_TOO_MANY_REQUESTS: sRetCode=(string)retcode+" Слишком частые запросы"; break;
      default:   sRetCode=(string)retcode+" неизвестная ошибка"; break;
     }
   return(sRetCode);
  }
// 
// закрыть все что открыто
// 
void CYurazTrade::CloseAll()
  {
   int pos=PositionsTotal(); // получим количество открытых позиций
   for(int ip=0;ip 9) // пока не смог решить проблему с request
   request.volume=9;


   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      request.type=ORDER_TYPE_SELL;
      request.price=SymbolInfoDouble(sSymbol,SYMBOL_BID);
     }
   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
     {
      request.type=ORDER_TYPE_BUY;
      request.price=SymbolInfoDouble(sSymbol,SYMBOL_ASK);
     }
   OrderSend(request,result);
   LastCloseCode=result.retcode;

  }
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Монитор событий ( вызвается из таймера )
//
class CYurazMonitor
  {
public:
   void              Monitor();

  };
// 
// 
// 
void CYurazMonitor::Monitor(void)
  {
  yzTrade.PrcClose = StringToDouble(ObjectGetString(0,editID,OBJPROP_TEXT));
 ObjectSetString(0,labelID1,OBJPROP_TEXT,
  DoubleToString( AccountInfoDouble(ACCOUNT_PROFIT),2) 
  + " "
  +DoubleToString( AccountInfoDouble(ACCOUNT_BALANCE)/100,2)
  + " "
  +DoubleToString( yzTrade.PrcClose,4)
  
  );
   if(yzTrade.AllCloseMonitor!=0) // монитор событий обнаружил, необходимо  закрыть все позиции
     {
      yzTrade.CloseAll();

     }
   if(AccountInfoDouble(ACCOUNT_PROFIT)>AccountInfoDouble(ACCOUNT_BALANCE)/100 *yzTrade.PrcClose)
     {
      yzTrade.AllCloseMonitor=2; // событие закрыть по профиту
      yzTrade.CloseAll();
     }
  }
//  
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 
// 
// 
CYurazTrade   yzTrade;    // клас обработки торговых операций 
CYurazMonitor yzMonitor;  // монитор событий
                          //
// 

string buttonID="Button";
//string labelID="Info";
string editID="Edit";
string labelID1="Info1";

int broadcastEventID=5000;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   yzTrade.AllCloseMonitor=0;

//--- создадим кнопку, для передачи пользовательских событий
   ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
   ObjectSetInteger(0,buttonID,OBJPROP_COLOR,White);
   ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,Gray);
   ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,10);
   ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,60);
   ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,250);
   ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
   ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
   ObjectSetString(0,buttonID,OBJPROP_TEXT,"Закрыть все позиции одним кликом");
   ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
   ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,false); // иначе нажать на нее нельзя

//--- создадим метку для вывода информации
//ObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
//ObjectSetInteger(0,labelID,OBJPROP_COLOR,Red);
//ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,10);
//ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,100);
//ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
//ObjectSetString(0,labelID,OBJPROP_TEXT,"Нет информации");
//ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
//ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0);


   ObjectCreate(0,labelID1,OBJ_LABEL,0,100,100);
   ObjectSetInteger(0,labelID1,OBJPROP_COLOR,Red);
   ObjectSetInteger(0,labelID1,OBJPROP_XDISTANCE,10);
   ObjectSetInteger(0,labelID1,OBJPROP_YDISTANCE,20);
   ObjectSetString(0,labelID1,OBJPROP_FONT,"Trebuchet MS");
   ObjectSetString(0,labelID1,OBJPROP_TEXT,"Позиции закроются при достижении процента от депозита");
   ObjectSetInteger(0,labelID1,OBJPROP_FONTSIZE,10);
   ObjectSetInteger(0,labelID1,OBJPROP_SELECTABLE,true);

   ObjectCreate(0,editID,OBJ_EDIT,0,100,100);
   ObjectSetInteger(0,editID,OBJPROP_XDISTANCE,370);
   ObjectSetInteger(0,editID,OBJPROP_YDISTANCE,20);
   ObjectSetInteger(0,editID,OBJPROP_COLOR,Red);

   ObjectSetInteger(0,editID,OBJPROP_XSIZE,50);
   ObjectSetInteger(0,editID,OBJPROP_YSIZE,50);
   ObjectSetString(0,editID,OBJPROP_TEXT,gpsPrcClose); // 3%
   ObjectSetInteger(0,editID,OBJPROP_FONTSIZE,20);
   ObjectSetInteger(0,editID,OBJPROP_SELECTABLE,false); // иначе нажать на нее нельзя

   yzTrade.PrcClose=StringToDouble(gpsPrcClose); // положим в торговый класс % прибыли при котором закроются все позиции

                                                 //   int customEventID; // номер пользовательского события для отправки
//   string message;    // сообщение для отправки в событии
//   bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
//   if(selected==true)
//     {
//      message="Кнопка нажата";
//      customEventID=CHARTEVENT_CUSTOM+1;
//     }
//   else // кнопка не нажата
//     {
//      message="Кнопка отжата";
//      customEventID=CHARTEVENT_CUSTOM+999;
//     }
//
//   EventChartCustom(0,CHARTEVENT_CUSTOM+999-CHARTEVENT_CUSTOM,0,0,message);

   EventSetTimer(1); // каждую секунду вызываем OnTimer
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit()
  {
   ObjectDelete(0,buttonID);
//ObjectDelete(0,labelID);
   ObjectDelete(0,editID);
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   yzMonitor.Monitor(); // запустим монитор событий
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- проверим событие на нажатие кнопки мышки
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickedChartObject=sparam;
      //--- если нажатие на объекте с именем buttonID
      if(clickedChartObject==buttonID)
        {
         //--- состояние кнопки - нажата кнопка или нет
         bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);

         //--- выведем в лог отладочное сообщение
         // printf("Кнопка нажата =%f ",selected);
         int customEventID; // номер пользовательского события для отправки
         string message;    // сообщение для отправки в событии
         //--- если кнопка нажата
         if(selected)
           {
            message="Кнопка нажата";
            customEventID=CHARTEVENT_CUSTOM+1;

           }
         else // кнопка не нажата
           {
            message="Кнопка отжата";
            customEventID=CHARTEVENT_CUSTOM+999;
           }
         //--- отправим пользовательское событие "своему"графику
         EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
         //--- отправим сообщение всем открытым графикам
         BroadcastEvent(ChartID(),0,"Broadcast Message");
         //--- отладочное сообщение
         // printf("Отправлено событие с ID =%d",customEventID);
        }
      ChartRedraw();// принудительно перерисуем все объекты на графике
     }

//--- проверим событие на принадлежность к пользовательским событиям
   if(id>CHARTEVENT_CUSTOM)
     {
      if(id==broadcastEventID)
        {
         // printf(" Получили широковещательное сообщение от графика с id= %d",lparam);
        }
      else
        {
         //--- прочитаем текстовое сообщение в событии
         string info=sparam;
         // printf("Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID =%d",id);

         if(id==1001)
           {
            yzTrade.AllCloseMonitor=1; // известим монитор о необходимости вызвать закрытие всех позиций
           }

         //--- выведем сообщение в метке
         // ObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
         ChartRedraw();// принудительно перерисуем все объекты на графике
        }
     }
  }
//+------------------------------------------------------------------+
//| послать широковещательное сообщение всем открытм графикам        |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam,double dparam,string sparam)
  {
   int limit=100;// у нас наверняка не больше 100 открытых графиков
   int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
   long currChart,prevChart=ChartFirst();
   int i=0;
   while(i        

Recommend