다른 통화 쌍에서 입찰/매도를 가져오는 방법은 무엇입니까? - 페이지 5

 
HosseinKOGO :

이것은 GBPAUD H4 3.12.2018 하루 종일입니다! 그리고 이번에는 끝내기 위해 건너뛰지 않았습니다.

인쇄할 내용이 너무 많으면 인쇄 기능 이 일부 보고서를 잃을 수 있습니까?
또 다른 문제는 이 3가지 악기의 틱이 서로 다른 밀리초 단위로 나오기 때문에 GBPAUD에서 start/OnTick 기능을 사용할 때 GBPAUD 틱이 나올 때마다 시작 기능만 수행하기 때문일 수 있습니다. 그리고 귀하의 코드가 0이 아닌 경우 해당 3쌍의 가격을 모두 반환하도록 지시할 수 있다고 생각합니다. 그렇다면 모든 상품의 모든 매수/매도 가격이 정확히 같은 시간에 나올 때마다 반환됩니다.

데이터는 괜찮아 보이는데...

당신은 인쇄 기능에 대해 옳았습니다 ... 내 테스트에서도 많은 누락 된 줄이 보입니다. 그러나 모든 것을 파일로 인쇄할 때 누락된 것은 없습니다.

다음은 코드에 대한 몇 가지 정보입니다. 각 GBPAUD 틱의 시간은 다른 쌍의 가장 최근 틱(동일한 시간까지)을 가져오는 데 사용되므로 항상 무언가를 반환하고 0이 아닙니다.

나는 더 깔끔해야 하는 클래스에 함수를 넣기로 결정했다. 참조 부착. EA와 함께 전문가 폴더에 넣으십시오. 자유롭게 수정하십시오.

다음 샘플은 이를 사용하는 한 가지 방법을 보여줍니다(강조 표시된 라인은 필수).

 #include "TicksInfo.mqh"
CTicksInfo ticksInfo;

string otherPairs[] = { "GBPUSD" , "EURUSD" };
string allPairs[] = {};

int tickCount = 0 ;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   ticksInfo.init(otherPairs);
   int numSym = ArraySize (otherPairs)+ 1 ;
   ArrayResize (allPairs,numSym);
   allPairs[ 0 ] = _Symbol ;
   for ( int i= 1 ; i<numSym; i++)
      allPairs[i] = otherPairs[i- 1 ];
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ticksInfo.deInit();
   Print ( "Total Ticks = " , tickCount);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   tickCount++;
   Print ( "=== Now process tick " , tickCount);
   MqlTick myTick;
   
   for ( int i= 0 ; i< ArraySize (allPairs); i++)
   {
       if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
       else
         Print (allPairs[i], " Error" );
   }
  }
//+------------------------------------------------------------------+

void printTicktoFile( string sym, MqlTick &tick)
{
   int file = FileOpen ( "LogFile.log" , FILE_WRITE | FILE_READ | FILE_TXT );
   FileSeek (file, 0 , SEEK_END );
   FileWrite (file, sym, " tick number " , tickCount, ", at " , 
          tick.time, " " ,
           IntegerToString (tick.time_msc-(tick.time* 1000 ), 3 , '0' ),
           " Ask = " , tick.ask, " Bid = " , tick.bid);
   FileClose (file);
}

void printTick( string sym, MqlTick &tick)
{
   Print (sym, " tick number " , tickCount, ", at " , 
          tick.time, " " ,
           IntegerToString (tick.time_msc-(tick.time* 1000 ), 3 , '0' ),
           " Ask = " , tick.ask, " Bid = " , tick.bid);
}

따라서 핵심은 바로 다음 줄입니다. ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>) . false를 반환하면 저널에서 오류 메시지를 확인해야 합니다.

파일:
TicksInfo.mqh  5 kb
 
Seng Joo Thio :

데이터는 괜찮아 보이는데...

당신은 인쇄 기능에 대해 옳았습니다 ... 내 테스트에서도 많은 누락 된 줄이 보입니다. 그러나 모든 것을 파일로 인쇄할 때 누락된 것은 없습니다.

다음은 코드에 대한 몇 가지 정보입니다. 각 GBPAUD 틱의 시간은 다른 쌍의 가장 최근 틱(동일한 시간까지)을 가져오는 데 사용되므로 항상 무언가를 반환하고 0이 아닙니다.

나는 더 깔끔해야 하는 클래스에 함수를 넣기로 결정했다. 참조 부착. EA와 함께 전문가 폴더에 넣으십시오. 자유롭게 수정하십시오.

다음 샘플은 이를 사용하는 한 가지 방법을 보여줍니다(강조 표시된 라인은 필수).

따라서 핵심은 바로 다음 줄입니다. ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>) . false를 반환하면 저널에서 오류 메시지를 확인해야 합니다.

도움을 주셔서 감사합니다.

이 모든 줄을 모든 적절한 영역에 복사했습니다. 그러나 코드를 이해하지 못하기 때문에 SecondPair의 Ask와 Bid를 Ask2,Bid2에 넣고 ThirdPair에도 같은 것을 넣는 방법을 알려주십시오.
제 글로벌 영역은 다음과 같습니다.

 #include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {SecondPair,ThirdPair};
string allPairs[] = {};

int tickCount = 0 ;
.
.
.

그리고 이 부분은 컴파일하는 동안 2개의 오류를 반환합니다. 어떻게 해야 하나요?:
'SecondPair' - 상수 표현식 필수 MyEA!.mq4
'ThirdPair' - 상수 표현식 필수 MyEA!.mq4

 
HosseinKOGO :

도움을 주셔서 감사합니다.

이 모든 줄을 적절한 모든 영역에 복사했습니다. 그러나 코드를 이해하지 못하기 때문에 SecondPair의 Ask와 Bid를 Ask2,Bid2에 넣고 ThirdPair에도 같은 것을 넣는 방법을 알려주십시오.
제 글로벌 영역은 다음과 같습니다.

그리고 이 부분은 컴파일하는 동안 2개의 오류를 반환합니다. 어떻게 해야 하나요?:
'SecondPair' - 상수 표현식 필수 MyEA!.mq4
'ThirdPair' - 상수 표현식 필수 MyEA!.mq4

그런 다음 allPairs와 동일한 방식으로 otherPairs를 선언합니다. 그리고 OnInit에서 다음을 수행하십시오.

 ArrayResize (otherPairs, 2 );
otherPairs[ 0 ] = SecondPair;
otherPairs[ 1 ] = ThirdPair;

그리고 Ask2, Bid2, Ask3, Bid3에 값을 할당하려면 OnTick에서 다음을 수행하십시오.

   MqlTick myTick;
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
       Print (SecondPair, " Error" );

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
       Print (ThirdPair, " Error" );
 
Seng Joo Thio :

그런 다음 allPairs와 동일한 방식으로 otherPairs를 선언합니다. 그리고 OnInit에서 다음을 수행하십시오.

그리고 Ask2, Bid2, Ask3, Bid3에 값을 할당하려면 OnTick에서 다음을 수행하십시오.

그것은 나에게 다시 00을 준다 :(
나의 글로벌 영역:

 #include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {};
string allPairs[] = {};

int tickCount = 0 ;
.
.
.

초기화:

   ticksInfo.init(otherPairs);
   int numSym = ArraySize (otherPairs)+ 1 ;
   ArrayResize (allPairs,numSym);
   allPairs[ 0 ] = _Symbol ;
   for ( int i= 1 ; i<numSym; i++)
   allPairs[i] = otherPairs[i- 1 ];
   
   ArrayResize (otherPairs, 2 );
   otherPairs[ 0 ] = SecondPair;
   otherPairs[ 1 ] = ThirdPair;
.
.
.

온디니트:

   ticksInfo.deInit();
   Print ( "Total Ticks = " , tickCount);

온틱:

   tickCount++;
   Print ( "=== Now process tick " , tickCount);
   MqlTick myTick;
   
   for ( int i= 0 ; i< ArraySize (allPairs); i++)
   {
       if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
       else
         Print (allPairs[i], " Error" );
   }
   
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
       Print (SecondPair, " Error" );

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
       Print (ThirdPair, " Error" );

신문:
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: GBPCAD 오류
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: GBPUSD 오류
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: GBPAUD 틱 번호 221179, 2018.01.03 23:36:58 000 매도호가 = 1.72479 입찰가 = 1.72459
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: === 이제 틱 221179를 처리합니다.



내가 어디를 잘못 알고 있니?
제로레벨 스킬이라 죄송합니다 :D

 
HosseinKOGO :

그것은 나에게 다시 00을 준다 :(
내 글로벌 영역:

초기화:

온디니트:

온틱:

내가 어디를 잘못 알고 있니?
제로레벨 스킬이라 죄송합니다 :D

OnInit - 3개의 새 줄이 모든 것보다 먼저 표시되어야 합니다.
 
HosseinKOGO :

제로레벨 스킬이라 죄송합니다 :D

변수와 함수 , 그리고 실험하려는 의지에 관한 것입니다.
 
Seng Joo Thio :
OnInit - 3개의 새 줄이 모든 것보다 먼저 표시되어야 합니다.

내가 해냈어. 그러나 매우 이상합니다. 두 개의 추가 쌍에 대한 타이머가 작동하지 않습니다...

 2019.05 . 14 17 : 41 : 55.469      2018.01 . 05 11 : 11 : 24    MyEA! GBPAUD,H4: GBPCAD tick number 370711 , at 1970.01 . 01 00 : 00 : 00 000 Ask = 0.0 Bid = 0.0
2019.05 . 14 17 : 41 : 55.469      2018.01 . 05 11 : 11 : 24    MyEA! GBPAUD,H4: GBPUSD tick number 370711 , at 1970.01 . 01 00 : 00 : 00 000 Ask = 0.0 Bid = 0.0
2019.05 . 14 17 : 41 : 55.469      2018.01 . 05 11 : 11 : 24    MyEA! GBPAUD,H4: GBPAUD tick number 370711 , at 2018.01 . 05 11 : 11 : 24 000 Ask = 1.72644 Bid = 1.72624
2019.05 . 14 17 : 41 : 55.469      2018.01 . 05 11 : 11 : 24    MyEA! GBPAUD,H4: === Now process tick 370711
 
HosseinKOGO :

내가 해냈어. 그러나 매우 이상합니다. 두 개의 추가 쌍에 대한 타이머가 작동하지 않습니다...

실험을 마친 후에도 여전히 이유를 알 수 없는 경우 전체를 보여주세요. 지금부터 약 8시간 정도 볼 수 있어요 :). 이제 😴 해야지... 😂
 
  1. Seng Joo Thio : OnInit - 3개의 새로운 라인이 모든 것보다 먼저 와야 합니다.
    아직 연결/차트가 없을 수 있으므로 OnInit (또는 로드 시)에서 가격 또는 서버 관련 기능을 사용하지 마십시오.
    1. 터미널이 시작됩니다.
    2. 지표/EA가 로드됩니다. 정적 및 전역적으로 선언된 변수가 초기화됩니다. (특정 순서에 의존하지 마십시오.)
    3. OnInit 가 호출됩니다.
    4. 지표의 경우 OnCalculate 는 기존 기록과 함께 호출됩니다.
    5. 사람이 암호를 입력해야 할 수 있습니다. 서버 연결이 시작됩니다.
    6. 새 기록이 수신되고 OnCalculate 가 다시 호출됩니다.
    7. 새 틱이 수신되면 OnCalculate / OnTick 이 호출됩니다. 이제 TickValue , TimeCurrent , 계정 정보 및 가격이 유효합니다.

  2. MT4에서: 현재 차트가 참조된 특정 쌍/TF가 아닌 한 가격에 액세스 하기 전에 4066/4073 오류를 처리 해야 합니다 .
    MQL4 EA의 다운로드 기록 - MQL4 및 MetaTrader 4 - MQL4 프로그래밍 포럼
    수정됨

    연결된 기능은 해당 심볼/TF에 대한 숨겨진 차트를 열어(아직 열려 있지 않은 경우) 히스토리를 업데이트하고 일시적으로 시장 감시에 심볼을 배치합니다(아직 열려 있지 않은 경우). 따라서 SymbolInfoDouble ( symbol , SYMBOL_BID ) 또는 MarketInfo ( symbol , MODE_BID ) 는 첫 번째 호출에서도 0을 반환하지 않습니다.

 
William Roeder :
  1. 아직 연결/차트가 없을 수 있으므로 OnInit (또는 로드 시)에서 가격 또는 서버 관련 기능을 사용하지 마십시오.
    1. 터미널이 시작됩니다.
    2. 지표/EA가 로드됩니다. 정적 및 전역적으로 선언된 변수가 초기화됩니다. (특정 순서에 의존하지 마십시오.)
    3. OnInit 가 호출됩니다.
    4. 지표의 경우 OnCalculate 는 기존 기록과 함께 호출됩니다.
    5. 사람이 암호를 입력해야 할 수 있습니다. 서버 연결이 시작됩니다.
    6. 새 기록이 수신되고 OnCalculate 가 다시 호출됩니다.
    7. 새 틱이 수신되면 OnCalculate / OnTick 이 호출됩니다. 이제 TickValue , TimeCurrent , 계정 정보 및 가격이 유효합니다.

  2. MT4에서: 현재 차트가 참조된 특정 쌍/TF가 아닌 한 가격에 액세스 하기 전에 4066/4073 오류를 처리 해야 합니다 .
    MQL4 EA의 다운로드 기록 - MQL4 및 MetaTrader 4 - MQL4 프로그래밍 포럼
    수정됨

    연결된 기능은 해당 심볼/TF에 대한 숨겨진 차트를 열어(아직 열려 있지 않은 경우) 히스토리를 업데이트하고 일시적으로 시장 감시에 심볼을 배치합니다(아직 열려 있지 않은 경우). 따라서 SymbolInfoDouble ( symbol , SYMBOL_BID ) 또는 MarketInfo ( symbol , MODE_BID ) 는 첫 번째 호출에서도 0을 반환하지 않습니다.

네가 옳아. 여기에서 OnInit에서 하는 유일한 작업은 기호 이름을 저장하기 위한 배열을 초기화하고 자체 데이터 파일을 읽기 위한 일부 파일 핸들을 준비하는 것이기 때문에 걱정할 필요가 없습니다. 입찰가 및 매도호가(예: '틱' 데이터)와 관련하여 MT4 전략 테스터가 다른 기호( 이 동작은 사람들에게 더 친숙한 OHLC 데이터 검색과 다릅니다.

사유: