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

 
Vladymyr Glushko :
그러나 단계별로 수행하는 방법은 무엇입니까? ..... 그래픽 개체 (무엇이며 어떻게 넣을 것인지), 차트에 데이터가있는 레이블 표시 (입력할 위치 및 데이터 포함) ...... 어리석은 질문 죄송합니다.

프로그래밍 방식으로.

필요한 데이터로 정보 표시기를 작성해야 합니다.

 
strongflex :
또한 RSI가 20분 전에 레벨을 넘었다면 가격을 확인합니다. 매우 감사합니다. 모든 것이 나와 함께 작동한다면 약속))

가능한 한 MQL5에 가깝게 하기 때문에 시간의 막대 이동을 얻고 종가 를 얻기 위해 MQL4 함수를 사용하지 않습니다(각각 iBarShift() 및 iClose()).

이를 위해 GetBarShift() 및 GetPriceClose()와 같은 자체 함수를 만듭니다. 또한 표준 MQL4 함수를 포기하기 때문에 iTime() 대신 GetTime() 함수를 사용하여 막대 시간을 가져와야 합니다.

테스트 어드바이저는 다음과 같습니다.

//+------------------------------------------------------------------+
//|                                               exTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link        "https://login.mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property strict
//--- input parameters
input ENUM_TIMEFRAMES       TimeframeRSI   = PERIOD_M15 ;   // Таймфрейм RSI
input int                   PeriodRSI      = 14 ;           // Период расчёта RSI
input ENUM_APPLIED_PRICE    PriceRSI       = PRICE_CLOSE ; // Цена расчёта RSI
input int                   MinutesBefore  = 20 ;           // Количество минут назад
//--- global variables
int       minutesBefore;     // Количество минут назад
int       periodRSI;         // Период расчёта RSI
//---
double    prevRSIvalue0;     // Значение RSI для заданного тф xxx минут назад
double    prevRSIvalue1;     // Значение RSI для заданного тф xxx минут назад-x минут
//---
double    prevClose_0;       // Значение Close для заданного тф xxx минут назад
double    prevClose_1;       // Значение Close для заданного тф xxx минут назад-x минут
//---
datetime timeBefore;       // Время ххх минут назад
datetime timePrevBefore;   // Время ххх минут назад-x минут
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   minutesBefore=(MinutesBefore< 1 ? 1 :MinutesBefore);   // Количество минут назад
   periodRSI=(PeriodRSI< 1 ? 1 :PeriodRSI);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   int shift_0;
   int shift_1;
   //---
   MqlDateTime server_time;
   TimeToStruct ( TimeCurrent (),server_time);
   string tf= EnumToString (TimeframeRSI);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if (server_time.min%minutesBefore== 0 || server_time.min== 0 ) {
       //--- время 1x и 2x минут назад
      timeBefore= TimeCurrent ()-minutesBefore* PeriodSeconds ( PERIOD_M1 );
      timePrevBefore= TimeCurrent ()- 2 *minutesBefore* PeriodSeconds ( PERIOD_M1 );
       //--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15)
      shift_0=GetBarShift( Symbol (),TimeframeRSI,timeBefore);
      shift_1=GetBarShift( Symbol (),TimeframeRSI,timePrevBefore);
       //--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15)
      prevRSIvalue0=GetLastDataRSI( Symbol (),TimeframeRSI,shift_0);
      prevRSIvalue1=GetLastDataRSI( Symbol (),TimeframeRSI,shift_1);
       //--- значения цен закрытия баров 1х и 2х минут назад
      prevClose_0=GetPriceClose( Symbol (),TimeframeRSI,shift_0);
      prevClose_1=GetPriceClose( Symbol (),TimeframeRSI,shift_1);
      }
   Comment ( "\nТекущее время: " , TimeCurrent (),
           "\nВремя " ,minutesBefore, " минут назад: " , TimeCurrent ()-minutesBefore* PeriodSeconds ( PERIOD_M1 ),
           "\nБар " ,tf, "_0=" ,shift_0, ", бар " ,tf, "_1=" ,shift_1,
           "\nМинуты текущего времени: " ,server_time.min,
           "\nЗначение RSI " ,minutesBefore, " минут назад на " ,tf, " : " , DoubleToString (prevRSIvalue0, 4 ),
           "\nЗначение RSI " ,minutesBefore* 2 , " минут назад на " ,tf, " : " , DoubleToString (prevRSIvalue1, 4 ),
           //---
           "\nЗначение Close " ,minutesBefore, " минут назад > " ,tf, " : " , DoubleToString (prevClose_0, Digits ()),
           "\nЗначение Close " ,minutesBefore* 2 , " минут назад > " ,tf, " : " , DoubleToString (prevClose_1, Digits ())
          );
  }
//+------------------------------------------------------------------+
double GetLastDataRSI( string symbol_name, ENUM_TIMEFRAMES timeframe, int shift, int period_rsi= 14 , ENUM_APPLIED_PRICE price_rsi= PRICE_CLOSE ) {
   return ( iRSI (symbol_name,timeframe,period_rsi,price_rsi,shift));
}
//+------------------------------------------------------------------+
double GetPriceClose( string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[ 1 ];
   if ( CopyClose (symbol_name,timeframe,shift, 1 ,array)== 1 ) return (array[ 0 ]);
   return (- 1 );
}
//+------------------------------------------------------------------+
int GetBarShift( string symbol_name, ENUM_TIMEFRAMES timeframe, datetime time) {
   if (time< 0 ) return (- 1 );
   //---
   datetime array[], time0;
   if ( CopyTime (symbol_name,timeframe, 0 , 1 ,array)< 0 ) return (- 1 );
   time0=array[ 0 ];
   if ( CopyTime (symbol_name,timeframe,time0,time,array)< 0 ) return (- 1 );
   datetime temptime=GetTime(symbol_name,timeframe, ArraySize (array)- 1 );
   if (array[ 0 ]==temptime && temptime<=time) return ( ArraySize (array)- 1 );
   else return ( ArraySize (array));
}
//+------------------------------------------------------------------+
datetime GetTime( string symbol_name, ENUM_TIMEFRAMES timeframe, int bar) {
   if (bar< 0 ) return (- 1 );
   datetime array[];
   if ( CopyTime (symbol_name,timeframe,bar, 1 ,array)> 0 ) return (array[ 0 ]);
   return (- 1 );
}
//+------------------------------------------------------------------+

이제 적시에 RSI에 대한 데이터 수신을 별도의 기능으로 정렬하고 가격과 RSI 값을 비교해야 합니다.

 
Artyom Trishkin :

가능한 한 MQL5에 가깝게 하기 때문에 시간의 막대 이동을 얻고 종가 를 얻기 위해 MQL4 함수를 사용하지 않습니다(각각 iBarShift() 및 iClose()).

이를 위해 GetBarShift() 및 GetPriceClose()와 같은 자체 함수를 만듭니다. 또한 표준 MQL4 함수를 포기하기 때문에 iTime() 대신 GetTime() 함수를 사용하여 막대 시간을 가져와야 합니다.

테스트 어드바이저는 다음과 같습니다.

//+------------------------------------------------------------------+
//|                                               exTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link        "https://login.mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property strict
//--- input parameters
input ENUM_TIMEFRAMES       TimeframeRSI   = PERIOD_M15 ;   // Таймфрейм RSI
input int                   PeriodRSI      = 14 ;           // Период расчёта RSI
input ENUM_APPLIED_PRICE    PriceRSI       = PRICE_CLOSE ; // Цена расчёта RSI
input int                   MinutesBefore  = 20 ;           // Количество минут назад
//--- global variables
int       minutesBefore;     // Количество минут назад
int       periodRSI;         // Период расчёта RSI
//---
double    prevRSIvalue0;     // Значение RSI для заданного тф xxx минут назад
double    prevRSIvalue1;     // Значение RSI для заданного тф xxx минут назад-x минут
//---
double    prevClose_0;       // Значение Close для заданного тф xxx минут назад
double    prevClose_1;       // Значение Close для заданного тф xxx минут назад-x минут
//---
datetime timeBefore;       // Время ххх минут назад
datetime timePrevBefore;   // Время ххх минут назад-x минут
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   minutesBefore=(MinutesBefore< 1 ? 1 :MinutesBefore);   // Количество минут назад
   periodRSI=(PeriodRSI< 1 ? 1 :PeriodRSI);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   int shift_0;
   int shift_1;
   //---
   MqlDateTime server_time;
   TimeToStruct ( TimeCurrent (),server_time);
   string tf= EnumToString (TimeframeRSI);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if (server_time.min%minutesBefore== 0 || server_time.min== 0 ) {
       //--- время 1x и 2x минут назад
      timeBefore= TimeCurrent ()-minutesBefore* PeriodSeconds ( PERIOD_M1 );
      timePrevBefore= TimeCurrent ()- 2 *minutesBefore* PeriodSeconds ( PERIOD_M1 );
       //--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15)
      shift_0=GetBarShift( Symbol (),TimeframeRSI,timeBefore);
      shift_1=GetBarShift( Symbol (),TimeframeRSI,timePrevBefore);
       //--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15)
      prevRSIvalue0=GetLastDataRSI( Symbol (),TimeframeRSI,shift_0);
      prevRSIvalue1=GetLastDataRSI( Symbol (),TimeframeRSI,shift_1);
       //--- значения цен закрытия баров 1х и 2х минут назад
      prevClose_0=GetPriceClose( Symbol (),TimeframeRSI,shift_0);
      prevClose_1=GetPriceClose( Symbol (),TimeframeRSI,shift_1);
      }
   Comment ( "\nТекущее время: " , TimeCurrent (),
           "\nВремя " ,minutesBefore, " минут назад: " , TimeCurrent ()-minutesBefore* PeriodSeconds ( PERIOD_M1 ),
           "\nБар " ,tf, "_0=" ,shift_0, ", бар " ,tf, "_1=" ,shift_1,
           "\nМинуты текущего времени: " ,server_time.min,
           "\nЗначение RSI " ,minutesBefore, " минут назад на " ,tf, " : " , DoubleToString (prevRSIvalue0, 4 ),
           "\nЗначение RSI " ,minutesBefore* 2 , " минут назад на " ,tf, " : " , DoubleToString (prevRSIvalue1, 4 ),
           //---
           "\nЗначение Close " ,minutesBefore, " минут назад > " ,tf, " : " , DoubleToString (prevClose_0, Digits ()),
           "\nЗначение Close " ,minutesBefore* 2 , " минут назад > " ,tf, " : " , DoubleToString (prevClose_1, Digits ())
          );
  }
//+------------------------------------------------------------------+
double GetLastDataRSI( string symbol_name, ENUM_TIMEFRAMES timeframe, int shift, int period_rsi= 14 , ENUM_APPLIED_PRICE price_rsi= PRICE_CLOSE ) {
   return ( iRSI (symbol_name,timeframe,period_rsi,price_rsi,shift));
}
//+------------------------------------------------------------------+
double GetPriceClose( string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[ 1 ];
   if ( CopyClose (symbol_name,timeframe,shift, 1 ,array)== 1 ) return (array[ 0 ]);
   return (- 1 );
}
//+------------------------------------------------------------------+
int GetBarShift( string symbol_name, ENUM_TIMEFRAMES timeframe, datetime time) {
   if (time< 0 ) return (- 1 );
   //---
   datetime array[], time0;
   if ( CopyTime (symbol_name,timeframe, 0 , 1 ,array)< 0 ) return (- 1 );
   time0=array[ 0 ];
   if ( CopyTime (symbol_name,timeframe,time0,time,array)< 0 ) return (- 1 );
   datetime temptime=GetTime(symbol_name,timeframe, ArraySize (array)- 1 );
   if (array[ 0 ]==temptime && temptime<=time) return ( ArraySize (array)- 1 );
   else return ( ArraySize (array));
}
//+------------------------------------------------------------------+
datetime GetTime( string symbol_name, ENUM_TIMEFRAMES timeframe, int bar) {
   if (bar< 0 ) return (- 1 );
   datetime array[];
   if ( CopyTime (symbol_name,timeframe,bar, 1 ,array)> 0 ) return (array[ 0 ]);
   return (- 1 );
}
//+------------------------------------------------------------------+

이제 적시에 RSI에 대한 데이터 수신을 별도의 기능으로 정렬하고 가격과 RSI 값을 비교해야 합니다.

더군다나?
if (prevRSIvalue1< 70 && (prevRSIvalue0> 70 ) && (prevClose_0> Bid ))

    {
    ticket= OrderSend ( Symbol (), OP_SELL , 0.1 , Ask , Slippage, 0 , 0 , NULL , Magic, 0 , Blue);
     return ( 0 );
    }
 
코드 끝을 확인하기 위해 다음을 삽입했습니다.
int start()
{
int ticket;

   if ( OrdersTotal () == 0 )
         {
         ticket= OrderSend ( Symbol (), OP_SELL , 1 , Bid , 0 , 0 , 0 , NULL , 1234 , 0 , Red);
      
        
         }
         return ( 0 );

}
테스터에서 거래를 열지 않습니다. 여기서 문제가 될 수 있는 것은 무엇입니까?
 
strongflex :
코드 끝을 확인하기 위해 다음을 삽입했습니다.
int start()
{
int ticket;

   if ( OrdersTotal () == 0 )
         {
         ticket= OrderSend ( Symbol (), OP_SELL , 1 , Bid , 0 , 0 , 0 , NULL , 1234 , 0 , Red);
      
        
         }
         return ( 0 );

}
테스터에서 거래를 열지 않습니다. 여기서 문제가 될 수 있는 것은 무엇입니까?

오류 코드 가 표시되지 않는 이유는 무엇입니까?

 
Vitalie Postolache :

오류 코드 가 표시되지 않는 이유는 무엇입니까?

테스터에 오류가 없습니다.
 

친애하는 포럼 사용자! 질문은 ~이야:

틱 블록에서 가능합니까?

정수 시작() {}

실행될 때 모든 변수의 값을 수동으로 설정할 수 있는 창을 표시하는 이벤트를 만듭니다.

Extern 을 통해 변수를 설정할 때 발생하는 것과 거의 같지만 프로그램 실행 중에 자동으로 발생하며 시작 시에는 한 번도 발생하지 않습니다.

어느 쪽을 파야 하는지 최소한 알려주시면 감사하겠습니다.

고맙습니다!

 
pro100lexx :

친애하는 포럼 사용자! 질문은 ~이야:

틱 블록에서 가능합니까?

정수 시작() {}

실행될 때 모든 변수의 값을 수동으로 설정할 수 있는 창을 표시하는 이벤트를 만듭니다.

Extern 을 통해 변수를 설정할 때 발생하는 것과 거의 같지만 프로그램 실행 중에 자동으로 발생하며 시작 시에는 한 번도 발생하지 않습니다.

어느 쪽을 파야 하는지 최소한 알려주시면 감사하겠습니다.

고맙습니다!

코드 베이스를 파헤쳐 보세요. 차트에 패널이 있는 것과 같은 것이 이미 있습니다. 예 들어 다음과 같습니다.
 
pro100lexx :

친애하는 포럼 사용자! 질문은 ~이야:

틱 블록에서 가능합니까?

정수 시작() {}

실행될 때 모든 변수의 값을 수동으로 설정할 수 있는 창을 표시하는 이벤트를 만듭니다.

Extern 을 통해 변수를 설정할 때 발생하는 것과 거의 같지만 프로그램 실행 중에 자동으로 발생하며 시작 시에는 한 번도 발생하지 않습니다.

어느 쪽을 파야 하는지 최소한 알려주시면 감사하겠습니다.

고맙습니다!

그래픽 개체를 탐색합니다. 특히 입력 필드 - OBJ_EDIT

차트에 생성하는 기능은 다음과 같습니다.

//+------------------------------------------------------------------+
void SetEditField( const long              chart_id= 0 ,               // ID графика
                  const string            name= "Edit" ,               // имя объекта
                  const int               sub_window= 0 ,             // номер подокна
                  const int               x= 0 ,                       // координата по оси X
                  const int               y= 0 ,                       // координата по оси Y
                  const int               width= 50 ,                 // ширина поля ввода
                  const int               height= 18 ,                 // высота поля ввода
                  const string            text= "Text" ,               // текст
                  const string            font= "Calibri" ,           // шрифт
                  const int               font_size= 8 ,               // размер шрифта
                  const ENUM_ALIGN_MODE   align= ALIGN_CENTER ,       // способ выравнивания
                  const ENUM_BASE_CORNER corner= CORNER_LEFT_UPPER , // угол графика для привязки
                  const long              z_order= 0 ,                 // приоритет на нажатие мышью
                  const color             clr= clrBlack ,             // цвет текста
                  const color             back_clr= clrWhite ,         // цвет фона
                  const color             border_clr= clrNONE ,       // цвет границы
                  const bool              back= false ,               // на заднем плане
                  const bool              read_only= false ,           // возможность редактировать
                  const bool              selection= false ,           // выделить для перемещений
                  const bool              hidden= true )               // скрыт в списке объектов
  {
   if ( ObjectFind (chart_id,name)< 0 ) ObjectCreate (chart_id,name, OBJ_EDIT ,sub_window, 0 , 0 );
   ObjectSetInteger (chart_id,name, OBJPROP_XDISTANCE ,x);
   ObjectSetInteger (chart_id,name, OBJPROP_YDISTANCE ,y);
   ObjectSetInteger (chart_id,name, OBJPROP_XSIZE ,width);
   ObjectSetInteger (chart_id,name, OBJPROP_YSIZE ,height);
   ObjectSetString (chart_id,name, OBJPROP_TEXT ,text);
   ObjectSetString (chart_id,name, OBJPROP_FONT ,font);
   ObjectSetInteger (chart_id,name, OBJPROP_FONTSIZE ,font_size);
   ObjectSetInteger (chart_id,name, OBJPROP_ALIGN ,align);
   ObjectSetInteger (chart_id,name, OBJPROP_READONLY ,read_only);
   ObjectSetInteger (chart_id,name, OBJPROP_CORNER ,corner);
   ObjectSetInteger (chart_id,name, OBJPROP_COLOR ,clr);
   ObjectSetInteger (chart_id,name, OBJPROP_BGCOLOR ,back_clr);
   ObjectSetInteger (chart_id,name, OBJPROP_BORDER_COLOR ,border_clr);
   ObjectSetInteger (chart_id,name, OBJPROP_BACK ,back);
   ObjectSetInteger (chart_id,name, OBJPROP_SELECTABLE ,selection);
   ObjectSetInteger (chart_id,name, OBJPROP_SELECTED ,selection);
   ObjectSetInteger (chart_id,name, OBJPROP_HIDDEN ,hidden);
   ObjectSetInteger (chart_id,name, OBJPROP_ZORDER ,z_order);
  }
//+------------------------------------------------------------------+
 
고맙습니다! 나는 이것을 정리할 것이다.
사유: