Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Совершил прорыв? Напиши статью об этом и получи 200 USD!
MetaQuotes Software Corp.
Модератор
180332
MetaQuotes Software Corp. 2010.07.20 12:01 

TrailingStopFrCnSAR:

Скрипт способен тралить по портфельному профиту, т.е. стопы начинают выставляться только с уровня общего безубытка всех ордеров данного направления.

Author: Vladimir Khlystov

MQL4 Comments
16319
MQL4 Comments 2010.07.21 02:26  

Уважаемый Владимир! Спасибо за ваши скрипты - полезные весьма!

Я правильно понимаю, что если дельту оставить "0", то трайлинг по парабалику будет происходить по его точкам?

Vladimir Khlystov
10810
Vladimir Khlystov 2010.07.21 15:06  
evbut:

Уважаемый Владимир! Спасибо за ваши скрипты - полезные весьма!

Я правильно понимаю, что если дельту оставить "0", то трайлинг по парабалику будет происходить по его точкам?


Да действительно, если TrailingStop=4 и delta=0, то тралл будет по точкам параболика
MQL4 Comments
16319
MQL4 Comments 2010.07.22 08:39  
Можно как-нибудь подправить, что бы советник не так часто делал запросы для переноса стопов? А то сейчас он каждую секунду их делает и выдаются ошибки видимо из-за проскальзывания
Vladimir Khlystov
10810
Vladimir Khlystov 2010.07.22 15:29  
evbut:
Можно как-нибудь подправить, что бы советник не так часто делал запросы для переноса стопов? А то сейчас он каждую секунду их делает и выдаются ошибки видимо из-за проскальзывания


да конечно.

В версии V2, я  добавил переменную:

StepTrall = 5 - шаг тралла, теперь перемещение SL будет не каждый пипс, а не менее чем на StepTrall пипс. Это уменьшит кол-во обращений к ДЦ.

Версия будет доступна после проверки модератором. 

MQL4 Comments
16319
MQL4 Comments 2010.07.25 16:01  
Огромное спасибо за Ваш труд. Для полноты счастья хочу попросить о еще одном небольшом дополнении. Необходима еще одна переменная, которая включала бы трал после набора заданного количества пипсов от цены открытия.
MQL4 Comments
16319
MQL4 Comments 2010.08.11 15:30  
Большое спасибо скрипт классно работает,но на реале ДЦ не дает ему работать .Это можно какнибудь обойти?
Vladimir Khlystov
10810
Vladimir Khlystov 2010.08.25 10:03  
Yuri_vk:
Большое спасибо скрипт классно работает,но на реале ДЦ не дает ему работать .Это можно какнибудь обойти?

А каким образом это проявляется? Как ДЦ влияет на скрипт?
Vladimir Khlystov
10810
Vladimir Khlystov 2010.08.25 10:05  
peterman:
Огромное спасибо за Ваш труд. Для полноты счастья хочу попросить о еще одном небольшом дополнении. Необходима еще одна переменная, которая включала бы трал после набора заданного количества пипсов от цены открытия. 

По доработкам, пишите в личку, договоримся.
MQL4 Comments
16319
MQL4 Comments 2010.08.26 15:03  
Интересный инструмент, приступил к тестированию, и, вот не задача, требует он индикатор velocity а где его взять, не пойму :(
MQL4 Comments
16319
MQL4 Comments 2011.02.04 12:20  

Подскажите как вставить TrailingStopFrCnSAR_v2 в советник который описан в учебнике?

//+------------------------------------------------------------------+
//|                                                  из учебника.mq4  |
//|                                                                  |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

#property link      "http://www.metaquotes.net"
//--------------------------------------------------------------- 1 --
// Численные значения для М15
extern double StopLoss   =2000;     // SL для открываемого ордера
extern double TakeProfit =2000;      // ТР для открываемого ордера
extern int    Period_MA_1=9;      // Период МА 1
extern int    Period_MA_2=30;      // Период МА 2
extern double Rastvor    =28.0;    // Расстояние между МА 
extern double Lots       =0.1;     // Жестко заданное колич. лотов
extern double Prots      =0.07;    // Процент свободных средств 
bool Work=true;                    // Эксперт будет работать.
string Symb;                       // Название финанс. инструмента
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
int   
Total,                           // Количество ордеров в окне    
Tip=-1,                          // Тип выбран. ордера (B=0,S=1)   
Ticket;                          // Номер ордера   
double   
MA_1_t,                          // Значен. МА_1 текущее   
MA_2_t,                          // Значен. МА_2 текущее    
Lot,                             // Колич. лотов в выбран.ордере   
Lts,                             // Колич. лотов в открыв.ордере   
Min_Lot,                         // Минимальное количество лотов   
Step,                            // Шаг изменения размера лота   
Free,                            // Текущие свободные средства   
One_Lot,                         // Стоимость одного лота   
Price,                           // Цена выбранного ордера   
SL,                              // SL выбранного ордера    
TP;                              // TP выбранного ордера   
bool   
Ans  =false,                     // Ответ сервера после закрытия   
Cls_B=false,                     // Критерий для закрытия  Buy   
Cls_S=false,                     // Критерий для закрытия  Sell   
Opn_B=false,                     // Критерий для открытия  Buy   
Opn_S=false;                     // Критерий для открытия  Sell
//--------------------------------------------------------------- 3 -- 
// Предварит.обработка   
if(Bars < Period_MA_2)                       // Недостаточно баров     
{
  Alert("Недостаточно баров в окне. Эксперт не работает.");      
  return;                                   // Выход из start()     
}   
if(Work==false)                              // Критическая ошибка     
{      
Alert("Критическая ошибка. Эксперт не работает.");      
return;                                   // Выход из start()     
}
//--------------------------------------------------------------- 4 --   
// Учёт ордеров   
Symb=Symbol();                               // Название фин.инстр.   
Total=0;                                     // Количество ордеров   
for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер     
{     
 if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий        
 {                                       // Анализ ордеров:         
 if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм         
 if (OrderType()>1)                     // Попался отложенный           
 {            Alert("Обнаружен отложенный ордер. Эксперт не работает.");            
 return;                             // Выход из start()           
 }         
 Total++;                               // Счётчик рыночн. орд         
 if (Total>1)                           // Не более одного орд           
 {            Alert("Несколько рыночных ордеров. Эксперт не работает.");            
 return;                             // Выход из start()          
  }         
  Ticket=OrderTicket();                  // Номер выбранн. орд.         
  Tip   =OrderType();                    // Тип выбранного орд.         
  Price =OrderOpenPrice();               // Цена выбранн. орд.         
  SL    =OrderStopLoss();                // SL выбранного орд.         
  TP    =OrderTakeProfit();              // TP выбранного орд.         
  Lot   =OrderLots();                    // Количество лотов       
   }     
   }
//--------------------------------------------------------------- 5 --
// Торговые критерии   
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_1   
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_2   
 if (MA_1_t > MA_2_t + Rastvor*Point)         // Если разница между    
  {                                          // ..МА 1 и 2 большая      
  Opn_B=true;                               // Критерий откр. Buy      
  Cls_S=true;                               // Критерий закр. Sell    
   }   
   if (MA_1_t < MA_2_t - Rastvor*Point)         // Если разница между    
    {                                          // ..МА 1 и 2 большая      
    Opn_S=true;                               // Критерий откр. Sell     
    Cls_B=true;                               // Критерий закр. Buy     
    }
//--------------------------------------------------------------- 6 --
// Закрытие ордеров   
while(true)                                  // Цикл закрытия орд.     
{      
if (Tip==0 && Cls_B==true)                // Открыт ордер Buy..        
{                                       //и есть критерий закр        
 Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");        
  RefreshRates();                        // Обновление данных         
  Ans=OrderClose(Ticket,Lot,Bid,2);      // Закрытие Buy        
   if (Ans==true)                         // Получилось :)          
    { 
       Alert ("Закрыт ордер Buy ",Ticket);            
       break;                              // Выход из цикла закр           
       }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок           
          continue;                           // Повторная попытка         
          return;                                // Выход из start()       
           }
            if (Tip==1 && Cls_S==true)                // Открыт ордер Sell..        
            {                                       // и есть критерий закр        
             Alert("Попытка закрыть Sell ",Ticket,". Ожидание ответа..");        
              RefreshRates();                        // Обновление данных        
               Ans=OrderClose(Ticket,Lot,Ask,2);      // Закрытие Sell         
               if (Ans==true)                         // Получилось :)           
               {          
                 Alert ("Закрыт ордер Sell ",Ticket);            
                 break;                              // Выход из цикла закр          
                  }        
                   if (Fun_Error(GetLastError())==1)      // Обработка ошибок            
                   continue;                           // Повторная попытка         
                   return;                                // Выход из start()        
                   }     
                    break;                                    // Выход из while     
                    }   
//--------------------------------------------------------------- 7 --   
// Стоимость ордеров   
RefreshRates();                              // Обновление данных   
Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов    
Free   =AccountFreeMargin();                 // Свободн средства   
One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота   
Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера   
 if (Lots > 0)                                // Если заданы лоты,то       
 Lts =Lots;                                // с ними и работаем    
 else                                         // % свободных средств      
 Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия    
 if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн   
 if (Lts*One_Lot > Free)                      // Лот дороже свободн.     
 {     
  Alert(" Не хватает денег на ", Lts," лотов");      
  return;                                   // Выход из start()     
 }
 //--------------------------------------------------------------- 8 --
 // Открытие ордеров   
 while(true)                                  // Цикл закрытия орд.    
  {      
  if (Total==0 && Opn_B==true)              // Открытых орд. нет +        
  {                                       // критерий откр. Buy         
  RefreshRates();                        // Обновление данных         
  SL=Bid - New_Stop(StopLoss)*Point;     // Вычисление SL откр.         
  TP=Bid + New_Stop(TakeProfit)*Point;   // Вычисление TP откр.         
  Alert("Попытка открыть Buy. Ожидание ответа..");         
  Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy        
   if (Ticket > 0)                        // Получилось :)           
   {           
    Alert ("Открыт ордер Buy ",Ticket);            
    return;                             // Выход из start()          
     }       
       if (Fun_Error(GetLastError())==1)      // Обработка ошибок            
       continue;                           // Повторная попытка         
       return;                                // Выход из start()        
       }      
       if (Total==0 && Opn_S==true)              // Открытых орд. нет +        
       {                                       // критерий откр. Sell         
       RefreshRates();                        // Обновление данных         
       SL=Ask + New_Stop(StopLoss)*Point;     // Вычисление SL откр.         
       TP=Ask - New_Stop(TakeProfit)*Point;   // Вычисление TP откр.         
       Alert("Попытка открыть Sell. Ожидание ответа..");         
       Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Открытие Sel        
        if (Ticket > 0)                        // Получилось :)           
        {           
         Alert ("Открыт ордер Sell ",Ticket);            
         return;                             // Выход из start()           
         }        
          if (Fun_Error(GetLastError())==1)      // Обработка ошибок            
          continue;                           // Повторная попытка         
          return;                                // Выход из start()       
           }    
             break;                                    // Выход из while     
             }
//--------------------------------------------------------------- 9 --   
return;                                   // Выход из start()  
   }
//-------------------------------------------------------------- 10 --
int Fun_Error(int Error)                        // Ф-ия обработ ошибок  
{   
switch(Error)     
{                                          // Преодолимые ошибки                  
case  4: Alert("Торговый сервер занят. Пробуем ещё раз..");         
Sleep(3000);                           // Простое решение         
return(1);                             // Выход из функции      
case 135:Alert("Цена изменилась. Пробуем ещё раз..");         
RefreshRates();                        // Обновим данные         
return(1);                             // Выход из функции      
case 136:Alert("Нет цен. Ждём новый тик..");         
while(RefreshRates()==false)           // До нового тика            
Sleep(1);                           // Задержка в цикле         
return(1);                             // Выход из функции      
case 137:Alert("Брокер занят. Пробуем ещё раз..");         
Sleep(3000);                           // Простое решение         
return(1);                             // Выход из функции      
case 146:Alert("Подсистема торговли занята. Пробуем ещё..");         
Sleep(500);                            // Простое решение         
return(1);                             // Выход из функции         
// Критические ошибки      
case  2: Alert("Общая ошибка.");         
return(0);                             // Выход из функции      
case  5: Alert("Старая версия терминала.");         
Work=false;                            // Больше не работать         
return(0);                             // Выход из функции      
case 64: Alert("Счет заблокирован.");         
Work=false;                            // Больше не работать         
return(0);                             // Выход из функции      
case 133:Alert("Торговля запрещена.");         
return(0);                             // Выход из функции      
case 134:Alert("Недостаточно денег для совершения операции.");         
return(0);                             // Выход из функции      
default: Alert("Возникла ошибка ",Error); // Другие варианты            
return(0);                   // Выход из функции     
    }  
  }
//-------------------------------------------------------------- 11 --
int New_Stop(int Parametr)                      // Проверка стоп-прик.  
{   
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция   
if (Parametr < Min_Dist)                     // Если меньше допуст.     
{      
Parametr=Min_Dist;                        // Установим допуст.      
Alert("Увеличена дистанция стоп-приказа.");     
}   
return(Parametr);                            // Возврат значения  } 
  
  
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
/ /123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий