초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1239

 
Alexey Viktorov :

나는 아무것도 추천할 수 없습니다. 최적화를 사용하지 않습니다. 나는 이런 기만을 생각한다.

동의하지 않는다. 제 생각에 최적화는 주어진 쌍과 전략에 가장 적합한 매개변수를 선택하는 것입니다.

추신: 이제 스프레드는 정상인 것 같습니다.

 
Youri Lazurenko :

동의하지 않는다.

나는 당신을 위해 선거운동을 한 것이 아닙니다. 제 개인적인 생각을 표현했을 뿐입니다.

 
Alexey Viktorov :

나는 당신을 위해 선거운동을 한 것이 아닙니다. 제 개인적인 생각을 표현했을 뿐입니다.

제 생각이 틀릴 수도 있습니다. 캠페인도 하지 않습니다.

 

안녕하세요. 도움이 필요하다. 보류 중인 주문 의 수명을 제한해야 하며, 바람직하게는 바 수로 제한해야 합니다. mql4에서 다음 기능을 사용했습니다.

 datetime DateExp()                                 
{
   datetime expDate = 0 ;
   
   if ( Period () == PERIOD_M1 )
      expDate = TimeCurrent () + ExpDate* 60 ;
      
   if ( Period () == PERIOD_M5 )
      expDate = TimeCurrent () + ExpDate* 5 * 60 ;
    
   if ( Period () == PERIOD_M15 )
      expDate = TimeCurrent () + ExpDate* 15 * 60 ;
    
   if ( Period () == PERIOD_M30 )
      expDate = TimeCurrent () + ExpDate* 30 * 60 ;
    
   if ( Period () == PERIOD_H1 )
      expDate = TimeCurrent () + ExpDate* 60 * 60 ;
    
   if ( Period () == PERIOD_H4 )
      expDate = TimeCurrent () + ExpDate* 4 * 60 * 60 ;
   
   if ( Period () == PERIOD_D1 )
      expDate = TimeCurrent () + ExpDate* 24 * 60 * 60 ;      
    
   if ( Period () == PERIOD_W1 ) 
      expDate = TimeCurrent () + ExpDate* 7 * 24 * 60 * 60 ; 
   
   if ( Period () == PERIOD_MN1 )
      expDate = TimeCurrent () + ExpDate* 30 * 24 * 60 * 60 ;
          
   return (expDate);  
}

어디

외부 정수 ExpDate = 6; //주문 수명의 막대 수

모든 것이 효과가 있었습니다.

mql5에서 비슷한 것을 시도했습니다.

 datetime DateExp()                                 
{
   datetime expDate = 0 ;
   
   if ( Period () == PERIOD_M1 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_M1 )*ExpDate;
      
   if ( Period () == PERIOD_M2 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_M2 )*ExpDate;
   
   if ( Period () == PERIOD_M3 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_M3 )*ExpDate;
   
   if ( Period () == PERIOD_M4 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_M4 )*ExpDate;
      
   if ( Period () == PERIOD_M5 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_M5 )*ExpDate;
   
   if ( Period () == PERIOD_M6 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_M6 )*ExpDate;
   
   if ( Period () == PERIOD_M10 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_M10 )*ExpDate;
   
   if ( Period () == PERIOD_M12 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_M12 )*ExpDate;
    
   if ( Period () == PERIOD_M15 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_M15 )*ExpDate;
   
   if ( Period () == PERIOD_M20 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_M20 )*ExpDate;
    
   if ( Period () == PERIOD_M30 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_M30 )*ExpDate;
    
   if ( Period () == PERIOD_H1 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_H1 )*ExpDate;
   
   if ( Period () == PERIOD_H2 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_H2 )*ExpDate;
   
   if ( Period () == PERIOD_H3 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_H3 )*ExpDate;
    
   if ( Period () == PERIOD_H4 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_H4 )*ExpDate;
   
   if ( Period () == PERIOD_H6 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_H6 )*ExpDate;
   
   if ( Period () == PERIOD_H8 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_H8 )*ExpDate;
   
   if ( Period () == PERIOD_H12 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_H12 )*ExpDate;
   
   if ( Period () == PERIOD_D1 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_D1 )*ExpDate;      
    
   if ( Period () == PERIOD_W1 ) 
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_W1 )*ExpDate; 
   
   if ( Period () == PERIOD_MN1 )
      expDate = TimeCurrent () + PeriodSeconds ( PERIOD_MN1 )*ExpDate;
          
   return (expDate);  
}

어디

입력 intExpDate = 6; //주문 수명의 막대 수

그런 다음 예를 들어 구매하기 위해 보류 주문을 할 때 (위 기능)을 사용하려고했습니다.

               request.action       = TRADE_ACTION_PENDING ;                                         
               request.magic        = Magic;                                                       
               request.symbol       = _Symbol ;                                                      
               request.volume       = GetLots();                                                    
               request.price        = openBuy;                                                      
               request.sl           = slBuy;                                                        
               request.tp           = tpBuy;                                                        
               request.type         = ORDER_TYPE_BUY_STOP ;                                          
               request.type_filling = ORDER_FILLING_FOK ;                                           
               request.expiration   = DateExp();                                                    
               request.deviation    = SG; 

보류 중인 주문이 있지만 테스터에서 활성화될 때까지 지속됩니다. 나는 request.expiration에 숫자만 넣으려고 했지만 아무 것도 도움이 되지 않았습니다. Google에서 정보를 찾지 못했습니다. 나에게 뭐가 문제 니? 일정 시간이 지난 후에도 주문이 삭제되지 않는 이유는 무엇입니까?

PS Comment에서 추론할 때 DateExp() 함수는 날짜와 시간을 보여줍니다.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
Youri Lazurenko :


다음을 포함하는 것을 잊었습니다.

 struct MqlTradeRequest
  {
   ENUM_TRADE_REQUEST_ACTIONS     action;           // Тип выполняемого действия
   ulong                          magic;             // Штамп эксперта (идентификатор magic number)
   ulong                          order;             // Тикет ордера
   string                         symbol;           // Имя торгового инструмента
   double                         volume;           // Запрашиваемый объем сделки в лотах
   double                         price;             // Цена 
   double                         stoplimit;         // Уровень StopLimit ордера
   double                         sl;               // Уровень Stop Loss ордера
   double                         tp;               // Уровень Take Profit ордера
   ulong                          deviation;         // Максимально приемлемое отклонение от запрашиваемой цены
   ENUM_ORDER_TYPE                type;             // Тип ордера
   ENUM_ORDER_TYPE_FILLING        type_filling;     // Тип ордера по исполнению
   ENUM_ORDER_TYPE_TIME           type_time;         // Тип ордера по времени действия
   datetime                       expiration;       // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED)
   string                         comment;           // Комментарий к ордеру
   ulong                          position;         // Тикет позиции
   ulong                          position_by;       // Тикет встречной позиции
  };
 
Vladimir Karputov :

다음을 포함하는 것을 잊었습니다.

감사합니다, 나는 이미 그것을 스스로 찾았습니다. 나는 질문이 제거되었다고 쓰고 싶었습니다. 이러한 설정 이전에 설정되었지만 올바른 매개변수가 아닌 것으로 나타났습니다. request.type_time = ORDER_TIME_GTC; request.type_time = ORDER_TIME_SPECIFIED 에 대해 수정됨 ; 모든 것이 작동합니다. 하지만 많은 피드백과 조언을 주셔서 감사합니다.

 
Artyom Trishkin :

Alexey는 처음에는 지표가 최소한 촛불을 끌도록 해야 한다고 말했습니다. 그들이 있는 방식. 적어도 현재 막대에서는. 이를 수행하는 방법 - 이해를 향한 첫 번째 단계가 지났다고 생각하십시오. 그러나 다른 매개 변수를 입력하고 정렬하는 것이 아니라 자신의 마음으로 밝혀지는 것이 바람직합니다.

그리고 여기서 "선험적으로 필요하다/필요하지 않다"? 네 가지 값만으로는 양초를 그릴 수 없기 때문에 정말 필요합니다.

여기에 USDJPY,H8 차트에서 5개의 캔들(실제)을 그려야 하는 매우 간단한 테스트 지표를 작성했습니다.

 //+------------------------------------------------------------------+
//|                                                        cTest.mq5 |
//|                                     Copyright 2020, Tabolin S.N. |
//|                           https://www.mql5.com/ru/users/vip.avos |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Tabolin S.N."
#property link        "https://www.mql5.com/ru/users/vip.avos"
#property version    "1.00"
//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots    1
//--- plot bars
#property indicator_label1    "bars"
#property indicator_type1    DRAW_CANDLES
#property indicator_color1    clrGold
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- indicator buffers
double    barsBuffer1[];
double    barsBuffer2[];
double    barsBuffer3[];
double    barsBuffer4[];
//+------------------------------------------------------------------+
double    newCandles_Open[ 5 ]   = { 106.785 , 106.724 , 106.760 , 106.767 , 106.769 };
double    newCandles_High[ 5 ]   = { 106.792 , 106.765 , 106.780 , 106.781 , 106.769 };
double    newCandles_Low[ 5 ]    = { 106.716 , 106.719 , 106.746 , 106.758 , 106.715 };
double    newCandles_Close[ 5 ]  = { 106.724 , 106.760 , 106.766 , 106.769 , 106.725 };

int       tick_count           = 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
{
//--- indicator buffers mapping
   SetIndexBuffer ( 0 , barsBuffer1, INDICATOR_DATA );
   SetIndexBuffer ( 1 , barsBuffer2, INDICATOR_DATA );
   SetIndexBuffer ( 2 , barsBuffer3, INDICATOR_DATA );
   SetIndexBuffer ( 3 , barsBuffer4, INDICATOR_DATA );
   
   ArraySetAsSeries (barsBuffer1  , true );
   ArraySetAsSeries (barsBuffer2  , true );
   ArraySetAsSeries (barsBuffer3  , true );
   ArraySetAsSeries (barsBuffer4  , true );
   
   ArrayInitialize (barsBuffer1   , 0.0 );
   ArrayInitialize (barsBuffer2   , 0.0 );
   ArrayInitialize (barsBuffer3   , 0.0 );
   ArrayInitialize (barsBuffer4   , 0.0 );
//---
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int    OnCalculate (
   const int         rates_total,       // размер входных таймсерий
   const int         prev_calculated,   // количество обработанных баров на предыдущем вызове
   const datetime &  time[],             // массив Time
   const double &    open[],             // массив Open
   const double &    high[],             // массив High
   const double &    low[],             // массив Low
   const double &    close[],           // массив Close
   const long &      tick_volume[],     // массив Tick Volume
   const long &      volume[],           // массив Real Volume
   const int &       spread[]           // массив Spread
   )
{
   if (rates_total - prev_calculated > 1 )
   {
       if (prev_calculated == 0 )
      {
         Print ( "~~~~ Предварительный расчёт индикатора." );
         for ( int i = 0 ; i < 5 ; i++)
         {
            barsBuffer1[ 0 ] = newCandles_Open[i];
            barsBuffer2[ 0 ] = newCandles_High[i];
            barsBuffer3[ 0 ] = newCandles_Low[i];
            barsBuffer4[ 0 ] = newCandles_Close[i];
         }
         Print ( "~~~~ Предварительный расчёт индикатора закончен." );
      }
       else return ( 0 );
   }
   else Print ( "tick_count = " ,++tick_count);
//--- return value of prev_calculated for next call
   return (rates_total);
}
//+------------------------------------------------------------------+

이 양초만 그릴 뿐 그 이상은 아닙니다.

하지만 실행하면 선이 그어집니다...

글쎄, 설명해줘 바보야, 내가 뭘 잘못하고 있니?


그건 그렇고, 문서에 오타가 있습니다 .

 const datetime &  time {} ,             // массив Time
Документация по MQL5: Обработка событий / OnCalculate
Документация по MQL5: Обработка событий / OnCalculate
  • www.mql5.com
события Calculate для обработки изменений ценовых данных. Существуют два варианта функции, в пределах одного индикатора нельзя использовать оба варианта. [in]  Размер массива price[] или входных таймсерий, доступных индикатору для расчета. Во втором варианте функции значение параметра соответствует количеству баров на графике, на котором он...
파일:
cTest.mq5  8 kb
 
Сергей Таболин :

여기에 USDJPY,H8 차트에서 5개의 캔들(실제)을 그려야 하는 매우 간단한 테스트 지표를 작성했습니다.

이 양초만 그릴 뿐 그 이상은 아닙니다.

하지만 실행하면 선이 그어집니다...

글쎄, 설명해줘 바보야, 내가 뭘 잘못하고 있니?


그건 그렇고, 문서에 오타가 있습니다 .

디버거에서 시간[0]을 확인하고 다음 질문에 답하십시오. "차트의 LEFT LEFT EDGE에서 양초를 그리려는 이유는 무엇입니까?


DRAW_CANDLES 에 대한 도움말을 사용하세요. DRAW_CANDLES 도움말에서 예제를 복사합니다. 그것을 이해하다. 그리고 티키에서는 아직 너무 이르다.

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_CANDLES
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_CANDLES
  • www.mql5.com
//|                                                 DRAW_CANDLES.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | "Рисует в отдельном окне разным цветом свечи по случайно выбранному из MarketWatch символу...
 
Vladimir Karputov :

디버거에서 시간[0]을 확인하고 다음 질문에 답하십시오. "차트의 LEFT LEFT EDGE에서 양초를 그리려는 이유는 무엇입니까?


DRAW_CANDLES 에 대한 도움말을 사용하세요. DRAW_CANDLES 도움말에서 예제를 복사합니다. 그것을 이해하다. 그리고 티키에서는 아직 너무 이르다.

블라디미르, 내가 맨 왼쪽 가장자리에서 그리려고 한 것은 이미 이해했습니다. 이제 테스트에서 오른쪽 가장자리의 그림이 있습니다.

   ArraySetAsSeries (barsBuffer1  , true );
   ArraySetAsSeries (barsBuffer2  , true );
   ArraySetAsSeries (barsBuffer3  , true );
   ArraySetAsSeries (barsBuffer4  , true );

그리고 양초의 가격은 진짜로 간주됩니다... 그리고 진드기는 없습니다...

 
Сергей Таболин :

블라디미르, 내가 맨 왼쪽 가장자리에서 그리려고 한 것은 이미 이해했습니다. 이제 테스트에서 오른쪽 가장자리의 그림이 있습니다.

그리고 양초의 가격은 진짜로 간주됩니다... 그리고 진드기는 없습니다...

마지막으로 도움말에서 예를 들어보세요! 글쎄, 당신은 얼마나 할 수 있습니까? 그 의미를 정말로 이해하지 못한다면 발명한 구조를 사용할 필요가 없습니다. 표준 구조를 사용하십시오 - 작동 방식을 파악하십시오. 그 후에 디자인을 휴지통에 버리십시오.


그리고 'MQL Wizard'를 사용하여 템플릿을 생성합니다.

코드

 //+------------------------------------------------------------------+
//|                                                 Draw Candles.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots    1
//--- plot USDJPY
#property indicator_label1    "USDJPY"
#property indicator_type1    DRAW_CANDLES
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- input parameters
input int       Input1= 9 ;
//--- indicator buffers
double    Buffer1[];
double    Buffer2[];
double    Buffer3[];
double    Buffer4[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,Buffer1, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,Buffer2, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,Buffer3, INDICATOR_DATA );
   SetIndexBuffer ( 3 ,Buffer4, INDICATOR_DATA );
//---
   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=prev_calculated- 1 ;
   if (prev_calculated== 0 )
      limit= 0 ;
   for ( int i=limit; i<rates_total; i++)
     {
      Buffer1[i]=open[i];
      Buffer2[i]=high[i];
      Buffer3[i]=low[i];
      Buffer4[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

그리고 결과


파일:
사유: