기준 지표를 다시 그리다?! - 페이지 5

 
이것은 Satori 지표의 새로운 버전입니다.(Currency1 및 Currency1에 대한 지수의 출력만 추가되었습니다)
//+------------------------------------------------------------------+
//|                                           RedrawIndicators-2.mq4 |
//|                                                           Satori |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "Satori"
#property link      "http://www.metaquotes.ru/forum/7790/"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Yellow
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
extern int       BarsCount=20;   //кол-во считаемых баров, если 0 - то все
extern string    Currency1="EURUSD";
extern string    Currency2="GBPUSD";

int handle,handle2;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexLabel(0,Currency1);

   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexLabel(1,Currency2);

   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

   handle= FileOpen("TestFile.csv",FILE_CSV|FILE_WRITE,';');
   handle2= FileOpen("TestFile2.csv",FILE_CSV|FILE_WRITE,';');
  if(handle<1 || handle2<1 )
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
   else
   {
   FileWrite (handle,"index",Symbol(),"","index1",Currency1,"","index2",Currency2);
   FileWrite (handle2,"index",Symbol(),"  ",Currency1,"  ",Currency2);
   }

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   FileClose(handle);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int i;
   double test1,test2;
   datetime tt1,tt2,TimeMain;
   BarsCount=MathMin(Bars,(MathMin(iBars(Currency1,Period()),iBars(Currency2,Period()))));
   for (i=0;i<BarsCount-counted_bars;i++)
      {
       TimeMain=Time[i];
       ExtMapBuffer1[i]=iTime(Currency1,Period(),iBarShift(Currency1,Period(),TimeMain));
       ExtMapBuffer2[i]=iTime(Currency2,Period(),iBarShift(Currency2,Period(),TimeMain));
       ExtMapBuffer3[i]=(ExtMapBuffer1[i]-ExtMapBuffer2[i]);
       tt1=Time[i]-ExtMapBuffer1[i];
       tt2=Time[i]-ExtMapBuffer2[i];
       if (ExtMapBuffer3[i]!=0 || tt1!=0 || tt2!=0) 
         {
         if (FileWrite (handle,
         i,TimeToStr(Time[i]),"",iBarShift(Currency1,Period(),ExtMapBuffer1[i]),TimeToStr(ExtMapBuffer1[i]),"",iBarShift(Currency2,Period(),ExtMapBuffer2[i]),TimeToStr(ExtMapBuffer2[i])
          )<=0) Print("нифига не пишет!!");
         }
        FileFlush(handle);
        if ((iTime(Symbol(),Period(),i)!=iTime(Currency1,Period(),i) ||
           Time[i]!=iTime(Currency1,Period(),i) ||
           iTime(Currency1,Period(),i)!=iTime(Currency2,Period(),i)
           ) && i>0)
        {
         if (FileWrite (handle2,i,
         TimeToStr(Time[i])," ",TimeToStr(iTime(Currency1,Period(),i))," ",TimeToStr(iTime(Currency2,Period(),i))
       )<=0) Print("нифига не пишет!!");

        }
      }//----
   return(0);
  }
//+------------------------------------------------------------------+
 
MIG 체크인을 위해 새 계정을 개설했습니다. 표시기를 시작한 다음 차트에서 제거하고 생성된 차트를 보았습니다. 단일 오류가 아닙니다(파일이 비어 있음). 이제 GBPJPY H4, EURUSD H4 , GBPUSD H4에 대한 MIG 견적 아카이브를 확인하겠습니다(실험의 순도를 위해 이전 수표의 통화를 사용했습니다).
 
이상한 점을 찾았습니다. GBPJPY에 대한 기록이 비어 있는 것으로 나타났습니다(EURUSD H4 및 GBPUSD H4의 경우 기록이 제자리에 있는 것으로 판명됨). 아마도 이것이 TestFile.csv 및 TestFile.csv2 파일에 레코드가 없는 것을 설명합니다. 동시에 GBPJPY H4 차트 자체는 정상적으로 반영됩니다. 의심
1) 시계열이 캐시되었습니다(그래서 차트가 표시됨)
2) 데이터 센터의 노출된 주소가 영향을 미칩니다(이전에는 데이터 센터를 통해 Alpari의 데모 계정에 터미널이 매달렸습니다)

이를 위해 데이터 센터 주소를 제거하고 Alpari 데모 계정으로 전환했는데 전환이 성공하고 데이터 센터가 꺼졌습니다. MIG 데모 계정으로 다시 전환했습니다. 서버 연결은 성공했지만 MarketWatch 데이터는 변경되지 않았습니다. 나는 GBPJPY H4(차트에 있음)의 업데이트를 강요했고, 역사가 펌핑되었습니다.
그러나 마지막 견적 시간은 여전히 모든 쌍에 대해 10-43입니다. 빌드 199.



이제 Redraw2 표시기를 실행하려고 합니다.


MarketWatch를 보니 모든 곳이 같은 시간 10:43
 
흠.. 데이터 센터를 통한 연결이 남아 있는 것으로 나타났습니다. 이제 모든 것이 정상이고 MarketWatch가 올바른 데이터를 표시합니다. 이제 더 깊은 이야기를 얻으려고 합니다.
 
업데이트됨, 때로는 인용문이 매우 흥미롭습니다.

 
이 그래프가 MIG에서 가져온 것이라면 이러한 농담이 있습니다. 올해 한두번 봤습니다. 나는 2004년 9월 8일에 MIG의 EURUSD 기록에 대한 도직을 가지고 있으며 ~ 1.7493입니다.
 
네, MIG입니다 :)
 
만일을 대비하여 (시계열 캐싱을 피하기 위해) 표시기를 시작하기 전에 터미널을 다시 시작했습니다. 인덱스 번호 1000 이후에 오류가 다시 나타났습니다.



이제 모든 점에 점을 찍는 세 번째 옵션을 수행합니다.
 
다음은 세 번째 버전입니다.
//+------------------------------------------------------------------+
//|                                           RedrawIndicators-2.mq4 |
//|                                                           Satori |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "Satori"
#property link      "http://www.metaquotes.ru/forum/7790/"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Yellow
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
extern int       BarsCount=20;   //кол-во считаемых баров, если 0 - то все
extern string    Currency1="EURUSD";
extern string    Currency2="GBPUSD";

int handle,handle2;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexLabel(0,Currency1);

   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexLabel(1,Currency2);

   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

   handle= FileOpen("TestFile3.csv",FILE_CSV|FILE_WRITE,';');
   handle2= FileOpen("TestFile3-2.csv",FILE_CSV|FILE_WRITE,';');
  if(handle<1 || handle2<1 )
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
   else
   {
   FileWrite (handle,"index",Symbol(),"iBarShift1","index1","Time[index1-1]",Currency1,"Time[index1+1]","iBarShift2","index2","Time[index2-1]",Currency2,"Time[index2+1]");
   FileWrite (handle2,"index",Symbol(),"  ",Currency1,"  ",Currency2);
   }

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   FileClose(handle);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int i;
   double test1,test2;
   double Bar1,Bar2;
   int iBarShift1,iBarShift2;
   datetime tt1,tt2,TimeMain;
   BarsCount=MathMin(Bars,(MathMin(iBars(Currency1,Period()),iBars(Currency2,Period()))));
   for (i=0;i<BarsCount-counted_bars;i++)
      {
       TimeMain=Time[i];
       iBarShift1=iBarShift(Currency1,Period(),TimeMain);
       iBarShift2=iBarShift(Currency2,Period(),TimeMain);
       ExtMapBuffer1[i]=iTime(Currency1,Period(),iBarShift1);
       ExtMapBuffer2[i]=iTime(Currency2,Period(),iBarShift2);
       ExtMapBuffer3[i]=(ExtMapBuffer1[i]-ExtMapBuffer2[i]);
       tt1=Time[i]-ExtMapBuffer1[i];
       tt2=Time[i]-ExtMapBuffer2[i];
       
       if (ExtMapBuffer3[i]!=0 || tt1!=0 || tt2!=0) 
         {
         Bar1=iBarShift(Currency1,Period(),ExtMapBuffer1[i]);
         Bar2=iBarShift(Currency2,Period(),ExtMapBuffer2[i]);
         if (FileWrite (handle,
         i,TimeToStr(Time[i]),iBarShift1,Bar1,TimeToStr(iTime(Currency1,Period(),Bar1-1)),TimeToStr(ExtMapBuffer1[i]),TimeToStr(iTime(Currency1,Period(),Bar1+1)),iBarShift1,Bar2,TimeToStr(iTime(Currency2,Period(),Bar2-1)),TimeToStr(ExtMapBuffer2[i]),TimeToStr(iTime(Currency2,Period(),Bar2+1))
          )<=0) Print("нифига не пишет!!");
         }
        FileFlush(handle);
        if ((iTime(Symbol(),Period(),i)!=iTime(Currency1,Period(),i) ||
           Time[i]!=iTime(Currency1,Period(),i) ||
           iTime(Currency1,Period(),i)!=iTime(Currency2,Period(),i)
           ) && i>0)
        {
         if (FileWrite (handle2,i,
         TimeToStr(Time[i])," ",TimeToStr(iTime(Currency1,Period(),i))," ",TimeToStr(iTime(Currency2,Period(),i))
       )<=0) Print("нифига не пишет!!");

        }
      }//----
   return(0);
  }
//+------------------------------------------------------------------+
 
세 번째 버전은 최종 답변을 제공하지 않았습니다. 추가 초 동안 각 기호에 대해 4시간 프레임의 Time[]을 확인해야 합니다. 초가 발견되지 않으면 터미널 오류입니다.