Покажите как добавить стоплосс, тейкпрофит, и лот в этот советник?

 

Здравствуйте, покажите как добавить стоплосс и тейкпрофит, и функцию лота с риском с настройками в этот шаблон советник.


Спасибо!


https://www.mql5.com/ru/articles/1462

Файлы:
antierror-1.mq4  15 kb
 
а что именно у вас не получается, на чем вы голову ломали?
 
sergeev >>:
а что именно у вас не получается, на чем вы голову ломали?

Там не могу понять установки стоп лосса и тейк профита, в функции там у них общий один сmd = OP_SELL, cmd=OP_BUY........... может сделать их разными типа cmd1 и cmd2?

И лот не понимаю как его сделать настраиваемым по риску?



int Deal(int act, double Lot)
 {
 int N = 0;
 int ticket;
 int err;
 double Price_open;
 double Lots;
 int cmd;
 int magik;
 magik = GenericMagik();
 Lots = NormalizeDouble(Lot,1);

   if(act == 1)
         {
         Price_open = NormalizeDouble(Ask, Digits);
         cmd = OP_BUY;
         }
   if(act == 2)
         {
         Price_open = NormalizeDouble(Bid, Digits);
         cmd = OP_SELL;
         }
         // проверака маржи для открытия позиции
         AccountFreeMarginCheck(Symbol(), cmd,Lots);
         err = GetLastError();
   if(err>0)
         {
         Print("No money for new position");
         NoOpen = true;
         return(0);
         }      
         // Отсылаем ордер                  
         ticket = OrderSend(Symbol(), cmd, Lots, Price_open, slippage, 0, 0, 0, magik);
   if(ticket > 0)
         {
         deals++;
         return(ticket);
         }
         // Если не отослался, то пытаемся 5 раз снова его открыть      
         else
         {
   while(N < count)
         {
         N++;
         err = ErrorBlock();
   if(err == 1)
         {
         Sleep(5000);
         RefreshRates();
   if(act == 1)
         Price_open = NormalizeDouble(Ask, Digits);
   if(act == 2)
         Price_open = NormalizeDouble(Bid, Digits);              
         ticket = OrderSend(Symbol(), cmd, Lots, Price_open, slippage, 0, 0, 0, magik);
   if(ticket > 0)
         {
         deals++;
         return(ticket);
         }
         }
         // получили серьезную ошибку  
   if(err > 1)            
         return(0);               
         }                                                       
         }    
return(0);
}
 

Вот так будет это корректно работать, я вставил два ticket с разными cmd теперь если я установлю стоплосс и тейк профит то должны они выставится? Или я не правильно внес изменения в функцию?

int Deal(int act, double Lot)
 {
 int N = 0;
 int ticket;
 int err;
 double Price_open;
 double Lots;
 int cmd1,cmd2;
 int magik;
 magik = GenericMagik();
 Lots = NormalizeDouble(Lot,1);

   if(act == 1)
         {
         Price_open = NormalizeDouble(Ask, Digits);
         cmd1 = OP_BUY;
         }
   if(act == 2)
         {
         Price_open = NormalizeDouble(Bid, Digits);
         cmd2 = OP_SELL;
         }
         // проверака маржи для открытия позиции
         AccountFreeMarginCheck(Symbol(), cmd1,Lots);
         AccountFreeMarginCheck(Symbol(), cmd2,Lots);
         err = GetLastError();
   if(err>0)
         {
         Print("Нет денег на новую позицию");
         NoOpen = true;
         return(0);
         }      
         // Отсылаем ордер                  
         ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage, 0, 0, 0, magik);
         ticket = OrderSend(Symbol(), cmd2, Lots, Price_open, slippage, 0, 0, 0, magik);
   if(ticket > 0)
         {
         deals++;
         return(ticket);
         }
         // Если не отослался, то пытаемся 5 раз снова его открыть      
         else
         {
   while(N < count)
         {
         N++;
         err = ErrorBlock();
   if(err == 1)
         {
         Sleep(5000);
         RefreshRates();
   if(act == 1)
         Price_open = NormalizeDouble(Ask, Digits);
         ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage, 0, 0, 0, magik);
   if(act == 2)
         Price_open = NormalizeDouble(Bid, Digits);              
         ticket = OrderSend(Symbol(), cmd2, Lots, Price_open, slippage, 0, 0, 0, magik);
   if(ticket > 0)
         {
         deals++;
         return(ticket);
         }
         }
         // получили серьезную ошибку  
   if(err > 1)            
         return(0);               
         }                                                       
         }    
return(0);
}
 

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

у вас пробелы в знаниях. Вот тут:

1. https://docs.mql4.com/ru/basis/functions

2. https://docs.mql4.com/ru/trading/OrderSend

 

Пробел в знаниях МКЛ есть, можно сказать что знаний вообще нет ни каких, я только изучать начал, этот код взял как бы за шаблон так как тема написана "Как разработать надежный и безопасный торговый робот на языке MQL4" Думаю автор обманывать не будет что его шаблон советника самый надежный.

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



 

Вот так, правильно ли я понял?

Правильно ли сделано до пункта:

//----- Отсылаем ордер ---------------------------------------------------------------
int Deal(int act, double Lot)
 {
 int N = 0;
 int ticket;
 int err;
 double Price_open;
 double Lots;
 int cmd1,cmd2;
 int magik;
 magik = GenericMagik();
 Lots = NormalizeDouble(Lot,1);

//----- Бай позиция -----------------------------------------
   if(act == 1)
         {
         Price_open = NormalizeDouble(Ask, Digits);
         cmd1 = OP_BUY;
         // проверака маржи для открытия позиции BUY
         AccountFreeMarginCheck(Symbol(), cmd1,Lots);
         err = GetLastError();
   if(err>0)
         {
         Print("Нет денег на новую позицию");
         NoOpen = true;
         return(0);
         }      
         }

//----- Селл позиция ----------------------------------------
   if(act == 2)
         {
         Price_open = NormalizeDouble(Bid, Digits);
         cmd2 = OP_SELL;
         }
         // проверака маржи для открытия позиции SELL         
         AccountFreeMarginCheck(Symbol(), cmd2,Lots);
         err = GetLastError();
   if(err>0)
         {
         Print("Нет денег на новую позицию");
         NoOpen = true;
         return(0);
         }      
         
//-----  Отсылаем ордер ---------------------------------------------------------------                  
         ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage, 0, 0, 0, magik);
   if(ticket > 0)
         {
         deals++;
         return(ticket);
         }
         // Если не отослался, то пытаемся 5 раз снова его открыть      
         else
         {
   while(N < count)
         {
         N++;
         err = ErrorBlock();
   if(err == 1)
         {
         Sleep(5000);
         RefreshRates();
   if(act == 1)
         Price_open = NormalizeDouble(Ask, Digits);
         ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage, 0, 0, 0, magik);
   if(act == 2)
         Price_open = NormalizeDouble(Bid, Digits);              
         ticket = OrderSend(Symbol(), cmd2, Lots, Price_open, slippage, 0, 0, 0, magik);
   if(ticket > 0)
         {
         deals++;
         return(ticket);
         }
         }
         // получили серьезную ошибку  
   if(err > 1)            
         return(0);               
         }                                                       
         }    
return(0);
}
 
Gun >>:

Вот так, правильно ли я понял?

Правильно ли сделано до пункта:

//----- Отсылаем ордер ---------------------------------------------------------------



до строки //----- Отсылаем ордер ---------------------------------------------------------------
  сделано правильно в том смысле, что сделано правильно. Но то ли вам надо, что вы там написали. давайте выясним.

начнём всё с самого начала. Проведём так сказать ликбез. 

1. Откуда (из какой функции) вы будете вызывать функцию Deal() ?

2. Что будете в неё передавать?

 
sergeev >>:


до строки //----- Отсылаем ордер ---------------------------------------------------------------
сделано правильно в том смысле, что сделано правильно. Но то ли вам надо, что вы там написали. давайте выясним.

начнём всё с самого начала. Проведём так сказать ликбез.

1. Откуда (из какой функции) вы будете вызывать функцию Deal() ?

2. Что будете в неё передавать?

"Но то ли вам надо, что вы там написали" - я не совсем понял почему оно мне не надо я вроде просто разделить пытаюсь, на бай и сел чтобы воткнуть тейкпрофит и стоплос. На бай стоп лосс и тейкпрофит идут под другими знаками(+-) на селл другие знаки(-+)

1. Функция Del() вызывается функцией start() - правильно?

2. Открытие ордера с выставленными стопами и тейкпрофитом и лотом по риску, плюс закрытие по close

 

Проверьте функцию, теперь все правильно вроде должен выставляться тейкпрофит и стоплос?

int Deal(int act, double Lot)
 {
 int N = 0;
 int ticket;
 int err;
 double Price_open;
 double Lots;
 int cmd1,cmd2;
 int magik;
 magik = GenericMagik();
 Lots = NormalizeDouble(Lot,1);
//------- Бай ---------------------------------------
   if(act == 1){
         Price_open = NormalizeDouble(Ask, Digits);
         cmd1 = OP_BUY;
   }//act
   // проверка маржи для открытия позиции
         AccountFreeMarginCheck(Symbol(), cmd1,Lots);    
         err = GetLastError();
   if(err>0){
         Print("Нет денег на новую позицию");
         NoOpen = true;
         return(0);
   }//err                   
//------- Селл --------------------------------------
   if(act == 2){
         Price_open = NormalizeDouble(Bid, Digits);
         cmd2 = OP_SELL;
   }//act
   // проверка маржи для открытия позиции
         AccountFreeMarginCheck(Symbol(), cmd2,Lots);
         err = GetLastError();
   if(err>0){
         Print("Нет денег на новую позицию");
         NoOpen = true;
         return(0);
   }//err
//-------------------------------------------------------------------------------------               
// Отсылаем ордер
//---------------------- Buy ----------------------------------------------------------                  
         ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point, 0, magik);
   if(ticket > 0){
         deals++;
         return(ticket);
   }//ticket
   // Если не отослался, то пытаемся 5 раз снова его открыть      
   else{
   while(N < count){
         N++;
         err = ErrorBlock();
   if(err == 1){
         Sleep(5000);
         RefreshRates();
       if(act == 1)
         Price_open = NormalizeDouble(Ask, Digits);
         ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point, 0, magik);
   if(ticket > 0){
         deals++;
         return(ticket);
   }//ticket
   }//err
   // получили серьезную ошибку  
       if(err > 1)            
         return(0);               
   }//else                                                       
   }//while   
// Отсылаем ордер
//---------------------- Sell ---------------------------------------------------------        
         ticket = OrderSend(Symbol(), cmd2, Lots, Price_open, slippage, Ask+StopLoss*Point,Bid-TakeProfit*Point, 0, magik);
   if(ticket > 0){
         deals++;
         return(ticket);
   }//ticket
   // Если не отослался, то пытаемся 5 раз снова его открыть      
   else{
   while(N < count){
         N++;
         err = ErrorBlock();
   if(err == 1){
         Sleep(5000);
         RefreshRates();         
       if(act == 2)
         Price_open = NormalizeDouble(Bid, Digits);              
         ticket = OrderSend(Symbol(), cmd2, Lots, Price_open, slippage, Ask+StopLoss*Point,Bid-TakeProfit*Point, 0, magik);
   if(ticket > 0){
         deals++;
         return(ticket);
   }//ticket
   }//err
   // получили серьезную ошибку  
       if(err > 1)            
        return(0);               
   }//else                                                       
   }//while    
return(0);
}//Deal
 

Вот. отлично!

только небольшая ошибка в стопах. Для селл надо все относительно Ask, а для Бай всё относительно Бид.

ticket = OrderSend(Symbol(), cmd1, Lots, Price_open, slippage,Bid-StopLoss*Point,Bid+TakeProfit*Point, 0, magik);
ticket = OrderSend(Symbol(), cmd2, Lots, Price_open, slippage, Ask+StopLoss*Point,Ask-TakeProfit*Point, 0, magik);

Причина обращения: