기고글 토론 "매매봇 프로토타입" - 페이지 2

 

이 디자인은 피하는 것이 좋습니다.

//------------------------------------------------------------------ CheckNewBar
bool CExpertAdvisor::CheckNewBar()          // 새 막대가 나타나는지 확인하는 기능
  {
   MqlRates rt[2];
   if(CopyRates(m_smb,m_tf,0,2,rt)!=2)      // 막대 복사
     { Print("CopyRates of ",m_smb," failed, no history"); return(false); }
   if(rt[1].tick_volume>1) return(false);   // 볼륨 확인 
   return(true);
  }

이전 틱을 처리하는 데 충분한 시간이 걸리므로 새 막대의 첫 번째 틱이 도착하는 것을 놓칠 수 있습니다.

각각 오프닝을 놓칠 수 있습니다.

바가 열리는 시간에 바인딩하는 것이 좋지만, 이를 위해서는 제로 바의 이전 시간을 저장하여 제로 바의 현재 시간과 비교해야 합니다.

동일하면 새 막대가 없습니다.

다르면 최소한 새 (다음) 막대가 열리고, 그 후 제로 막대의 저장된 시간을 제로 막대의 현재 시간으로 초기화합니다.

이 디자인이 더 안정적입니다.

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5
 

향후 글에서 이 문제를 다루겠습니다:

  • *(서버 측에서와 같이) 거래별로 다른 수준의 손절 및 이익실현 주문은 네트워크 및 클라이언트 프로그램 중단과 관련된 문제(장기간의 네트워크 연결 끊김, 네트워크 지연으로 인한 슬리피지(및 재호가), 클라이언트 프로그램 또는 운영체제 종료, 재시작, 충돌(클라이언트 측 소프트웨어의 장기간 부재) 등을 피하기 위해 *필수*입니다;) 소위 "가상" 주문은 도움이 되지 않으며 비-OCO 대체 주문도 도움이 되지 않습니다 (아니요, 견고성이 요구되는 경우 손절 및 이익실현 주문은 반드시 서버 측에서 이루어져야 하며 한 주문이 체결되면 다른 주문도 동시에 서버에서 제거되어야 합니다).
  • 크래시 발생 시 거래당 *강력한* 상태 복구; 즉, 클라이언트/OS가 크래시되면(그리고 자동으로 다시 시작되면) 그동안 미체결된 개별 거래 및 주문에 무슨 일이 있었는지 EA가 정확히 알기를 원합니다: 체결, 청산, 여전히 활성 상태, 어떤 관련 s/l 및 t/p 주문이 어떤 거래 / 주문에 속하는지 등 (아니요, 디스크에 상태 쓰기는 거래를 여는 것과 디스크에 상태 쓰기 사이에 경쟁 조건이 있고 클라이언트 프로그램이 정확히 부적절한 시간에 충돌 할 수 있기 때문에 *하지 * 않습니다; 서버 측 주문 주석이 수정 가능하면 * 할 수 있습니다 *).

제가 알기로 MT5는 *1*(하나의) 서버 측 s/l 및 t/p 주문만 *상품당*(거래 당이 아닌) 지원하며 OCO 주문은 지원하지 않습니다(OCO 주문은 거래 당 s/l 및 t/p 주문을 시뮬레이션하는 데 사용할 수 있지만 여기에도 경쟁 조건이 있습니다). 위의 문제가 해결되지 않는 한 MT5(단순한 단일 주문 단일 시간대 단일 방향 MA 교차 유형 EA)를 통한 거래에 $100 이상을 투입하지 않을 것입니다. 그리고 100달러에 대해서도 잘 모르겠습니다.

 
olyakish:

이 디자인은 피하는 것이 좋습니다.

이전 틱을 처리하는 데 충분한 시간이 걸리므로 새 막대의 첫 번째 틱이 도착하는 것을 놓칠 수 있습니다.

각각 오프닝을 놓칠 수 있습니다.

바가 열리는 시간에 바인딩하는 것이 좋지만, 이를 위해서는 제로 바의 이전 시간을 저장하여 제로 바의 현재 시간과 비교해야 합니다.

동일하면 새 막대가 없습니다.

다르면 최소한 새 (다음) 막대가 열리고, 그 후 제로 막대의 저장된 시간을 제로 막대의 현재 시간으로 초기화합니다.

이 디자인이 더 안정적입니다.

저는 이렇게 해봤습니다:

bool CUniexp::checkNewBar(void)
{
   static datetime prevTime[1];
   datetime currentTime[0];
   CopyTime(_Symbol,_Period,0,1,currentTime);
   if (currentTime[0]==prevTime[0])
   {return (false);}
   else
   {
      prevTime[0] = currentTime[0];
      return (true);
   }
}
 
isNewBar
isNewBar
  • 투표: 7
  • 2010.05.07
  • Prival
  • www.mql5.com
Функция анализа появления нового бара на заданном таймфрейме.
 

컴파일되지만 디버거가 실패합니다.

C:\프로그램 파일\메타트레이더 5\MQL5\전문가\예제\eMyEA.ex5 로드에 실패했습니다.

 
Rosh:

새 문서 무역 로봇의 프로토타입이 게시되었습니다:

작성자: Алексей Сергеев


훌륭한 글 감사합니다! 저는 초보자이지만 코드에 대해 질문이 있습니다.


void CExpertAdvisor::TrailingPosition(long dir,int TS) 함수에서 한 줄이 있습니다:

sl=NormalSL(dir,apr,apr,TS,StopLvl); // 스톱로스를 계산합니다.


NormalSL을 호출할 때 두 번째와 세 번째 인수에 모두 apr을 사용해야 하나요? 그래야 한다고 생각했습니다:

sl=NormalSL(dir,op,apr,TS,StopLvl);

두 번째 인수는 "역방향"(즉, 변수 apr)이 아닌 "지정된" 방향(즉, 변수 op)에 대한 매수/매도 가격이어야 하기 때문입니다.


고마워요!

 
echostate:


void CExpertAdvisor::TrailingPosition(long dir,int TS) 함수에는 한 줄이 있습니다:

sl=NormalSL(dir,apr,apr,TS,StopLvl); // 스톱로스를 계산합니다.


NormalSL을 호출할 때 두 번째와 세 번째 인수에 모두 apr을 사용해야 하나요? 그래야 한다고 생각했습니다:

sl=NormalSL(dir,op,apr,TS,StopLvl);

아니요.
두 번째와 세 번째 인수는 apr이어야 합니다.

왜냐하면 트랄의 계산은 포지션이 청산될 가격에서 파생되기 때문입니다. 매수 매수 및 매도 매도 요청 함수가 맞습니다.

두 번째 인수는 "반대" 방향(즉, 변수 apr)이 아닌 "지정된" 방향(즉, 변수 op)에 대한 매수/매도 호가여야 하기 때문입니다.

는 "반대" 방향에서 계산해야 합니다. 이 경우, apr.
 
sergeev:


두 번째와 세 번째 인수는 apr이어야 합니다.

트랄의 계산은 포지션이 청산될 가격에서 파생되기 때문입니다. 매수 입찰 및 매도 요청 함수가 맞습니다.

는 "반대" 방향에서 계산해야 합니다. 이 경우, apr.


빠른 답변 감사합니다! 제가 틀린 것 같아서요.


함수에서 물어볼 수도 있나요?

double CExpertAdvisor::CountLotByRisk(int dist,double risk,double lot) // 위험 규모별로 로트 계산
  {
   if(dist==0 || risk==0) return(lot);
   m_smbinf.Refresh();
   return(NormalLot(AccountInfoDouble(ACCOUNT_BALANCE)*risk/(dist*10*m_smbinf.TickValue())));
  }

반환 값의 "dist"와 "m_smbinf.TickValue()" 사이에 "10"이 있는 이유는 무엇인가요? "dist"는 스톱로스(핍 기준)이고 "m_smbinf.TickValue()"는 해당 통화쌍의 랏당 핍당 미국 달러 가치인 것으로 알고 있습니다. 그래서 그 사이에 또 다른 "10"을 곱하는 이유를 잘 모르겠습니다.

감사합니다!

 
정말 감사합니다.
 

매우 유용한 기사입니다. 감사합니다!