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

 
Vitaly Gorbunov :

필요한 주문의 수를 어딘가에서 결정했다는 사실은 좋지만 이 블록에서 모든 주문을 다시 실행하고 확인합니다!

즉시 볼 수 있는 일반적인 방식으로 코드를 깨십시오!

당신은 확실히 다시 셀 수 있습니다. 그러나 이것이 본질을 바꾸지는 않습니다. if() 문은 "else"를 수행하지 않습니다. 이것은 하나의 경우일 뿐이지만 더 많은 경우가 있습니다.
 
for ( int h = OrdersTotal ()- 1 ; h >= 0 ; h--)
    {
     if ( OrderSelect (h, SELECT_BY_POS ))
      {
       if ((cnt_OO >= 2 ))
        {
       if (( OrderMagicNumber () == Magic)&&( OrderLots () <= Lots/Prikup - Dplus))
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice ();
         LotsNext  = NormalizeDouble ( OrderLots ()*K,lotDigit);
         if (NewPB > 0 )
          PBcloseON = true ;
         Alert ( "Pospedny Order NEXT  " , OrderTicket ());
         Alert ( "Otkritih orderov  " ,cnt_OO);
//         break;
        }
       break ;
       }
         LotsNext    = NormalizeDouble (Lots*Prikup,lotDigit); 
         Alert ( "Otkritih orderov NEXT net " );
         Alert ( "Otkritih orderov  " ,cnt_OO);
         break ;
     
        }}

이렇게 해보세요!

여기에서 그렇지 않으면 (다른 경우) 귀하의 코드에서 볼 수 없습니다!

다른 경우를 던지고 무엇이 잘못되었는지 봅시다. :)

논리를 주의 깊게 연구한 후 코드를 다시 작업했습니다.

이렇게 생겼습니다

 if (cnt_OO> 0 ) //Если нет ордеров то и не надо ни чего делать
{
   for ( int h = OrdersTotal ()- 1 ; h >= 0 ; h--)
   {
     if ( OrderSelect (h, SELECT_BY_POS ))
     {
       if (cnt_OO== 1 )
         {
           //Если ордер один проверяем тот ли ордер (майджик и прочее) и что то там делаем
         }
       else
         {
           //Если ордеров больше чем 1 проверяем те ли ордера (майджик и прочее) и что то там делаем
         }
     }
   }
   
}
 

그렇게 될 수 있습니다. 그러나 교과서에는 조건이 충족되지 않으면 if() 연산자의 조건을 처리하기 위해 블록을 닫는 중괄호 뒤에 명령이 처리된다고 나와 있습니다. 이것은 일어나지 않습니다.

또한 결함이 있었습니다.

     if (( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ))&&( OrderMagicNumber () == Magic)&&(OrderLotsOld==zLots))
      {
       

첫 번째 if 문에 조건을 하나 더 추가하면 - 다음 단계는 작동하지 않습니다.

나는 두 가지 추측이있다

1. 어리석은 전략 테스터. 이러한 상황은 프로그램을 디버깅하는 단계에서 발생하기 때문에 실제 계정에서 이를 확인하려면 완전히 편심해야 합니다. 예, 데모에서도 다시 시작 상황을 재현하기 어렵습니다. 테스터가 멍청하다는 사실과 MT4 창에서 여러 주문을 마감하는 순서는 마감이 동시에 발생하면 실제 주문과 일치하지 않는 경우가 많습니다. 이것은 프로그램의 마지막 주문을 다시 계산하면 명확하게 알 수 있습니다. 이 어리석음 때문에 나는 그 괴짜가 누구인지 알아내는데 일주일이 걸렸다.

틱 기록에서도 테스터의 작업 논리는 실제와 거리가 멉니다. 내 알고리즘의 경우 이것은 매우 중요합니다.

2. 추측으로. MQL/MT4 뿐만 아니라 시스템 전문가를 위한 특히 고급 전문가를 위한 질문입니다.

- 다른 창의 동일한 쌍에 두 개의 동일한 Expert Advisor가 있습니다. 예를 들어, 주말 동안 컴퓨터를 끈 후 월요일에 Expert Advisors를 시작할 때 둘 다 첫 번째 틱에서 동시에 작업을 시작합니다. 나는 첫 번째 것이 상태를 복원하는 데 작동하고 두 번째가 작동하기를 바랐습니다. 운이 좋은 사람이 먼저 일을 합니다.

실제로 데이터 복구에 대한 메시지는 혼합되어 있습니다. 즉, 시스템 타이머와 같은 어떤 조건에 의해 프로그램의 실행 이 중단된 다음 계속됩니다. 예를 들어 상황이 어떻게 돌아가는지 확인하기 위해 다른 계정으로 전환할 때 흥미로운 상황이 발생합니다. 계정 확인 조건은 프로그램 초반이고, 원래 계정으로 돌아갈 때 프로그램이 중간에 있고 지금 어떤 계정인지는 상관없습니다.

나는 탈출구를 찾았습니다. 각 블록이 시작될 때 계좌 번호를 확인했습니다. 모든 곳에 있는지 잘 모르겠습니다.

 

Amon1953 내가 수정한 첫 번째 변종을 보았습니까? 그는 일한다? if() 매뉴얼에 쓰여진 그대로이고 오랜 세월 동안 작동합니다. 문제는 코드에 있습니다. 잘못된 블록에 break를 넣었습니다.

(( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ))&&( OrderMagicNumber () == Magic)&&( OrderLotsOld ==zLots)) 줄이 코드에서 찢어지면 변수에 할당된 항목을 확인해야 합니다.

두 번째 요점에서 - 두 올빼미 모두 병렬로 실행되므로 그들로부터의 메시지가 뒤섞일 것입니다. 설명한 대로 수행하려면 올빼미 사본 간에 세마포링을 구성해야 합니다. 그러나 계정을 변경하면 이해할 수 없는 일이 발생한다는 사실이 매우 흥미롭습니다. OnInit과 OnDeinit를 보고 싶습니다. 문제가 있을 가능성이 큽니다.

 
Vitaly Gorbunov :

Amon1953 내가 수정한 첫 번째 변종을 보았습니까? 그는 일한다? if() 매뉴얼에 쓰여진 그대로이고 오랜 세월 동안 작동합니다. 문제는 코드에 있습니다. 잘못된 블록에 break를 넣었습니다.

(( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ))&&( OrderMagicNumber () == Magic)&&( OrderLotsOld ==zLots)) 줄이 코드에서 찢어지면 변수에 할당된 항목을 확인해야 합니다.

두 번째 요점에서 - 두 올빼미 모두 병렬로 실행되므로 그들로부터의 메시지가 뒤섞일 것입니다. 설명한 대로 수행하려면 올빼미 사본 간에 세마포링을 구성해야 합니다. 그러나 계정을 변경하면 이해할 수 없는 일이 발생한다는 사실이 매우 흥미롭습니다. OnInit과 OnDeinit를 보고 싶습니다. 문제가 있을 가능성이 큽니다.

가장 최근의 순서로 루프를 종료해야 하기 때문에 확인하지 않았습니다(목록의 첫 번째 항목이 있음).

저는 숙련된 프로그래머가 아니며 OnInit와 OnDeinit이 어떻게 작동하는지 잘 이해하지 못합니다. 그래서 저는 사용하지 않지만, 프로그램이 중간에 중단 없이 작동하도록 하는 것 같습니다.

세마포어에 관해서도 불명확하고 어드바이저가 다른 창에 설치되어 있고 다른 마법을 가지고 있습니다.

 
최근에 프로그래밍을 시작했다면 프로그래밍의 기본 기본 사항을 다시 한 번 배우십시오. 실례는 아니지만 당신과 의사 소통하는 것은 매우 어렵습니다.
 
Vitaly Gorbunov :
최근에 프로그래밍을 시작했다면 프로그래밍의 기본 기본 사항을 다시 한 번 배우십시오. 실례는 아니지만 당신과 의사 소통하는 것은 매우 어렵습니다.
고맙습니다. 초보자를 위한 섹션입니다. 이 의사 소통조차도 나에게 유익했습니다. 어드바이저 알고리즘을 만들고 프로그램 코드를 작성하는 것은 어렵습니다(특히 프로그래밍 언어가 저에게 완전히 새롭기 때문에)
 
Amon1953 :
고맙습니다. 초보자를 위한 섹션입니다. 이 의사 소통조차도 나에게 유익했습니다. 어드바이저 알고리즘을 만들고 프로그램 코드를 작성하는 것은 어렵습니다(특히 프로그래밍 언어가 저에게 완전히 새롭기 때문에)
베이스를 강화해야 할 것 같습니다! 코드에서 구현하려는 논리를 잘 이해하지 못하기 때문에 원하는 작업을 말로 설명하십시오. 그리고 나는 당신이 틀린 부분을 설명하려고 노력할 것입니다.
 
Vitaly Gorbunov :
베이스를 강화해야 할 것 같습니다! 코드에서 구현하려는 논리를 잘 이해하지 못하기 때문에 원하는 작업을 말로 설명하십시오. 나는 당신이 틀린 부분을 설명하려고 노력할 것입니다.

나는 이미 내가 필요한 것을 설명했습니다. 나는 세부 사항을 명확히하려고 노력할 것입니다.

어드바이저를 다시 시작할 때 알고리즘이 일련의 주문을 나타내므로 이전 상태를 복원해야 합니다. 첫 번째 주문은 기본 주문이며 체인의 다음 주문 매개 변수는 여기에서 계산됩니다. 예를 들어 두 번째 볼륨은 밑면의 50%이고 세 번째 볼륨은 75%입니다. EA를 다시 시작할 때 다음 주문의 볼륨은 마지막 주문에서 계산되기 때문에 기본 주문의 볼륨과 마지막 주문의 볼륨을 알아야 합니다. 예: 3개의 미결제 주문이 있고 다음(네 번째) 주문을 계산하려면 마지막 미결제 주문의 양을 결정해야 합니다.

주문이 하나만 있으면 기본이며 이 경우에는 관심이 없습니다. 다른 블록에서 처리됩니다.

알고리즘은 간단합니다. 그러나 두 개의 if() 문에서만 작동합니다.

 
Amon1953 :

나는 이미 내가 필요한 것을 설명했습니다. 나는 세부 사항을 명확히하려고 노력할 것입니다.

어드바이저를 다시 시작할 때 알고리즘이 일련의 주문을 나타내므로 이전 상태를 복원해야 합니다 . 첫 번째 주문은 기본 주문이며 체인의 다음 주문 매개 변수는 여기에서 계산됩니다. 예를 들어 두 번째 볼륨은 밑면의 50%이고 세 번째 볼륨은 75%입니다. EA를 다시 시작할 때 다음 주문의 볼륨은 마지막 주문에서 계산되기 때문에 기본 주문의 볼륨과 마지막 주문의 볼륨을 알아야 합니다. 예: 3개의 미결제 주문이 있고 다음(네 번째) 주문을 계산하려면 마지막 미결제 주문의 양을 결정해야 합니다.

주문이 하나만 있으면 기본이며 이 경우에는 관심이 없습니다. 다른 블록에서 처리됩니다.

알고리즘은 간단합니다. 그러나 두 개의 if() 문에서만 작동합니다.

아몬1953 :

가장 최근의 순서로 루프를 종료해야 하기 때문에 확인하지 않았습니다(목록의 첫 번째 항목이 있음).

저는 숙련된 프로그래머 가 아니며 OnInit 및 OnDeinit 작동 방식을 잘 이해하지 못합니다 . 그래서 저는 사용하지 않지만, 프로그램이 중간에 중단 없이 작동하도록 하는 것 같습니다.

세마포어에 관해서도 불명확하고 어드바이저가 다른 창에 설치되어 있고 다른 마법을 가지고 있습니다.

문서 읽기:

초기화

OnInit() 함수는 Init 이벤트에 대한 처리기입니다. void 또는 int 유형일 수 있으며 매개변수가 없습니다.

무효의   초기화 ();

Init 이벤트는 Expert Advisor 또는 표시기를 로드한 직후에 생성됩니다. OnInit() 함수는 초기화에 사용됩니다. OnInit()에 int 반환 값이 있는 경우 0이 아닌 반환 코드는 초기화 실패를 나타내고 REASON_INITFAILED의 초기화 해제 이유 코드 함께 Deinit 이벤트를 생성합니다 .

또한 변수의 가시성을 처리합니다.

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после...