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

 
fxsaber :

그리고 어떻게 사용하시겠습니까?

전체 아이디어는 "..\MQL5\Files\00\dir_01" 주소에 처리할 파일이 있는 디렉터리가 있다고 가정해 보겠습니다. 멋진 코드를 사용하여 이러한 폴더의 경로를 배열로 가져오고 어떤 파일을 처리해야 하는지 명확하게 알고 이미 더 나아가고 싶습니다. 이 파일을 참조하려면 "MQL5\\Files\\00\\dir_01\"과 같이 해당 파일에 대한 경로를 작성해야 합니다. \A\\test.csv"이고 코드는 "MQL5\Files\00\dir_01\A\"와 같은 경로를 반환하므로 향후 사용에 적합한 경로를 최적으로 반환하도록 수정할 수 있는지 묻습니다. 암호.

 
Aleksey Vyazmikin :

그리고 어떻게 사용하시겠습니까?

전체 아이디어는 "..\MQL5\Files\00\dir_01" 주소에 처리할 파일이 있는 디렉토리가 있다고 가정해 보겠습니다. 멋진 코드를 사용하여 이러한 폴더의 경로를 배열로 얻고 어떤 파일을 처리해야 하는지 명확하게 알고 이미 더 나아가고 싶습니다. 이 파일을 참조하려면 "MQL5\\Files\\00\\dir_01\"과 같이 해당 파일에 대한 경로를 작성해야 합니다. \A\\test.csv"이고 코드는 "MQL5\Files\00\dir_01\A\"와 같은 경로를 반환하므로 향후 사용에 적합한 경로를 최적으로 반환하도록 수정할 수 있는지 묻습니다. 암호.

이중 슬래시가 무엇인지 이해하지 못할 뿐입니다. 하나의 문자로 구문에서 두 개로 표시됩니다. 첫 번째 슬래시 명령, 두 번째 슬래시 명령.

\n, \r, \t, \" 및 \\는 이 규칙에 따라 지정된 문자입니다. 즉, 경로에는 항상 하나의 슬래시가 있습니다.

 
fxsaber :

이중 슬래시가 무엇인지 이해하지 못할 뿐입니다. 하나의 문자로 구문에서 두 개로 표시됩니다. 첫 번째 슬래시 명령, 두 번째 슬래시 명령.

\n, \r, \t, \" 및 \\는 이 규칙에 따라 지정된 문자입니다. 즉, 경로에는 항상 하나의 슬래시가 있습니다.

내가 뭔가를 이해하지 못한다는 것을 배제하지는 않지만 파일 경로를 생성하려면 슬래시가 하나가 아니라 두 개 필요합니다.

 
Aleksey Vyazmikin :

내가 뭔가를 이해하지 못한다는 것을 배제하지는 않지만 파일 경로를 생성하려면 슬래시가 하나가 아니라 두 개 필요합니다.

두 개의 슬래시가 필요하지 않습니다.

 void OnStart ()
{
   uchar Array[ 1 ] = {'\\'};
  
   Print ( CharArrayToString (Array));
}
Print 를 통해 하나, 둘, 세 개의 슬래시를 기록해 보십시오. 아마도 그러면 이해하게 될 것입니다.
 
fxsaber :

두 개의 슬래시가 필요하지 않습니다.

인쇄를 사용하여 하나, 둘, 세 개의 슬래시를 기록해 보십시오. 아마도 그러면 이해하게 될 것입니다.

네, 슬래시가 명령이라는 것은 이해하지만 경로를 작성해야 하며 이를 위해 이중 슬래시를 사용합니다.

유효한 경로는 다음과 같습니다.

 int zz= FileOpen ( " 00\\dir_01\\A\\ZZ_Analiz_Open.bin", FILE_BIN | FILE_READ );

Folders[0] 배열에서 문자열을 받았습니다.

 00 \dir_01\A\

같은 이름을 가진 파일에 액세스하고 싶지만 배열 인덱스를 변경하여 다른 디렉토리에 있고 이 작업을 수행해야 한다고 가정합니다.

 int zz= FileOpen (Folders[0]+"ZZ_Analiz_Open.bin", FILE_BIN | FILE_READ );

하지만 그런 명령은 오류가 발생합니다. 그렇죠?

 
그리고 메인 파일 объект класса 가 생성되고 그 중 하나의 메소드가 호출됩니다.

헛된 것입니다.

 

안녕하세요!

MQL4에서 MQL5로 전환하려고 하는데 마지막으로 닫힌 위치를 찾을 수 없습니다.
MQL5에서는 주문을 보낼 때 주문이고, 열렸을 때 포지션이 되었고, 논리적으로 닫힌 후에는 포지션 히스토리에 들어가야 하고, 삭제된 보류 주문 은 주문 히스토리에 있어야 합니다. , 그러나 거래의 내역 주문만 볼 수 있으므로 마감된 위치를 어디에서 찾아야 하는지 명확하지 않습니다.

다음과 같이 시도했습니다.

 ulong GetLastCloseTicket()
{
     datetime to= TimeCurrent ();
     datetime from=to- 3 * PeriodSeconds ( PERIOD_D1 );
     HistorySelect (from,to);    
     int Htotal= HistoryOrdersTotal ();
     ulong lastOrders[ 2 ];
     ulong ticket;
     ArrayInitialize (lastOrders, 0 );
 
     for ( uint j = 0 ; j < Htotal; j++)
    {           
         if (ticket= HistoryOrderGetTicket (j)) {            
             if ( HistoryOrderGetInteger (ticket, ORDER_TYPE )== ORDER_TYPE_BUY || HistoryOrderGetInteger (ticket, ORDER_TYPE )== ORDER_TYPE_SELL ) {
                 Print ( "ticket = " +ticket+ ";" );
                 Print ( "ORDER_TYPE = " + ORDER_TYPE + ";" );                
                 // хранить самый последний (недавно закрытый) ордер в lastOrders[1]
                 // а предпоследний в lastOrders[0]
                 if (ticket > lastOrders[ 0 ]) {
                     if (ticket > lastOrders[ 1 ]) {
                        lastOrders[ 0 ] = lastOrders[ 1 ];
                        lastOrders[ 1 ] = ticket;                   
                    } else {
                        lastOrders[ 0 ] = ticket;
                    }
                }
            }
        }
    }
     Print ( "lastOrders[1] = " +lastOrders[ 1 ]+ ";" );
     return (lastOrders[ 1 ]);   
} 

그러나 열린 위치와 닫힌 위치의 숫자를 모두 표시합니다. ORDER_TYPE은 항상 4를 출력하며 이것도 명확하지 않습니다.

ORDER를 DEAL로 변경하려고 했지만 작동하지 않습니다.
말해봐, 제발, 무슨 일이야?

 
vladzeit :

블라디미르 감사합니다. RefreshRates 따옴표 업데이트 기능 사용 수업에서   CsymbolInfo 이미 조금 만났습니다. 나는 그것을 당신의 작품에서 보았고, 글쎄, 나는 그것을 입문서에서 읽었습니다.

OnTick 에서 이 함수를 호출하고 Comment 에 가격 값을 표시하는 것도 예제에서 명확합니다.   현재 문자를 확인하기 위한 OnInit의 절차도 나에게 명확합니다.

새 막대가 있는 예제를 기다리는 동안 예제로 연습하겠습니다. 아직 실제로 적용하지는 않았습니다. 노력하겠습니다.


따라서 새로운 바가 탄생할 때만 작동하는 예입니다.

이 예에서는 정적 변수 PrevBars , prev_askprev_bid 를 사용합니다. 정적 변수의 본질 -

static 키워드로 선언된 지역 변수 는 함수의 수명 동안 값을 유지 합니다. 이후에 함수를 호출할 때마다 이러한 지역 변수에는 이전 호출 중에 가졌던 값이 포함됩니다.

따라서 세 가지 정적 변수( PrevBars , prev_askprev_bid )는 OnTick 함수 내부에서 선언된 지역 변수이며 이전에 OnTick 함수에 들어갔을 때의 값을 유지합니다.

PrevBars 는 이전 막대의 시간을 저장합니다. 이 시간은 현재 막대의 시간인 time_0 과 비교됩니다. PrevBarstime_0 인 동안 - 우리는 현재 막대에 있고 OnTick 기능을 종료합니다. 이전 막대의 가격을 저장하는 변수와 유사하게: 먼저 이전 및 현재 가격을 표시한 다음 현재 가격을 prev_ask 변수에 씁니다. 그리고   이전 입찰가 .

 //+------------------------------------------------------------------+
//|                                      Display previous prices.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.000"
//---
#include <Trade\SymbolInfo.mqh>  
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   if (!m_symbol.Name( Symbol ())) // sets symbol name
       return ( INIT_FAILED );
   RefreshRates ();
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//--- we work only at the time of the birth of new bar
   static datetime PrevBars = 0 ;
   datetime time_0= iTime (m_symbol.Name(), Period (), 0 );
   if (time_0==PrevBars)
       return ;
   PrevBars=time_0;
   if (! RefreshRates ())
     {
      PrevBars= 0 ;
       return ;
     }
//---
   static double prev_ask = 0.0 ;
   static double prev_bid = 0.0 ;
   Comment ( "       Previous | Current" , "\n" ,
           "Ask: " , DoubleToString (prev_ask,m_symbol. Digits ()), " | " , DoubleToString (m_symbol. Ask (),m_symbol. Digits ()), "\n" ,
           "Bid:  " , DoubleToString (prev_bid,m_symbol. Digits ()), " | " , DoubleToString (m_symbol. Bid (),m_symbol. Digits ()));
   prev_ask=m_symbol. Ask ();
   prev_bid=m_symbol. Bid ();
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates ( void )
  {
//--- refresh rates
   if (!m_symbol. RefreshRates ())
     {
       Print ( "RefreshRates error" );
       return ( false );
     }
//--- protection against the return value of "zero"
   if (m_symbol. Ask ()== 0 || m_symbol. Bid ()== 0 )
       return ( false );
//---
   return ( true );
  }
//+------------------------------------------------------------------+
 

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

초보자의 질문 MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin , 2018.12.05 00:39

네, 슬래시가 명령이라는 것은 이해하지만 경로를 작성해야 하며 이를 위해 이중 슬래시를 사용합니다.

유효한 경로는 다음과 같습니다.

 int zz= FileOpen ( " 00\\dir_01\\A\\ZZ_Analiz_Open.bin", FILE_BIN | FILE_READ );

Folders[0] 배열에서 문자열을 받았습니다.

 00 \dir_01\A\

같은 이름을 가진 파일에 액세스하고 싶지만 배열 인덱스를 변경하여 다른 디렉토리에 있고 이 작업을 수행해야 한다고 가정합니다.

 int zz= FileOpen (Folders[0]+"ZZ_Analiz_Open.bin", FILE_BIN | FILE_READ );

하지만 그런 명령은 오류가 발생합니다. 그렇죠?


오류가 발생하지 않습니다. 이중 슬래시가 무엇인지 결코 깨닫지 못했습니다.

 
Aleksey Vyazmikin :

네, 슬래시가 명령이라는 것은 이해하지만 경로를 작성해야 하며 이를 위해 이중 슬래시를 사용합니다.

유효한 경로는 다음과 같습니다.

Folders[0] 배열에서 문자열을 받았습니다.

같은 이름을 가진 파일에 액세스하고 싶지만 배열 인덱스를 변경하여 다른 디렉토리에 있고 이 작업을 수행해야 한다고 가정합니다.

하지만 그런 명령은 오류가 발생합니다. 그렇죠?

Alexey, 문서에서 예를 들어

 //+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//--- неправильный способ открытия файла
   string terminal_data_path = TerminalInfoString ( TERMINAL_DATA_PATH );
   string filename =terminal_data_path+ "\\MQL5\\Files\\" + "fractals.csv" ;
   int filehandle= FileOpen (filename, FILE_WRITE | FILE_CSV );
   if (filehandle< 0 )
     {
       Print ( "Неудачная попытка открыть файл по абсолютному пути" );
       Print ( "Код ошибки " , GetLastError ());
     }
//--- правильный способ работы в "файловой песочнице"
   ResetLastError ();
   filehandle= FileOpen ( "fractals.csv" , FILE_WRITE | FILE_CSV );
   if (filehandle!= INVALID_HANDLE )
     {
       FileWrite (filehandle, TimeCurrent (), Symbol (), EnumToString ( _Period ));
       FileClose (filehandle);
       Print ( "FileOpen OK" );
     }
   else Print ( "Операция FileOpen неудачна, ошибка " , GetLastError ());
//--- еще один пример с созданием вложенной директории в MQL5\Files\
   string subfolder= "Research" ;
   filehandle= FileOpen (subfolder+ "\\fractals.txt" , FILE_WRITE | FILE_CSV );
       if (filehandle!= INVALID_HANDLE )
     {
       FileWrite (filehandle, TimeCurrent (), Symbol (), EnumToString ( _Period ));
       FileClose (filehandle);
       Print ( "Файл должен быть создан в папке " +terminal_data_path+ "\\" +subfolder);
     }
   else Print ( "Операция FileOpen неудачна, ошибка " , GetLastError ());
  }

예제 코드에서 강조 표시된 두 개의 문자열 변수를 인쇄합니다. 차이점을 찾아 이중 슬래시는 프로그램 코드에서만 작성되지만 컴파일되면 하나만 남아 있고 파일 경로에 하나가 사용된다는 점을 이해하십시오.

Документация по MQL5: Файловые операции / FileOpen
Документация по MQL5: Файловые операции / FileOpen
  • www.mql5.com
[in]  Имя открываемого файла, может содержать подпапки. Если файл открывается для записи, то указанные подпапки будут созданы в случае их отсутствия. [in]  значение, используемое в качестве разделителя в txt или csv-файле. Если для csv-файла разделитель не указан, то по умолчанию используется символ табуляции. Если для txt-файла разделитель не...
사유: