mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 109

 
Taras Slobodyanik :

논리적 zhezh - 이것은 쿠데타입니다

논리를 판단하지 않고 정보를 작성했습니다. 영향을 받는 경우 PositionID도 같은 방식으로 변경되어야 합니다.

이제 변경되지 않습니다. 이것이 버그라면 훌륭할 것입니다!


그러므로 질문. DEAL_ENTRY_INOUT 거래가 PositionID를 DEAL_ORDER로 변경해야 합니까?

바꿔야 한다고 생각합니다. 이 동작은 매우 편리하고 정확합니다.
 
fxsaber :

논리를 판단하지 않고 정보를 작성했습니다. 영향을 받는 경우 PositionID도 같은 방식으로 변경되어야 합니다.

이제 변경되지 않습니다. 이것이 버그라면 훌륭할 것입니다!


그러므로 질문. DEAL_ENTRY_INOUT 거래가 PositionID를 DEAL_ORDER로 변경해야 합니까?

여기서는 안된다고 합니다. https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer

이전에 예라고 작성되었지만 위치 ID가 변경되었습니다.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
Andrey Barinov :

여기서는 안된다고 합니다. https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer

아마도 그럴만한 이유가 있을 것입니다. 내 관점에서 이것은 완전히 잘못된 것처럼 보입니다.

이전에 예라고 작성되었지만 위치 ID가 변경되었습니다.

개발자에게 상황을 명확히 하도록 요청하십시오. PositionID가 변경되면 5번의 플립 후 "포지션" 표시 모드의 거래 내역 탭에 5개의 포지션이 표시됩니다.

이제(PositionID는 뒤집기 중에 변경되지 않음) 항상 하나의 위치만 표시됩니다. 쉽게 말해서 이상한 결정입니다.

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MetaTrader 5 플랫폼 빌드 1930의 새 버전: MQL5의 플로팅 차트 창 및 .Net 라이브러리

fxsaber , 2018.11.09 16:19

"by real ticks" 모드에서 테스터는 진드기가 도착하면 자체적으로 막대를 형성합니다. 이러한 이유로 터미널과 테스터에서 사용자 지정 기호의 막대 기록이 완전히 다를 수 있습니다.

 
종종 Expert Advisor 컴파일 후 이 Expert Advisor가 이전에 선택된 경우 Tester 설정 이 재설정되는 상황이 있습니다. 이것은 말할 것도 없이 짜증스럽습니다. 왜냐하면 각 편집 후에는 고문 트리로 올라가 자신을 찾아야합니다. 혹시 모르시는 분이 계시다면 테스터가 리셋되지 않도록 하는 레시피가 있습니다. 기록의 디버그 모드에서 조언자를 한 번 실행해야 합니다(CTRL+F5). 그 후에는 재컴파일이 테스터 설정에 영향을 미치지 않습니다.
 
fxsaber :
종종 Expert Advisor 컴파일 후 이 Expert Advisor가 이전에 선택된 경우 Tester 설정 이 재설정되는 상황이 있습니다. 이것은 말할 것도 없이 짜증스럽습니다. 왜냐하면 각 편집 후에는 고문 트리로 올라가 자신을 찾아야합니다. 혹시 모르시는 분이 계시다면 테스터가 리셋되지 않도록 하는 레시피가 있습니다. 기록의 디버그 모드에서 조언자를 한 번 실행해야 합니다(CTRL+F5). 그 후에는 재컴파일이 테스터 설정에 영향을 미치지 않습니다.


어제도 마찬가지였습니다!

다음과 같이 치료했습니다. 새 버전(새 파일 이름)을 컴파일한 후 터미널을 다시 시작해야 합니다. - mqlache를 업데이트하지 않을 수도 있습니다.

그 후 테스터는 컴파일할 때 이전 파일로 재설정하지 않습니다.


이 문제는 이전에 여러 번 나타났다가 사라졌습니다. 그랬더니 다시 나타났다...

Z.Y. 나는 당신의 말의 의미를 읽지 않았습니다. 그리고 당신은 묻지 않고 조언했습니다 ...

 
이 주제와 관련이 없는 댓글은 " MQL4에 대한 모든 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 "으로 이동되었습니다.
 

얘들아 누구 있어? 히스토리 업로드 스크립트를 확인해주세요...

저만 다 얼어붙나요? 도움말에서 가져온 스크립트...

 //+------------------------------------------------------------------+ 
//|                                              TestLoadHistory.mq5 | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link        "https://www.mql5.com" 
#property version    "1.02" 
#property script_show_inputs 

//--- input parameters 

//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart ()
  {



   int       all_symbols= SymbolsTotal ( false );   string   sym_name= "" ;
   Print ( "Load symbols " ,all_symbols);

   for ( int k= 0 ;k<all_symbols;k++)
       if ((sym_name= SymbolName (k, false ))!= "" )
        {
         SymbolSelect (sym_name, true );

         Print (k, " Symbol name " ,sym_name);

         int res=CheckLoadHistory(sym_name, PERIOD_M1 ,( TimeCurrent ()- 60 * 60 * 24 * 5 ));

         switch (res)
           {
             case - 1 : Print ( "Unknown symbol " ,sym_name);             break ;
             case - 2 : Print ( "Requested bars more than max bars in chart " ,sym_name); break ;
             case - 3 : Print ( "Program was stopped " ,sym_name);                         break ;
             case - 4 : Print ( "Indicator shouldn't load its own data " ,sym_name);       break ;
             case - 5 : Print ( "Load failed " ,sym_name);                                 break ;
             case    0 : Print ( "Loaded OK " ,sym_name);                                   break ;
             case    1 : Print ( "Loaded previously " ,sym_name);                           break ;
             case    2 : Print ( "Loaded previously and built " ,sym_name);                 break ;
             default : Print ( "Unknown result " ,sym_name);
           }

         datetime first_date;
         SeriesInfoInteger (sym_name, PERIOD_M1 , SERIES_FIRSTDATE ,first_date);
         int bars= Bars (sym_name, PERIOD_M1 );
         Print ( "First date " ,first_date, " - " ,bars, " bars" );
        }
//--- 

//--- 
  }
//+------------------------------------------------------------------+ 
//|                                                                  | 
//+------------------------------------------------------------------+ 
int CheckLoadHistory( string symbol, ENUM_TIMEFRAMES period, datetime start_date)
  {
   datetime first_date= 0 ;
   datetime times[ 100 ];
//--- check symbol & period 
   if (symbol== NULL || symbol== "" ) symbol= Symbol ();
   if (period== PERIOD_CURRENT )     period= Period ();
//--- check if symbol is selected in the MarketWatch 
   if (! SymbolInfoInteger (symbol, SYMBOL_SELECT ))
     {
       if ( GetLastError ()== ERR_MARKET_UNKNOWN_SYMBOL ) return (- 1 );

       SymbolSelect (symbol, true );
     }
//--- check if data is present 
   SeriesInfoInteger (symbol,period, SERIES_FIRSTDATE ,first_date);
   if (first_date> 0 && first_date<=start_date) return ( 1 );
//--- don't ask for load of its own data if it is an indicator 
   if ( MQL5InfoInteger ( MQL5_PROGRAM_TYPE )== PROGRAM_INDICATOR && Period ()==period && Symbol ()==symbol)
       return (- 4 );
//--- second attempt 
   if ( SeriesInfoInteger (symbol, PERIOD_M1 , SERIES_TERMINAL_FIRSTDATE ,first_date))
     {
       //--- there is loaded data to build timeseries 
       if (first_date> 0 )
        {
         //--- force timeseries build 
         CopyTime (symbol,period,first_date+ PeriodSeconds (period), 1 ,times);
         //--- check date 
         if ( SeriesInfoInteger (symbol,period, SERIES_FIRSTDATE ,first_date))
             if (first_date> 0 && first_date<=start_date) return ( 2 );
        }
     }
//--- max bars in chart from terminal options 
   int max_bars= TerminalInfoInteger ( TERMINAL_MAXBARS );
//--- load symbol history info 
   datetime first_server_date= 0 ;
   while (! SeriesInfoInteger (symbol, PERIOD_M1 , SERIES_SERVER_FIRSTDATE ,first_server_date) && ! IsStopped ())
       Sleep ( 5 );
//--- fix start date for loading 
   if (first_server_date>start_date) start_date=first_server_date;
   if (first_date> 0 && first_date<first_server_date)
       Print ( "Warning: first server date " ,first_server_date, " for " ,symbol,
             " does not match to first series date " ,first_date);
//--- load data step by step 
   int fail_cnt= 0 ;
   while (! IsStopped ())
     {
       //--- wait for timeseries build 
       while (! SeriesInfoInteger (symbol,period, SERIES_SYNCHRONIZED ) && ! IsStopped ())
         Sleep ( 5 );
       //--- ask for built bars 
       int bars= Bars (symbol,period);
       if (bars> 0 )
        {
         if (bars>=max_bars) return (- 2 );
         //--- ask for first date 
         if ( SeriesInfoInteger (symbol,period, SERIES_FIRSTDATE ,first_date))
             if (first_date> 0 && first_date<=start_date) return ( 0 );
        }
       //--- copying of next part forces data loading 
       int copied= CopyTime (symbol,period,bars, 100 ,times);
       if (copied> 0 )
        {
         //--- check for data 
         if (times[ 0 ]<=start_date)   return ( 0 );
         if (bars+copied>=max_bars) return (- 2 );
         fail_cnt= 0 ;
        }
       else
        {
         //--- no more than 100 failed attempts 
         fail_cnt++;
         if (fail_cnt>= 100 ) return (- 5 );
         Sleep ( 10 );
        }
     }
//--- stopped 
   return (- 3 );
  }
//+------------------------------------------------------------------+ 
//| Возвращает строкое значение периода                              | 
//+------------------------------------------------------------------+ 
string GetPeriodName( ENUM_TIMEFRAMES period)
  {
   if (period== PERIOD_CURRENT ) period= Period ();
//--- 
   switch (period)
     {
       case PERIOD_M1 :   return ( "M1" );
       case PERIOD_M2 :   return ( "M2" );
       case PERIOD_M3 :   return ( "M3" );
       case PERIOD_M4 :   return ( "M4" );
       case PERIOD_M5 :   return ( "M5" );
       case PERIOD_M6 :   return ( "M6" );
       case PERIOD_M10 : return ( "M10" );
       case PERIOD_M12 : return ( "M12" );
       case PERIOD_M15 : return ( "M15" );
       case PERIOD_M20 : return ( "M20" );
       case PERIOD_M30 : return ( "M30" );
       case PERIOD_H1 :   return ( "H1" );
       case PERIOD_H2 :   return ( "H2" );
       case PERIOD_H3 :   return ( "H3" );
       case PERIOD_H4 :   return ( "H4" );
       case PERIOD_H6 :   return ( "H6" );
       case PERIOD_H8 :   return ( "H8" );
       case PERIOD_H12 : return ( "H12" );
       case PERIOD_D1 :   return ( "Daily" );
       case PERIOD_W1 :   return ( "Weekly" );
       case PERIOD_MN1 : return ( "Monthly" );
     }
//--- 
   return ( "unknown period" );
  }
//+------------------------------------------------------------------+
 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

보류 중인 주문이 트리거될 때 이해할 수 없는 상황입니다.

fxsaber , 2018.11.26 13:37

다음과 같은 상황도 있습니다.

  1. 포지션을 개시하는 시장가 주문이 접수되었고 OrdersTotal이 1 증가했습니다.
  2. 이행되었고 OrdersTotal은 1 감소했지만 PositionsTotal은 1 증가하지 않았습니다. 저것들. 위치가 있지만 터미널은 그것에 대해 알지 못합니다.

예를 들어 포지션이나 주문이 없습니다 - PositionsTotal = 0, OrdersTotal = 0.

시장가 주문을 합니다. 이 경우 PositionsTotal = 0, OrdersTotal = 1입니다.

시장가 주문 완료 - OrdersTotal = 0. 그러나 PositionsTotal = 0 !

 
실행 시간
 PositionSelectByTicket ( OrderGetInteger ( ORDER_TICKET ));

PositionsTotal 은 (재생하기 어렵지 않음) 변경할 수 있습니다.


예를 들어 PositionsTotal은 True를 반환하는 PositionsSelectBytTicket 바로 전에 0을 반환합니다.

사유: