포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 930

 

DiPach , 다시 한 번 도움을 주셔서 감사합니다. 귀하의 사례를 분석했습니다. 시작 코드를 변경했습니다. 그것은 다음과 같이 밝혀졌습니다.

 void OnStart ()
  {
int awd1[];
ArrayResize (awd1, 6 , 7 );
   for ( int i= 0 ;i<= 5 ;i++)
   {
   awd1[i]=i+ 10 ;
   Print ( "awd1[" , i, "]=" , awd1[i]);
   }
   Alert ( "awd1[0]=" , awd1[ 0 ], ", awd1[1]=" , awd1[ 1 ], ", awd1[2]=" , awd1[ 2 ], 
   ", awd1[3]=" , awd1[ 3 ], ", awd1[4]=" , awd1[ 4 ], ", awd1[5]=" , awd1[ 5 ]);
  }

변경된 사항:

1. 배열 int awd1[]; OnStart() 함수 내부

2. ArrayResize(awd1,6,7) 기능 추가

3. 대본이 적립되었습니다.

결론을 내리도록 노력하겠습니다. 스크립트에서는 OnStart() 함수 내에서 배열을 선언하는 것이 맞습니다. 배열이 선언된 후에는 ArrayResize() 함수에 의해 결정되어야 합니다. 그렇지 않으면 컴파일러가 맹세합니다. 내 결론이 맞습니까? 그렇지 않다면 정확한 해석을 알려주세요.

 
silachara :

DiPach , 도움을 주셔서 다시 한 번 감사드립니다. 귀하의 사례를 분석했습니다. 시작 코드를 변경했습니다. 그것은 다음과 같이 밝혀졌습니다.

변경된 사항:

1. 배열 int awd1[]; OnStart() 함수 내부

2. ArrayResize(awd1,6,7) 함수를 추가했습니다.

3. 대본이 적립되었습니다.

결론을 내리도록 노력하겠습니다. 스크립트에서는 OnStart() 함수 내에서 배열을 선언하는 것이 맞습니다. 배열이 선언된 후에는 ArrayResize() 함수에 의해 결정되어야 합니다. 그렇지 않으면 컴파일러가 맹세합니다. 내 결론이 맞습니까? 그렇지 않다면 정확한 해석을 알려주세요.

일반적으로 그렇습니다. 그리고 그는 적어도 조용히, 그러나 구체적으로 맹세할 것입니다. :)

다음 사항을 명확히 하겠습니다.

1. 일반 변수와 배열을 선언할 때 이 스크립트(또는 조언자/지시자)가 수행할 작업과 이러한 변수/배열의 용도부터 진행해야 한다고 생각합니다.

당신이 첨부한 스크립트의 체계는 프로그램의 전역 수준이 아니라 지역적으로 변수 선언을 허용한다고 생각합니다. 즉, 배열 선언은 한 번만 발생합니다. 그리고 우리가 말하는 코드의 Start() 본문에는 불필요한 반복(반복) 선언이 없습니다. 예를 들어 for() 루프가 시작 되기 전 섹션에서 for() {}를 종료 한 후 섹션에서 일부 변수를 추가로 선언합니다.


따라서 배열이 프로그램의 전역 변수 수준이 아니라 OnStart()의 본문에서 for() 루프 연산자 이전 에 한 번 선언된다는 사실은 이러한 방식에서 충분히 수용 가능합니다. 프로그램.

제 입장에서는 전역 프로그램 변수 수준에서 선언할 필요가 없다면 이 기회를 이용하여 로컬에서 가능한 것을 선언하는 것이 좋습니다.

2. 코드에 따라 다음을 명확히 하겠습니다.

 void OnStart ()
  {
   int awd1[];
   ArrayResize (awd1, 6 , 7 );
   for ( int i= 0 ;i< 6 ;i++)
     {
      awd1[i]=i+ 10 ;
       Print ( "awd1[" ,i, "]=" ,awd1[i]);
     }
   string text= StringConcatenate ( "awd1[0]=" ,awd1[ 0 ], ", awd1[1]=" ,awd1[ 1 ], ", awd1[2]=" ,awd1[ 2 ],
                                 ", awd1[3]=" ,awd1[ 3 ], ", awd1[4]=" ,awd1[ 4 ], ", awd1[5]=" ,awd1[ 5 ]);
   Alert (text);
  }

내 말은:

  • <=(보다 작음) 기호를 사용하지 마십시오. 나는 (i=0 ; i<=5 ;i++) 어디에 있었는지 의미합니다. 기호 <(보다 작음)를 넣고 5 대신 숫자 6을 입력합니다.
 for ( int i= 0 ;i< 6 ;i++)

이 경우 5는 다음에 적합합니다.

 for ( int i= 5 ;i>= 0 ;i--)
  • 이전에 Stringconcatenate 함수가 긴 텍스트의 더 빠른 처리를 촉진한다는 정보를 만난 것을 기억합니다. 그래서 저는 보통 직접 사용합니다. 만일을 위해 여기에도 포함시켰습니다.


P./S.: ArrayResize() 의 사용이 동적 배열에 대한 경우를 대비하여 한 가지 더 설명합니다. 이 함수에 대한 문서에는 이 함수 로 동적 배열의 크기를 조정할 수 없는 경우 정보 가 있습니다.

 
Best_ATS :
친구를 추가할 수 없는 이유는 무엇입니까?
그리고 직장에서 개인적으로 알지 못하는 친구를 어떻게 상상합니까?
 

안녕하세요! 새 가격이 먼저 표시되고 이전 가격이 내려가는 식으로 계속 표시되도록 하려면 어떻게 해야 합니까? 명확하게 하기 위해 예를 만들었습니다.

 double NN= 0 ;
double NN1= 0 ;
double NN2= 0 ;
double NN3= 0 ;
void OnTick ()
  {
//---
if (Ask>NN)NN=Ask;
if (NN>NN1)NN1=NN;
if (NN1>NN2)NN2=NN1;
if (NN2>NN3)NN3=NN2;
         Comment ( ""        
             + "1.   " + "Buy: " " Max: " + DoubleToStr(NN, 5 )
             + "\n"   
             + "2.   " + "Buy: " " Max: " + DoubleToStr(NN1, 5 )
             + "\n"   
             + "3.   " + "Buy: " " Max: " + DoubleToStr(NN2, 5 )
             + "\n"   
             + "4.   " + "Buy: " " Max: " + DoubleToStr(NN3, 5 )
             + "\n"
             + "------------------------------------------------" );
           
  }
 
abeiks :

안녕하세요! 새 가격이 먼저 표시되고 이전 가격이 내려가는 식으로 계속 표시되도록 하려면 어떻게 해야 합니까? 명확하게 하기 위해 예를 만들었습니다.

나는 예를 만들었고, 당신은 조건을 어느 정도 이해하게 될 것입니다.

 double bda_Price[ 4 ];
void OnTick ()
{
       int li_int;
//---
     if (Ask > bda_Price[ 0 ])
    {
        ArrayInitialize (bda_Price, 0.);
        bda_Price[ 0 ] = Ask;
         double lda_Price[ 3 ];
         ArrayCopy (lda_Price, bda_Price, 0 , 1 );
        for ( int li_int = 1 ; li_int < 4 ; li_int++)
        {bda_Price[li_int] = lda_Price[li_int- 1 ];}
    }
     string ls_txt;
     StringInit (ls_txt, 100 );
     for (li_int = 0 ; li_int < 4 ; li_int++)
    {ls_txt = StringConcatenate (ls_txt, ( string ) li_int, ".   Buy:  Max: ", DoubleToStr (bda_Price[li_int], Digits ), "\n" );
    ls_txt = StringConcatenate (ls_txt, "------------------------------------------------" );
     Comment (ls_txt);
//---
}
 
TarasBY :

나는 예를 만들었고, 당신은 조건을 어느 정도 이해하게 될 것입니다.


고맙습니다!
 
abeiks :

안녕하세요! 새 가격이 먼저 표시되고 이전 가격이 내려가는 식으로 계속 표시되도록 하려면 어떻게 해야 합니까? 명확하게 하기 위해 예를 만들었습니다.

다음은 완전히 원시적인 코드입니다.

 double Price1, Price2, Price3, Price4;

void OnTick ()
  {
Price4=Price3;
Price3=Price2;
Price2=Price1;
Price1=Ask;
Comment (Price1, "\n" , Price2, "\n" , Price3, "\n" , Price4);
  }
 
silachara :

다음은 완전히 원시적인 코드입니다.




고맙습니다!
 

안녕하세요. 기본 스크립트를 사용하여 전략 테스터 에서 거래 주문을 열려고 시도했지만 작동하지 않았습니다.

정수 시작()

{

//----

인트르;

이중 요청=종료[0]+MarketInfo(_Symbol,MODE_SPREAD)*포인트;

res=OrderSend(Symbol(),OP_BUY,0.1,요청,3,0,0,"",0,0,파란색);

if(res>-1)Alert("구매 주문이 티켓으로 열렸습니다. ",res);

//----

리턴(0);

}

시각화 모드에서 테스터의 차트에 스크립트를 던지지만 MT4 터미널에서 거래 주문이 열립니다.

또한 전략 테스터에서 SimpleFXTester_v2.ex4를 사용하여 미결 주문에 대한 정보를 얻지 못합니다.

그것을 알아내는 데 도움이되는 거대한 요청.

 
kosmos0975 :

안녕하세요. 기본 스크립트를 사용하여 전략 테스터에서 거래 주문을 열려고 시도했지만 작동하지 않았습니다.

정수 시작()

{

//----

인트르;

이중 요청=종료[0]+MarketInfo(_Symbol,MODE_SPREAD)*포인트;

res=OrderSend(Symbol(),OP_BUY,0.1,요청,3,0,0,"",0,0,파란색);

if(res>-1)Alert("구매 주문이 티켓으로 열렸습니다. ",res);

//----

반환(0);

}

시각화 모드에서 테스터의 차트에 스크립트를 던지지만 MT4 터미널에서 거래 주문이 열립니다.

또한 전략 테스터에서 SimpleFXTester_v2.ex4를 사용하여 미결 주문에 대한 정보를 얻지 못합니다.

그것을 알아내는 데 도움이되는 거대한 요청.

테스터의 스크립트가 작동하지 않습니다.