Я всегда предпочитаю устанавливать уровни Stop Loss и Take Profit в целых типах (точнее в 'ushort')
//--- input parametersinputushort InpStopLoss = 150; // Stop Loss, in points (1.00045-1.00055=10 points)inputushort InpTakeProfit = 460; // Take Profit, in points (1.00045-1.00055=10 points)inputulong InpMagic = 200; // Magic number//+------------------------------------------------------------------+//| Expert initialization function |
OnTick:
По PositionsTotal определяем, есть ли позиции или нет. Если позиций нет, то сначала получаем свежие цены (делаем это с помощью SymbolInfoTick). Внимание: это очень простая версия - здесь не так много необходимых проверок!
MetaQuotes Programming Language 5 (MQL5), included in MetaTrader 5 Client Terminal, has many new possibilities and higher performance, compared to MQL4. This article will help you to get acquainted with this new programming language. The simple examples of how to write an Expert Advisor and Custom Indicator are presented in this article. We...
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- create handle of the indicator iMAhandle_iMA=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift,
Inp_MA_ma_method,Inp_MA_applied_price);//--- if the handle is not createdif(handle_iMA==INVALID_HANDLE)
{
//--- tell about the failure and output the error codePrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
Symbol(),
EnumToString(Period()),
GetLastError());
//--- the indicator is stopped earlyreturn(INIT_FAILED);
}
//---return(INIT_SUCCEEDED);
}
Получение значений (я использую общую функцию iGetArray). Обратите внимание: для массива"array_ma" я использую"ArraySetAsSeries" - в этом случае в массиве "array_ma" элемент с индексом "0" соответствует самому правому бару на графике (bar # 0)
Советник работает только на новом баре. Сигнал для открытия позиции BUY: rsi на баре # 1> 'RSI Level UP'. Сигнал для открытия позиции SELL: rsi на баре № 1 < 'RSI Level DOWN'.
//+------------------------------------------------------------------+//| iRSI simple advisor.mq5 |//+------------------------------------------------------------------+#property version"1.005"//---#include <Trade\Trade.mqh>
CTrade m_trade; // trading object//--- input parametersinputint Inp_RSI_ma_period = 14; // RSI: averaging period inputENUM_APPLIED_PRICE Inp_RSI_applied_price = PRICE_CLOSE; // RSI: type of priceinputdouble Inp_RSI_Level_UP = 70; // RSI Level UPinputdouble Inp_RSI_Level_DOWN = 30; // RSI Level DOWN//---int handle_iRSI; // variable for storing the handle of the iRSI indicatordatetime m_prev_bars = 0; // "0" -> D'1970.01.01 00:00';//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- create handle of the indicator iRSI
handle_iRSI=iRSI(Symbol(),Period(),Inp_RSI_ma_period,Inp_RSI_applied_price);
//--- if the handle is not created if(handle_iRSI==INVALID_HANDLE)
{
//--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iRSI indicator for the symbol %s/%s, error code %d",
Symbol(),
EnumToString(Period()),
GetLastError());
//--- the indicator is stopped early return(INIT_FAILED);
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//--- we work only at the time of the birth of new bardatetime time_0=iTime(Symbol(),Period(),0);
if(time_0==m_prev_bars)
return;
m_prev_bars=time_0;
//---double rsi_1=iRSIGet(1);
if(rsi_1==EMPTY_VALUE)
return;
//---if(rsi_1>Inp_RSI_Level_UP)
m_trade.Sell(1.0);
elseif(rsi_1<Inp_RSI_Level_DOWN)
m_trade.Buy(1.0);
}
//+------------------------------------------------------------------+//| TradeTransaction function |//+------------------------------------------------------------------+voidOnTradeTransaction(constMqlTradeTransaction &trans,
constMqlTradeRequest &request,
constMqlTradeResult &result)
{
//---int d=0;
}
//+------------------------------------------------------------------+//| Get value of buffers for the iRSI |//+------------------------------------------------------------------+double iRSIGet(constint index)
{
double RSI[1];
//--- reset error code ResetLastError();
//--- fill a part of the iRSI array with values from the indicator buffer that has 0 index if(CopyBuffer(handle_iRSI,0,index,1,RSI)<0)
{
//--- if the copying fails, tell the error code PrintFormat("Failed to copy data from the iRSI indicator, error code %d",GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculated return(EMPTY_VALUE);
}
return(RSI[0]);
}
//+------------------------------------------------------------------+
Советник работает только на новом баре. Сигнал для открытия позиции BUY: rsi на баре # 1> 'RSI Level UP'. Сигнал для открытия позиции SELL: rsi на баре № 1 < 'RSI Level DOWN'.
Да благословит вас Бог. Если вы хотите, чтобы сделка была заключена на следующем баре после получения подтверждения сигнала. Т.е. заключать сделку на следующем баре после подтверждения сигнала, какой бит кода нужно добавить
aodunusi : Да благословит вас Господь. Если вы хотите, чтобы сделка заключалась на следующем баре после получения подтверждения сигнала. Т.е. заключать сделку на следующем баре после подтверждения сигнала, какой бит кода должен быть добавлен
Как только сигнал rsi подтвержден, ордер должен быть взят (покупка или продажа). Мы хотим удерживать ордер на покупку до формирования следующей свечи, т.е. мы не торгуем на той свече, на которой получили подтверждение сделки, а на следующей свече, которая формируется / следующей цене открытия.
Как только параметры RSI будут соблюдены, удерживаем ордер на покупку и исполняем его на следующей свече
aodunusi : Как только сигнал rsi подтвердился, нужно выставить ордер (на покупку или продажу). Мы хотим удерживать этот ордер на покупку до формирования следующей свечи, т.е. мы не торгуем на свече, на которой мы получили подтверждение сделки, а на следующей свече, которая формируется / следующей цене открытия.
Как только параметры RSI будут соблюдены, удерживаем ордер на покупку и исполняем его на следующей свече
Я не понимаю: Вы советуете мне как торговать? Или вы хотите отложить сигнал (то есть проверить сигнал не на баре №1, а на баре №2)?
aodunusi: Как только сигнал rsi подтвердился, нужно выставить ордер (на покупку или продажу). Мы хотим удерживать этот ордер на покупку до формирования следующей свечи, т.е. мы не торгуем на той свече, на которой получили подтверждение сделки, а на следующей свече, которая формируется / следующей цене открытия.
Как только параметры RSI будут соблюдены, удерживаем ордер на покупку и исполняем его на следующей свече
Торговля на закрытом баре? Это значит: бар с сигналом закрывается и открывается новый бар - и мы можем открыть сделку после этого (если предыдущий бар с сигналом еще существует), верно?
Это значит: торговля на закрытии бара. Да, большинство систем - это системы "торговли на закрытии бара".
Sergey Golubev: Торговля на закрытом баре? Это значит: бар с сигналом закрывается и открывается новый бар - и мы можем открыть сделку после этого (если предыдущий бар с сигналом еще существует), правильно?
Это значит: торговля на закрытии бара. Да, большинство систем - это системы "торговли на закрытом баре".
Да, именно это я и имел в виду... Когда есть сигнал, нужно подождать, пока бар закроется, и тогда срабатывает покупка. Пожалуйста, какой код я могу использовать, чтобы включить это?
aodunusi : Да, именно это я и имел в виду... Когда есть сигнал, подождите, пока бар не закроется, затем сработает покупка. Пожалуйста, какой код я могу использовать, чтобы включить это?
Вам нужно переделать код: запрашивать данные не с одного бара, а с двух. И проверять условие не на одном баре - а на двух.
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//--- we work only at the time of the birth of new bardatetime time_0=iTime(Symbol(),Period(),0);
if(time_0==m_prev_bars)
return;
m_prev_bars=time_0;
//---double rsi_1=iRSIGet(1);
if(rsi_1==EMPTY_VALUE)
return;
//---if(rsi_1>Inp_RSI_Level_UP)
m_trade.Sell(1.0);
elseif(rsi_1<Inp_RSI_Level_DOWN)
m_trade.Buy(1.0);
}
Будет:
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//--- we work only at the time of the birth of new bardatetime time_0=iTime(Symbol(),Period(),0);
if(time_0==m_prev_bars)
return;
m_prev_bars=time_0;
//---double rsi_2=iRSIGet(2);
double rsi_1=iRSIGet(1);
if(rsi_2==EMPTY_VALUE || rsi_1==EMPTY_VALUE)
return;
//---if(rsi_2>Inp_RSI_Level_UP && rsi_1>Inp_RSI_Level_UP)
m_trade.Sell(1.0);
elseif(rsi_2<Inp_RSI_Level_DOWN && rsi_1<Inp_RSI_Level_DOWN)
m_trade.Buy(1.0);
}
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Простой советник со стоп-лоссом и тейк-профитом
Пример простого совет ника, который открывает одну позицию с указанными стоп-лоссом и тейк-профитом.
Чтобы отдать торговый приказ на открытие позиции со стоп-лоссом и тейк-профитом, необходимо рассчитать эти уровни:
Переменные, объявленные на глобальном уровне программы (в "заголовке" советника):
Входные параметры:
OnTick:
Результат:
Создание хэндла индикатора iMA, получение значений индикатора
(Код: iMA Values on a Chart.mq5)
Главное правило: хэндл индикатора нужно получить один раз (оптимально сделать это в функции OnInit).
Входные параметры и переменная, в которой хранится хэндл индикатора:
Создание хэндла(проверка результата)
Получение значений (я использую общую функцию iGetArray). Обратите внимание: для массива"array_ma" я использую"ArraySetAsSeries" - в этом случае в массиве "array_ma" элемент с индексом "0" соответствует самому правому бару на графике (bar # 0)
Результат работы:
Рис. 1. Получение значений на барах #0, #1, #2
Простой советник iRSI
(Код: iRSI simple advisor)
Советник работает только на новом баре. Сигнал для открытия позиции BUY: rsi на баре # 1> 'RSI Level UP'. Сигнал для открытия позиции SELL: rsi на баре № 1 < 'RSI Level DOWN'.
Простой советник iRSI
Советник работает только на новом баре. Сигнал для открытия позиции BUY: rsi на баре # 1> 'RSI Level UP'. Сигнал для открытия позиции SELL: rsi на баре № 1 < 'RSI Level DOWN'.
Да благословит вас Господь. Если вы хотите, чтобы сделка заключалась на следующем баре после получения подтверждения сигнала. Т.е. заключать сделку на следующем баре после подтверждения сигнала, какой бит кода должен быть добавлен
Я вас не понимаю.
Я не понимаю вас.
Как только сигнал rsi подтвердился, нужно выставить ордер (на покупку или продажу). Мы хотим удерживать этот ордер на покупку до формирования следующей свечи, т.е. мы не торгуем на свече, на которой мы получили подтверждение сделки, а на следующей свече, которая формируется / следующей цене открытия.
Я не понимаю: Вы советуете мне как торговать? Или вы хотите отложить сигнал (то есть проверить сигнал не на баре №1, а на баре №2)?
Как только сигнал rsi подтвердился, нужно выставить ордер (на покупку или продажу). Мы хотим удерживать этот ордер на покупку до формирования следующей свечи, т.е. мы не торгуем на той свече, на которой получили подтверждение сделки, а на следующей свече, которая формируется / следующей цене открытия.
Это значит: бар с сигналом закрывается и открывается новый бар - и мы можем открыть сделку после этого (если предыдущий бар с сигналом еще существует), верно?
Это значит: торговля на закрытии бара.
Да, большинство систем - это системы "торговли на закрытии бара".
Торговля на закрытом баре?
Это значит: бар с сигналом закрывается и открывается новый бар - и мы можем открыть сделку после этого (если предыдущий бар с сигналом еще существует), правильно?
Это значит: торговля на закрытии бара.
Да, большинство систем - это системы "торговли на закрытом баре".
Да, именно это я и имел в виду... Когда есть сигнал, подождите, пока бар не закроется, затем сработает покупка. Пожалуйста, какой код я могу использовать, чтобы включить это?
Вам нужно переделать код: запрашивать данные не с одного бара, а с двух. И проверять условие не на одном баре - а на двух.
Это было(#23 ) :
Будет: