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

 
Vitaly Muzichenko :

처음에는 이대로 두십시오.

다음으로, 막대가 해결되었음을 올바르게 고정해야 하지만 여기에서는 TK에 대한 전체 접근 방식을 계산해야 합니다.

지금까지 귀하의 게시물에서 본 것을 보면 다음을 수행해야 합니다.

결론은 스프레드가 표준보다 크면 OnTick 으로 돌아가고 새 틱에서 스프레드를 확인하고 정상이면 주문을 보내고 이 막대에 거래가 있었음을 기억한다는 것입니다. .

두 번째 방법도 있습니다.

일반적으로 언제 기록해야 하는지 논리를 결정해야 하며 "새 막대"가 형성되기 전에 더 이상 확인하지 않습니다.


이해합니다, 감사합니다!

 

여러분, 조언 부탁드립니다. 두 번째 주에는 지표 데이터를 파일에 기록하여 나중에 읽고 데이터를 기반으로 지표를 만들려고 합니다. 표시기는 교육적이며 특정 막대의 각 눈금에 대한 볼륨을 계산합니다. 눈금이 양수이면 볼륨을 "+"에 추가하고 음수이면 -에 "-"를 추가합니다. 수신된 누적 볼륨을 추가하고 델타를 얻고 이 델타를 발생 기준으로 고려합니다. 이것이 곡선을 얻는 방법입니다. 그러나 이 곡선은 실시간으로만 작성됩니다. 그것은 역사에 근거하지 않습니다. 이를 위해 파일에 데이터를 쓰기로 결정했습니다. 이 단계에서 멈췄습니다. 애도를 표하며 코드에서 컴파일러 오류가 발생하지 않도록 했습니다. 그러나 결과 제품이 작동하지 않습니다. 이전 표시기가 작동했습니다. 파일 쓰기 코드를 첨부한 후 표시기가 작동을 멈췄습니다. 프로그램은 이해할 수 없는 항목이 하나 포함된 파일을 만들고 이에 대해 죽습니다. 나는 하루 종일 앉아서 아무것도 이해할 수 없습니다. 누구든지 도울 수 있습니까?

 //+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property version    "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_label1    "Вверх"
#property indicator_type1    DRAW_LINE
#property indicator_color1   Salmon
#property indicator_style1    STYLE_SOLID
#property indicator_width1    2

#property indicator_label2    "Вниз"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrDarkTurquoise
#property indicator_style2    STYLE_SOLID
#property indicator_width2    2

input string              InpFileName= "111.csv" ;       // Имя файла 
input string              InpDirectoryName= "Data" ;     // Имя каталога 

datetime Время= 0 ;   // Время прошлого бара
double Bid1;
double    Buf_1[];
// double ExtBuffer;
long V1; // объем для текущего тика вверх
long V2; // накопленный объем для всех тиков вверх текущего бара
long V3; // объем текущего тика вниз
long V4; // накопленный объем для всех тиков вниз для текущего бара
long V5;   // отрицательные и положительные iVolume нарастающим итогом
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit ()
  {
   IndicatorDigits ( 0 );
   SetIndexBuffer ( 0 ,Buf_1);
//SetIndexBuffer(1,Buf_2);
   Bid1= Bid ;
   V5= 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[])
  {
   datetime Вр= Time [ 0 ];   // Время текущего бара
   if (Вр>Время)           // Если новый бар
     {
      Время=Вр;           // Запомнить
                           //      Buf_1[0]=0;         // и обнулить последний элемент буфера
     }

   datetime date_Buf_1[]; // массив дат индикатора 
   datetime time_Buf_1[]; // массив времени 
                           // --- считаю объем для положительных и отрицательных тиков      
   if ( Bid >=Bid1)
     {
       if ( Bid >Bid1) // если тик положительный..
        {
         V1= iVolume ( NULL , 0 , 0 ); // если повышающий цену тик, то находим его объем
         V2= V1 + V2;
        }
       else
        {
         V1= 0 ;                 // если Bid1 = Bid2, т.е. изменение цены = 0, то iVolume этого тика присваиваем 0;
         V2= V1 + V2;
        }
     }
   else
     {
      V3 = iVolume ( NULL , 0 , 0 ); // если понижающий цену тик 
      V4 = V3 + V4;             // то находим его объем  
     }

   V5=V2-V4;               // определяем разницу (дельту) между объемами положительных и отрицательных тиков
   Bid1= Bid ;
   Buf_1[ 0 ]=V5; // в буфер сгружаем  дельту

                 //   ExtBuffer = Buf_1 [0];
//   double macurrent=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,0); 

// запись в файл данных буфера

//--- установим для массивов признак таймсерии 
   ArraySetAsSeries (Buf_1, true );
   ArraySetAsSeries (date_Buf_1, true );

//--- скопируем таймсерию 
   int copied= CopyTime ( NULL , 0 , 0 , 0 ,date_Buf_1);

//--- подготовим массив Buf_1 
   ArrayResize (Buf_1,copied);
//--- скопируем значения линии индикатора  
   for ( int i= 0 ;i<copied;i++)
     {
      Buf_1[i]=V5;
     }
//--- откроем файл для записи значений индикатора 
   ResetLastError ();
   int file_handle= FileOpen (InpDirectoryName+ "//" +InpFileName, FILE_READ | FILE_WRITE | FILE_CSV );
   if (file_handle!= INVALID_HANDLE )
     {
       PrintFormat ( "Файл %s открыт для записи" ,InpFileName);
       PrintFormat ( "Путь к файлу: %s\\Files\\" , TerminalInfoString ( TERMINAL_DATA_PATH ));
       //--- сначала запишем значения индикатора 
       FileWrite (file_handle,Buf_1[ 0 ]);
       //--- запишем время и значения в файл 
       for ( int i= 0 ;i<Buf_1[ 0 ];i++)
         FileWrite (file_handle,time_Buf_1[i],Buf_1[i]);
       //--- закрываем файл 
       FileClose (file_handle);
       PrintFormat ( "Данные записаны, файл %s закрыт" ,InpFileName);
     }
   else
       PrintFormat ( "Не удалось открыть файл %s, Код ошибки = %d" ,InpFileName, GetLastError ());

   return (rates_total);
  }
//+------------------------------------------------------------------+
 
YarTrade :

여러분, 조언 부탁드립니다. 두 번째 주에는 지표 데이터를 파일에 기록하여 나중에 읽고 데이터를 기반으로 지표를 만들려고 합니다. 표시기는 교육적이며 특정 막대의 각 눈금에 대한 볼륨을 계산합니다. 눈금이 양수이면 볼륨을 "+"에 추가하고 음수이면 -에 "-"를 추가합니다. 수신된 누적 볼륨을 추가하고 델타를 얻고 이 델타를 발생 기준으로 고려합니다. 이것이 당신이 곡선을 얻는 방법입니다. 그러나 이 곡선은 실시간으로만 작성됩니다. 그것은 역사에 근거하지 않습니다. 이를 위해 파일에 데이터를 쓰기로 결정했습니다. 이 단계에서 멈췄습니다. 애도를 표하며 코드에서 컴파일러 오류가 발생하지 않도록 했습니다. 그러나 결과 제품이 작동하지 않습니다. 이전의 표시기가 작동했습니다. 파일 쓰기 코드를 첨부한 후 표시기가 작동을 멈췄습니다. 프로그램은 이해할 수 없는 항목이 하나 포함된 파일을 만들고 이에 대해 죽습니다. 나는 하루 종일 앉아서 아무것도 이해할 수 없습니다. 누구든지 도울 수 있습니까?


쓰기 전에 포인터를 파일 끝으로 이동하는 것이 좋습니다.

FileSeek - Файловые операции - Справочник MQL4
FileSeek - Файловые операции - Справочник MQL4
  • docs.mql4.com
Если выставить позицию за "правую границу" файла (больше, чем размер файла), то последующая запись в файл будет будет произведена не с конца файла, а с выставленной позиции. При этом между предыдущим концом файла и выставленной позицией будут записаны неопределенные значения...
 
Alexey Viktorov :

쓰기 전에 포인터를 파일 끝으로 이동하는 것이 좋습니다.


이것이 왜 필요한가? 나는 링크를 읽었지만 아무것도 이해하지 못했습니다.

 
YarTrade :

이것이 왜 필요한가? 나는 링크를 읽었지만 아무것도 이해하지 못했습니다.

글쎄, 왜? 파일을 열면 포인터가 파일의 시작 부분에 있고 파일의 시작 부분에 정보가 기록됩니다. 올바른 위치에 쓰려면 포인터를 올바른 위치로 이동해야 합니다.

[삭제]  
YarTrade :

여러분, 조언 부탁드립니다. 두 번째 주 동안 나는 지표 데이터를 파일에 쓰려고 노력했습니다 ...

읽었어?
 
Alexey Kozitsyn :
읽었어?

아직 MQL4를 배우고 있습니다. 읽지 않는다.

선생님과 함께 예제를 통해 무료/유료로 MQL4를 배울 수 있는 온라인 교육 서비스가 있습니까? MQL4 튜토리얼을 거의 읽었지만 프로그래밍을 전혀 할 수 없습니다. 전에는 프로그래밍을 전혀 하지 않았습니다. 이 스레드에서 무언가를 배우려고 노력하고 있지만 일주일 동안 진전이 없었습니다. 조언해주실 수 있나요?

 
YarTrade :

아직 MQL4를 배우고 있습니다. 읽지 않는다.

선생님과 함께 예제를 통해 무료/유료로 MQL4를 배울 수 있는 온라인 교육 서비스가 있습니까? MQL4 튜토리얼을 거의 읽었지만 프로그래밍을 전혀 할 수 없습니다. 전에는 프로그래밍을 전혀 하지 않았습니다. 이 스레드에서 무언가를 배우려고 노력하고 있지만 일주일 동안 진전이 없었습니다. 조언해주실 수 있나요?

1. mql4에서 파일 작업은 mql5에서와 동일합니다.

2. Sergei Kovalev에 대한 존경심과 함께 그는 당시 내 질문에도 대답했지만 제 생각에는 Kirill의 교훈이 더 이해하기 쉽습니다. Yandex에서 당신은 그의 수업에 대한 2개의 링크를 입력하고 즉시


 

안녕하세요! 사이트의 교과서는 나에게 충분했습니다. 몇 년 동안 함정에 맞서면서 스스로 지표를 작성하는 법을 배웠습니다. 그러나 질문이 남아 있습니다. 이제 지표가 빗나가는 이유를 이해할 수 없습니다. M1에서 약 12시간 후에 일부는 잘못 그리기 시작하지만 올바르게 경적을 울립니다. 일부는 잘못된 렌더링에서 그리기 및 경적을 울립니다. M5에서는 5배 더 오래 지속됩니다. 말해 주세요.

 
Alexey Viktorov :

1. mql4에서 파일 작업은 mql5에서와 동일합니다.

2. Sergei Kovalev에 대한 존경심으로 그는 당시 내 질문에도 대답했지만 내 생각에는 Kirill의 교훈이 더 이해하기 쉽습니다. Yandex에서 당신은 그의 수업에 대한 2개의 링크를 입력하고 즉시



프로그래밍을 해본 적이 없다면 "Cyril로부터" 교훈을 배우는 것이 정말로 가능합니까? 그리고 얼마나 걸릴 것 같습니까?