Код в роботе на тейк профит и стоп лосс

 

Подскажите что нужно прописать в роботе что-бы он выставлял стоп лосс и тейк профит.

Заранее большое спасибо  

 
Даже чтобы он выставлял стоп лосс и тейк профит по цене а не по пунктом 
 
Vasily48:
Даже чтобы он выставлял стоп лосс и тейк профит по цене а не по пунктом 

1. Читаем справку Торговые функции-OrderSend, там куча примеров

2. По какой цене? Инструмента или депозита? 

 
Alexey Volchanskiy:

1. Читаем справку Торговые функции-OrderSend, там куча примеров

2. По какой цене? Инструмента или депозита? 

Я хочу сделать скальперского робота. Я только начинаю этим заниматься и торговал в ручную и на основе своих торгов хочу сделать робота. За основу я беру этого робота 

Trade panel with autopilot на мт5. И мне надо добавить в него тейк профит и стоп лосс по другому так как в нём нет такой функции. 


 
Vasily48:
Я хочу сделать скальперского робота. Я только начинаю этим заниматься и торговал в ручную и на основе своих торгов хочу сделать робота. За основу я беру этого робота 

Trade panel with autopilot на мт5. И мне надо добавить в него тейк профит и стоп лосс по другому так как в нём нет такой функции. 


1. Читаем справку Торговые функции-OrderSend, там куча примеров

Жаль шрифт больше не делается

 
Vasily48:

Подскажите что нужно прописать в роботе что-бы он выставлял стоп лосс и тейк профит.

Заранее большое спасибо  

Вот пример выставления Stop Loss и Take Profit (пример работает только на hedge счетах):

//+------------------------------------------------------------------+
//|                                        Stop Loss Take Profit.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CTrade         m_trade;                     // trading object
CSymbolInfo    m_symbol;                    // symbol info object
//--- input parameters
input ushort   InpStopLoss    = 30;         // Stop Loss (in pips)
input ushort   InpTakeProfit  = 90;         // Take Profit (in pips)
//---
double         ExtStopLoss;
double         ExtTakeProfit;
bool           FirstStart;
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetMarginMode();
   if(!IsHedging())
     {
      Print("Hedging only!");
      return(INIT_FAILED);
     }

   m_symbol.Name(Symbol());                  // sets symbol name
   m_symbol.Refresh();                       // refreshes the symbol data
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;

   ExtStopLoss    = InpStopLoss   * digits_adjust * m_symbol.Point();
   ExtTakeProfit  = InpTakeProfit * digits_adjust * m_symbol.Point();

   FirstStart=true;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(FirstStart)
     {
      if(!RefreshRates())
         return;

      m_trade.Buy(m_symbol.LotsMin(),Symbol(),m_symbol.Ask(),
                  m_symbol.Bid()-ExtStopLoss,
                  m_symbol.Ask()+ExtTakeProfit);

      m_trade.Sell(m_symbol.LotsMin(),Symbol(),m_symbol.Bid(),
                   m_symbol.Ask()+ExtStopLoss,
                   m_symbol.Bid()-ExtTakeProfit);

      FirstStart=false;
     }
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetMarginMode(void)
  {
   m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsHedging(void)
  {
   return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
  }
//+------------------------------------------------------------------+
Файлы:
 
Vladimir Karputov:

Вот пример выставления Stop Loss и Take Profit (пример работает только на hedge счетах):

//+------------------------------------------------------------------+
//|                                        Stop Loss Take Profit.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CTrade         m_trade;                     // trading object
CSymbolInfo    m_symbol;                    // symbol info object
//--- input parameters
input ushort   InpStopLoss    = 30;         // Stop Loss (in pips)
input ushort   InpTakeProfit  = 90;         // Take Profit (in pips)
//---
double         ExtStopLoss;
double         ExtTakeProfit;
bool           FirstStart;
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetMarginMode();
   if(!IsHedging())
     {
      Print("Hedging only!");
      return(INIT_FAILED);
     }

   m_symbol.Name(Symbol());                  // sets symbol name
   m_symbol.Refresh();                       // refreshes the symbol data
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;

   ExtStopLoss    = InpStopLoss   * digits_adjust * m_symbol.Point();
   ExtTakeProfit  = InpTakeProfit * digits_adjust * m_symbol.Point();

   FirstStart=true;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(FirstStart)
     {
      if(!RefreshRates())
         return;

      m_trade.Buy(m_symbol.LotsMin(),Symbol(),m_symbol.Ask(),
                  m_symbol.Bid()-ExtStopLoss,
                  m_symbol.Ask()+ExtTakeProfit);

      m_trade.Sell(m_symbol.LotsMin(),Symbol(),m_symbol.Bid(),
                   m_symbol.Ask()+ExtStopLoss,
                   m_symbol.Bid()-ExtTakeProfit);

      FirstStart=false;
     }
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetMarginMode(void)
  {
   m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsHedging(void)
  {
   return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
  }
//+------------------------------------------------------------------+

Владимир, чисто из любопытства, это ты специально такие развернутые ответы пишешь ли заготовлены типовые болванки? Если болванки, может, организовать ветку Code Snippets? Думаю, каждый MQL5 программист туда свой кусочек кинет. Ведь в Code Base сниппеты не положишь, там должно быть нечто цельное и работающее.
Сейчас у MS в Visual Studio даже в контекстном меню редактора есть пункт "Insert Snippet", можно типовые использовать или свою библиотеку создать. А у нас была бы ветка на форуме.

Сейчас даже голосование сделаю по этому вопросу ) 

 
Alexey Volchanskiy:

Владимир, чисто из любопытства, это ты специально такие развернутые ответы пишешь ли заготовлены типовые болванки? Если болванки, может, организовать ветку Code Snippets? Думаю, каждый MQL5 программист туда свой кусочек кинет. Ведь в Code Base сниппеты не положишь, там должно быть нечто цельное и работающее.
Сейчас у MS в Visual Studio даже в контекстном меню редактора есть пункт "Insert Snippet", можно типовые использовать или свою библиотеку создать. А у нас была бы ветка на форуме.

Сейчас даже голосование сделаю по этому вопросу ) 

... и обязательно сразу в первых строках, объяснение для нетямущих - что есть "сниппет" 😉
 

можно и я свой "простой" для понимания код вставлю /

Работает на любом счете 

в внешних переменных

input int    StopLosss=0;

input int    TakeProfits=0;

 

функции

 

//+----------------------------------------------------------------------------+
//|  Описание : Вычисляет новый Стоплосс тейкпрофит и выставляет.                                           |
//+----------------------------------------------------------------------------+

void Modify(string symToWork2,int sl2,int tp2,int tickettoModify=0,int tickettoModifydeal=0)
  {
   ZeroMemory(request);
   ZeroMemory(result);
   int  PosTotal=PositionsTotal();

   for(int i=PosTotal-1;i>=0;i--)
     {
      if((PositionSelectByTicket(PositionGetTicket(i))==true || (!PositionSelectByTicket(PositionGetTicket(i)) && PositionSelect(symToWork2)))

         && PositionGetSymbol(i)==symToWork2
         && (tickettoModify==0 || tickettoModify==PositionGetTicket(i) || AccountInfoInteger(ACCOUNT_MARGIN_MODE)!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
         )
        {

         stop_level=SymbolInfoInteger(PositionGetString(POSITION_SYMBOL),SYMBOL_TRADE_STOPS_LEVEL);

         if((PositionGetString(POSITION_SYMBOL)!=symToWork2)) continue;

         order_open_price = PositionGetDouble(POSITION_PRICE_OPEN);
         order_type       = PositionGetInteger(POSITION_TYPE);

         if(order_type==POSITION_TYPE_BUY)
           {

            double sl,tp;

            if(sl2!=0 ) sl=SymbolInfoDouble(symToWork2,SYMBOL_BID)-sl2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else sl=0;
            if(tp2!=0 ) tp=SymbolInfoDouble(symToWork2,SYMBOL_BID)+tp2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else tp=0;


            ModifyOrders(PositionGetInteger(POSITION_IDENTIFIER),sl,tp,"Modify");

           }// end POSITION_TYPE_BUY    

         else if(order_type==POSITION_TYPE_SELL)
           {

            double sl,tp;

            if(sl2!=0) sl=SymbolInfoDouble(symToWork2,SYMBOL_ASK)+sl2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else sl=0;
            if(tp2!=0) tp=SymbolInfoDouble(symToWork2,SYMBOL_ASK)-tp2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else tp=0;
            ModifyOrders(PositionGetInteger(POSITION_IDENTIFIER),sl,tp,"Modify");

           }// end POSITION_TYPE_SELL

        }// end if select                
     }
  }// end for
//+------------------------------------------------------------------+
//| Модификация позиций                                                                 |
//+------------------------------------------------------------------+
bool ModifyOrders(int ticket,double stoploss,double takeprofit,string comenttomodify)
  {
   ZeroMemory(request);
   ZeroMemory(result);

   request.symbol=PositionGetString(POSITION_SYMBOL);
   int stops_level=(int)SymbolInfoInteger(request.symbol,SYMBOL_TRADE_STOPS_LEVEL);
   bool SL_check=false,TP_check=false;
   if(stops_level==0){SL_check=true;TP_check=true;}
   request.position=ticket;
   request.order=PositionGetInteger(POSITION_IDENTIFIER);
   request.comment=comenttomodify;

   if(stoploss==-1)stoploss=PositionGetDouble(POSITION_SL);
   if(takeprofit==-1)takeprofit=PositionGetDouble(POSITION_TP);
   if(stoploss!=PositionGetDouble(POSITION_SL))request.sl=stoploss;else request.sl=PositionGetDouble(POSITION_SL);
   if(takeprofit!=PositionGetDouble(POSITION_TP))request.tp=takeprofit;else request.tp=PositionGetDouble(POSITION_TP);

   request.tp=NormalizeDouble(request.tp,SymbolInfoInteger(symToWork,SYMBOL_DIGITS));
   request.sl=NormalizeDouble(request.sl,SymbolInfoInteger(symToWork,SYMBOL_DIGITS));
   request.action=TRADE_ACTION_SLTP;
   request.deviation=slippage; // по спреду

   if(NormalizeDouble(request.sl,SymbolInfoInteger(request.symbol,SYMBOL_DIGITS))==NormalizeDouble(PositionGetDouble(POSITION_SL),SymbolInfoInteger(request.symbol,SYMBOL_DIGITS))
      && NormalizeDouble(request.tp,SymbolInfoInteger(request.symbol,SYMBOL_DIGITS))==NormalizeDouble(PositionGetDouble(POSITION_TP),SymbolInfoInteger(request.symbol,SYMBOL_DIGITS)))
     {

      return(false);

     }

//--- получим уровень SYMBOL_TRADE_STOPS_LEVEL
//--- проверяем только два типа ордеров
   switch(PositionGetInteger(POSITION_TYPE))
     {
      //--- операция покупка
      case  ORDER_TYPE_BUY:
        {
         //--- проверим StopLoss
         if(request.sl!=0)SL_check=(SymbolInfoDouble(request.symbol,SYMBOL_BID)-request.sl>stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT));else SL_check=true;
         if(!SL_check && request.sl!=0)
            PrintFormat("CHECKSLTP ERROR "+comenttomodify+" For order %d StopLoss=%.5f must be less than %.5f"+
                        " (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)",
                        ticket,request.sl,SymbolInfoDouble(request.symbol,SYMBOL_BID)-stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT),SymbolInfoDouble(request.symbol,SYMBOL_BID),stops_level);
         //--- проверим TakeProfit
         if(request.tp!=0)TP_check=(request.tp-SymbolInfoDouble(request.symbol,SYMBOL_BID)>stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT));else TP_check=true;
         if(!TP_check && request.tp!=0)
            PrintFormat("CHECKSLTP ERROR "+comenttomodify+"  For order %d TakeProfit=%.5f must be greater than %.5f"+
                        " (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)",
                        ticket,request.tp,SymbolInfoDouble(request.symbol,SYMBOL_BID)+stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT),SymbolInfoDouble(request.symbol,SYMBOL_BID),stops_level);
         break; //--- вернем результат проверки
        }
      //--- операция продажа
      case  ORDER_TYPE_SELL:
        {
         //--- проверим StopLoss
         if(request.sl!=0)SL_check=(request.sl-SymbolInfoDouble(request.symbol,SYMBOL_ASK)>stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT));else SL_check=true;
         if(!SL_check && request.sl!=0)
            PrintFormat("CHECKSLTP ERROR "+comenttomodify+"  For order %d StopLoss=%.5f must be greater than %.5f "+
                        " (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)",
                        ticket,request.sl,SymbolInfoDouble(request.symbol,SYMBOL_ASK)+stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT),SymbolInfoDouble(request.symbol,SYMBOL_ASK),stops_level);
         //--- проверим TakeProfit
         if(request.tp!=0)TP_check=(SymbolInfoDouble(request.symbol,SYMBOL_ASK)-request.tp>stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT));else TP_check=true;
         if(!TP_check && request.tp!=0)
            PrintFormat("CHECKSLTP ERROR "+comenttomodify+"  For order %d TakeProfit=%.5f must be less than %.5f "+
                        " (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)",
                        ticket,request.tp,SymbolInfoDouble(request.symbol,SYMBOL_ASK)-stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT),SymbolInfoDouble(request.symbol,SYMBOL_ASK),stops_level);
         break;
        }
     }

   if(TP_check && SL_check)
     {
      Print("ModifyOrders "+comenttomodify+"  "
            +ticket
            +" POSITION_TYPE="+PositionGetInteger(POSITION_TYPE)
            +" stoploss="+stoploss
            +" takeprofit="+takeprofit
            +" request.sl="+request.sl
            +" request.tp="+request.tp
            +" POSITION_SL="+PositionGetDouble(POSITION_SL)
            +" POSITION_TP="+PositionGetDouble(POSITION_TP)
            +" SYMBOL_BID="+SymbolInfoDouble(request.symbol,SYMBOL_BID)
            +" SYMBOL_ASK="+SymbolInfoDouble(request.symbol,SYMBOL_ASK)
            +" stops_level="+stops_level
            );
      bool checksend=OrderSend(request,result);
     }
   if(result.retcode==TRADE_RETCODE_DONE)
     {
      if(Sounds)PlaySound("ok.wav"); Print("ModifyOrders "+comenttomodify+" = "+(string)result.retcode+
         " symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
         +(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+"   "+ErrorDescription(result.retcode));
     }
   else
     {
      if(Sounds)PlaySound("stops.wav");
      Print("ModifyOrders  "+comenttomodify+" ERROR = "+(string)result.retcode+
            " symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
            +(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+"   "+ErrorDescription(result.retcode));
     }

   return(false);
  }


 в OnTick там где нужна модификация:

      //+------------------------------------------------------------------+
      // Модификация позиций
      //+------------------------------------------------------------------+
    
         Modify(Symbol(),StopLosss,TakeProfits);
      


 

 
Vladimir Karputov:
... и обязательно сразу в первых строках, объяснение для нетямущих - что есть "сниппет" 😉
Написал, даже простейший пример из студии привел ) Вопрос такой, технически сколько я (если буду вести ветку сниппетов) смогу редактировать свой первый пост? Вроде есть какой-то срок у движка форума? Надо же меню будет делать и в него дбавлять новые пункты
 
Alexey Volchanskiy:
Написал, даже простейший пример из студии привел ) Вопрос такой, технически сколько я (если буду вести ветку сниппетов) смогу редактировать свой первый пост? Вроде есть какой-то срок у движка форума? Надо же меню будет делать и в него дбавлять новые пункты
Три дня, вроде.