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

 

NormalPrice 오류! 좋은 하루 되세요. 일반 margintail을 mql4에서 mql5로 재작업하면 NormalPrice 오류가 발생합니다. 개가 묻힌 곳을 이해하는 데 도움이 됩니다.

 #include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo  o_position;     //класс для управления открытыми позициями
CTrade         o_trade;     
CSymbolInfo    o_symbol;
COrderInfo     o_order;
//+------------------------------------------------------------------+
//| Переменные вводимые при запуске параметры                        |
//+------------------------------------------------------------------+
input double   StartLot    = 0.1 ;
input int      Indent      = 30 ;
input int      Step        = 10 ;
input double   ProfitClose = 20 ;
input int      MagicNumber = 12345 ;
input int      Slippage    = 30 ;
//+------------------------------------------------------------------+
//| Изменяемые параметры в программе                                 |
//+------------------------------------------------------------------+
int dStep;
int dIndent;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
   dStep = Step;
   dIndent = Indent;
   
   if (!o_symbol.Name( Symbol ()))
       return ( INIT_FAILED );
   
   RefreshRates ();
   
   o_trade.SetExpertMagicNumber(MagicNumber);
   //Проверка режимов открытия ордеров через функцию
   if (IsFillingTypeAllowed (o_symbol.Name(), SYMBOL_FILLING_FOK ))
   {
      o_trade.SetTypeFilling( ORDER_FILLING_FOK );
   }
   else if (IsFillingTypeAllowed (o_symbol.Name(), SYMBOL_FILLING_IOC ))
   {
      o_trade.SetTypeFilling( ORDER_FILLING_IOC );
   }
   else 
   {
      o_trade.SetTypeFilling( ORDER_FILLING_RETURN );
   }

   o_trade.SetDeviationInPoints(Slippage);
   
   if (o_symbol. Digits () == 3 || o_symbol. Digits () == 5 )
   {
      dStep    *= 10 ;
      dIndent  *= 10 ;
   }

   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
{
   datetime              lpos_time         = 0 ;
   double                lpos_price_open   = 0.0 ;
   double                lpos_volume       = 0.0 ;
   ENUM_POSITION_TYPE    lpos_type         = - 1 ;
   int                   pos_count         = 0 ;
   double                sum_profit        = 0 ;
   //счечик открытых позиций
   for ( int i = PositionsTotal () - 1 ; i>= 0 ; i--)
   {
       if (o_position.SelectByIndex(i))
      {
         if (o_position. Symbol () == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
             if (o_position. Time () > lpos_time) //если время позиции больше чем время последней позиции
            {
               lpos_time         = o_position. Time ();
               lpos_price_open   = o_position.PriceOpen();
               lpos_volume       = o_position. Volume ();
               lpos_type         = o_position.PositionType();
            }
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit();
         }
      }
   
   }
   //счетчик количества отложенных ордеров
   int stop_count = 0 ;
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--) //OrderTotal считает только отложенные ордера
   {
       if (o_order.SelectByIndex(i))
      {
         if (o_order. Symbol () == o_symbol.Name() && o_order.Magic() == MagicNumber)
         stop_count++;
      }
   
   }
//Функция проверки котировок
   if (! RefreshRates ())
       return ;
   //
   if (sum_profit > ProfitClose)
   {
      CloseAll();
       return ;
   }
   //
   if (pos_count> 0 )
   {
       if (lpos_type == POSITION_TYPE_BUY && o_symbol. Bid () < lpos_price_open - dStep * o_symbol. Point ())
      {
         o_trade.Sell(lpos_volume * 2 , o_symbol.Name());
      }   
       if (lpos_type == POSITION_TYPE_SELL && o_symbol. Ask () < lpos_price_open + dStep * o_symbol. Point ())
      {
         o_trade.Buy(lpos_volume * 2 , o_symbol.Name());
      }   
      o_trade.SellStop(StartLot, o_symbol. Bid () - dIndent * o_symbol. Point ());
      o_trade.BuyStop(StartLot, o_symbol. Ask () + dIndent * o_symbol. Point ());
       return ;
   }
   if (pos_count > 0 && stop_count > 0 )
      DeleteStopOrders(); 
}
//Функция проверки котировок
bool RefreshRates ()
{
   if (!o_symbol. RefreshRates ())
       return ( false );
   if (o_symbol. Ask () == 0 || o_symbol. Bid () == 0 )
       return ( false );
   return ( true );
}   

