//--- при таком методе мы будет сюда попадать на каждом тике. 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 | //+------------------------------------------------------------------+ boolRefreshRates () { //--- 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 ); } //+------------------------------------------------------------------+
//--- при таком методе мы будет сюда попадать на каждом тике. 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 | //+------------------------------------------------------------------+ boolRefreshRates () { //--- 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 ); } //+------------------------------------------------------------------+
Vitalie Postolache : 최대(최소). 이 함수에는 여러 출력 값이 없습니다.
그것이 내가 묻는 것입니다. 배열에는 5개의 숫자가 있습니다. 1.1012 1.1013 1.1013 1.1013 1.1012, 함수가 최대값을 고려하는 요소는 무엇입니까? 대부분 - 아니요, 똑같이 큰 세 가지가 있습니다. 답변 옵션: 첫 번째 충족, 마지막 충족, 최대값 중 하나. 원하는 경우 더 많은 옵션을 제공할 수 있습니다. 선택은 도움말(문서)의 기능 설명에 반영되어야 하는데 찾지 못했습니다.
슬프게도 작동하지 않습니다
ShortModified 및 LongModified 메서드.
{
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 );
};
그들은 수업에 포함됩니다. 별도의 기능으로 추가해야 하나요....?
어떻게 정리해야 할지 모르겠습니다. 기존 후행 클래스를 추가하는 예제를 찾으려고 했지만 찾지 못했습니다.
{
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 );
};
그들은 수업에 포함됩니다. 별도의 기능으로 추가해야 하나요....?
어떻게 정리해야 할지 모르겠습니다. 기존 후행 클래스를 추가하는 예제를 찾으려고 했지만 찾지 못했습니다.
코드에 복사하기만 하면 됩니다.
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
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.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 );
}
//+------------------------------------------------------------------+
전문가 고문 예: 헤지 계정에서 정지 없이 한 번에 두 개의 반대 위치를 엽니다.
EA 설정에는 두 가지 옵션이 있습니다.
//| 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)을 줄까요?
최대(최소). 이 함수에는 여러 출력 값이 없습니다.