초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 412

 
Imminence :

안녕하세요 초보자 문제가 있습니다 ...

예를 들어, 시스템이 마지막 막대의 종가를 특정 기간 동안의 고점 및 저점과 비교하도록 강제할 수는 없습니다.

마지막 20바. 내가 무엇을 잘못하고 있지?


Alert를 통해 확인해보니 이해가 안가는 이유로 테스터는 맨 마지막 틱부터 계산해서 최대값을 주는데 이 값을 줍니다

진드기가있는만큼 주문이 열리지 않습니다.


그리고 두 번째 문제는 EA가 다음 바가 열릴 때까지 기다리게 하는 방법입니다(30m 주기)? 제어점으로 테스트하면 모든 것이 정상이지만 틱으로 테스트하면

그런 다음 어드바이저는 예를 들어 손절매로 마감된 동일한 바에서 즉시 열립니다...


틱 여부에 관계없이 어떻게 거래를 마감할 수 있습니까? 예를 들어, 30m의 기간에 바가 끝나기 5초 전에 주문을 종료하고 싶습니다(29.55, 59.55)

그 순간의 모든 데이터를 기반으로 합니다. 이 단계에서 문제는 5초 이내에 틱이 발생하지 않으면 발생하지 않는다는 것입니다.

논리 연산 이 없으면 신호가 수신되지 않고 다음 신호까지 순간이 누락됩니다. 이론상으로는 쓰레기이지만 실제로 테스터에서 다음 신호는

어떤 이유로 몇 초 후에도 나타납니다.


미리 감사드립니다!

1. 코드에서 마지막 20개 막대에 대해 아무 것도 보지 못했습니다. 자세히 살펴보겠습니다.

2. 새 막대의 첫 번째 눈금을 결정하는 방법

3. 틱 여부와 상관없이 어떻게 거래를 성사시킬 수 있습니까?

OnTick 작업에서 벗어나 OnTimer 작업, 1초 간격으로 타이머를 설정하고 그 안의 시간을 확인해야 합니다. 타이머는 진드기의 도착에 의존하지 않습니다.

 /// Определяет начало нового бара
bool NewBar()
{
     static datetime lastbar = 0 ;
     datetime curbar = iTime( Symbol (), PERIOD_M30 , 0 );
     if (lastbar!=curbar)
    {
        lastbar=curbar;
         return ( true );
    }
     return ( false );
}
 
Leanid Aladzyeu :

O_o ATP는 다른 것이 무엇인지 몰랐고 터미널은 오류가 있는 곳을 찔렀습니다. 처음으로 치명적인 오류가 발생 했습니다.

그녀에게 침.

물론, 그것은 침을 뱉을 것입니다, 당신은 차원이 2인 배열의 세 번째 요소에 액세스하고 있습니다 - mas [ 2 ]++

 void Oher( int Mag, string Symb, int &mas[ 2 ])
..............
...........

case 1 :mas[ 1 ]++; mas [ 2 ]++; break ; // 1 продажа
 

Alexey Volchanskiy :
Так у тебя в комменте стоит управляющий символ "\n " - это символ перевода строки. Если его убрать, многострочия не будет.

이건 농담이야. 이제 줄 끝에 주석이 추가되고... 텍스트가 오른쪽으로 이스케이프됩니다. ;-)

 

좋은 저녁이에요. 텐칸과 킨쥰의 교차점에서 간단한 Expert Advisor 를 쓰려고 합니다. 코드는 다음과 같습니다.

무효 OnTick()

무효 OnTick()

{

TradeSignal_20();

}


int TradeSignal_20()

{

정수 = 0;


if(h_ich==INVALID_HANDLE)

{

h_ich=iIchimoku(Symbol(), 마침표(),IKHtenkansen,IKHkijunsen,IKHsenkouspanb);

리턴(0);

}

또 다른

{

if (CopyBuffer(h_ich,0,0,3,ich1_buffer)<2) return(0); // 텐칸센_라인

if (CopyBuffer(h_ich,1,0,3,ich2_buffer)<2) return(0); // 기준센_라인

if (!ArraySetAsSeries(ich1_buffer,true)) return(0);

if (!ArraySetAsSeries(ich2_buffer,true)) return(0);

}

//--- 조건을 확인하고 sig에 대한 값을 설정합니다.

if (ich1_buffer[1]>ich2_buffer[1]) sig=1;

그렇지 않으면 if(ich1_buffer[1]<ich2_buffer[1]) sig=-1;

그렇지 않으면 시그=0;

if (ich1_buffer[1]>ich2_buffer[1])

if (ich1_buffer[2]<ich2_buffer[2])

Alert(Symbol()+": 구매");

if (ich1_buffer[1]<ich2_buffer[1])

if (ich1_buffer[2]>ich2_buffer[2])

Alert(Symbol()+": 판매");

//--- 거래 신호 반환

반환(시그);

}

//+----------------------------------------------- --------------------+

경고가 지속적으로 호출되지 않고 한 번만 호출되도록 하는 방법은 무엇입니까?

 
Alexey Volchanskiy :

1. 코드에서 마지막 20개 막대에 대해 아무 것도 보지 못했습니다. 자세히 살펴보겠습니다.

2. 새 막대의 첫 번째 눈금을 결정하는 방법

3. 틱 여부와 상관없이 어떻게 거래를 성사시킬 수 있습니까?

OnTick 작업에서 벗어나 OnTimer 작업, 1초 간격으로 타이머를 설정하고 그 안의 시간을 확인해야 합니다. 타이머는 진드기의 도착에 의존하지 않습니다.

그렇다면 종가 를 지난 20개 막대의 최고가와 어떻게 비교할 수 있습니까? 그리고 마지막 가격이 20바의 최대값과 같거나 크면 열리라는 신호가 있습니다.
  

double HIGHEST              = High[iHighest( Symbol (), 0 ,MODE_HIGH, 20 , 0 )];


   
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[ 0 ] >= HIGHEST )

  {
   TICKET = OrderSend ( Symbol (),OP_BUY,LOT,Ask, 0 ,Ask-StopLoss* Point ,Ask+TakeProfit* Point , NULL ,MAGIC, 0 ,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
 
first_may :

좋은 저녁이에요. 텐칸과 킨쥰의 교차점에서 간단한 Expert Advisor 를 쓰려고 합니다. 코드는 다음과 같습니다.

무효 OnTick()

무효 OnTick()

{

TradeSignal_20();

경고가 지속적으로 호출되지 않고 한 번만 호출되도록 하는 방법은 무엇입니까?
종교는 SRC 버튼을 누르는 것을 허용하지 않습니까?
 
Imminence :
그렇다면 종가 를 지난 20개 막대의 최고가와 어떻게 비교할 수 있습니까? 그리고 마지막 가격이 20바의 최대값과 같거나 크면 열리라는 신호가 있습니다.
우리는 코드를 본다
 double HIGHEST              = High[iHighest( Symbol (), 0 ,MODE_HIGH, 20 , 0 )];

  if (Close[ 0 ] > SMMA && Close[ 0 ] > BB_UP && Close[ 0 ] >= HIGHEST)

  {
***********

문제는 0 막대, 즉 현재 막대에 액세스하는 것입니다. 새 막대의 시작을 결정하는 것이 필요합니다. 이전 답변에서 제공했으며 새 막대의 첫 번째 눈금에서만 모든 비교를 수행합니다. 그리고 인덱싱을 변경합니다. 마지막으로 닫힌 막대가 iHighest에 속하지 않아야 합니다. 이제 각 눈금에서 현재 나타나는 막대에 액세스하고 있으며 결과가 가장 이상할 것입니다.

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20, 2 )];

  if(Close[1] > SMMA && Close[1] > BB_UP && Close[1] >= HIGHEST)

  {
***********

 
Alexey Volchanskiy :
우리는 코드를 본다

문제는 0 막대, 즉 현재 막대에 액세스하는 것입니다. 새 막대의 시작을 결정하는 것이 필요합니다. 이전 답변에서 제공했으며 새 막대의 첫 번째 눈금에서만 모든 비교를 수행합니다. 그리고 인덱싱을 변경합니다. 마지막으로 닫힌 막대가 iHighest에 속하지 않아야 합니다. 이제 각 눈금에서 현재 나타나는 막대에 액세스하고 있으며 결과가 가장 이상할 것입니다.

감사합니다. 도움이 된 것 같습니다 :) 비록 똑같이 했고 작동하지 않았다고 맹세할 준비가 되었지만...

OnTimer()를 제안했지만 어떤 이유로 그는 나와 협력하고 싶어하지 않습니다. 모든 도움을 연구했지만 더 이해하기 쉬운 설명이나 예를 찾지 못한 나는 막다른 골목에 이르렀습니다.

즉, 참고서에 다 나와있지만 이 진부한 코드도 실행되지 않습니다... 이 프로그램을 인터넷 검색해보니 테스트에서 OnTimer()가 작동하지 않는다는 내용을 발견했습니다.

방법. 이 순간은 mql5의 출시와 함께 제거된 것처럼 보이지만. 알아낼 수 있도록 도와주세요 :) 감사합니다!

 int OnInit ()
  {
//---
   bool   Timer = EventSetTimer ( 1 );
   if (Timer != TRUE)
   Print ( GetLastError ()); 
//---
   return ( INIT_SUCCEEDED );
  }

void OnDeinit ( const int reason)
  {
   EventKillTimer ();   
  }
  
void OnTimer ()
{
Print ( "It works" );
}  
  
 

Imminence :

이 프로그램을 인터넷 검색해보니 OnTimer()가 테스트 모드에서 작동하지 않는다는 사실을 알게 되었습니다. 이 순간은 mql5의 출시로 제거된 것처럼 보이지만. 알아낼 수 있도록 도와주세요 :) 감사합니다!

맞습니다. 테스터의 MT4에서 타이머는 쟁기질하지 않으며 이것은 문서화되지 않았습니다! 나는 서비스 데스크에 편지를 썼고 그들은 결코 이것을하지 않을 것이라고 말했습니다. OnTick에서 OnTimer 호출을 통해 나왔습니다. 내 타이머는 1초로 설정되어 있습니다.

 // Возвращает true, если работает под тестером
bool IsRunOnTester()
{
     if ( MQLInfoInteger ( MQL_TESTER ) || MQLInfoInteger ( MQL_VISUAL_MODE ) || MQLInfoInteger ( MQL_OPTIMIZATION ))
         return true ;
     return false ;    
}

MqlDateTime      TimeCurrStruct;

void OnTick ()
{
     if (IsRunOnTester())
    {
         static datetime dt1 = 0 , dt2 = 0 ;
         static bool tfirst = true ;
         if (tfirst)
        {
            tfirst = false ;
            dt1 = dt2 = TimeCurrent ();
             return ;
        }
    
        dt2 = TimeCurrent ();
         for ( datetime TimeTesterCurrent = dt1+ 1 ; TimeTesterCurrent <= dt2; TimeTesterCurrent++)
        {
             TimeToStruct (TimeTesterCurrent, TimeCurrStruct);
             OnTimer ();
        }    
        dt1 = dt2;
    }
}

즉, 테스터의 틱이 초당 1회보다 더 자주 발생하면 여분의 틱은 건너뛰고 덜 자주 발생하면 1초의 배수가 있는 시리즈가 생성됩니다. 이 시간은 TimeCurrStruct 구조에 있으며 모든 모드에서 내 메인 클래스는 이 구조에서만 시간이 걸립니다. 제 생각에는 이것이 이 버그를 물리칠 수 있는 유일한 방법입니다. 다음은 기능입니다. 초과분을 제거하고 고기만))

 void OnTimer ()
{
     string msg;
     if (!IsRunOnTester())
    {
         TimeToStruct ( TimeCurrent (), TimeCurrStruct);
        SmartDsp.ReceiveTick(TimeCurrStruct);     // основной метод робота, в него передается структура со временем
    }
     else
    {
        SmartDsp.ReceiveTick(TimeCurrStruct);    
    }
}
 
Alexey Volchanskiy :
종교는 SRC 버튼을 누르는 것을 허용하지 않습니까?
그들이 의미하는 바가 명확하지 않습니까?
사유: