[경고, 주제 닫힘!] 포럼을 어지럽히지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 당신 없이는 어디에도 없습니다. - 페이지 656

 
artmedia70 :
스택 오버플로의 원인은 무엇입니까? 테이크 크기가 큰 위치를 열 때(테이크는 변동성에서 계산되고 100을 곱한 크기는 41*100으로 판명됨) 스택 오버플로가 로그에 기록되고... 건강합니다. 이 포지션이 닫힐 때까지 더 이상 단일 포지션이 열리지 않으며, 이 포지션은 엄청난 테이크로 인해 닫히지 않습니다... 그리고 어드바이저가 더 이상 올바르게 작동하지 않기 때문입니다. 오픈 포지션의 예정된 총 이익에 도달하면 모든 포지션을 청산해야 합니다... 그러나 이것은 한 포지션이 오랫동안 약 2,000포인트의 엄청난 이익을 냈음에도 불구하고 그런 일이... 이것? 결국, 열린 포즈가 함께 스택을 오버플로하고 모든 것이 공중제비를 굴릴 때 그러한 상황에 대해 보장할 수 없습니다...


스택은 유형 범위를 벗어난 숫자로 오버플로할 수 없습니다. 다른 오류가 발생합니다.

스택은 종료하지 않고 함수 또는 재귀 함수 호출에 전달된 데이터로 오버플로할 수 있습니다.

start()는 동일한 함수입니다. 아마도 거기에 많은 변수가 있을 것입니다.

스택은 함수(로컬 변수)의 중간 값이 저장되는 메모리 영역입니다. 동적 배열을 사용하고 배열의 범위를 올바르게 제어하지 않은 경우 스택을 직접 파괴할 수 있습니다. 즉, 배열에 데이터를 쓰지 않고 단순히 배열 바로 뒤에 오는 메모리 영역에 데이터를 썼습니다.

일부 배열을 전역 변수 로 이동하십시오. 조언자를 맨 위로 데려가다

추신: 적어도 이것은 모든 프로그래밍 언어의 경우입니다. - mql에서도 마찬가지라고 생각합니다.

 
IgorM :


스택은 유형 범위를 벗어난 숫자로 오버플로할 수 없습니다. 다른 오류가 발생합니다.

스택은 종료하지 않고 함수 또는 재귀 함수 호출에 전달된 데이터로 오버플로할 수 있습니다.

start()는 동일한 함수입니다. 아마도 거기에 많은 변수가 있을 것입니다.

스택은 함수(로컬 변수)의 중간 값이 저장되는 메모리 영역입니다. 동적 배열을 사용하고 배열의 범위를 올바르게 제어하지 않은 경우 스택을 직접 파괴할 수 있습니다. 즉, 배열에 데이터를 쓰지 않고 단순히 배열 바로 뒤에 오는 메모리 영역에 데이터를 썼습니다.

일부 배열을 전역 변수로 이동하십시오. 고문을 맨 위로 데려가다

추신: 적어도 이것은 모든 프로그래밍 언어의 경우입니다. - mql에서도 마찬가지라고 생각합니다.

Igor, 당신은 내가 당분간 배열을 사용하지 않는다는 것을 알고 있습니다... 제 코드에는 두 개의 배열만 있습니다. 틱 이전의 주문 배열과 틱 이후의 주문 배열입니다. 그것들은 내 전역 변수 범위에 설정됩니다. 이 위치를 여는 코드를 어드바이저의 다른 위치로 옮기고 오류가 사라진 것이 재미있습니다. 오더 를 여는 함수에 대한 재귀 호출 이 있는 것 같았지만 그것에 대해 많이 생각하지 않았습니다. 나는 방금 총 이익을 달성하고 모든 포지션을 청산하는 코드에서 클로즈 직후에 오프닝을 배치하는 것이 적절하지 않다고 결정했습니다. 힙업, 젠장... :)
 
artmedia70 :
Igor, 당신은 내가 당분간 배열을 사용하지 않는다는 것을 알고 있습니다... 제 코드에는 두 개의 배열만 있습니다. 틱 이전의 주문 배열과 틱 이후의 주문 배열입니다. 그것들은 내 전역 변수 범위에 설정됩니다. 이 위치를 여는 코드를 어드바이저의 다른 위치로 옮기고 오류가 사라진 것이 재미있습니다. 오더를 여는 함수에 대한 재귀 호출이 있는 것 같았지만 그것에 대해 많이 생각하지 않았습니다. 나는 방금 총 이익을 달성하고 모든 포지션을 청산하는 코드에서 클로즈 직후에 오프닝을 배치하는 것이 적절하지 않다고 결정했습니다. 힙업, 젠장... :)

나는 오랫동안 고문을 만들기위한 템플릿을 만들었습니다. 주문할 때 즉시 이러한 유형의 주문의 존재에 대한 표시 (플래그)를 설정 한 다음이 유형의 새 주문을 열기 전에 항상 플래그를 확인합니다. - 그런 주문이 있긴 한데 주문 하나만으로 어드바이저를 쓴다
 
IgorM :

나는 오랫동안 고문을 만들기위한 템플릿을 만들었습니다. 주문할 때 즉시 이러한 유형의 주문의 존재에 대한 표시 (플래그)를 설정 한 다음이 유형의 새 주문을 열기 전에 항상 플래그를 확인합니다. - 그런 주문이 있긴 한데 주문 하나만으로 어드바이저를 쓴다
그래서 결국 나도 그렇지만 모든 사람이 자신의 개발, 템플릿 및 기타 유용한 것들을 가지고 있다고 생각합니다. 이것은 다른 문제입니다. 나는 여전히 드로다운과 싸우고 있기 때문에 다양한 메소드-메소드-함수 등등을 뒤틀리고 비틀고 있다. 추세에 따라 순수하고 엄격하게 작업을 수행하면 매우 적은 수의 포지션이 열리며, 각각 고유한 추세/플랫이 있는 여러 시간대에서 작업하면 추세 고갈을 잡는 방법이 명확하지 않은 경우 하나의 오래된 프레임에서 추세는 이미 평평하게 바뀌었고 더 젊은 프레임에서는 여전히 거기에 있지만 이미 끝나가고 있습니다. 로우에서 포즈를 열면 시간에 쫓기지 않고 드로다운을 줄 확률이 높다. 이제 4시간 차트부터 시작하여 방향을 결정하고 모든 후배를 위해 이 방향으로만 작업하려고 합니다. 나는 결과를 보기 위해 추세에서 평평한, 다소간 호황으로 전환하는 순간을 결정했습니다.
 
Craft :


예, 실제로 "0"이지만 어떻게 해야 하는지 알려주세요. 이 방법으로 작동하지 않고 동일한 기간을 설정하고 두 옵션(new 및 old) 모두에서 시도했습니다. Print("NormalizeDouble(c1b_1..., 0을 제공(값 c1b[i]만 표시, c1s[i] - 0을 포함한 나머지 모두 표시), 옵션 중 하나를 작동 상태로 가져오는 데 도움을 주거나 최소한 힌트를 공유하면 누가 결함을 볼 수 있습니까?

새로운:

낡은:

전부의:


유리야 미래를 위해 코드가 반복된다면  적어도 두 번은 메서드에 할당해야 하며 코드를 복잡하게 만드는 배열 힙이 필요하지 않습니다.
다음은 방법입니다.

 //+------------------------------------------------------------------+
double iCCIAverage( string cci_symbol, int cci_timeframe, int cci_period, int cci_applied_price, int ma_period, int ma_method, int ma_shift){
   double array[];
   int loop_array;
   ArrayResize (array,ma_period + ma_shift);
   for ( int loop = ma_period + ma_shift - 1 ; loop >= 0 ; loop--, loop_array++)array[loop_array] = iCCI (cci_symbol, cci_timeframe, cci_period, cci_applied_price, loop);
   return (iMAOnArray(array, 0 , ma_period, 0 , ma_method, ma_shift));
}
//+------------------------------------------------------------------+

매개변수로 모든 것이 명확하다고 생각하고 데이터를 입력하고 ma_shift 매개변수를 변경하여 필요한 시프트를 얻습니다. 이 방법을 템플릿으로 사용할 수 있습니다. 액세스 방법을 표시기 i…(…) 또는 iCustom(…) 으로 변경하기만 하면 됩니다. 이제 거래 결정 블록은 다음과 같아야 합니다.

 //--------------------------------------------------------------- 5 --
   // Торговые критерии
if ( NormalizeDouble (iCCIAverage( Symbol (), 0 , PeriodB, PRICE_TYPICAL , AvgB, MODE_SMA , 1 ), 4 )< NormalizeDouble (iCCIAverage( Symbol (), 0 , PeriodB, PRICE_TYPICAL , AvgB, MODE_SMA , 2 ), 4 ) &&
   NormalizeDouble (iCCIAverage( Symbol (), 0 , PeriodB, PRICE_TYPICAL , AvgB, MODE_SMA , 2 ), 4 )> NormalizeDouble (iCCIAverage( Symbol (), 0 , PeriodB, PRICE_TYPICAL , AvgB, MODE_SMA , 3 ), 4 ))
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
if ( NormalizeDouble (iCCIAverage( Symbol (), 0 , PeriodS, PRICE_TYPICAL , AvgS, MODE_SMA , 1 ), 4 )> NormalizeDouble (iCCIAverage( Symbol (), 0 , PeriodS, PRICE_TYPICAL , AvgS, MODE_SMA , 2 ), 4 ) &&
   NormalizeDouble (iCCIAverage( Symbol (), 0 , PeriodS, PRICE_TYPICAL , AvgS, MODE_SMA , 2 ), 4 )< NormalizeDouble (iCCIAverage( Symbol (), 0 , PeriodS, PRICE_TYPICAL , AvgS, MODE_SMA , 3 ), 4 ))
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 6 --

따라서 이제 "이전" 및 "신규" 옵션이 필요하지 않으며 지정된 기준에 따라 거래가 열립니다(내가 이해하는 한 부드러운 iCC의 상단/하단 3개 패턴이 있음). 파일에 수정된 버전이 있습니다.

파일:
21_2.mq4  14 kb
 

안녕하세요.

주문 시작된 이후로 배열에 가격을 쓰는 코드를 알려주세요.

각각의 새로운 가격이 배열에 추가되도록 만드는 방법입니다.

 
zelek :

안녕하세요.

주문이 시작된 이후로 배열에 가격을 쓰는 코드를 알려주세요.

각각의 새로운 가격이 배열에 추가되도록 만드는 방법입니다.


질문에 대해 더 구체적으로

주문할 당시의 현재 가격에 관심이 있는 경우 현재 가격을 변경 사항이 있는 전역 배열에 기록할 책임이 있는 주문을 담당하는 코드의 함수에 대한 호출을 추가할 수 있습니다. 배열 인덱스 카운터에서 코드의 어느 곳에서나 볼 수 있습니다.

 

어드바이저의 성능을 확인하는 방법 - 코드 실행 시간을 밀리초 단위로 표시하고 싶습니다.

MT5 대 MT4가 얼마나 더 나은지

 
IgorM :

어드바이저의 성능을 확인하는 방법 - 코드 실행 시간을 밀리초 단위로 표시하고 싶습니다.

MT5 대 MT4가 얼마나 더 나은지


GetTickCount가 도움이 될 것입니다 https://docs.mql4.com/en/common/GetTickCount
 
DDFedor :

GetTickCount가 도움이 될 것입니다 https://docs.mql4.com/en/common/GetTickCount


ATP 예입니다. MT4 및 MT5에 대해 동일한 유형의 코드 속도를 측정한 사람이 내가 찾던 것입니다.