초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 710

 
Kirill Andreev :
슬프게도 작동하지 않습니다
메서드 ShortModified 및 LongModified.
 
Vladimir Karputov :
ShortModified 및 LongModified 메서드.
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 );
  };

그들은 수업에 포함됩니다. 별도의 기능으로 추가해야 하나요....?

어떻게 정리해야 할지 모르겠습니다. 기존 후행 클래스를 추가하는 예제를 찾으려고 했지만 찾지 못했습니다.

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

그들은 수업에 포함됩니다. 별도의 기능으로 추가해야 하나요....?

어떻게 정리해야 할지 모르겠습니다. 기존 후행 클래스를 추가하는 예제를 찾으려고 했지만 찾지 못했습니다.

코드에 복사하기만 하면 됩니다.
 
Vladimir Karputov :
코드에 복사하기만 하면 됩니다.

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

 

 

오류 메시지를 제공합니다

'return' - 'void' 함수 는 값을 반환합니다. traal.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);
  }  

 

 

오류 메시지를 제공합니다

'return' - 'void' 함수 는 값을 반환합니다. traal.mq5 482 4

아무 생각 없이 복사할 수는 없습니다. 원작을 다시 보세요.
 

전문가 고문 예: 헤지 계정에서 정지 없이 한 번에 두 개의 반대 위치를 엽니다.

EA 설정에는 두 가지 옵션이 있습니다.

  • TrailingStop(핍)
  • TrailingStep(핍)
TrailingStep은 지나치게 빈번한 수정에 대한 보호 기능입니다.

//+------------------------------------------------------------------+
//|                                                 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 );
  }
//+------------------------------------------------------------------+
파일:
 
Vladimir Karputov :

전문가 고문 예: 헤지 계정에서 정지 없이 한 번에 두 개의 반대 위치를 엽니다.

EA 설정에는 두 가지 옵션이 있습니다.

  • TrailingStop(핍)
  • TrailingStep(핍)
TrailingStep은 지나치게 빈번한 수정에 대한 보호 기능입니다.

//+------------------------------------------------------------------+
//|                                                 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 );
  }
//+------------------------------------------------------------------+


감사합니다, 처음은 아니었지만 작동했습니다!!!
 
흥미롭게도 세 개의 최대값(최소값)이 있는 경우 그 중 인덱스가 ArrayMaximum( ArrayMinimum )을 제공합니까?
 
Vladimir :
흥미롭게도 세 개의 최대값(최소값)이 있는 경우 그 중 어느 인덱스가 ArrayMaximum(ArrayMinimum)을 줄까요?
최대(최소). 이 함수에는 여러 출력 값이 없습니다.
 
Vitalie Postolache :
최대(최소). 이 함수에는 여러 출력 값이 없습니다.
그것이 내가 묻는 것입니다. 배열에는 5개의 숫자가 있습니다. 1.1012 1.1013 1.1013 1.1013 1.1012, 함수가 최대값을 고려하는 요소는 무엇입니까? 대부분 - 아니요, 똑같이 큰 세 가지가 있습니다. 답변 옵션: 첫 번째 충족, 마지막 충족, 최대값 중 하나. 원하는 경우 더 많은 옵션을 제공할 수 있습니다. 선택은 도움말(문서)의 기능 설명에 반영되어야 하는데 찾지 못했습니다.
사유: