[아카이브!] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 2. - 페이지 470

 
tol64 :

다중 통화 매개변수를 어떻게 최적화합니까? MT4 테스터에서는 한 번에 여러 개의 악기를 테스트하는 것이 불가능합니다... 다중 화폐에 대해 생각하고 있으며 지금까지 매개 변수가 각 악기에 개별적으로 최적화 된 다음 이러한 매개 변수를 모두 거래하기 위해 매개 변수가 최적화되어 있다는 결론에 도달했습니다. 다중 통화 모드용으로 설계된 Expert Advisor로 전송됩니다.

나는 올바른 방향으로 가고 있습니까 아니면 정말 더 쉬운가요?)))

mql5에서는 이 모든 것이 테스트와 거래 모두에 대해 하나의 Expert Advisor에서 구현될 수 있지만 지금은 mql4를 연구하기로 결정했습니다.

이 주제에 대해 생각하면서 한 번에 여러 기기를 테스트하는 것이 불가능하다면 기기의 각 차트에 자신의 사본을 설치하기만 하면 똑같을 수 있다면 왜 모든 것을 하나의 Expert Advisor에 넣어야 하는지 생각했습니다. 커뮤니티 회원들의 의견을 듣고 싶습니다.

나는 다중 통화가 없으며 각 악기에 대해 동일한 고문을 걸뿐입니다.
 
Roman. :

댓글
죄송합니다 답변을 이해하지 못했습니다
 
demlin :
죄송합니다 답변을 이해하지 못했습니다

Google을 통해 요청 시 검색하여 보십시오: "site:mql4.com Expert Advisor를 최적화하는 방법"도 여기에서 확인할 수 있습니다.

같은 문제에 대한 유능한 책을 추천합니다. Ralph Vince "주식 거래자를 위한 거래 시스템의 개발, 테스트 및 최적화" - 모든 것이 상세하고 명확하며 이해할 수 있습니다.

 

작업: 그림은 특정 곡선(예: MA)을 보여줍니다. 점 A,C,E는 극댓값이고 점 B,D는 극소값입니다. 질문: 인접한 최대값과 최소값 사이의 거리가 N 포인트보다 큰 경우 계산하는 방법은 무엇입니까? 나는 그것을 시도했지만 어떻게 든 모든 것이 너무 성가신 것으로 판명되었습니다. 그러한 문제를 해결하기 위해 기성품 알고리즘이 있습니까? 누구든지 만나면 알려주십시오.

 
Elenn :

작업: 그림은 특정 곡선(예: MA)을 보여줍니다. 점 A,C,E는 극댓값이고 점 B,D는 극소값입니다. 질문: 인접한 최대값과 최소값 사이의 거리가 N 포인트보다 큰 경우 계산하는 방법은 무엇입니까? 나는 그것을 시도했지만 어떻게 든 모든 것이 너무 성가신 것으로 판명되었습니다. 그러한 문제를 해결하기 위해 기성품 알고리즘이 있습니까? 누구든지 만나면 알려주십시오.


이동 평균의 방향을 결정합니다.

상승하고 동시에 변수 B, C, D 및 E가 비어 있으면 이동 평균의 현재 값을 변수 A에 입력합니다.

변수 A가 비어 있지 않고 동시에 이동 평균이 아래쪽으로 향하고 동시에 변수 C, D, E가 비어 있으면 이동 평균의 현재 값을 변수 B에 입력합니다. 변수 A와 변수 B가 비어 있지 않고 이동 평균이 위쪽으로 향하고 변수 D와 E가 비어 있으면 이동 평균의 현재 값을 변수 C에 입력합니다.

음 등등 우리는 변수의 값을 값으로 채웁니다.

이제 변수 A와 C가 비어 있지 않고 A와 C의 차이 계수가 미리 결정된 포인트 수 이상인 경우 의도한 작업이 수행됩니다.

일반적으로 코드는 가능합니다. 조언자가 새로운 시작 지점에 왔다는 것을 이해할 수 있도록 알고리즘의 어느 지점에서 변수를 재설정할지 결정하기만 하면 됩니다. 루프와 배열을 통해 수행할 수 있으며 코드가 더 짧고 단순해질 가능성이 매우 높지만 이해를 위해서는 변수를 통해 알고리즘을 고려하는 것이 좋습니다. 배열 인덱스 와 루프의 촛불 번호에서 혼동됩니다.

 

얘들아, 나는 최근에이 문제에 부딪쳤다. 누가 주제에 있습니까 - 댓글. 자신 - 운 좋게도 빠르게 오류를 발견했습니다 ... 코드를 작성할 때 - 모든 것이 오류없이 컴파일되지만 트롤은 작동하지 않습니다 ... 즉. 주문 루프를 더 이상 진행하지 말자... 코드 섹션 - 인용하겠습니다... 오류는 다음과 같았습니다. - 외부 변수에서 주문 마법은 대문자로 설정되었고, 주문을 통해 정렬하기 위한 조건에서는 사이클 - CTRL + F 를 통해 검색하는 동안 소문자 - 요청 " 매직"이 " 매직"으로 이동했습니다... 컴파일러는 오류를 제공하지 않았지만 루프에서 프로그램은 전환에 도달하지 못했습니다. 트롤 뷰... 루프 "매직"에 의해 중단되었습니다... 일반적으로 어떻게 되어야 합니까??? 나는 항상 " magic "과 " Magic "이 다른 변수라고 생각했습니다... 따라서 컴파일러는 "magic" 변수가 정의되지 않았다는 이 오류를 지적했어야 했습니다... 코드에서 지금과 같이 이 형식으로 실행이 트레일 선택에 도달하지 않고 Printa ()가 더 이상 도달하지 않습니다. 이 조건에서 루프가 종료되는 것은 마술 때문입니다. " magic "과 " Magic "이라는 이름이 다르기 때문에 이 조건은 절대 충족되지 않습니다.

 if ((OrderSymbol() != Symbol ()) || (OrderMagicNumber() != magic))
      {
         continue ;
      }

 // глоб переменные
...
...
extern int   Magic = 10 ;     // MagicNumber

//----------------------------------------------------------------------------
int start()                             // Спец. функция start
  {
  
   
   int orderCount = 0 ; 
  
   //---------------------------ТРАЛ ОРДЕРОВ---------------------------------------------------------------------------------------
   int orderType;
     for (orderIndex = ( OrdersTotal () - 1 ); orderIndex >= 0 ; orderIndex--)
    {
       if (! OrderSelect (orderIndex, SELECT_BY_POS))
      {
         continue ;
      }

       if ((OrderSymbol() != Symbol ()) || (OrderMagicNumber() != magic))
      {
         continue ;
      }

      orderType = OrderType();
       if ((orderType != OP_BUY) && (orderType != OP_SELL))
      {
         continue ;
      }
                ticket = OrderTicket( );                         // Номер ордера
       double    orderLots = OrderLots();                         // Lots   
       double    orderProfit = OrderProfit() + OrderSwap();       // Profit
       double    Price = OrderOpenPrice();                         // Цена открытия рыночного ордера
       double    SL =  OrderStopLoss();                           // Значение StopLoss ордера
       double    TP = OrderTakeProfit();                           // Значение TakeProfit ордера
          
             if (ticket> 0 )                                               // Если позиция открылась
                    {
                             while ( OrderSelect (ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep ( 100 );
                                 }
                                   double OpenPrice=OrderOpenPrice();
                    }
                 
         
      orderCount++;                     // считаем ордера (не больше 10)
     
            
       while (!IsTradeAllowed() || !IsConnected()) Sleep ( 5000 ); RefreshRates();
       
       //----------------------------Тралим последовательно все наши ордера по виду трала------------------
       if (UseTrailing && orderCount > 0 && type == 0 )   // простой трал по аналогии учебнику - в зависимости от параметра trlinloss (тралить ли в зоне лоссов)
          {     
           if (orderType == OP_BUY)  SampleTrailing_texbook ( 0 );           // если бай
           if (orderType == OP_SELL) SampleTrailing_texbook ( 1 );           // если селл
          }      
      ...
      ...
      ...   
     Print ( "Эксперт база: Всего наших ордеров = " ,orderCount);
     }   
//--------------------------------------------------------------------------------------------------------------------------------------     
   
   
  
//----------------------------------------------------------------  
   return ;                             // Выход из start()
  }

추신 잘 모르시는 분들은 이 점을 알아두세요. 그렇지 않으면 코드를 얼마나 어지럽혀야 할지 잘 모를 수도 있습니다...

 
Roman. :

얘들아, 나는 최근에이 문제에 부딪쳤다. 누가 주제에 있습니까 - 댓글. 자신 - 운 좋게도 빠르게 오류를 발견했습니다 ... 코드를 작성할 때 - 모든 것이 오류없이 컴파일되지만 트롤은 작동하지 않습니다 ... 즉. 주문 루프를 더 이상 진행하지 말자... 코드 섹션 - 인용하겠습니다... 오류는 다음과 같았습니다. - 외부 변수에서 주문 마법은 대문자로 설정되었고, 주문을 통해 정렬하기 위한 조건에서는 사이클 - CTRL + F 를 통해 검색하는 동안 소문자 - 요청 " 매직"이 " 매직"으로 이동했습니다... 컴파일러는 오류를 제공하지 않았지만 루프에서 프로그램은 전환에 도달하지 못했습니다. 트롤 뷰... 루프 "매직"에 의해 중단되었습니다... 일반적으로 어떻게 되어야 합니까??? 나는 항상 " magic "과 " Magic "이 다른 변수라고 생각했습니다... 따라서 컴파일러는 "magic" 변수가 정의되지 않았다는 이 오류를 지적했어야 했습니다... 코드에서 지금과 같이 이 형식으로 실행이 트레일 선택에 도달하지 않고 Printa()가 더 이상 도달하지 않습니다. 이 조건에서 루프가 종료되는 것은 마술 때문입니다. " magic "과 " Magic "이라는 이름이 다르기 때문에 이 조건은 절대 충족되지 않습니다.

추신 잘 모르시는 분들은 이 점을 알아두세요. 그렇지 않으면 코드를 얼마나 어지럽혀야 할지 잘 모를 수도 있습니다...


나를 위해 Magic이 선언되고 회전이 마술로 진행되면 컴파일러는 magic 변수가 선언되지 않았다고 기록합니다.

메타에디터 4 401.

 
Roman. :

얘들아, 나는 최근에이 문제에 부딪쳤다. 누가 주제에 있습니까 - 댓글. 자신 - 운 좋게도 빠르게 오류를 발견했습니다 ... 코드를 작성할 때 - 모든 것이 오류없이 컴파일되지만 트롤은 작동하지 않습니다 ... 즉. 주문 루프를 더 이상 진행하지 말자... 코드 섹션 - 인용하겠습니다... 오류는 다음과 같았습니다. - 외부 변수에서 주문 마법은 대문자로 설정되었고, 주문을 통해 정렬하기 위한 조건에서는 사이클 - CTRL + F 를 통해 검색하는 동안 소문자 - 요청 " 매직"이 " 매직"으로 이동했습니다... 컴파일러는 오류를 제공하지 않았지만 루프에서 프로그램은 전환에 도달하지 못했습니다. 트롤 뷰... 루프 "매직"에 의해 중단되었습니다... 일반적으로 어떻게 되어야 합니까??? 나는 항상 " magic "과 " Magic "이 다른 변수라고 생각했습니다... 따라서 컴파일러는 "magic" 변수가 정의되지 않았다는 이 오류를 지적했어야 했습니다... 코드에서 지금과 같이 이 형식으로 실행이 트레일 선택에 도달하지 않고 Printa()가 더 이상 도달하지 않습니다. 이 조건에서 루프가 종료되는 것은 마술 때문입니다. " magic "과 " Magic "이라는 이름이 다르기 때문에 이 조건은 절대 충족되지 않습니다.

추신 잘 모르시는 분들은 이 점을 알아두세요. 그렇지 않으면 코드를 얼마나 어지럽혀야 할지 잘 모를 수도 있습니다...

내 가장 단순한 트롤과 비교하십시오. 특히, 주문 반복 주기:

   // В глоб. переменных
   string sy= Symbol ();
   // ...................................................................
   color   cl;
   double sl, StopLevel;
   for ( int i= 0 ; i< OrdersTotal (); i++) {
       if ( OrderSelect (i, SELECT_BY_POS)) {
         if (OrderSymbol()!=sy)           continue ;
         if (OrderMagicNumber()!=Magic)   continue ;
         if (OrderType()> 1 )               continue ;
         sl=OrderStopLoss();
         if (OrderType()==OP_BUY) {
            cl=clModifyBuy;
            StopLevel= NormalizeDouble (strG-DeltaStop*PointX, dg);
             if (sl<StopLevel) ModifyOrder(- 1 , StopLevel, - 1 , - 1 , cl);
            }
         if (OrderType()==OP_SELL) {
            cl=clModifySell;
            StopLevel= NormalizeDouble (strR+DeltaStop*PointX, dg);
             if (sl>StopLevel) ModifyOrder(- 1 , StopLevel, - 1 , - 1 , cl);
            }
         }
      }

원칙은 분명하다고 생각합니다.

그리고 변수 magic과 Magic은 정말 다릅니다. Ctrl + F로 검색하는 동안 "대소문자 구분" 확인란을 선택합니다.

코드 어딘가에서 여전히 둘 다 선언했습니다.

 
artmedia70 :

그리고 변수 magic과 Magic은 정말 다릅니다. Ctrl + F로 검색하는 동안 "대소문자 구분" 확인란을 선택합니다.

코드 어딘가에서 여전히 둘 다 선언했습니다.

정확히. 당신 덕분에 찾았습니다... :-))) 변수의 맨 아래에는 변수 extern int Magic = 10; 나는 변수를 선언했다 -
 int magic = 12345 ;

:-)))

주문을 여는 기능에서 나는 마술과주기 마술을 고려 했기 때문에 트롤에 대한 주문 열거주기 작동하지 않았다는 것이 밝혀졌습니다 ... :-)))

내 마음의 바닥에서 감사합니다 - 나는 그것을 알아 냈습니다. "대소문자 구분" 확인란을 선택 했는데 모든 것이 제대로 작동했습니다.

추신 그것이 어떻게 발생하는지에서 !!!... (코드가 코드를 통과할 때 - 저는 준비가 되었으며 여러 마술사를 발표할 뿐만 아니라 ... :-))) )

 
artmedia70 :

내 가장 단순한 트롤과 비교하십시오. 특히, 주문 반복 주기:

원칙은 분명하다고 생각합니다.

트롤 옵션을 주셔서 감사합니다. 원칙은 분명합니다.
사유: