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

 
pyatka__ASD :
말해봐, 지그재그의 높고 낮은 정점의 연결이있는 프로그램의 조각이있는 사람이 있습니까? 감사해요

어떤 연결이 필요한지 모르겠지만... 이것이 내가 Expert Advisor에서 사용 가능한 GZ의 극한값을 결정하는 방법입니다. 아래 또는 위로, 필요한 것을 찾으시기 바랍니다.

 //-----------------------------------------------------------------------------------------------------------------   
   if (op==OP_BUY)
      {
         for (m= 1 ; m<=CalcBarsLimit; m++)                       // Найдём первый перелом ЗЗ слева от первого бара
            {
               zz= iCustom (sy, tf, "ZigZag" , dp, dv, bs, 0 , m); // Берём данные 0 буфера ЗЗ с бара m
               if (zz!= 0 &&                                     // Если первый экстремум верхний
                   NormalizeDouble (zz, dg)== NormalizeDouble ( iCustom (sy, tf, "ZigZag" , dp, dv, bs, 1 , m), dg))
                     return (false);                             // Валим отсюда
               else if (zz!= 0 &&                               // Если первый экстремум нижний
                         NormalizeDouble (zz, dg)== NormalizeDouble ( iCustom (sy, tf, "ZigZag" , dp, dv, bs, 2 , m), dg)) 
                  {
                     if ( MathRound ((KLevel-zz)/pt)>=DistanceMIN &&         // Если расстояние от ZZ до KLevel ...
                         MathRound ((KLevel-zz)/pt)<=DistanceMAX)           // ... в заданных пределах
                        {
                           if (Open[ 1 ]<KLevel && 
                               Close[ 1 ]>KLevel &&
                               pa>KLevel)
                              {
                                 Fibo0_PriceB=zz;                                   // Сохраним цену излома ZZ
                                 Fibo23_PriceB=pa;                                   // Сохраним цену 23 фибы
                     
                                 nmKLB=DoubleToStr(Time[m], 4 );                     // имя метки
                                 SetArrow( 5 , DeepSkyBlue , nmKLB, Time[m], zz, 1 );   // Отмечаем излом ЗЗ на графике
                                 return (true);
                              }
                        }       
                  }
            }
      }
//-----------------------------------------------------------------------------------------------------------------   
   if (op==OP_SELL)
      {
         for (m= 1 ; m<=CalcBarsLimit; m++)                       // Найдём первый перелом ЗЗ слева от первого бара
            {
               zz= iCustom (sy, tf, "ZigZag" , dp, dv, bs, 0 , m); // Берём данные 0 буфера ЗЗ с бара m
               if (zz!= 0 &&                                     // Если первый экстремум нижний
                   NormalizeDouble (zz, dg)== NormalizeDouble ( iCustom (sy, tf, "ZigZag" , dp, dv, bs, 2 , m), dg))
                     return (false);                             // Валим отсюда
               else if (zz!= 0 &&                               // Если первый экстремум верхний
                         NormalizeDouble (zz, dg)== NormalizeDouble ( iCustom (sy, tf, "ZigZag" , dp, dv, bs, 1 , m), dg)) 
                  {
                     if ( MathRound ((zz-KLevel)/pt)>=DistanceMIN &&         // Если расстояние от ZZ до KLevel ...
                         MathRound ((zz-KLevel)/pt)<=DistanceMAX)           // ... в заданных пределах
                        {
                           if (Open[ 1 ]>KLevel && 
                               Close[ 1 ]<KLevel &&
                               pb<KLevel)
                              {
                                 Fibo0_PriceS=zz;                                 // Сохраним цену излома ZZ
                                 Fibo23_PriceS=pb;                               // Сохраним цену 23 фибы
                     
                                 nmKLS=DoubleToStr(Time[m], 4 );                   // имя метки
                                 SetArrow( 5 , BurlyWood , nmKLS, Time[m], zz, 1 );   // Отмечаем излом ЗЗ на графике
                                 return (true);
                              }
                        }       
                  }
            }
      }

   return (false);
}
//-------------------------------------------------------------------------------

ZY... 코드는 초안이며 최적화되지 않았습니다. 정규화 된 두 값을 빼서 결과가 0인지 확인하는 것이 더 낫다는 것을 알고 있기를 바랍니다 ...

 
alsu :

할 수 있다. 매개변수로 돌아갑니다.

방법 것입니다? 변수가 start 내부에 선언되면 return_value1 값을 할당할 수 있습니까?
 
eddy :
방법 것입니다? 변수가 start 내부에 선언되면 return_value1 값을 할당할 수 있습니까?

네. 이를 참조로 매개변수 전달 이라고 합니다. 함수가 정상적으로 선언되었을 때 이를 호출하면 형식 매개변수로 전달된 모든 변수가 함수의 지역 변수에 복사되어 조작됩니다. 참조로 전달할 때 복사가 발생하지 않습니다. 이 기능은 매개변수의 복사본이 아니라 원본과 함께 작동합니다. 따라서 이러한 매개변수를 사용하여 기능 코드에서 수행된 모든 변경 사항은 기능 코드에서 반환된 후에도 유효합니다.

참조로 매개변수를 전달하려면 필요한 매개변수의 식별자에 & 기호를 접두사로 붙여 함수를 선언할 때 이 메서드를 지정해야 합니다.

 

예제(스크립트로 컴파일 및 테스트)

 void Func1( double a)
{
   a=a* 2 ;
}

void Func2( double &a)
{
   a=a* 2 ;
}

int start()
{
   double a= 5 ;

   Func1(a);
   
   Print (a); //выведет 5

   Func2(a);
   
   Print (a); //выведет 10
}
 
eddy :
5*5=5?))
5가 아니라 2가 곱해집니다. 첫 번째 경우 매개변수 a는 "값으로" 전달되고 그 내용은 함수를 종료한 후 저장되지 않습니다. 두 번째에서는 참조로(이중 &a) 가치, 즉 5*2=10은 Func2가 종료된 후 변수 a에 포함됩니다.
 

쿨쿨 :)

그렇다면?

 double a= 5 ;

   Print (Func2(a));
 
eddy :


그렇다면?

10일 것이다. 그건 그렇고, 묻는 것보다 확인하는 것이 빠릅니다))))
 

컴퓨터가 계산하느라 바빠서 지금은 직접 확인할 수가 없어요.

다음 코드가 있습니다.

   if (DecreaseFactor> 0 ){
       for (int cnt=OrdersHistoryTotal()- 1 ; cnt>= 0 ; cnt--){
         if ( OrderSelect (cnt,SELECT_BY_POS,MODE_HISTORY)){ 
           if (OrderMagicNumber()==Magic){
             if (OrderSymbol()== Symbol ()){
               if (OrderType()< 2 ){ 
                   if (OrderProfit()> 0 ) break ;
                   if (OrderProfit()< 0 ) losses++;
       } } } } } 
       if (losses> 1 ) Lot= NormalizeDouble (Lot-Lot*losses/DecreaseFactor, 1 );
    }

Google을 통해이 코드의 여러 반복을 찾았으므로 코드가 작동한다는 결론에 도달했습니다.

그러나, 라인

Lot= NormalizeDouble (Lot-Lot*losses/DecreaseFactor, 1 );

당혹스러운.

DecreaseFactor=3이고 손실=3이면 공식에 따라 Lot=0 !!!

손실>3이면 Lot<0 !!!

가능합니까?

 
그렇다면 손실DecreaseFactor 는 무엇입니까?
 
eddy :

쿨쿨 :)

그렇다면?

그래서 아무 일도 일어나지 않을 것입니다. Funk2 함수 - 값을 반환하지 않습니다. 그녀는 공허 하다
사유: