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

 
DYM :

뭔가 안맞아요, 기준점이 price1인건 알지만 조건을 만들 마음이 부족합니다. 내 버전이 작동하지 않습니다.

이 줄거리

           double a= ObjectGetDouble (id,name,OBJPROP_PRICE1);
           double b= ObjectGetDouble (id,name,OBJPROP_PRICE2);
             if (b!=a) 
           {
             ObjectSetDouble (id,name,OBJPROP_PRICE2,a);
           }

OnTimer()에 넣어야 합니다.

 

개별 컴파일러 경고 를 끌 수 있는지 아는 사람이 있습니까?

그렇지 않으면

"'XXxx' 선언은 전역 변수를 숨깁니다"

갖다..



 
Maxim Kuznetsov :

개별 컴파일러 경고 를 끌 수 있는지 아는 사람이 있습니까?

그렇지 않으면

"'XXxx' 선언은 전역 변수를 숨깁니다"

갖다..

금지된다

 
MakarFX :

이 줄거리

OnTimer()에 넣어야 합니다.

도와 주셔서 정말로 고맙습니다. 이 조건이 어떻게 작동하는지 이해하는 것 같습니다. 안타깝게도 OnTimer() 함수 작업에 대한 정보는 거의 없지만 힌트를 하나 찾았고 조건이 작동한 것 같습니다. 그냥 그런 기능인데 응답을 밀리초 단위로 설정하면 전체 컴퓨터 메모리를 채우지 않을까요?

다음은 일어난 일입니다.

 extern ENUM_LINE_STYLE  line_st   =  STYLE_SOLID;         // 9. Стиль линий
extern int              line_wd   =  2;                   // 10. Толщина линий

// Координаты
extern int x_coor = 7;    // Сдвиг по оси X
extern int y_coor = 10;    // Сдвиг по оси Y

string nameline;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
       EventSetMillisecondTimer ( 500 );
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
     //RefreshRates();
       double a= ObjectGetDouble ( ChartID (),nameline,OBJPROP_PRICE1);
       double b= ObjectGetDouble ( ChartID (),nameline,OBJPROP_PRICE2);
       if (b!=a) 
         {
             ObjectSetDouble ( ChartID (),nameline,OBJPROP_PRICE2,a);
             Print ( "Работает - функция" );
         }         
         else
            {
               Print ( "Не работает - функция" );
            }
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
  {
  
   datetime dt1     = 0 ;
   double    price1  = 0 ;
   datetime dt2     = 0 ;
   double    price2  = 0 ;
   int       window   = 0 ;
   int       x        = 0 ;
   int       y        = 0 ;

//+------------------------------------------------------------------+ 
       //--- Клик по 1 линии
   if (id== CHARTEVENT_OBJECT_CLICK )
     {
       string clickObject=sparam;
       if (clickObject==line[ 0 ])
        {
        nameline= "line_" + IntegerToString ( MathRand ()+ 100 , 0 , ' ' );

         y= 200 ;
         ChartXYToTimePrice ( 0 , 25 ,y,window,dt1,price1);
         ChartXYToTimePrice ( 0 , 147 ,y,window,dt2,price2);

         TrendCreate( 0 ,nameline, 0 ,dt1,price1,dt2,price2,color1,line_st,line_wd, false , true , false , false , false , 0 );
         
        }

     }
}

void OnDeinit(const int reason)
  {
   Comment("");
   EventKillTimer();

  }
 
DYM :

도와 주셔서 정말로 고맙습니다. 이 조건이 어떻게 작동하는지 이해하는 것 같습니다. 안타깝게도 OnTimer() 함수 작업에 대한 정보는 거의 없지만 힌트를 하나 찾았고 조건이 작동한 것 같습니다. 그냥 그런 기능인데 응답을 밀리초 단위로 설정하면 전체 컴퓨터 메모리를 채우지 않을까요?

다음은 일어난 일입니다.

득점하지 않을 것입니다 ... 그렇게하는 것이 좋습니다

   if (b!=a) 
     {
       if ( ObjectSetDouble ( ChartID (),nameline,OBJPROP_PRICE2,a))
        {
         Print ( "Работает - функция" );
        }
       else
        {
         Print ( "Ошибка-" , GetLastError ());
        }
     }
 
MakarFX :

득점하지 않을 것입니다 ... 그렇게하는 것이 좋습니다

정말 감사합니다!

 
MakarFX :

득점하지 않을 것입니다 ... 그렇게하는 것이 좋습니다

다음과 같이 더 좋습니다.

   if (b!=a) 
     {
       if (! ObjectSetDouble ( ChartID (),nameline,OBJPROP_PRICE2,a))
         Print ( "Ошибка-" , GetLastError ());
     }
 
Vitaly Muzichenko :

다음과 같이 더 좋습니다.

고맙습니다.
 

안녕하세요. 하나의 글을 발견하고 내 방식대로 리메이크하기로 했다. 그런데 제 손이 엉뚱한 곳에서 자라고 있기에 제가 뭘 잘못했는지 말씀해 주셨으면 합니다.

여기에 내가 의존한 기사가 있습니다 - http://mql.su/2017/11/lesson11-first-indicator/

나는 rsi 판독 값을 기반으로 나만의 지표를 만들고 싶었습니다. 그러나 화면에서 당신은 그것의 결과를 볼 수 있습니다.

물론, 나는이 문제에서 매우 멀리 떨어져 있지만 내가 뭔가 잘못하고있는 것 같습니다)))))))))

당신은 나를 위해 그것을 할 필요가 없습니다. 어디에서 무엇을 추가하고 교체해야하는지 알려주십시오!

 #property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link        " https://www.mql5.com "
#property version    "1.00"
#property strict
#property indicator_chart_window
//#property indicator_separate_window  // Индик. рисуется в основном окне
//////////////////////////////////////////
#property indicator_buffers 2    // Сообщаем о том, что у нас будет два буфера
#property indicator_color1 Lime // Цвет стрелки для покупок
#property indicator_color2 Red   // Цвет стрелки для продаж


double Buy[];                   // Буфер для покупок
double Sell[];                   // Буфер для продаж

#define BUY 0
#define SELL 1

input int per = 14 ;
input int verx = 70 ;
input int niz = 30 ;
//+------------------------------------------------------------------+
//| 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 , 233 );   // Стрелка "вверх" для покупок
   SetIndexArrow( 1 , 234 );   // Стрелка "вниз" для продаж
   
   //Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
   IndicatorDigits ( Digits );
   //Строка с кратким названием индикатора выводится в сплывающей подсказке при наведении указателя мыши на стрелку
   IndicatorShortName ( "Мой первый индикатор" );
   //Устанавливаем текст описания стрелок индикатора для отображения информации в всплывающей подсказке.
   SetIndexLabel( 0 , "Покупаем" );
   SetIndexLabel( 1 , "Продаём" );
//---
   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 counted_bars = IndicatorCounted();
   int limit, signal;
   
   //Пересчитаем последний посчитанный бар
   if (counted_bars> 0 ) 
       counted_bars-- ;
       
   //Определяем число баров, которые следует пересчитать
   limit= Bars -counted_bars;
   
   // Чтобы индикатор "не перерисовывался" расчет ведем с последнего закрытого бара(он имеет индекс равный 1)
   // нулевой бар является текущим, т.е. он изменяется с каждым новым тиком до тех пор пока не будет закрыт
   
   for ( int i = 2 ; i < limit; i++)  
   {
         //Проверяем сигнал на вход для текущего бара
         signal = Signal(i- 1 );
         
         if (signal == BUY)
         {
            Buy[i- 1 ] = low[i- 1 ];
         }
         else    
         if (signal == SELL)
         {
            Sell[i- 1 ] = high[i- 1 ];
         }
   }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 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 (per >= verx && Close[ 1 ]<Open[ 1 ])
   
   return (BUY);
   
   if (per <= verx && Close[ 1 ]>Open[ 1 ])
     return (SELL);
   
   // Сигнала нет   
   return (- 1 );
   }
Урок №11: Пишем индикатор
Урок №11: Пишем индикатор
  • 2017.11.08
  • admin
  • mql.su
На этом уроке мы напишем простой индикатор, который в дальнейшем будем использовать при разработке советника. А использовать для получения сигнала мы будем уже существующие — Moving Average и MACD. Алгоритм следующий: Определять направление сделки (покупка или продажа) мы будем по индикатору Moving Average с периодом 100 на дневном...
파일:
 
jarikn :

안녕하세요. 하나의 글을 발견하고 내 방식대로 리메이크하기로 했다. 그런데 제 손이 엉뚱한 곳에서 자라고 있기에 제가 뭘 잘못했는지 말씀해 주셨으면 합니다.

여기에 내가 의존한 기사가 있습니다 - http://mql.su/2017/11/lesson11-first-indicator/

나는 rsi 판독 값을 기반으로 나만의 지표를 만들고 싶었습니다. 그러나 화면에서 당신은 그것의 결과를 볼 수 있습니다.

물론, 나는이 문제에서 매우 멀리 떨어져 있지만 내가 뭔가 잘못하고있는 것 같습니다)))))))))

당신은 나를 위해 그것을 할 필요가 없습니다. 어디에서 무엇을 추가하고 교체해야하는지 알려주십시오!

   if(per >= verx && Close[1] <Open[1])
   
   return (BUY);
   
   if (per <= verx && Close [1]> Open[1])
    return(SELL);

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