Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1561

 
MakarFX:
Entfernen Sie nicht

Sie müssen das Zeichen ändern, wie ich geschrieben habe.

Das habe ich getan, und es werden wie üblich bis zu fünf Verträge eröffnet.

 
Eugen8519:

also habe ich es geändert und es werden wie üblich fünf Verträge geöffnet

Posten Sie den OnTick()-Code
 
MakarFX:

Addieren Sie dann, um den gesamten Gewinn für den Zeitraum zu berechnen.

Sie verstehen das wieder falsch. Er sagte, er wolle den Gewinn zählen. Die Funktion versuchte, den Verlust des letzten geschlossenen Auftrags zu berechnen, was nicht korrekt war. So hat er am Ende alle verwirrt.

 
MakarFX:
Posten Sie den OnTick()-Code
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 vorerst entfernt
 
Eugen8519:

die Linie finden

OPENORDER("Buy");

und ersetzen sie durch.

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

eine Linie finden

OPENORDER("Sell");

und ersetzen durch

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

Sie haben es wieder falsch verstanden. Er sagte, er wolle den Gewinn berechnen. Die Funktion versuchte, den Verlust des letzten geschlossenen Auftrags zu berechnen, was nicht korrekt war. So hat er am Ende alle verwirrt.

Sie haben selbst gesagt, dass der Gewinn negativ sein kann, und er wollte den Gesamtgewinn des Handels positiv oder negativ erhalten.
 
MakarFX:

die Linie finden

und ersetzen sie durch.

eine Linie finden

und ersetzen sie durch.


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


Ich habe es so formuliert, dass es bei zwei Verträgen immer noch unbegrenzt ist.

 
MakarFX:
Sie haben selbst gesagt, dass der Gewinn negativ sein kann, und er wollte den Gesamtgewinn des Handels positiv oder negativ erhalten.

Ein Gewinn wird also nur addiert, wenn er positiv ist. Wenn sie negativ ist, handelt es sich um einen Verlust. Um den Gesamtgewinn zu ermitteln, werden alle Gewinne, auch die negativen, zusammengezählt. Und diese Funktion versucht, den Gewinn der letzten Bestellung zu ermitteln, macht es aber falsch und heißt lastloss. Verstehst du das nicht? Ach, du liebe Zeit... Ich bin erschöpft...

 
Eugen8519:



Ich habe es so formuliert, aber es ist immer noch unbegrenzt bei zwei Verträgen.

nicht vorhanden in void OnTick

 
MakarFX:

Addieren Sie dann, um den gesamten Gewinn für den Zeitraum zu berechnen.

"Und warum addieren Sie Swap und Provision zum Gewinn?
OrderProfit()

Kann auch negativ sein...

Und von welchem Gesamtgewinn sprechen wir, wenn Sie nur einen oder einige wenige passende Aufträge bearbeiten, aber nicht alle?"


Irgendetwas hat sie wirklich verwirrt. Die Bemerkung war in Ordnung, es ging nicht um das Addieren und Subtrahieren negativer Zahlen)

Ich mag auch keine Antworten Seek, es ist da)

Grund der Beschwerde: