Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1561

 
MakarFX:
Не надо убирать

надо знак поменять как я написал

так я поменял, а он открывает как обычно до пяти контрактов

 
Eugen8519:

так я поменял, а он открывает как обычно до пяти контрактов

Выложи код OnTick()
 
MakarFX:

Затем и прибавлять, чтобы посчитать весь профит за период.

Вы снова не поняли. Он сказал, что хочет подсчитать профит. А функция пыталась считала убыток последнего закрытого ордера и то некорректно. Вот и запутал он всех в итоге.

 
MakarFX:
Выложи код OnTick()
void OnTick()
  {  

  double close1 = iClose(_Symbol,Timeframe,1);

   datetime time_0=iTime(0);
   if(TimeBar==time_0)
      return;
   if(TimeBar==0)
     {
      TimeBar=time_0;
      return;
     }//first program run
 
   double EMA0[],EMA_TREND[],WMA0[];
//---
   int start_pos=1,count=3;
   if(!iGetArray(handle_iMA_EMA,0,start_pos,count,EMA0))
      return;
   if(!iGetArray(handle_iMA_EMA_TREND,0,start_pos,count,EMA_TREND))
      return;
   if(!iGetArray(handle_iMA_WMA,0,start_pos,count,WMA0))
      return;
      
//---

   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeToStruct(TimeCurrent() , str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
   if(YesStop==false)
   {
   
   ulong  m_ticket=0;
   double SEma,LEma;
   
   SEma = iMAGet(handle_iMA_WMA,0);
   LEma = iMAGet(handle_iMA_EMA,0);
   
      static int isCrossed=0;
   if(!Reverse)
      isCrossed=Crossed(LEma,SEma);
   else
      isCrossed=Crossed(SEma,LEma);
//---
   if(!RefreshRates())
      return;
//---
   bool   condition1 = (close1 > EMA_TREND[0]);
   bool   condition2 = (isCrossed==1);

{  
   {  
        int pos_total=PositionsTotal();
     {
       if(condition1 && condition2 && pos_total==0 )
        {

      if(!RefreshRates())
         return;
      TimeBar=time_0;
      my_TP = m_symbol.Ask() + ExtTakeProfit*Point();
      my_SL = m_symbol.Ask() - ExtStopLoss*Point();
      my_lot = Lots;
      OPENORDER("Buy");
      CLOSEORDER("Sell");
         }  
 }
   bool   condition3 = (close1 < EMA_TREND[0]);
   bool   condition4 = (isCrossed==2);
   
      if(condition3 && condition4 && pos_total==0 )
         {
      if(!RefreshRates())
         return;
      TimeBar=time_0;
      my_TP  = m_symbol.Bid() - ExtTakeProfit*Point();
      my_SL  = m_symbol.Bid() + ExtStopLoss*Point();

      my_lot= Lots;
      OPENORDER("Sell");
      CLOSEORDER("Buy");
         }
     } 
 } 
 
 
 if(UseTimeLimitClose)
     {
      MqlDateTime TimeNow;
      TimeToStruct(TimeCurrent(),TimeNow);
      if  ( TimeNow.day_of_week >= closday  && TimeNow.hour >= Close_Hour && TimeNow.min >= Close_min ) 
       {
          CloseAllPositions();
       }     
   }
//---
   TrailingOrder();
   Trailing();
//---
   return;
    }
 }

//--------------------------------------------------------------------
void CLOSEORDER(string ord)
  {
   for(int i=PositionsTotal()-1; i>=0; i--)  // returns the number of open positions
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY && ord=="Buy")
               m_trade.PositionClose(m_position.Ticket());  // Close Buy
            if(m_position.PositionType()==POSITION_TYPE_SELL && ord=="Sell")
               m_trade.PositionClose(m_position.Ticket()); // Close Sell
           }
  }
 

   
//--------------------------------------------------------------------   
void CloseAllPositions()
{
 
   for(int i=PositionsTotal()-1; i>=0 && !IsStopped(); i--)
     {
      if(m_position.SelectByIndex(i))
        {
         //--- trading object
         m_trade.SetExpertMagicNumber(m_position.Magic());
         m_trade.SetTypeFillingBySymbol(m_position.Symbol());
         //--- close positions
         if(m_trade.PositionClose(m_position.Ticket()) && (m_trade.ResultRetcode()==TRADE_RETCODE_DONE || m_trade.ResultRetcode()==TRADE_RETCODE_PLACED))
            PrintFormat("Position #%I64u on %s to be closed",m_position.Ticket(),m_position.Symbol());
         else
            PrintFormat("> Error closing position #%I64u on %s (%s)",m_position.Ticket(),m_position.Symbol(),m_trade.ResultComment());
        }
      }
   }
//--------------------------------------------------------------------

void OPENORDER(string ord)

  {
  
  double priceL=m_symbol.Ask();
   if(ord=="Sell")      
        //--- check for free money
            if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,my_lot,priceL)<0.0)
               printf("We have no money. Free Margin = %f",m_account.FreeMargin());
            else
      if(!m_trade.Sell(my_lot,Symbol(),m_symbol.Bid(),my_SL,my_TP,""))
         Print("BUY_STOP -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of Retcode: ",m_trade.ResultRetcodeDescription(),
               ", ticket of order: ",m_trade.ResultOrder());                     // Если sell, то не открываемся
     double priceS=m_symbol.Bid();
   if(ord=="Buy")
         //--- check for free money
            if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,my_lot,priceS)<0.0)
               printf("We have no money. Free Margin = %f",m_account.FreeMargin());
            else
      if(!m_trade.Buy(my_lot,Symbol(),m_symbol.Ask(),my_SL,my_TP,""))
 
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription(),
               ", ticket of deal: ",m_trade.ResultDeal());
   return;
 }
  double iMAGet(const int handle,const int index)
  {
   double MA[];
   ArraySetAsSeries(MA,true);
//--- reset error code
   ResetLastError();
//--- fill a part of the iMABuffer array with values from the indicator buffer that has 0 index
   if(CopyBuffer(handle,0,0,index+1,MA)<0)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(0.0);
     }
   return(MA[index]);
  }
//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+
//| Get Time for specified bar index                                 |
//+------------------------------------------------------------------+
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[];
   datetime time=0;
   ArraySetAsSeries(Time,true);
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied>0)
      time=Time[0];
   return(time);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
 
 
}
void TrailingOrder()

  {
  int pos_total=PositionsTotal();

   if(InpTrailingOrderLimit==0)
        return;
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
                  if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingOrderLimit+ExtTrailingOrderStep))
                       OPENORDER("Buy");
 
                  
              }
            else
              {
               if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
                  if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingOrderLimit+ExtTrailingOrderStep))))
                        OPENORDER("Sell");
 
              }
           }
    }      
 void Trailing()
  {
   if(InpTStop==0)
      return;
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTStop+ExtTStep)
                  if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTStop+ExtTStep))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTStepShift),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket(),
                              " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                              ", description of result: ",m_trade.ResultRetcodeDescription());
                    }
              }
            else
              {
               if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTStop+ExtTStep)
                  if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTStop+ExtTStep))) ||
                     (m_position.StopLoss()==0))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTStepShift),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket(),
                              " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                              ", description of result: ",m_trade.ResultRetcodeDescription());
                   }
              }
         }
   }
//+------------------------------------------------------------------+


pos_total<=2 убрал пока
 
Eugen8519:

найди строку

OPENORDER("Buy");

и замени на

   if (PositionsTotal()<=2)
     {
      OPENORDER("Buy");
     }

найди строку

OPENORDER("Sell");

и замени на

   if (PositionsTotal()<=2)
     {
      OPENORDER("Sell");
     }
 
Mihail Matkovskij:

Вы снова не поняли. Он сказал, что хочет подсчитать профит. А функция пыталась считала убыток последнего закрытого ордера и то некорректно. Вот и запутал он всех в итоге.

Ты сам сказал профит может быть отрицательным и он хотел получить полный профит по сделке положительный или отрицательный
 
MakarFX:

найди строку

и замени на

найди строку

и замени на


   if(InpTrailingOrderLimit==0)
        return;
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
                  if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingOrderLimit+ExtTrailingOrderStep))
                     if (PositionsTotal()<=2)
                          {
                        OPENORDER("Buy");
                          }
 
                  
              }
            else
              {
               if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
                  if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingOrderLimit+ExtTrailingOrderStep))))
                 if (PositionsTotal()<=2)
                           {
                            OPENORDER("Sell");
                            }


встравил так, всеравно неограничивается на двух контрактах

 
MakarFX:
Ты сам сказал профит может быть отрицательным и он хотел получить полный профит по сделке положительный или отрицательный

Значит, профит суммируется только если он положительный. Если отрицательный, то это уже убыток. Если нужно узнать общий профит, по суммируются все профиты, включая отрицательные. А у него функция пыталась узнать профит последнего ордера, делала это некорректно и называлась lastloss. Неужели не поняли? Ну ёлки палки... Сил моих нет...

 
Eugen8519:



встравил так, всеравно неограничивается на двух контрактах

не там в void OnTick

 
MakarFX:

Затем и прибавлять, чтобы посчитать весь профит за период.

"И зачем вы своп с комиссией к прибыли прибавляете? При том что 
OrderProfit()

может быть и отрицательным...

И о какой общей прибыли идет речь, если вы обрабатываете только 1 или несколько подходящих ордеров, но не все?"


Что то и правда запутали друг друга. Все правильно в замечании было.  А не про сложение вычитание отрицательных чисел)

Я тоже не люблю ответы Ищи, там есть)