Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 710

 
Kirill Andreev :
işe yaramıyor ne yazık ki
ShortModified ve LongModified yöntemleri.
 
Vladimir Karputov :
ShortModified ve LongModified yöntemleri.
class CSampleExpert
  {
protected :
   double             m_adjusted_point;             // point value adjusted for 3 or 5 points
   CTrade            m_trade;                       // trading object
   CSymbolInfo       m_symbol;                     // symbol info object
   CPositionInfo     m_position;                   // trade position object
   CAccountInfo      m_account;                     // account info wrapper
   //--- indicators
   int                m_handle_macd;                 // MACD indicator handle
   int                m_handle_ema;                 // moving average indicator handle
   //--- indicator buffers
   double             m_buff_MACD_main[];           // MACD indicator main buffer
   double             m_buff_MACD_signal[];         // MACD indicator signal buffer
   double             m_buff_EMA[];                 // EMA indicator buffer
   //--- indicator data for processing
   double             m_macd_current;
   double             m_macd_previous;
   double             m_signal_current;
   double             m_signal_previous;
   double             m_ema_current;
   double             m_ema_previous;
   //---
   double             m_macd_open_level;
   double             m_macd_close_level;
   double             m_traling_stop;
   double             m_take_profit;

public :
                     CSampleExpert( void );
                    ~CSampleExpert( void );
   bool               Init( void );
   void               Deinit( void );
   bool               Processing( void );

protected :
   bool               InitCheckParameters( const int digits_adjust);
   bool               InitIndicators( void );
   bool               LongClosed( void );
   bool               ShortClosed( void );
   bool                LongModified( void );
   bool                ShortModified( void );
   bool               LongOpened( void );
   bool               ShortOpened( void );
  };

Sınıfa dahil edilirler. Onları ayrı bir işlev olarak eklemem gerekiyor .... ?

Onları nasıl düzenleyeceğimi bilmiyorum. Mevcut son sınıfları eklemenin örneklerini bulmaya çalıştım ama bulamadım.

 
Kirill Andreev :
class CSampleExpert
  {
protected :
   double             m_adjusted_point;             // point value adjusted for 3 or 5 points
   CTrade            m_trade;                       // trading object
   CSymbolInfo       m_symbol;                     // symbol info object
   CPositionInfo     m_position;                   // trade position object
   CAccountInfo      m_account;                     // account info wrapper
   //--- indicators
   int                m_handle_macd;                 // MACD indicator handle
   int                m_handle_ema;                 // moving average indicator handle
   //--- indicator buffers
   double             m_buff_MACD_main[];           // MACD indicator main buffer
   double             m_buff_MACD_signal[];         // MACD indicator signal buffer
   double             m_buff_EMA[];                 // EMA indicator buffer
   //--- indicator data for processing
   double             m_macd_current;
   double             m_macd_previous;
   double             m_signal_current;
   double             m_signal_previous;
   double             m_ema_current;
   double             m_ema_previous;
   //---
   double             m_macd_open_level;
   double             m_macd_close_level;
   double             m_traling_stop;
   double             m_take_profit;

public :
                     CSampleExpert( void );
                    ~CSampleExpert( void );
   bool               Init( void );
   void               Deinit( void );
   bool               Processing( void );

protected :
   bool               InitCheckParameters( const int digits_adjust);
   bool               InitIndicators( void );
   bool               LongClosed( void );
   bool               ShortClosed( void );
   bool                LongModified( void );
   bool                ShortModified( void );
   bool               LongOpened( void );
   bool               ShortOpened( void );
  };

Sınıfa dahil edilirler. Bunları ayrı bir işlev olarak eklemem gerekiyor .... ?

Onları nasıl düzenleyeceğimi bilmiyorum. Mevcut son sınıfları eklemenin örneklerini bulmaya çalıştım ama bulamadım.

Bunları kodunuza kopyalamanız yeterlidir.
 
Vladimir Karputov :
Bunları kodunuza kopyalamanız yeterlidir.

void LongModified()
  {

double m_traling_stop=InpTrailingStop*m_adjusted_point;
   bool res= false ;
//--- check for trailing stop
   if (InpTrailingStop> 0 )  
     {
       if (m_symbol. Bid ()-m_position.PriceOpen()>m_adjusted_point*InpTrailingStop)
        {
         double sl= NormalizeDouble (m_symbol. Bid ()-m_traling_stop,m_symbol. Digits ());
         double tp=m_position.TakeProfit();
         if (m_position.StopLoss()<sl || m_position.StopLoss()== 0.0 )
           {
             //--- modify position
             if (m_trade.PositionModify( Symbol (),sl,tp))
               printf ( "Long position by %s to be modified" , Symbol ());
             else
              {
               printf ( "Error modifying position by %s : '%s'" , Symbol (),m_trade.ResultComment());
               printf ( "Modify parameters : SL=%f,TP=%f" ,sl,tp);
              }
             //--- modified and must exit from expert
            res= true ;
           }
        }
     }
//--- result
   return (res);
  }  

 

 

hata mesajı veriyor

'return' - 'void' işlevi bir değer döndürür iz.mq5 482 4

 
Kirill Andreev :

void LongModified()
  {

double m_traling_stop=InpTrailingStop*m_adjusted_point;
   bool res= false ;
//--- check for trailing stop
   if (InpTrailingStop> 0 )  
     {
       if (m_symbol. Bid ()-m_position.PriceOpen()>m_adjusted_point*InpTrailingStop)
        {
         double sl= NormalizeDouble (m_symbol. Bid ()-m_traling_stop,m_symbol. Digits ());
         double tp=m_position.TakeProfit();
         if (m_position.StopLoss()<sl || m_position.StopLoss()== 0.0 )
           {
             //--- modify position
             if (m_trade.PositionModify( Symbol (),sl,tp))
               printf ( "Long position by %s to be modified" , Symbol ());
             else
              {
               printf ( "Error modifying position by %s : '%s'" , Symbol (),m_trade.ResultComment());
               printf ( "Modify parameters : SL=%f,TP=%f" ,sl,tp);
              }
             //--- modified and must exit from expert
            res= true ;
           }
        }
     }
//--- result
   return (res);
  }  

 

 

hata mesajı veriyor

'return' - 'void' işlevi bir değer döndürür iz.mq5 482 4

Akılsızca kopyalayamazsınız. Orijinaline tekrar bakın.
 

Uzman Danışman örneği: bir hadge hesabında, aynı anda iki zıt pozisyon açıyoruz - durmadan.

EA ayarlarında iki parametre vardır:

  • TrailingStop (pip olarak)
  • TrailingStep (pip olarak)
TrailingStep, aşırı sık yapılan değişikliklere karşı bir korumadır:

//+------------------------------------------------------------------+
//|                                                 TrailingStop.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#property description "Пример TrailingStop"
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                       // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//--- input parameters
input ushort    InpTrailingStop    = 10 ;       // TrailingStop (in pips)
input ushort    InpTrailingStep    = 5 ;         // TrailingStep (in pips)
//---
double          ExtTrailingStop= 0.0 ;
double          ExtTrailingStep= 0.0 ;
ulong           m_magic= 15489 ;                 // magic number
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
bool            FirstStart= true ;               // true - first start
double          m_adjusted_point;             // point value adjusted for 3 or 5 points
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   SetMarginMode();
   if (!IsHedging())
     {
       Print ( "Hedging only!" );
       return ( INIT_FAILED );
     }
   m_symbol.Name( Symbol ());                   // sets symbol name
   m_symbol.Refresh();                       // refreshes the symbol data
   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 ;
   m_adjusted_point=digits_adjust*m_symbol. Point ();
   ExtTrailingStop=InpTrailingStop*m_adjusted_point;
   ExtTrailingStep=InpTrailingStep*m_adjusted_point;

   m_trade.SetExpertMagicNumber(m_magic);     // sets magic number

   FirstStart= true ;
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (FirstStart)
     {
      m_trade.Buy( 0.01 );
      m_trade.Sell( 0.01 );
      FirstStart= false ;
     }
//--- TrailingStop
   if (! RefreshRates ())
       return ;

//--- при таком методе мы будет сюда попадать на каждом тике.
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--)
       if (m_position.SelectByIndex(i))
         if (m_position. Symbol ()== Symbol () && m_position.Magic()==m_magic)
           {
             //--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
             if (m_position.PositionType()== POSITION_TYPE_BUY )
              {
               //--- когда у позиции ещё нет StopLoss
               if (m_position.StopLoss()== 0 )
                 {
                   //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                   if (m_symbol. Bid ()-ExtTrailingStop>m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(), 0.0 );
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                   //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
                   //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                   if (m_symbol. Bid ()-ExtTrailingStop-ExtTrailingStep>m_position.StopLoss())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),
                                             NormalizeDouble (m_symbol. Bid ()-ExtTrailingStop,m_symbol. Digits ()), 0.0 );
                    }
                 }
              }

             if (m_position.PositionType()== POSITION_TYPE_SELL )
              {
               //--- когда у позиции ещё нет StopLoss
               if (m_position.StopLoss()== 0 )
                 {
                   //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                   if (m_symbol. Ask ()+ExtTrailingStop<m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(), 0.0 );
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                   //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
                   //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                   if (m_symbol. Bid ()+ExtTrailingStop+ExtTrailingStep<m_position.StopLoss())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),
                                             NormalizeDouble (m_symbol. Ask ()+ExtTrailingStop,m_symbol. Digits ()), 0.0 );
                    }
                 }
              }
           }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetMarginMode( void )
  {
   m_margin_mode=( ENUM_ACCOUNT_MARGIN_MODE ) AccountInfoInteger ( ACCOUNT_MARGIN_MODE );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsHedging( void )
  {
   return (m_margin_mode== ACCOUNT_MARGIN_MODE_RETAIL_HEDGING );
  }
//+------------------------------------------------------------------+
//| 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 );
  }
//+------------------------------------------------------------------+
Dosyalar:
 
Vladimir Karputov :

Uzman Danışman örneği: bir hadge hesabında, aynı anda iki zıt pozisyon açıyoruz - durmadan.

EA ayarlarında iki seçenek vardır:

  • TrailingStop (pip olarak)
  • TrailingStep (pip olarak)
TrailingStep, aşırı sık yapılan değişikliklere karşı bir korumadır:

//+------------------------------------------------------------------+
//|                                                 TrailingStop.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#property description "Пример TrailingStop"
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                       // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//--- input parameters
input ushort    InpTrailingStop    = 10 ;       // TrailingStop (in pips)
input ushort    InpTrailingStep    = 5 ;         // TrailingStep (in pips)
//---
double          ExtTrailingStop= 0.0 ;
double          ExtTrailingStep= 0.0 ;
ulong           m_magic= 15489 ;                 // magic number
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
bool            FirstStart= true ;               // true - first start
double          m_adjusted_point;             // point value adjusted for 3 or 5 points
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   SetMarginMode();
   if (!IsHedging())
     {
       Print ( "Hedging only!" );
       return ( INIT_FAILED );
     }
   m_symbol.Name( Symbol ());                   // sets symbol name
   m_symbol.Refresh();                       // refreshes the symbol data
   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 ;
   m_adjusted_point=digits_adjust*m_symbol. Point ();
   ExtTrailingStop=InpTrailingStop*m_adjusted_point;
   ExtTrailingStep=InpTrailingStep*m_adjusted_point;

   m_trade.SetExpertMagicNumber(m_magic);     // sets magic number

   FirstStart= true ;
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (FirstStart)
     {
      m_trade.Buy( 0.01 );
      m_trade.Sell( 0.01 );
      FirstStart= false ;
     }
//--- TrailingStop
   if (! RefreshRates ())
       return ;

//--- при таком методе мы будет сюда попадать на каждом тике.
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--)
       if (m_position.SelectByIndex(i))
         if (m_position. Symbol ()== Symbol () && m_position.Magic()==m_magic)
           {
             //--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
             if (m_position.PositionType()== POSITION_TYPE_BUY )
              {
               //--- когда у позиции ещё нет StopLoss
               if (m_position.StopLoss()== 0 )
                 {
                   //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                   if (m_symbol. Bid ()-ExtTrailingStop>m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(), 0.0 );
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                   //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
                   //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                   if (m_symbol. Bid ()-ExtTrailingStop-ExtTrailingStep>m_position.StopLoss())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),
                                             NormalizeDouble (m_symbol. Bid ()-ExtTrailingStop,m_symbol. Digits ()), 0.0 );
                    }
                 }
              }

             if (m_position.PositionType()== POSITION_TYPE_SELL )
              {
               //--- когда у позиции ещё нет StopLoss
               if (m_position.StopLoss()== 0 )
                 {
                   //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                   if (m_symbol. Ask ()+ExtTrailingStop<m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(), 0.0 );
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                   //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
                   //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                   if (m_symbol. Bid ()+ExtTrailingStop+ExtTrailingStep<m_position.StopLoss())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),
                                             NormalizeDouble (m_symbol. Ask ()+ExtTrailingStop,m_symbol. Digits ()), 0.0 );
                    }
                 }
              }
           }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetMarginMode( void )
  {
   m_margin_mode=( ENUM_ACCOUNT_MARGIN_MODE ) AccountInfoInteger ( ACCOUNT_MARGIN_MODE );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsHedging( void )
  {
   return (m_margin_mode== ACCOUNT_MARGIN_MODE_RETAIL_HEDGING );
  }
//+------------------------------------------------------------------+
//| 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 );
  }
//+------------------------------------------------------------------+


teşekkürler, ilk seferde olmasa da işe yaradı!!!
 
İlginç bir şekilde, üç maksimum (minimum) varsa, o zaman bunlardan hangisinin indeksi ArrayMaximum ( ArrayMinimum ) verir?
 
Vladimir :
İlginç bir şekilde, üç maksimum (minimum) varsa, o zaman bunlardan hangisinin indeksi ArrayMaximum (ArrayMinimum) verir?
En maksimum (minimum). Bu işlevin birden fazla çıkış değeri yoktur.
 
Vitalie Postolache :
En maksimum (minimum). Bu işlevin birden fazla çıkış değeri yoktur.
İşte bunu soruyorum. Dizide 5 sayı var: 1.1012 1.1013 1.1013 1.1013 1.1012, işlev hangi öğelerden maksimumu dikkate alacak? Çoğu - hayır, eşit büyüklükte üç tane var. Cevap seçenekleri: ilk karşılaşma, son karşılaşma, maksimumdan herhangi biri. Dilerseniz daha fazla seçenek sunabilirsiniz. Seçim, yardımdaki (belgelerdeki) işlevin açıklamasına yansıtılmalıdır, ancak bulamadım.