Помогите разобрать код и добавить функцию

 

Здравствуйте уважаемые подписчики форума.

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

Подскажите где в коде это прописано и как лучше изменить что бы стоп лос можно было прописывать в ручную в количестве пунктов 

#property version   "1.001"
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
#include <Trade\AccountInfo.mqh>
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
CAccountInfo   m_account;                    // account info wrapper
//--- input parameters
input string  Comment_1    = "settings";
input ushort  InpPlus      = 5;
input ushort  InpTakeProfit= 30;
input ushort  InpDistanciya= 30;
input ushort  InpStepDist  = 5;
input double  Lots         = 0.00;
input double  InpPercent   = 1;
input bool    Martin       = true;
input string  Comment_4    = "signalProc";
input bool    Proc         = true;
input double  Procent      = 1.3;
input ushort  InpSlip      = 2;
input ulong   Magic        = 1;
//---
double  ExtPlus      = 0;
double  ExtTakeProfit= 0;
double  ExtDistanciya= 0;
double  ExtStepDist  = 0;
ulong    ExtSlip=0;
double  ExtPercent=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(m_account.MarginMode()!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      Print("Hedging only!");
      return(INIT_FAILED);
     }
//---
   m_symbol.Name(Symbol());                  // sets symbol name
   m_trade.SetExpertMagicNumber(Magic);      // sets magic number

   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;
   ExtPlus        = InpPlus         *digits_adjust;
   ExtTakeProfit  = InpTakeProfit   *digits_adjust;
   ExtDistanciya  = InpDistanciya   *digits_adjust;
   ExtStepDist    = InpStepDist     *digits_adjust;
   ExtSlip        = InpSlip         *digits_adjust;
   ExtPercent     = InpPercent;

   m_trade.SetDeviationInPoints(ExtSlip);    // sets deviation
//---
   if(!LabelCreate())
      return(INIT_FAILED);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(!RefreshRates())
      return;
   double Lots_New=0;
   double One_Lot=0.0;
   if(!OrderCalcMargin(ORDER_TYPE_BUY,m_symbol.Name(),1.0,m_symbol.Ask(),One_Lot))
     {
      Print("Error OrderCalcMargin #",GetLastError());
      return;
     }
   double Min_Lot=m_symbol.LotsMin();
   double Step   =m_symbol.LotsStep();
   double Free   =m_account.FreeMargin();
//--------------------------------------------------------------- 3 --
   if(Lots>0)
     {
      double Money=Lots*One_Lot;
      if(Money<=m_account.FreeMargin())
         Lots_New=Lots;
      else
         Lots_New=MathFloor(Free/One_Lot/Step)*Step;
     }
//--------------------------------------------------------------- 4 --
   else
     {
      if(ExtPercent>100)
         ExtPercent=100;
      if(ExtPercent==0)
         Lots_New=Min_Lot;
      else
         Lots_New=MathFloor(Free*ExtPercent/100/One_Lot/Step)*Step;//Расч
     }
//--------------------------------------------------------------- 5 --
   if(Lots_New<Min_Lot)
      Lots_New=Min_Lot;
   if(Lots_New*One_Lot>m_account.FreeMargin())
     {
      return;
     }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// set text label transferred to OnInit ()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   double opB=2000;           double opS=0;
   double orderProfitbuy=0;   double Sum_Profitbuy=0;
if(Procent*(-1)<=y && iClose(Symbol(),Period(),1)>iOpen(Symbol(),Period(),1))
        {
         sigup=1; sigdw=0;
        }
      if(Procent>=x && iClose(Symbol(),Period(),1)<iOpen(Symbol(),Period(),1))
        {
         sigup=0; sigdw=1;
        }
     }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   int f=0;
   if(Martin==true)
     {
      if(total==0)
        {
         f=1;
        }
      if(total>=1)
        {
         f=total;
        }
      LotB=Lots_New*f;
      LotS=Lots_New*f;
     }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   if(Martin==false)
     {
      LotB=LotS;
      LotS=LotB;
     }
//---
   if(!RefreshRates())
      return;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//  
   if((b==0 && sigup==1 && s==0) || (m_symbol.Ask()<opB-dis+spred && b>=1 && s==0))
     {
      m_trade.Buy(LotB,Symbol(),m_symbol.Ask(),0,0,"Buy ");
      return;
     }
   if((s==0 && sigdw==1 && b==0) || (m_symbol.Bid()>opS+dis+spred && s>=1 && b==0))
     {
      m_trade.Sell(LotS,Symbol(),m_symbol.Bid(),0,0,"Sell");
      return;
     }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   double TP=NormalizeDouble(spred+ExtTakeProfit*m_symbol.Point(),m_symbol.Digits());
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   bool buy_or_sell=false;
   if(!RefreshRates())
      return;
   for(int iq=total-1; iq>=0; iq--)
     {
      if(m_position.SelectByIndex(iq))
        {
         if(m_position.Symbol()==Symbol() && m_position.Magic()==Magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY && m_position.TakeProfit()==0 && b==1)
              {
               m_trade.PositionModify(m_position.Ticket(),
                                      m_position.StopLoss(),NormalizeDouble(m_position.PriceOpen()+TP,Digits()));
               buy_or_sell=true;
              }
            if(m_position.PositionType()==POSITION_TYPE_SELL && m_position.TakeProfit()==0 && s==1)
              {
               m_trade.PositionModify(m_position.Ticket(),
                                      m_position.StopLoss(),NormalizeDouble(m_position.PriceOpen()-TP,Digits()));
               buy_or_sell=true;
              }
           }
        }
     }
   if(buy_or_sell)
      return;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   double nn=0,bb=0;
   double factb=0.0;
   for(int ui=total-1; ui>=0; ui--)
     {
      if(m_position.SelectByIndex(ui))
        {
         if(m_position.Symbol()==Symbol())
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY && m_position.Magic()==Magic)
              {
               double op=m_position.PriceOpen();
               double llot=m_position.Volume();
               double itog=op*llot;
               bb=bb+itog;
               nn=nn+llot;
               factb=bb/nn;
              }
           }
        }
     }
   double nnn=0,bbb=0;
   double facts=0.0;
   for(int usi=total-1; usi>=0; usi--)
     {
      if(m_position.SelectByIndex(usi))
        {
         if(m_position.Symbol()==Symbol())
           {
            if(m_position.PositionType()==POSITION_TYPE_SELL && m_position.Magic()==Magic)
              {
               double ops=m_position.PriceOpen();
               double llots=m_position.Volume();;
               double itogs=ops*llots;
               bbb=bbb+itogs;
               nnn=nnn+llots;
               facts=bbb/nnn;
              }
           }
        }
     }
   buy_or_sell=false;
   if(!RefreshRates())
      return;
   for(int uui=total-1; uui>=0; uui--)
     {
      if(m_position.SelectByIndex(uui))
        {
         if(m_position.Symbol()==Symbol())
           {
            double pr_open=m_position.PriceOpen();
            double pr_curr=m_position.PriceCurrent();
            double pr_tp=m_position.TakeProfit();

if(b>=2 && m_position.PositionType()==POSITION_TYPE_BUY && m_position.Magic()==Magic)
              {
               if(!CompareDoubles(m_position.TakeProfit(),factb+CORR))
                 {
                  if(!m_trade.PositionModify(m_position.Ticket(),m_position.StopLoss(),factb+CORR))
                     DebugBreak();
                  buy_or_sell=true;
                 }
              }
            if(s>=2 && m_position.PositionType()==POSITION_TYPE_SELL && m_position.Magic()==Magic)
              {
               if(!CompareDoubles(m_position.TakeProfit(),facts-CORR))
                 {
                  if(!m_trade.PositionModify(m_position.Ticket(),m_position.StopLoss(),facts-CORR))
                     DebugBreak();
                  buy_or_sell=true;
                 }
              }
           }
        }
     }
//---
   return;
  }
//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+ 
//| Create a text label                                              | 
//+------------------------------------------------------------------+ 
bool LabelCreate() // priority for mouse click 
  {
//--- reset the error value 
   ResetLastError();
//--- create a text label 
   if(!ObjectCreate(0,"R",OBJ_LABEL,0,0,0))
     {
      Print(FUNCTION,
            ": failed to create text label! Error code = ",GetLastError());
      return(false);
     }
//--- set label coordinates 
   ObjectSetInteger(0,"R",OBJPROP_XDISTANCE,10);
   ObjectSetInteger(0,"R",OBJPROP_YDISTANCE,10);
//--- set the chart's corner, relative to which point coordinates are defined 
   ObjectSetInteger(0,"R",OBJPROP_CORNER,CORNER_LEFT_UPPER);
//--- set the text 
   ObjectSetString(0,"R",OBJPROP_TEXT,"VS-Robotics");
//--- set text font 
   ObjectSetString(0,"R",OBJPROP_FONT,"Arial Black");
//--- set font size 
   ObjectSetInteger(0,"R",OBJPROP_FONTSIZE,15);
//--- set color 
   ObjectSetInteger(0,"R",OBJPROP_COLOR,clrRed);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,Digits()-1)==0)
      return(true);
   else
      return(false);
  }
//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
Файлы:
VS-Robotics.mq5  29 kb
 
Вставьте код, через форму добавления кода.
 
Evgeniy Chumakov:
Вставьте код, через форму добавления кода.

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