Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1561

 
MakarFX:
Non rimuovere

Devi cambiare il segno come ho scritto.

Così l'ho fatto, e si apre a cinque contratti come al solito.

 
Eugen8519:

così l'ho cambiato e si apre a cinque contratti come al solito

Pubblica il codice OnTick()
 
MakarFX:

Poi sommate per calcolare l'intero profitto del periodo.

Lei fraintende di nuovo. Ha detto che voleva contare il profitto. La funzione ha cercato di calcolare la perdita dell'ultimo ordine chiuso, e non era corretta. Così, alla fine, ha confuso tutti.

 
MakarFX:
Pubblica il codice 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 rimosso per ora
 
Eugen8519:

trovare la linea

OPENORDER("Buy");

e sostituirlo con.

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

trovare una linea

OPENORDER("Sell");

e sostituirlo con

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

Hai di nuovo frainteso. Ha detto che voleva calcolare il profitto. La funzione ha cercato di calcolare la perdita dell'ultimo ordine chiuso e non era corretta. Così alla fine ha confuso tutti.

Tu stesso hai detto che il profitto può essere negativo e lui voleva ottenere il profitto totale del commercio positivo o negativo
 
MakarFX:

trovare la linea

e sostituirlo con.

trovare una linea

e sostituirlo con.


   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");
                            }


Se la metto in questo modo, è ancora illimitata su due contratti

 
MakarFX:
Tu stesso hai detto che il profitto può essere negativo e lui voleva ottenere il profitto totale del commercio positivo o negativo

Quindi un profitto viene sommato solo se è positivo. Se è negativo, è una perdita. Se vogliamo conoscere il profitto totale, si sommano tutti i profitti, compresi quelli negativi. E questa funzione cerca di scoprire il profitto dell'ultimo ordine, lo fa in modo errato e si chiama lastloss. Non lo capite? Oh, caro... Sono esausto...

 
Eugen8519:



L'ho messo in questo modo, ma è ancora illimitato su due contratti.

non c'è in void OnTick

 
MakarFX:

Poi sommate per calcolare l'intero profitto del periodo.

"E perché aggiungete swap e commissioni ai profitti? Considerando che
OrderProfit()

Può anche essere negativo...

E di che tipo di profitto totale stiamo parlando se si elaborano solo 1 o pochi ordini corrispondenti, ma non tutti?".


C'era qualcosa di molto confuso tra di loro. Era tutto giusto nell'osservazione, non si tratta di aggiungere e sottrarre numeri negativi)

Non mi piacciono nemmeno le risposte Seek, è lì)