MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1521

 
MakarFX :

그렇지 않으면 "당"대신에 rsi 판독 값이 있어야합니다.

그렇습니까?

 int Signal( int i)
{
   // Снимем показания индикатора
   double Current   = iRSI ( NULL , 0 , per, PRICE_CLOSE , i);
   double Previous    = iRSI ( NULL , 0 , per, PRICE_CLOSE , i+ 1 );
   
     double SCurrent   = iRSI ( NULL , 0 , per, PRICE_CLOSE , i);
     // Для предыдущего бара
   double SPrevious    = iRSI ( NULL , 0 , per, PRICE_CLOSE , i+ 1 );
       // А теперь проверим всловия для наличия сигналов
   
   // есть сигнал на покупку?
   if (Current <= niz && Close[1]>Open[1] )
   
   return (BUY);
   
   if (Current >= verx && Close[ 1 ]<Open[ 1 ])
     return (SELL);
   
   // Сигнала нет   
   return (- 1 );
 
jarikn :

그렇습니까?

예, 하지만 한 지표를 다른 지표로 다시 쓸 수는 없습니다.

표시기의 논리를 작성한 다음 작성하십시오.


이 경우 모든 논리가 명확하지 않거나 사용되지 않는 추가 데이터가 있습니다.
 
MakarFX :

예, 하지만 한 지표를 다른 지표로 다시 쓸 수는 없습니다.

표시기의 논리를 작성한 다음 작성하십시오.


이 경우 모든 논리가 명확하지 않거나 사용되지 않는 추가 데이터가 있습니다.

내가 얻은 스크린 샷을보십시오.

나는 이 생각이 있다.

rsi가 70 수준 위에 있고 양초가 시가 아래에서 닫히면 매도 신호가 있어야 합니다.

rsi가 30 수준보다 낮고 양초가 시가보다 높으면 매수 신호입니다.


엄격하게 판단하지 마십시오, 나는 단지 조금 배우려고 노력하고 있습니다))))

이제 내가 뭘 잘못했는지 말해줘?

파일:
 
jarikn :

내가 얻은 스크린 샷을보십시오.

나는 이런 생각이 있다.

rsi가 70 수준 위에 있고 양초가 시가 아래에서 닫히면 매도 신호가 있어야 합니다.

rsi가 30 수준보다 낮고 양초가 시가보다 높으면 매수 신호입니다.


엄격하게 판단하지 마십시오, 나는 단지 조금 배우려고 노력하고 있습니다))))

이제 내가 뭘 잘못했는지 말해줘?

1) 버튼을 사용하여 메시지에 스크린샷 삽입 영상

2) 당신의 조건에 따라 - 맞아요

 //+------------------------------------------------------------------+
//|                                                   jarikn_RSI.mq4 |
//|                                           Copyright 2020, DrMak. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, DrMak."
#property link        " https://www.mql5.com "
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots    2
//--- plot Покупаем
#property indicator_label1   "Продаём"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrGreen
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- plot Продаём
#property indicator_label2   "Покупаем"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrRed
#property indicator_style2    STYLE_SOLID
#property indicator_width2    1
//--- input parameters
input int    RSI_Period  = 14 ;   //Период рассчета RSI
input int    AlertLevUp  = 70 ;   //Уровень для покупок 
input int    AlertLevDn  = 30 ;   //Уровень для продаж
//--- indicator buffers
double       Buy[];             // Буфер для покупок
double       Sell[];           // Буфер для продаж
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,Buy);
   SetIndexBuffer ( 1 ,Sell);  
   // Устанавливаем нулевые значения для индикатора, при которых не будет сигнальных стрелок
   SetIndexEmptyValue ( 0 , 0 );
   SetIndexEmptyValue ( 1 , 0 );
   //Определяем стиль отображения индикаторных линий - стрелка
   SetIndexStyle ( 0 , DRAW_ARROW );
   SetIndexStyle ( 1 , DRAW_ARROW ); 
   // Установим значки "стрелки" для буферов
   SetIndexArrow( 0 , 234 );   //Стрелка "вниз" для продаж
   SetIndexArrow( 1 , 233 );   //Стрелка "вверх" для покупок
   //Устанавливаем текст описания стрелок индикатора для отображения информации в всплывающей подсказке.
   SetIndexLabel( 0 , "Продаём" );
   SetIndexLabel( 1 , "Покупаем" );
   //Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
   IndicatorDigits ( Digits );
   //Строка с кратким названием индикатора выводится в сплывающей подсказке при наведении указателя мыши на стрелку
   IndicatorShortName ( "Мой первый индикатор" );
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   int limit=rates_total-prev_calculated- 1 ;
   if (limit< 1 ) return ( 0 );
   for ( int i=limit;i>= 0 ;i--)
     {
       // Снимем показания индикатора
       double RSI = iRSI ( NULL , 0 ,RSI_Period, PRICE_CLOSE ,i);
       if (RSI>AlertLevUp&&open[i]>close[i])
         Buy[i]=high[i];
       if (RSI<AlertLevDn&&open[i]<close[i])
         Sell[i]=low[i];
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
MakarFX :

1) 버튼을 사용하여 메시지에 스크린샷 삽입

2) 당신의 조건에 따라 - 맞아요

감사하다. 나는 이것을 정리할 것이다

 
MakarFX :

1) 버튼을 사용하여 메시지에 스크린샷 삽입

2) 당신의 조건에 따라 - 맞아요

그리고 그러한 조건을 작성하는 방법 * rsi가 상향식 AlertLevDn에서 교차하면 구매합니까? 이것이 가능합니까 아니면 추가 슬라이딩이 필요합니까?

{
//---
   int limit=rates_total-prev_calculated- 1 ;
   if (limit< 1 ) return ( 0 );
   for ( int i=limit;i>= 0 ;i--)
     {
       // Снимем показания индикатора
       double RSI = iRSI ( NULL , 0 ,RSI_Period, PRICE_CLOSE ,i);
       if (RSI>AlertLevUp)
         Buy[i]=high[i];
       if (RSI<AlertLevDn)
         Sell[i]=low[i];
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
jarikn :

그리고 그러한 조건을 작성하는 방법 * rsi가 상향식 AlertLevDn에서 교차하면 구매합니까? 이것이 가능합니까 아니면 추가 슬라이딩이 필요합니까?

당신의 질문은 당신에게 대답을 제공합니다 ...

rsi가 아래에서 위로 교차 하면 현재 값이 더 높고 이전 값이 더 낮습니다.

현재 가치

 double RSI = iRSI ( NULL , 0 ,RSI_Period, PRICE_CLOSE ,i);

하기 전에

 double RSI2 = iRSI ( NULL , 0 ,RSI_Period, PRICE_CLOSE , i+1 );

그런 다음 비교

RSI2가 AlertLevDn보다 작고 RSI가 AlertLevDn 보다 큰 경우

당신은 바이)

 
MakarFX :

당신의 질문은 당신에게 대답을 제공합니다 ...

rsi가 아래에서 위로 교차 하면 현재 값이 더 높고 이전 값이 더 낮습니다.

현재 가치

하기 전에

그런 다음 비교

RSI2가 AlertLevDn보다 작고 RSI가 AlertLevDn 보다 큰 경우

당신은 바이)

이해했다. 감사하다)

 
jarikn :

이해했다. 감사하다)

고치다

 int limit=rates_total-prev_calculated- 2 ;
 

안녕하세요 조언 부탁드립니다. MT5

볼린저 밴드 값을 가져와야 합니다.

쓰기

#property strict

#include <Indicators\Trend.mqh>
CiBands       m_bands;

input int Magic = 778871;

int OnInit(){//////////////***OnInit()****///*************OnInit()*******/////////***/////////////////////////OnInit()


Print(m_bands.Create(Symbol(), PERIOD_CURRENT, 20, 0, 2, PRICE_CLOSE));
Print((string)m_bands.MaPeriod());
Print((string)m_bands.Base(Bars(NULL, PERIOD_CURRENT)));

return(INIT_SUCCEEDED);
} 

double_max와 유사한 것을 출력합니다.

이 경우 마침표, 오프셋 및 나머지는 올바르게 가져옵니다.