Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 710
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
işe yaramıyor ne yazık ki
ShortModified ve LongModified yöntemleri.
{
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.
{
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.
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
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
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.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 );
}
//+------------------------------------------------------------------+
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.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 );
}
//+------------------------------------------------------------------+
İ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.