//+------------------------------------------------------------------+
//|                                                     SL&TP_Up.mq4 |
//|                      Copyright © 2011,  http://easyfx.narod.ru   |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, http://easyfx.narod.ru"
#property link      "http://easyfx.narod.ru"
extern int Tral_Up=20;           // Дист. преследования в пунктах
extern int TPp=250;              //TakeProfit в пунктах

extern bool info=false;
//--------------------------------------------------------------- 1 --
int start()                                     // Спец. функция start
  {
   string Symb=Symbol();                        // Финанс. инструмент
   double StopLevel=MarketInfo(Symb,MODE_STOPLEVEL);  
double spred=MarketInfo(Symb,MODE_SPREAD);  
double mindist=(StopLevel+spred+Tral_Up); 
double LotSize=MarketInfo(Symb,MODE_LOTSIZE);  
double minLot=MarketInfo(Symb,MODE_MINLOT);
   double TICKVALUE=MarketInfo(Symb,MODE_TICKVALUE); 
double    Lot=0.02;  //OrderLots( ) ; //
   double Pp=(LotSize*Point)*Lot; 
double   P=0.03;  // OrderProfit( ) ;
   double RealPofit=P/Pp;  
if (info==true)
           {
           Alert("mindist=",mindist," Digits=",Digits);
            }
//--------------------------------------------------------------- 2 --
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордеров
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         int Tip=OrderType();                   // Тип ордера
         if(Tip>1)continue;                     // Не наш ордер
         double SL=OrderStopLoss();             // SL выбранного орд.
         double TP=OrderTakeProfit();        // TP выбранного орд.
//-------------------------------------------------------------- 3 --
         while(true)                            // Цикл модификации
           {
          SL=OrderStopLoss(); 
TP=OrderTakeProfit();
             StopLevel=MarketInfo(Symb,MODE_STOPLEVEL);         //Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах
             spred=MarketInfo(Symb,MODE_SPREAD);               //Спрэд в пунктах 0.0002
             mindist=(StopLevel+spred+Tral_Up);    //  0.0009
             LotSize=MarketInfo(Symb,MODE_LOTSIZE); //Размер лота
               P=OrderProfit( ) ;                  // Прибыль ордера в $$$
             minLot=MarketInfo(Symb,MODE_MINLOT);  // Минимальный лот 
                Lot=OrderLots( ) ;                 // Величина лота ордеров
             Pp=LotSize*Point*Lot;  // Стоимость 1 пункта лота  
             RealPofit=P/Pp;         // Прибыль ордеров в пунктах       
//---------------------------------------------------------------- 4 --
            bool Modify=false;                  // Не назначен к модифи
            switch(Tip)                         // По типу ордера
            {
               case 0 :                         // Ордер Buy
                  if (SL<=(Ask-mindist*Point)&&RealPofit>=mindist)         // Если ниже желаем.то модифицируем его
                    {
                     SL=Bid-mindist*Point;          
TP=Ask+TPp*Point;
                     string Text="Buy";        // Текст для Buy 
                     Modify=true;               // Назначен к модифи.
                    }
                  break;                        // Выход из switch
               case 1 :                         // Ордер Sell
                  if (SL>=(Bid+mindist*Point)&&RealPofit>=mindist)  // Если выше желаем.или равно нулю то модифицируем его
                   {
                     SL=Ask+mindist*Point;           
TP=Bid-TPp*Point;
                     Text="Sell";              // Текст для Sell 
                     Modify=true;               // Назначен к модифи.
                    }
              }                                 // Конец switch
            if (Modify==false)                  // Если его не модифи
               break;                           // Выход из while
//--------------------------------------------------- 5 --
            double Price =OrderOpenPrice();     // Цена выбранн. орд.
            int    Ticket=OrderTicket();        // Номер выбранн. орд.
//          Print ("Модификация ",Text,Ticket,". Ждём ответ..");
            bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
            //--------------------------------------------------- 6 --
            if (Ans==true)                      // Получилось :)
              {
//               Print ("Ордер ",Text,Ticket," модифицирован:)");
               break;                           // Из цикла модифи.
              }
//---------------------------------------------------------------- 7 --
            int Error=GetLastError();           // Не получилось :(
            switch(Error)                       // Преодолимые ошибки
              {
               case 130:Print("Неправильные стопы. Пробуем ещё раз.");
                  RefreshRates();               // Обновим данные
                  continue;                     // На след. итерацию
               case 136:Print("Нет цен. Ждём новый тик..");
                  while(RefreshRates()==false)  // До нового тика
                     Sleep(1);                  // Задержка в цикле
                  continue;                     // На след. итерацию
               case 146:Print("Подсистема торгов занята.Пробуем ещё");
                  Sleep(100);                   // Простое решение
                  RefreshRates();               // Обновим данные
                  continue;                     // На след. итерацию
                  // Критические ошибки
               case 2 : Print("Общая ошибка.");
                  break;                        // Выход из switch
               case 5 : Print("Старая версия клиентского терминала.");
                  break;                        // Выход из switch
               case 64: Print("Счет заблокирован.");
                  break;                        // Выход из switch
               case 133:Print("Торговля запрещена");
                  break;                        // Выход из switch
               default: Print("Возникла ошибка ",Error);//Др. ошибки
              }
            break;                              // Из цикла модифи.
           }                                    // Конец цикла модифи.
//-------------------------------------------------------------- 8 --
        }                                       // Конец анализа орд.
     }                                          // Конец перебора орд.
//--------------------------------------------------------------- 9 --
   return;                                      // Выход из start()
  }
//-------------------------------------------------------------- 10 --



Hosted by uCoz