Советники: TrailingStopFrCnSAR

 

TrailingStopFrCnSAR:

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

Author: Vladimir Khlystov

 

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

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

 
evbut:

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

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


Да действительно, если TrailingStop=4 и delta=0, то тралл будет по точкам параболика
 
Можно как-нибудь подправить, что бы советник не так часто делал запросы для переноса стопов? А то сейчас он каждую секунду их делает и выдаются ошибки видимо из-за проскальзывания
 
evbut:
Можно как-нибудь подправить, что бы советник не так часто делал запросы для переноса стопов? А то сейчас он каждую секунду их делает и выдаются ошибки видимо из-за проскальзывания


да конечно.

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

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

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

 
Огромное спасибо за Ваш труд. Для полноты счастья хочу попросить о еще одном небольшом дополнении. Необходима еще одна переменная, которая включала бы трал после набора заданного количества пипсов от цены открытия.
 
Большое спасибо скрипт классно работает,но на реале ДЦ не дает ему работать .Это можно какнибудь обойти?
 
Yuri_vk:
Большое спасибо скрипт классно работает,но на реале ДЦ не дает ему работать .Это можно какнибудь обойти?

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

По доработкам, пишите в личку, договоримся.
 
Интересный инструмент, приступил к тестированию, и, вот не задача, требует он индикатор velocity а где его взять, не пойму :(
 

Подскажите как вставить 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);
  }
//+------------------------------------------------------------------+
Причина обращения: