MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 478

 
lil_lil :

FileSeek (파일, 0 , SEEK_END )가 있습니다. 모든 것이 새 줄 에서 파일에 기록됩니다.

문제는 4개의 파일이 있고 4개의 위치에 대한 데이터를 각각 별도의 파일에 작성해야 하며, 각 파일에는 이름에 위치 티켓이 있고 데이터는 마지막 파일, 마지막 파일에 데이터 하나만 기록된다는 것입니다. 위치.

파일 이름이 정확합니까? 대신 Ticket=OrderTicket(); 파일명=_티켓+기호()+".txt"; FileName=(string)OrderTicket()+Symbol()+".txt"를 작성합니다. 처음에는 #property strict 지시문을 추가합니다. 이는 오류를 제거하는 데 도움이 됩니다.
 
STARIJ :
파일 이름이 정확합니까? 대신 Ticket=OrderTicket(); 파일명=_티켓+기호()+".txt"; FileName=(string)OrderTicket()+Symbol()+".txt"를 작성합니다. 처음에는 #property strict 지시문을 추가합니다. 이는 오류를 제거하는 데 도움이 됩니다.

감사합니다. 추천에 따라 이름의 구성이 다시 수정되었지만 여전히 마지막 위치의 데이터만 씁니다.

그리고, 새 파일의 이름은 변경되지 않았습니다) 문제의 이름이 아닌 것으로 의심되며 마지막 위치의 파일이 이미 발견되었습니다.

이전 위치를 무시하는 이유는 무엇입니까?

 

1501896125EURUSD.txt
타임 세미 입찰 가격
2018.02.22 22:53 P 1.23259 0.88322
2018.02.22 22:54 P 1.23259 0.88322
2018.02.22 22:55 P 1.23259 0.88322
2018.02.22 22:56 P 1.23249 0.88322

1501896094EURUSD.txt
타임 세미 입찰 가격
2018.02.22 22:43 패 1.23212 1.23203
2018.02.22 22:44 패 1.23220 1.23203
2018.02.22 22:44 패 1.23224 1.23203
2018.02.22 22:45 패 1.23244 1.23203
2018.02.22 22:45 패 1.23242 1.23203
2018.02.22 22:46 패 1.23251 1.23203
뭔가 변경? 보세요... 여기 있습니다: string sy=""; 정수 연산=-1, mn=-1; 거의 필요하지 않습니다 ... 아마도 버리시겠습니까? 루프에서 중첩된 if() 대신 계속이 더 좋습니다.

파일:
Fileee.mq4  7 kb
 
STARIJ :

1501896125EURUSD.txt
타임 세미 입찰 가격
2018.02.22 22:53 P 1.23259 0.88322
2018.02.22 22:54 P 1.23259 0.88322
2018.02.22 22:55 P 1.23259 0.88322
2018.02.22 22:56 P 1.23249 0.88322

1501896094EURUSD.txt
타임 세미 입찰 가격
2018.02.22 22:43 패 1.23212 1.23203
2018.02.22 22:44 패 1.23220 1.23203
2018.02.22 22:44 패 1.23224 1.23203
2018.02.22 22:45 패 1.23244 1.23203
2018.02.22 22:45 패 1.23242 1.23203
2018.02.22 22:46 패 1.23251 1.23203
뭔가 변경? 보세요... 여기 있습니다: string sy=""; 정수 연산=-1, mn=-1; 거의 필요하지 않습니다 ... 아마도 버리시겠습니까? 루프에서 중첩된 if() 대신 계속이 더 좋습니다.

그는 모든 직책을 기록하고 싶지 않습니다.

7포지션을 엽니다. 하나의 파일을 작성했습니다

고문이 차트에있을 때 편집 된 그는 첫 번째 위치와 마지막 위치의 데이터를 기록하기 시작했습니다. 이제 첫 번째 위치인 하나에만 데이터를 씁니다.

6개가 누락된 것 같지만 경고 경고 (FileName)에는 티켓이 모두 있습니다.

그가 원하는 것은...

 
파일 쓰기를 위한 다음 조건을 포함하여 프로그램에는 많은 조건이 있습니다.
if(t_pre+60< TimeCurrent() && _o_t+1800>TimeCurrent()) // 주문 개시 후 30분 동안 1분에 한 번. 그게 필요 할까?
{
t_pre=TimeCurrent();
프로그램에는 분기가 포함되어 있습니다.
   for (i= 0 ; i<k; i++) 
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) 
        {
         if ( OrderSymbol ()==sy || sy== "" ) 
           {
             if ( OrderType ()== OP_BUY || 
               OrderType ()== OP_SELL ) 
              {
               if (op< 0 || OrderType ()==op) 
                 {
                   if (mn< 0 || OrderMagicNumber ()==mn) 
                    {
                     _o_t= OrderOpenTime ();
И еще 5 закрывающих скобок. а можно короче на 10 строк и понятнее записать так
   for (i= 0 ; i<k; i++) 
  {
     if ( ! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) continue ; // если ошибка выбора ордера - переходим к следующему
     if ( OrderSymbol ()!=sy && sy!= "" ) continue ;   // а это вообще надо?
     if ( OrderType ()!= OP_BUY && OrderType ()!= OP_SELL ) continue ; // а другие разве у Вас есть?
     if (op>= 0 && OrderType ()!=op) continue ;
     if (mn>= 0 && OrderMagicNumber ()!=mn) continue ;
     _o_t= OrderOpenTime ();
왜 사다리로 글을 쓰곤 했습니까? 이전 버전의 MQL4에서는 실행 속도가 빨라졌습니다. 이제 상관없어
_o_t 변수는 2곳에서만 사용됩니다. 이를 OrderOpenTime()으로 대체하면 프로그램이 2줄(선언 및 할당)만큼 명확해지고 짧아집니다.
datetime_o_t; 그리고
_o_t=주문오픈타임();
 

문제가 무엇인지 찾았습니다. 한 주기에 대해 60초의 카운트다운을 빼야 합니다.

 //+------------------------------------------------------------------+ 
//| Ежеминутная информация об ордерах, открытых за последнее полчаса | 
//+------------------------------------------------------------------+ 
#property strict
bool RUS= true ;
datetime t_pre= 0 ;   // Время предыдущего выполнения

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
{
   if (t_pre+ 60 >= TimeCurrent ()) return ;       // Дождаться 60 секунд после прошлой обработки
   t_pre= TimeCurrent ();                     // Это нужно вынести за цикл - в этом было дело !!!!!!!!!!!!

   string text;
   for ( int i= 0 ; i< OrdersTotal (); i++) 
   {
       if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) continue ;
       if ( OrderType ()!= OP_BUY && OrderType ()!= OP_SELL ) continue ;
       string ИмяФайла=( string ) OrderTicket ()+ Symbol ()+ ".txt" ;
       Alert (ИмяФайла);
       if ( OrderOpenTime ()+ 60 >= TimeCurrent ()) continue ;   // Пропуск молодых которым меньше 1 минуты
       if ( OrderOpenTime ()+ 1800 <= TimeCurrent ()) continue ; // Пропустк старых которым больше 30 минут
       if ( OrderType ()== OP_BUY ){ if ( Bid > OrderOpenPrice ())text= "P" ; else text= "L" ;}
       if ( OrderType ()== OP_SELL ){ if ( Bid < OrderOpenPrice ())text= "P" ; else text= "L" ;}

       // Открытие или создание файла и перемещение указателя в конец
       int Файл= FileOpen (ИмяФайла, FILE_CSV | FILE_READ | FILE_WRITE , " " );
       if (Файл == - 1 ) {   Alert ( "Ошибка при открытии файла " ,ИмяФайла);   return ; }
       FileSeek (Файл, 0 , SEEK_END );

       // Если новый файл записать имя файла и строку заголовков колонок
       if ( FileSize (Файл)== 0 )
      {
         FileWrite (Файл,ИмяФайла);
         FileWrite (Файл, "           Время Полу   BID     Цена " );
      }
       // Сбор информации и запись в файл
       FileWrite (Файл, TimeToStr ( TimeCurrent ()), text,
                dstr( Bid ), "  " , dstr( OrderOpenPrice ()));
       FileClose (Файл);
   }
}

// Преобразование числа double в строку с запятой или точкой в соответствии с локализацией
string dstr( double Цена)
{
   if (!RUS) return DoubleToStr (Цена, Digits );
   return StringSetChar ( DoubleToStr (Цена, Digits ), StringFind ( DoubleToStr (Цена, Digits ), "." ), ',' );
}
파일:
-Fi----.mq4  5 kb
 

안녕하세요, 친애하는 포럼 사용자 여러분.

동일한 설정을 최적화하고 테스트할 때 때때로 다른 결과가 나오는 이유를 말씀해 주시겠습니까?

SQ Tick Downloader에서 다운로드한 인용문 및 스크립트를 통해 실행

 
Aidar Kaliaskar :

좋은 오후입니다.

동일한 설정을 최적화하고 테스트할 때 때때로 다른 결과가 나오는 이유를 말씀해 주시겠습니까?

더 말씀드리겠습니다. 실제 계정에서 거래할 때 2개의 다른 계정에 있는 한 브로커가 다른 결과를 가질 수 있습니다.
 
Vladislav Andruschenko :
더 말씀드리겠습니다. 실제 계정에서 거래할 때 2개의 다른 계정에 있는 한 브로커가 다른 결과를 가질 수 있습니다.

그것은 아마도 브로커에 더 의존합니다. 그러나 원래 질문에 도움을 줄 수 있습니까?

 
Aidar Kaliaskar :

그것은 아마도 브로커에 더 의존합니다. 그러나 원래 질문에 도움을 줄 수 있습니까?

현재로 설정된 경우 스프레드. 현재 설정된 경우 테스트 종료 날짜입니다. 더 많은 이유가 있을 수 있습니다.