오류, 버그, 질문 - 페이지 2853

 

모두에게 좋은 하루. 다음 문제를 해결하도록 도와주세요.

가상 머신 에는 두 개의 MT5 터미널이 있습니다. 하나는 브로커 A와 작동하고 다른 하나는 브로커 B와 작동합니다. 동일한 봇은 두 터미널에서 모두 작동합니다. 버전 2615로 업데이트할 때까지 어제까지는 모든 것이 정상이었습니다.

브로커 A와 작업하는 터미널은 원래대로 작동했지만 브로커 B가 있는 터미널은 정지 상태로 작동하기 시작했습니다. 즉, 시작한 후 일정 시간 정상적으로 작동한 다음 멈춥니다. 동결 후 로그에서 다음 항목:

PJ      1       11:18:36.886    Network '67003410': connection to RoboForex-ECN lost
MP      0       11:18:37.656    Network '67003410': authorized on RoboForex-ECN through Europe #2 (ping: 98.08 ms, build 2560)
RN      0       11:18:37.656    Network '67003410': previous successful authorization performed from 91.217.110.2 on 2020.09.22 07:16:34
DR      0       11:18:37.768    Network '67003410': terminal synchronized with RoboMarkets Ltd: 2 positions, 0 orders, 121 symbols, 0 spreads
IM      0       11:18:37.768    Network '67003410': trading has been enabled - hedging mode
EK      1       11:20:38.099    Network '67003410': connection to RoboForex-ECN lost
ES      0       11:20:38.674    Network '67003410': authorized on RoboForex-ECN through Europe #2 (ping: 98.08 ms, build 2560)
FQ      0       11:20:38.674    Network '67003410': previous successful authorization performed from 91.217.110.2 on 2020.09.22 07:18:36
FM      0       11:20:38.784    Network '67003410': terminal synchronized with RoboMarkets Ltd: 2 positions, 0 orders, 121 symbols, 0 spreads
GR      0       11:20:38.784    Network '67003410': trading has been enabled - hedging mode
OH      1       11:22:39.328    Network '67003410': connection to RoboForex-ECN lost
CR      3       11:22:55.243    NetDispatcher   thread timeout reached possible deadlock [15]


 

컴파일 오류가 발생합니까?

 int j = 1 e3;         // OK
if (j % 1000 == 0 );   // OK
if (j % 1 e3 == 0 );     // '%' - illegal operation use
 
Igor Makanu :

컴파일 오류가 발생합니까?

더블

 
Vladimir Simakov :

더블

확인. 고맙습니다

확인, 그것은

 Print ( typename ( 1 e3)); //        double
 
MQL5에서 차트 기록 작업에 대한 실험적 수정이 포함된 베타 2617이 출시되었습니다.
 
현장의 PM은 다시 쟁기질하지 마십시오.
 

메타트레이더 5 터미널 개발자가 마지막 업데이트에서 표시기 버퍼를 끊었나요? 아니면 내 머리에 뭔가가 있습니까?

요점은 새 막대에서 전체 재계산이 없는 모든 화살표 표시기가 동일한 결함을 제공하기 시작했다는 것입니다. 화살표는 새 막대의 신호 막대에서 인접한 막대에 토끼처럼 생성되기 시작합니다. 예시를 첨부합니다.

새 막대에서 표시기를 완전히 다시 계산하는 것만으로도 도움이 됩니다.


 //+------------------------------------------------------------------+
//|                                                   test_arrow.mq5 |
//|                                               Efremov Konstantin |
//|                          https://www.mql5.com/ru/users/leonardo4 |
//+------------------------------------------------------------------+
#property copyright "Efremov Konstantin"
#property link        "https://www.mql5.com/ru/users/leonardo4"
#property version    "1.00"
#property indicator_chart_window
//--- init indicator buffers
#property indicator_buffers 1
#property indicator_plots    1

#property indicator_label1    "Arrows"
#property indicator_type1    DRAW_ARROW
#property indicator_color1    clrLawnGreen
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1

input int       History  = 10 ;             // История, дней  

double    Arrows[];
int       cnt_bars;
int       HistoryCandle;
bool      FirstStartFlag;
int bar, limit;
datetime counted_bar;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer        ( 0 ,Arrows, INDICATOR_DATA );
   ArraySetAsSeries      (Arrows, true );
   PlotIndexSetInteger   ( 0 , PLOT_DRAW_TYPE , DRAW_ARROW );
   PlotIndexSetInteger   ( 0 , PLOT_LINE_COLOR , clrDodgerBlue );
   PlotIndexSetString    ( 0 , PLOT_LABEL , "Arrows" );
   PlotIndexSetInteger   ( 0 , PLOT_ARROW , 233 );
   
   IndicatorSetInteger ( INDICATOR_DIGITS , _Digits );

//--- Рассчитываем количество свечей истории текущего таймфрейма от настройки "дней"
   HistoryCandle           = History* 24 * 60 * 60 / PeriodSeconds ( PERIOD_CURRENT );
   cnt_bars                = HistoryCandle;   // Кол-во баров для подсчета сигналов
   FirstStartFlag          = true ;
   
//---
   return ( INIT_SUCCEEDED );
  }
 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ChartRedraw ( 0 );
  }
  
//+------------------------------------------------------------------+
//| 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[])
  {
//---

       ArraySetAsSeries (close, true );
       ArraySetAsSeries (open, true );
       ArraySetAsSeries (low, true );
      
     if (HistoryCandle>=rates_total) cnt_bars=rates_total- 1 ;
     else cnt_bars=HistoryCandle;
     
//----+ проверка количества баров на достаточность для корректного расчёта индикатора
       if (rates_total<=cnt_bars)
         {
             Print ( "Недостаточно истории. Есть " + IntegerToString (rates_total- 1 )+ " надо " + IntegerToString (cnt_bars));                                                                                                                                                                                                                                                                                                              
             return ( 0 );
         }
         
//--- инициализация индикаторного буфера  
     if (FirstStartFlag) 
      {
//--- обнулим все буферы стрелок и времени от мусора                                                             
         for ( int x=cnt_bars; x>= 0 && ! IsStopped (); x--) Arrows[x] = EMPTY_VALUE ;
         FirstStartFlag = false ;
         ChartRedraw ( 0 );
      }
      
   if (prev_calculated>rates_total || prev_calculated<= 0 ) // проверка на первый старт расчёта индикатора
      {
         limit=cnt_bars- 1 ; // стартовый номер для расчёта всех баров
      }
   else limit=rates_total-prev_calculated; // стартовый номер для расчёта новых баров
   
   if (rates_total != prev_calculated) Arrows[ 0 ] = EMPTY_VALUE ;
   

   
   for (bar=limit; bar>= 0 && ! IsStopped (); bar--)
      {
         if (close[bar+ 1 ]>open[bar]+ 5 * _Point )  {Arrows[bar]= NormalizeDouble (low[bar]- 5 * _Point , _Digits );}
      }
      
   MqlRates rates[];
   MqlTick tick;
   SymbolInfoTick ( Symbol (),tick);
   CopyRates ( Symbol (), PERIOD_CURRENT , 0 , 1 ,rates);
   double i;
   long m,s;
   m=rates[ 0 ].time+GetMinute()* 60 -tick.time;
   i=m/ 60.0 ;
   s=m% 60 ;
   m=(m-m% 60 )/ 60 ;
            
   Comment ( " Candle: " + IntegerToString (m, 0 , ' ' )+ " m " + IntegerToString (s, 0 , ' ' )+ " s left" );
   
   if ( iTime ( _Symbol , PERIOD_M1 , 0 ) > counted_bar ) 
      {
         counted_bar = iTime ( _Symbol , PERIOD_M1 , 0 );
         ChartRedraw ( 0 );
      }
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

int GetMinute()
  {
   switch ( Period ())
     {
       case PERIOD_M1 : return ( 1 );
       case PERIOD_M2 : return ( 2 );
       case PERIOD_M3 : return ( 3 );
       case PERIOD_M4 : return ( 4 );
       case PERIOD_M5 : return ( 5 );
       case PERIOD_M6 : return ( 6 );
       case PERIOD_M10 : return ( 10 );
       case PERIOD_M12 : return ( 12 );
       case PERIOD_M15 : return ( 15 );
       case PERIOD_M20 : return ( 20 );
       case PERIOD_M30 : return ( 30 );
       case PERIOD_H1 : return ( 60 );
       case PERIOD_H2 : return ( 120 );
       case PERIOD_H3 : return ( 180 );
       case PERIOD_H4 : return ( 240 );
       case PERIOD_H6 : return ( 360 );
       case PERIOD_H8 : return ( 480 );
       case PERIOD_H12 : return ( 720 );
       case PERIOD_D1 : return ( 1440 );
       case PERIOD_W1 : return ( 10080 );
       case PERIOD_MN1 : return ( 43200 );
     }
   return ( 1 );
  }
파일:
test_arrow.mq5  12 kb
 
Konstantin Efremov :

알려주세요. Metatrader 5 터미널 개발자가 최신 업데이트에서 표시기 버퍼를 중단했습니까? 아니면 내 머리에 뭔가가 있습니까?

요점은 새 막대에서 전체 재계산이 없는 모든 화살표 표시기가 동일한 결함을 제공하기 시작했다는 것입니다. 화살표는 새 막대의 신호 막대에서 인접한 막대에 토끼처럼 생성되기 시작합니다. 예시를 첨부합니다.

새 막대에서 표시기를 완전히 다시 계산하는 것만으로도 도움이 됩니다.


이 쓰레기를 교체

 //--- инициализация индикаторного буфера  
     if (FirstStartFlag) 
      {
//--- обнулим все буферы стрелок и времени от мусора                                                             
         for ( int x=cnt_bars; x>= 0 && ! IsStopped (); x--) Arrows[x] = EMPTY_VALUE ;
         FirstStartFlag = false ;
         ChartRedraw ( 0 );
      }

그런 넌센스

   if (prev_calculated == 0 )
     ArrayInitialize (Arrows, 0.0 );
 

>>켜기   가상 기기   2개의 MT5 터미널 비용이 듭니다. 하나는 브로커 A와 작동하고 다른 하나는 브로커 B와 작동합니다. >>동일한 봇이 두 터미널에서 작동합니다. 버전 2615로 업데이트할 때까지 어제까지는 모든 것이 정상이었습니다.


반환된 버전 2560, 모든 것이 잘 작동하고 정지 및 교착 상태가 없습니다.

개발자가 메시지에 전혀 응답합니까?

Виртуальный хостинг для MetaTrader 5
Виртуальный хостинг для MetaTrader 5
  • www.mql5.com
Виртуальный хостинг для MetaTrader 4/5 является лучшим VPS-решением для Форекса. Оно не требует настройки, дает минимальные задержки до сервера и отличается низкими ценами. Всего за 15 USD в месяц вы получите виртуальную платформу, которая работает круглые сутки, экономит вашу прибыль и даже окупает себя. Создать удаленную копию приложения...
 
elavr :

>>켜기   가상 기기   2개의 MT5 터미널 비용이 듭니다. 하나는 브로커 A와 작동하고 다른 하나는 브로커 B와 작동합니다. >>동일한 봇이 두 터미널에서 작동합니다. 버전 2615로 업데이트할 때까지 어제까지는 모든 것이 정상이었습니다.


반환된 버전 2560, 모든 것이 잘 작동하고 정지 및 교착 상태가 없습니다.

개발자가 메시지에 전혀 응답합니까?

이해하거나 재현할 수 있도록 기술적인 세부 정보를 제공했습니까?

세부 사항이 없는 질문은 거의 항상 우리의 관심 없이 남아 있습니다.