오류, 버그, 질문 - 페이지 2451

 
이름에 # 기호가 포함된 파일을 저장소에 추가할 수 없습니다. 이것은 정상적인 동작입니까 아니면 버그입니까?
 

FX에 대해 이야기하는 경우 틱은 가격을 많이 변경하지 않습니다(보통). 그러나 다른 시장에서는 틱 바이 틱 접근 방식으로 주문이 심각하게 미끄러질 수 있습니다. 나는 여전히 진드기 사이를 시도하고 있습니다. 나는 아무런 해를 보지 않고 잠재적인 이점이 있습니다.

시도해야합니다 ...

 
작동 중인 히스테리시스... 구조에서 암시적 복사 할당 연산자 작업의 예.

 #define PRINT(x) Print ( #x, ":" , string (x))

struct MyArray{
   uchar data[];
};


void OnStart (){
   MyArray tmp_arr;
   
   MyArray huge_arr;
   ArrayResize (huge_arr.data, 1000 );
   ArrayInitialize (huge_arr.data, 0x8 );
   
   MyArray small_arr;
   ArrayResize (small_arr.data, 10 );
   ArrayInitialize (small_arr.data, 0x1 );
   
   
   tmp_arr = small_arr;
   Print ( "\r\nTest with small_arr" );
   PRINT( ArraySize (tmp_arr.data));
   PRINT(tmp_arr.data[ 0 ]);
   PRINT(tmp_arr.data[ ArraySize (tmp_arr.data)- 1 ]);
   
   tmp_arr = huge_arr;
   Print ( "\r\nTest with huge_arr" );
   PRINT( ArraySize (tmp_arr.data));
   PRINT(tmp_arr.data[ 0 ]);
   PRINT(tmp_arr.data[ ArraySize (tmp_arr.data)- 1 ]);
   
   tmp_arr = small_arr;
   Print ( "\r\nTest with small_arr" );
   PRINT( ArraySize (tmp_arr.data));
   PRINT(tmp_arr.data[ 0 ]);
   PRINT(tmp_arr.data[ ArraySize (tmp_arr.data)- 1 ]);
}

결과:
 2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   Test with small_arr
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   ArraySize (tmp_arr.data): 10
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   tmp_arr.data[ 0 ]: 1
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   tmp_arr.data[ ArraySize (tmp_arr.data)- 1 ]: 1
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   Test with huge_arr
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   ArraySize (tmp_arr.data): 1000
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   tmp_arr.data[ 0 ]: 8
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   tmp_arr.data[ ArraySize (tmp_arr.data)- 1 ]: 8
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   Test with small_arr
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   ArraySize (tmp_arr.data): 1000
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   tmp_arr.data[ 0 ]: 1
2019.05 . 03 14 : 29 : 14.005 Test_push (EURUSD,H1)   tmp_arr.data[ ArraySize (tmp_arr.data)- 1 ]: 8
 
Sergey Dzyublik :
작동 중인 히스테리시스... 구조에서 암시적 복사 연산자 작업의 예.

아마도 이것을 감지하기 위해 코드에서 오류를 찾아 내부 상태/인내성에 도달하는 것이 필요했을 것입니다. "여기서는 아무 것도 작동하지 않지만 어쨌든 확인하겠습니다."

 
fxsaber :

아마도 이것을 감지하기 위해 코드에서 오류를 찾아 내부 상태/인내성에 도달하는 것이 필요했을 것입니다. "여기서는 아무 것도 작동하지 않지만 어쨌든 확인하겠습니다."

코드는 특정 프로토콜에 대한 바이트 스트림을 구문 분석했습니다.
압축을 푼 데이터와 압축을 푼 데이터(다음 캡슐화 수준을 위한 데이터)의 크기가 수렴되지 않았습니다.

 
Sergey Dzyublik :

코드는 특정 프로토콜에 대한 바이트 스트림을 구문 분석했습니다.
압축을 푼 데이터와 압축을 푼 데이터(다음 캡슐화 수준을 위한 데이터)의 크기가 수렴되지 않았습니다.

이러한 작업으로 감지하는 것은 어렵지 않습니다. 운이 좋은.
 
Sergey Dzyublik :
작동 중인 히스테리시스... 구조에서 암시적 복사 연산자 작업의 예.

질문이 무엇입니까?

 void OnStart ()
{
         int a[]; ArrayResize ( a, 3 ); ArrayInitialize ( a, 3 );
         int b[]; ArrayResize ( b, 2 ); ArrayInitialize ( b, 2 );

MQL의 조건부 표기법

 //                 a = b;

에 상당하다

         ArrayCopy ( a,  b );

결과:

         ArrayPrint ( a );
}

2 2 3

 
A100 :

질문이 무엇입니까?


내 생각에 할당 복사 연산자는 배열 요소 자체뿐만 아니라 해당 번호도 복사해야 예약된 메모리 양이 유효합니다.

그리고 지금 다음과 같은 일이 일어나고 있습니다:

int size;
size = 4; // size == 4
size = 8; // size == 8
size = 4; // size == 8



원천:

 struct MyArray{
   uchar data[];
}

MyArray GetArray( int i){
   MyArray arr;
   
   if (i% 2 == 0 ){
       ArrayResize (arr.data, 8 );
       ArrayInitialize (arr.data, 0x8 );
   } else {
       ArrayResize (arr.data, 4 );
       ArrayInitialize (arr.data, 0x4 );
   }
   return arr;
}

void OnStart (){
   MyArray arr_1 = GetArray( 1 );
   ArrayPrint (arr_1.data);		// 4 4 4 4
   
   MyArray arr_2 = GetArray( 2 );         
   ArrayPrint (arr_2.data);              // 8 8 8 8 8 8 8 8
   
   arr_2 = arr_1;
   ArrayPrint (arr_2.data);              // 4 4 4 4 8 8 8 8
}
 
Sergey Dzyublik :


복사 연산자는 배열 요소 자체뿐만 아니라 해당 번호도 복사해야 예약된 메모리 양이 유효합니다.

그땐 왜

 struct MyArray {
         uchar data[];
};
void OnStart ()
{
        { uchar    a[], b[]; a = b; } //(1) Error
        { MyArray a,   b;   a = b; } //(2) нормально
}

(1)의 경우 오류가 있지만 (2)의 경우 모든 것이 정상입니다!? 무슨 상관이야?

그리고 배열이 a = b 규칙이 아니라 ArrayCopy ( a, b ) 규칙에 따라 복사되도록

규칙에 따르지 않음 = b, 존재하지 않기 때문에 존재한다면 오류가 없을 것입니다 (1)


 
Igor Zakharov :

각 틱을 계산하면 리소스 집약적이며 특히 전략 테스터에서 두드러집니다. Trade 이벤트에서만 다시 계산하는 것이 더 정확하지 않습니까? 공석 목록에서 실제로 변경되는 사항은 언제입니까? OnTradeTransaction()은 Expert Advisor의 작업에서 사용자 개입에 대한 제어를 단순화합니다. (전례가 있습니다 :)

이 로봇에서 무익 + 수익성 > X 구성표에 따라 그리드를 닫을 가능성을 테스트한 다음 둘 다 닫습니다(일반적으로 다른 기호). 그러나 실패가 발생하기 때문입니다. 그들이 닫혀 있다는 사실에도 불구하고 테스터는 그것에 대해 알지 못하고 다음 반복으로 진행하여 기존 항목을 이미 닫힌 항목과 잘못 "짝짓기"합니다. 저것들. 닫을 때마다 다시 계산을 추가해야 했습니다.

카운터 재설정으로 다시 계산하고 모든 열린 항목에 대해 먼저 +1 / -1이 아닌 다시 계산합니다.

처음부터 OnTradeTransaction()을 사용 하는 것은 위험하다는 것에 동의합니다. 일반적으로 요청 이 비동기가 아닌 경우에만 문제가 있는 경우에는 거부할 것입니다.

전혀 위험하지 않습니다. 문제는 일련의 행동과 사건의 조직에만 있습니다. Barabashka는 더 정확하게 말했고 쌍을 닫고 다음 틱까지 사이클을 종료했습니다. 다음 틱에서 가격이 더 나빠질 것이라는 사실은 아닙니다. 조금 더 늦게 닫는 게 나을지도 모르지만, 무엇으로 무엇을 닫았는지 혼란은 없을 것입니다.

두 번째 옵션: PositionsTotal이 아니라 미리 생성된 배열로 주기를 구성합니다. 그리고 쌍을 닫을 때 이러한 티켓은 어레이에서 제거됩니다. 이렇게 하면 닫힌 위치 가 다시 닫히는 것을 방지할 수 있습니다. 일반적으로 공상의 비행과 행동의 논리.