Здравствуйте Владимир,
Я всегда нахожу Ваши коды. Это еще один хороший советник. Я прошу Вас: мне нужен трейлинг стоп. Пожалуйста, встройте его в код.
Большое спасибо
Здравствуйте Владимир,
Я изменил написанный Вами код Polish Layer для своих целей. Я хочу объединить результаты нескольких индикаторов и вывести это из результатов. Как я могу это сделать?
Здравствуйте, Владимир,
Я изменил написанный Вами код Polish Layer для своих целей. Я хочу объединить результаты нескольких индикаторов и вывести это из результатов. Как я могу это сделать?
Опишите подробно, что вы сделали. Покажите код. Расскажите, что еще нужно сделать.
Как правильно вставить код? Или просто скопировать-вставить? Я вижу функцию Alt+S, но не знаю, как она работает.
Форум о трейдинге, автоматических торговых системах и тестировании торговых стратегий
Общие правила и лучшие практики форума.
Алена Верлейен, 2017.07.19 11:03
Когда вы публикуете код, пожалуйста, используйте кнопку SRC !
#include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\AccountInfo.mqh> CPositionInfo m_position; // объект торговой позиции CTrade m_trade; // торговый объект CSymbolInfo m_symbol; // объект информации о символе CAccountInfo m_account; // обёртка для информации об аккаунте //--- входные параметры input ENUM_TIMEFRAMES per_kis = PERIOD_M15; input ENUM_TIMEFRAMES per_nagy = PERIOD_H1; input int kis_trend_gyors_per= 99; input int kis_trend_lassú_per= 99; input int nagy_trend_gyors_per= 99; input int nagy_trend_lassú_per= 99; input ENUM_MA_METHOD MA_method_kis = MODE_SMA; input ENUM_MA_METHOD MA_method_nagy = MODE_SMA; input int ST_indikátor_periódus = 14; input int RSI_indikátor_periódus = 14; input int STh_alsó = 20; input int ST_lassuló = 3; input ushort TakeProfit=11111; input ushort StopLoss=90; input ushort TrailingStop=20; input double Lots=0.1; ulong m_magic=1; // магическое число ulong m_slippage=30; // скольжение int handle_iMA_kis_trend_gyors; // переменная для хранения хэндла индикатора iMA int handle_iMA_kis_trend_lassú; int handle_iMA_nagy_trend_gyors; int handle_iMA_nagy_trend_lassú; int handle_iRSI; int handle_iStochastic_M15; // переменная для хранения хэндла индикатора iStochastic ENUM_ACCOUNT_MARGIN_MODE m_margin_mode; double m_adjusted_point; // значение баллов скорректировано на 3 или 5 баллов //+------------------------------------------------------------------+ //| Функция инициализации эксперта| //+------------------------------------------------------------------+ int OnInit() { SetMarginMode(); if(!IsHedging()) { Print("Hedging only!"); return(INIT_FAILED); } if(TrailingStop>=TakeProfit) { Print("Error! TrailingStop>=TakeProfit!"); return(INIT_PARAMETERS_INCORRECT); } //--- m_symbol.Name(Symbol()); // задает имя символа if(!RefreshRates()) { Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()), ", Ask=",DoubleToString(m_symbol.Ask(),Digits())); return(INIT_FAILED); } m_symbol.Refresh(); //--- m_trade.SetExpertMagicNumber(m_magic); //--- m_trade.SetDeviationInPoints(m_slippage); //--- настройка на 3 или 5 цифр int digits_adjust=1; m_adjusted_point=m_symbol.Point()*digits_adjust; //--- создаем хэндл индикатора iMA handle_iMA_kis_trend_gyors=iMA(m_symbol.Name(),per_kis,kis_trend_gyors_per,0, MA_method_kis,PRICE_CLOSE); //--- создаем хэндл индикатора iMA handle_iMA_kis_trend_lassú=iMA(m_symbol.Name(),per_kis,kis_trend_lassú_per ,0,MA_method_kis , PRICE_CLOSE ); //--- создаем хэндл индикатора iMA handle_iMA_nagy_trend_gyors=iMA(m_symbol.Name(),per_nagy,nagy_trend_gyors_per ,0, MA_method_nagy , PRICE_CLOSE ); //--- создаем хэндл индикатора iMA handle_iMA_nagy_trend_lassú=iMA(m_symbol.Name(),per_nagy,nagy_trend_lassú_per ,0, MA_method_nagy , PRICE_CLOSE ); //--- создаем хэндл индикатора iRSI handle_iRSI=iRSI(m_symbol.Name(),per_kis,RSI_indikátor_periódus, PRICE_CLOSE); //--- создаем хэндл индикатора iStochastic handle_iStochastic_M15=iStochastic(m_symbol.Name(),per_kis,ST_indikátor_periódus,3,ST_lassuló,MODE_SMA,STO_CLOSECLOSE); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Функция деинициализации эксперта| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Функция экспертного тика| //+------------------------------------------------------------------+ void OnTick() { if(kis_trend_gyors_per>=kis_trend_lassú_per || nagy_trend_gyors_per>=nagy_trend_lassú_per) return; static datetime PrevBars=0; datetime time_0=iTime(0); if(time_0==PrevBars) return; PrevBars=time_0; //--- вычисляем начальные параметры индикаторов для поиска условий входа double MA_kis_trend_gyors = iMAGet(handle_iMA_kis_trend_gyors,0); double MA_kis_trend_lassú = iMAGet(handle_iMA_kis_trend_lassú,0); double MA_nagy_trend_gyors = iMAGet(handle_iMA_nagy_trend_gyors,0); double MA_nagy_trend_lassú = iMAGet(handle_iMA_nagy_trend_lassú,0); double Stoh_fast = iStochasticGet(MAIN_LINE,0); double Stoh_fast_prew=iStochasticGet(MAIN_LINE,1); double RSI0 = iRSIGet(0); double RSI1 = iRSIGet(1); double StRSI=(Stoh_fast*RSI0)/100;//------------------------------------------------------------------------ I would like to draw out these outcomes. double StRSI_prew=(Stoh_fast_prew*RSI1)/100;//-------------------------------------------------------------- double price_M15=iClose(1,NULL,per_kis); bool Long=false; if(MA_kis_trend_gyors>MA_kis_trend_lassú && MA_nagy_trend_gyors>MA_nagy_trend_lassú) Long=true; if(!Long ) return; //--- Проверка условий для совершения сделки if(Long==true ) { if( StRSI>STh_alsó && StRSI_prew<=STh_alsó ) { if(!RefreshRates()) return; //--- проверьте объем перед отправкой ордера, чтобы избежать ошибки "недостаточно денег" (CTrade) double chek_volime_lot=m_trade.CheckVolume(m_symbol.Name(),Lots,m_symbol.Ask(),ORDER_TYPE_BUY); if(chek_volime_lot!=0.0) if(chek_volime_lot>=Lots) { Print("BUY разница (MA_M15-price_M15) = ",DoubleToString(MA_kis_trend_gyors,m_symbol.Digits()), " MA_M15 = ",DoubleToString(MA_kis_trend_gyors,m_symbol.Digits()), " price_M15 = ",DoubleToString(MA_kis_trend_gyors,m_symbol.Digits())); double sl=m_symbol.NormalizePrice(m_symbol.Bid()-StopLoss*m_adjusted_point); double tp=m_symbol.NormalizePrice(m_symbol.Bid()+TakeProfit*m_adjusted_point); if(m_trade.Buy(Lots,NULL,m_symbol.Ask(),sl,tp)) { if(m_trade.ResultDeal()==0) Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); else Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } else Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } } } //--- трейлинг if(TrailingStop==0) return; for(int i=PositionsTotal()-1;i>=0;i--) if(m_position.SelectByIndex(i)) // выбирает позицию по индексу для дальнейшего доступа к ее свойствам if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic) { if(m_position.PositionType()==POSITION_TYPE_BUY) { if(!RefreshRates()) continue; if(m_symbol.Bid()-m_position.PriceOpen()>TrailingStop*m_adjusted_point) { if(m_position.StopLoss()<m_symbol.Bid()-TrailingStop*m_adjusted_point) { if(!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(m_symbol.Bid()-TrailingStop*m_adjusted_point), m_position.TakeProfit())) Print("PositionModify -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } } } } //--- return; } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ //| Обновляет данные о котировках символов.| //+------------------------------------------------------------------+ bool RefreshRates() { //--- частота обновления if(!m_symbol.RefreshRates()) return(false); //--- защита от возврата значения "ноль". if(m_symbol.Ask()==0 || m_symbol.Bid()==0) return(false); //--- return(true); } //+------------------------------------------------------------------+ //| Получение значения буферов для iMA| //+------------------------------------------------------------------+ double iMAGet(int handle_iMA,const int index) { double MA[1]; //--- сброс кода ошибки ResetLastError(); //--- заполните часть массива iMABuffer значениями из индикаторного буфера, имеющего индекс 0 if(CopyBuffer(handle_iMA,0,index,1,MA)<0) { //--- если копирование не удалось, сообщите код ошибки PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError()); //--- выход с нулевым результатом - это означает, что индикатор считается не рассчитанным return(0.0); } return(MA[0]); } //+------------------------------------------------------------------+ //| Получите значение буферов для iStochastic | //| Номера буферов следующие:| //| 0 - ГЛАВНАЯ_ЛИНИЯ, 1 - СИГНАЛЬНАЯ_ЛИНИЯ| //+------------------------------------------------------------------+ double iStochasticGet(const int buffer,const int index) { double Stochastic[1]; //--- сброс кода ошибки ResetLastError(); //--- заполняем часть массива iStochasticBuffer значениями из индикаторного буфера, имеющего индекс 0 if(CopyBuffer(handle_iStochastic_M15,buffer,index,1,Stochastic)<0) { //--- если копирование не удалось, сообщите код ошибки PrintFormat("Failed to copy data from the iStochastic indicator, error code %d",GetLastError()); //--- выход с нулевым результатом - это означает, что индикатор считается не рассчитанным return(0.0); } return(Stochastic[0]); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Получение значения буферов для iRSI| //+------------------------------------------------------------------+ double iRSIGet(const int index) { double RSI[1]; //--- сброс кода ошибки ResetLastError(); //--- заполняем часть массива iRSI значениями из буфера индикатора, имеющего индекс 0 if(CopyBuffer(handle_iRSI,0,index,1,RSI)<0) { //--- если копирование не удалось, сообщите код ошибки PrintFormat("Failed to copy data from the iRSI indicator, error code %d",GetLastError()); //--- выход с нулевым результатом - это означает, что индикатор считается не рассчитанным return(0.0); } return(RSI[0]); } //+------------------------------------------------------------------+ //| Получить Close для указанного индекса бара| //+------------------------------------------------------------------+ double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) { if(symbol==NULL) symbol=Symbol(); if(timeframe==0) timeframe=per_kis; double Close[1]; double close=0; int copied=CopyClose(symbol,timeframe,index,1,Close); if(copied>0) close=Close[0]; return(close); } //+------------------------------------------------------------------+ //| Получить время для указанного индекса бара| //+------------------------------------------------------------------+ datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) { if(symbol==NULL) symbol=Symbol(); if(timeframe==0) timeframe=per_kis; datetime Time[1]; datetime time=0; int copied=CopyTime(symbol,timeframe,index,1,Time); if(copied>0) time=Time[0]; return(time); } //+------------------------------------------------------------------+
Сочетание польского слоя и Get Trend. Я выделил проблему с помощью пустого фона.
//--- создаем хэндл индикатора iMA handle_iMA_kis_trend_gyors=iMA(m_symbol.Name(),per_kis,kis_trend_gyors_per,0,MA_method_kis,PRICE_CLOSE); //--- если ручка не создана if(handle_iMA_kis_trend_gyors==INVALID_HANDLE) { //--- сообщите о неудаче и выведите код ошибки PrintFormat("Failed to create handle \"handle_iMA_kis_trend_gyors\" of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //--- индикатор останавливается раньше времени return(INIT_FAILED); } //--- создаем хэндл индикатора iMA handle_iMA_kis_trend_lassú=iMA(m_symbol.Name(),per_kis,kis_trend_lassú_per,0,MA_method_kis,PRICE_CLOSE); //--- если ручка не создана if(handle_iMA_kis_trend_lassú==INVALID_HANDLE) { //--- сообщите о неудаче и выведите код ошибки PrintFormat("Не удалось создать хэндл \"handle_iMA_kis_trend_lassú\" индикатора iMA для символа %s/%s, код ошибки %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //--- индикатор останавливается раньше времени return(INIT_FAILED); } //--- создаем хэндл индикатора iMA handle_iMA_nagy_trend_gyors=iMA(m_symbol.Name(),per_nagy,nagy_trend_gyors_per,0,MA_method_nagy,PRICE_CLOSE); //--- если ручка не создана if(handle_iMA_nagy_trend_gyors==INVALID_HANDLE) { //--- сообщите о неудаче и выведите код ошибки PrintFormat("Failed to create handle \"handle_iMA_nagy_trend_gyors\" of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //--- индикатор останавливается раньше времени return(INIT_FAILED); } //--- создаем хэндл индикатора iMA handle_iMA_nagy_trend_lassú=iMA(m_symbol.Name(),per_nagy,nagy_trend_lassú_per,0,MA_method_nagy,PRICE_CLOSE); //--- если ручка не создана if(handle_iMA_nagy_trend_lassú==INVALID_HANDLE) { //--- сообщите о неудаче и выведите код ошибки PrintFormat("Не удалось создать хэндл \"handle_iMA_nagy_trend_lassú\" индикатора iMA для символа %s/%s, код ошибки %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //--- индикатор останавливается раньше времени return(INIT_FAILED); } //--- создаем хэндл индикатора iRSI handle_iRSI=iRSI(m_symbol.Name(),per_kis,RSI_indikátor_periódus,PRICE_CLOSE); //--- если ручка не создана if(handle_iRSI==INVALID_HANDLE) { //--- сообщите о неудаче и выведите код ошибки PrintFormat("Failed to create handle \"handle_iRSI\" of the iRSI indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //--- индикатор останавливается раньше времени return(INIT_FAILED); } //--- создаем хэндл индикатора iStochastic handle_iStochastic_M15=iStochastic(m_symbol.Name(),per_kis,ST_indikátor_periódus,3,ST_lassuló,MODE_SMA,STO_CLOSECLOSE); //--- если ручка не создана if(handle_iStochastic_M15==INVALID_HANDLE) { //--- сообщите о неудаче и выведите код ошибки PrintFormat("Failed to create handle \"handle_iStochastic_M15\" of the iStochastic indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //--- индикатор останавливается раньше времени return(INIT_FAILED); }
//--- Я хотел бы рассказать об этих результатах. double StRSI=(Stoh_fast*RSI0)/100.0; double StRSI_prew=(Stoh_fast_prew*RSI1)/100.0; //---
Я хотел бы вывести результат Стохастика, умноженного на RSI.
Я не понимаю.
Попробуйте объяснить другими словами или нарисовать картинку.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Polish Layer:
Этот советник основан на индикаторах: RSI, WPR, Stochastic, Moving Average, deMarker
Автор: Vladimir Karputov