//+------------------------------------------------------------------+
bool IsFillingTypeAllowed ( string symbol, int fill_type)
{
   int filling = ( int ) SymbolInfoInteger (symbol, SYMBOL_FILLING_MODE ); //запрашиваем режим открытия
   return (filling && fill_type);
}   
//+------------------------------------------------------------------+
void   CloseAll()
{
   for ( int index = PositionsTotal ()- 1 ; index >= 0 ; index--)
   {
       if (o_position.SelectByIndex(index))
      {
         if (o_position. Symbol () == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      }
   }
}
//+Функция удаления стоп ордеров
void   DeleteStopOrders()
{
   for ( int i = OrdersTotal ()- 1 ; i>- 0 ; i--)
   {
       if (o_order.SelectByIndex(i))
         if (o_order. Symbol () == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade. OrderDelete (o_order.Ticket());
   }
}

 
질문이 주제에 없을 수도 있지만 그냥 그렇게 만드는 요점이 보이지 않습니다. 여기 물어볼게.
신호 신뢰성은 무엇을 기반으로 합니까?
 
Evgeniy Kazeikin :
질문이 주제에 없을 수도 있지만 그냥 그렇게 만드는 요점이 보이지 않습니다. 여기 물어볼게.
신호 신뢰성은 무엇을 기반으로 합니까?
복잡한 공식에 따라 계산된 5개 또는 6개의 구성 요소가 있으며 해당 색상으로 눈금이 그려집니다.
 
Slava :

테스터 의 위 오류 (나는 다중 통화 Expert Advisor를 테스트 중임) 외에도 다른 기호가 테스터에 표시되기를 원하지 않으며 4001번도 번호가 지정된 수많은 동기화되지 않은 오류가 통나무.

다시 말하지만, 1981년 빌드에서는 모든 것이 오류 없이 작동했습니다. 1983년 - 문제.

동기화 확인 기능:

 //+------------------------------------------------------------------+
//| Проверка синхронизации данных                                                                                               |
//+------------------------------------------------------------------+
bool CheckSync( const string &usingSymbols[], // Список используемых символов
               const ENUM_TIMEFRAMES timeframe           // Рабочий ТФ
               )
  {
//--- Цикл по символам
   for ( int i= 0 ; i<_symbolsSize; i++)
     {
       //--- Проверяем синхронизацию i-го символа
       if (! SymbolIsSynchronized (usingSymbols[i]) || // Если нет синх. данных терминала и сервера или..
         ! SeriesInfoInteger (usingSymbols[i],timeframe, SERIES_SYNCHRONIZED ))   // ..не синх. данные по символу/периоду на данный момент
        {
         //---
         Print ( __FUNCTION__ , ": ВНИМАНИЕ! Синхронизация по '" +usingSymbols[i]+ "' ТФ " + EnumToString (timeframe)+ " отсутствует!" );
         Print ( __FUNCTION__ , ": error = " , GetLastError ());
         //--- Возвращаем ложь
         return ( false );
        }
     }
//--- Все символы синхронизованы
   return ( true );
  }

CopyTime() 함수에 의해 각 기호에 대한 매분 데이터 요청에 의해 동기화가 지원됩니다. 동기화 확인 함수를 호출하기 전에 ResetLastError()는 4001 오류 번호를 재설정하지 않습니다.

 

안녕하세요, 11월 8일 MT5 업데이트 이후, 전략 테스터에서 이 스크립트 를 사용하여 수평선이 더 이상 그려지지 않았습니다. 그리고 코멘트가 표시되지 않습니다.

해결 방법을 알려주세요.

오류 4001.

 2019.02 . 11 20 : 42 : 53.522 Terminal        MetaTrader x64 build 1983 started (MetaQuotes Software Corp.)
2019.02 . 11 20 : 42 : 53.528 Terminal        Windows 10 (build 14393 ) x64, IE 11 , UAC, Intel Core i3  M 330 @ 2.13 GHz, Memory: 1797 / 3885 Mb, Disk: 359 / 368 Gb, GMT+ 8
 
San Kos :

안녕하세요, 11월 8일 MT5 업데이트 이후, 전략 테스터에서 이 스크립트 를 사용하여 수평선이 더 이상 그려지지 않았습니다. 수정 방법을 알려주세요.

오류 4001.

확인합니다.

터미널 및 시스템:

 2019.02 . 10 16 : 53 : 22.710 MetaTrader 5 x64 build 1983 started (MetaQuotes Software Corp.)
2019.02 . 10 16 : 53 : 23.196 Windows 10 (build 17134 ) x64, IE 11 , UAC, Intel Core i3- 3120 M  @ 2.50 GHz, Memory: 3340 / 8077 Mb, Disk: 101 / 415 Gb, GMT+ 2
2019.02 . 10 16 : 53 : 23.196 C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075


예: 일일 범위 EA는 OBJ_HLINE 개체와 함께 작동합니다. 오류 테스터:

 2019.02 . 11 14 : 37 : 47.737    InpStartMinute= 5
2019.02 . 11 14 : 37 : 47.795 2018.09 . 01 00 : 00 : 00    VLineCreate: failed to create a vertical line! Error code = 4001
2019.02 . 11 14 : 37 : 47.795 2018.09 . 01 00 : 00 : 00    VLineMove: failed to move the vertical line! Error code = 4001
2019.02 . 11 14 : 37 : 47.795 2018.09 . 01 00 : 00 : 00    VLineCreate: failed to create a vertical line! Error code = 4001
2019.02 . 11 14 : 37 : 47.795 2018.09 . 01 00 : 00 : 00    VLineMove: failed to move the vertical line! Error code = 4001
2019.02 . 11 14 : 37 : 47.795 2018.09 . 01 00 : 00 : 00    HLineCreate: failed to create a horizontal line! Error code = 4001
2019.02 . 11 14 : 37 : 47.795 2018.09 . 01 00 : 00 : 00    HLineMove: failed to move the horizontal line! Error code = 4001
2019.02 . 11 14 : 37 : 47.795 2018.09 . 01 00 : 00 : 00    HLineCreate: failed to create a horizontal line! Error code = 4001
2019.02 . 11 14 : 37 : 47.795 2018.09 . 01 00 : 00 : 00    HLineMove: failed to move the horizontal line! Error code = 4001
2019.02 . 11 14 : 37 : 48.969 USDJPY,Daily: history cache allocated for 548 bars and contains 433 bars from 2017.01 . 02 00 : 00 to 2018.08 . 31 00 : 00
 
Alexey Kozitsyn :

테스터 의 위 오류 (저는 다중 통화 Expert Advisor를 테스트 중입니다) 외에도 다른 기호가 테스터에 표시되기를 원하지 않으며 4001번도 번호가 지정된 수많은 동기화되지 않은 오류가 통나무.

다시 말하지만, 1981년 빌드에서는 모든 것이 오류 없이 작동했습니다. 1983년 - 문제.

동기화 확인 기능:

CopyTime() 함수에 의해 각 기호에 대한 매분 데이터 요청에 의해 동기화가 지원됩니다. 동기화 확인 함수를 호출하기 전에 ResetLastError()는 4001 오류 번호를 재설정하지 않습니다.

이 오류는 이미 수정되었습니다.

 
Vladimir Karputov :

확인합니다.

터미널 및 시스템:


예: 일일 범위 EA는 OBJ_HLINE 개체와 함께 작동합니다. 오류 테스터:

다음 빌드에서 수정됩니다.

 

빌드 1984 MQ 데모 서버


 

다른 사람이 1983 빌드에서 이 문제를 겪고 있는지 궁금합니다. 멀티 통화 테스터 가 커피 추출을 거부 하고 단일 통화 테스터로 변한 것으로 보입니다. 다른 기호에 대한 막대를 얻으려고 합니다. 요청한 기호에 관계없이 테스터 설정 에 설정된 기호를 반환합니다.


다음은 오류가 있는 간단한 Expert Advisor입니다.

 int OnInit ()
  {
       EventSetMillisecondTimer ( 200 );
       return INIT_SUCCEEDED ;
  }

void OnTimer ()
{
       MqlRates aBarsCHFJPY[], aBarsEURUSD[], aBarsUSDCHF[];
       int countBars = CopyRates ( "CHFJPY" , PERIOD_H1 , 1 , 1 , aBarsCHFJPY)
         , countBars2 = CopyRates ( "EURUSD" , PERIOD_H1 , 1 , 1 , aBarsEURUSD)
         , countBars3 = CopyRates ( "USDCHF" , PERIOD_H1 , 1 , 1 , aBarsUSDCHF);
      
       ExpertRemove ();
       return ;
}

나는 aBarsCHFJPY[0], aBarsEURUSD[0], aBarsUSDCHF[0]의 값을 디버깅하고 있으며 그것들이 정확히 동일하다는 것을 알았습니다(어떤 것은 테스터 설정에서 선택한 기호에 따라 다름). 테스터의 날짜를 변경해도 아무 영향이 없습니다. 즉, 캐릭터 속성이 올바른 것 같습니다. 1966을 빌드하기 위해 롤백했습니다. 모든 것이 정상입니다.

사유: