MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1561

 
MakarFX :
temizlemeye gerek yok

yazdığım gibi işareti değiştirmeniz gerekiyor

bu yüzden değiştim ve her zamanki gibi beş sözleşmeye kadar açılıyor

 
Eugen8519 :

bu yüzden değiştim ve her zamanki gibi beş sözleşmeye kadar açılıyor

OnTick() kodunu gönderin
 
MakarFX :

Ardından, dönem için tüm karı hesaplamak için ekleyin.

Yine anlamadın. Kârı hesaplamak istediğini söyledi. Ve fonksiyon, son kapalı sıranın kaybını hesaplamaya çalıştı ve o zaman bile yanlıştı. Böylece herkesin kafasını karıştırdı.

 
MakarFX :
OnTick() kodunu gönderin
 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 şimdilik kaldırıldı
 
Eugen8519 :

çizgiyi bul

OPENORDER( "Buy" );

ve şununla değiştir

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

çizgiyi bul

OPENORDER( "Sell" );

ve şununla değiştir

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

Yine anlamadın. Kârı hesaplamak istediğini söyledi. Ve fonksiyon, son kapalı sıranın kaybını hesaplamaya çalıştı ve o zaman bile yanlıştı. Böylece herkesin kafasını karıştırdı.

Sen kendin karın negatif olabileceğini söyledin ve anlaşmadan pozitif veya negatif tam bir kâr elde etmek istedi.
 
MakarFX :

çizgiyi bul

ve şununla değiştir

çizgiyi bul

ve şununla değiştir


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


bu şekilde eklendi, yine de iki sözleşmede sınırsız

 
MakarFX :
Sen kendin karın negatif olabileceğini söyledin ve anlaşmadan pozitif veya negatif tam bir kâr elde etmek istedi.

Bu, kârın yalnızca pozitif olması durumunda özetlendiği anlamına gelir. Negatifse, o zaman zaten bir kayıptır. Toplam karı bulmanız gerekiyorsa, negatif olanlar da dahil olmak üzere tüm karlar toplanır. Ve işlevi, son düzenin kârını bulmaya çalıştı, yanlış yaptı ve son kayıp olarak adlandırıldı. Anlamadılar mı? Eh, Noel ağacı çubukları ... Gücüm yok ...

 
Eugen8519 :



bu şekilde eklendi, yine de iki sözleşmede sınırsız

orada yok OnTick

 
MakarFX :

Ardından, dönem için tüm karı hesaplamak için ekleyin.

“Ve neden kâr etmek için komisyonlu bir takas ekliyorsunuz?
OrderProfit()

olumsuz olabilir...

Ve yalnızca 1 veya birkaç uygun siparişi işlerseniz, ancak hepsini değil, ne tür bir toplam kârdan bahsediyoruz?"


Bir şey gerçekten birbirini karıştırdı. Açıklamada her şey doğruydu. Negatif sayıların toplanması ve çıkarılmasıyla ilgili değil)

Ben de cevapları sevmiyorum. Bak, oradalar)