Советники: Polish Layer

 

Polish Layer:

Этот советник основан на индикаторах: RSI, WPR, Stochastic, Moving Average, deMarker

Polish Layer tester

Автор: Vladimir Karputov

 

Здравствуйте Владимир,

Я всегда нахожу Ваши коды. Это еще один хороший советник. Я прошу Вас: мне нужен трейлинг стоп. Пожалуйста, встройте его в код.


Большое спасибо

 

Здравствуйте Владимир,

Я изменил написанный Вами код Polish Layer для своих целей. Я хочу объединить результаты нескольких индикаторов и вывести это из результатов. Как я могу это сделать?

 
csezo2 :

Здравствуйте, Владимир,

Я изменил написанный Вами код Polish Layer для своих целей. Я хочу объединить результаты нескольких индикаторов и вывести это из результатов. Как я могу это сделать?

Опишите подробно, что вы сделали. Покажите код. Расскажите, что еще нужно сделать.

 
Как правильно вставить код? Или просто скопировать-вставить? Я вижу функцию Alt+S, но не знаю, как она работает.
 
csezo2:
Как правильно вставить код? Или просто скопировать-вставить? Я вижу функцию Alt+S, но не знаю, как она работает.
 
 
#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. Я выделил проблему с помощью пустого фона.
 
csezo2:
Сочетание польского слоя и 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;
//---
Файлы:
1.mq5  33 kb
 
Я хотел бы вывести результат Stochastic, умноженный на RSI.
 
csezo2 :
Я хотел бы вывести результат Стохастика, умноженного на RSI.

Я не понимаю.

Попробуйте объяснить другими словами или нарисовать картинку.