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

 
A100 :

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

당신이 직접 생각해 냈습니까, 아니면 어딘가에 기록되어 있습니까?
동적 배열이 있는 구조에 대한 암시적 할당 연산자 의 작업에 대해 이야기하고 있음을 상기시켜 드리겠습니다.

 
Sergey Dzyublik :

당신이 직접 생각해 냈습니까, 아니면 어딘가에 기록되어 있습니까?
동적 배열이 있는 구조에 대한 암시적 할당 연산자 의 작업에 대해 이야기하고 있음을 상기시켜 드리겠습니다.

내 생각은 아니지만 개발자

         uchar a[], b[]; a = b; //Error: invalid array access
왜 오류가 발생합니까? 구조에 싸여 오류가 사라졌습니까? 그리고 왜? 근본적으로 달라진 점은 무엇입니까? 내 답변은 위에 있습니다
 
Alexey Viktorov :

문제는 일련의 행동과 사건의 조직에만 있습니다.

순서가 보장되지 않는다고 설명서에서 직접 인용했습니다. 그렇기 때문에 위험합니다.

나는 이미 블라디미르의 조언에 따라 코드를 다시 작성하기 시작했지만 닫기가 틱보다 오래 걸리는 경우를 우연히 발견했습니다. 지금까지 최적화 속도와 타협하기 위해 완전히 닫힐 때까지 중지하는 것보다 더 나은 방법을 찾지 못했습니다.

금요일입니다 :) 쉬고 나면 뭔가 알 수 있을 것 같아요.

어쨌든 아이디어에 감사드립니다. 낭비되지 않습니다!

 
A100 :

내 생각은 아니지만 개발자

어디에 쓰여 있는지 이해가 가지 않았지만 상관 없습니다 ...
쿨러 감사합니다.

목발을 짚고 다음과 같이 달렸다.

 struct MyArray{
   uchar data[];
   
   void operator =(MyArray &bytes){
       ArrayCopy ( this .data, bytes.data);
       ArrayResize ( this .data, ArraySize (bytes.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            
}
 
Igor Zakharov :

순서가 보장되지 않는다고 설명서에서 직접 인용했습니다. 그렇기 때문에 위험합니다.

나는 이미 블라디미르의 조언에 따라 코드를 다시 작성하기 시작했지만 닫기가 틱보다 오래 걸리는 경우를 우연히 발견했습니다. 지금까지 최적화 속도와 타협하기 위해 완전히 닫힐 때까지 중지하는 것보다 더 나은 방법을 찾지 못했습니다.

금요일입니다 :) 쉬고 나면 뭔가 알 수 있을 것 같아요.

어쨌든 아이디어에 감사드립니다. 낭비되지 않습니다!

나는 내 자신의 일관성에 대해 이야기했습니다.

내 관찰에 따르면 OnTick 후에 트랜잭션이 발생하면 다음 틱을 기다리지 않고 코드 실행이 OnTradeTransaction 함수로 전달됩니다. 따라서 자체 함수로 또는 OnTradeTransaction 에서 닫는 사실을 처리하는 데 차이가 없습니다 . 하지만 저는 OnTradeTransaction으로 작업하는 것을 더 좋아합니다. 가장 중요한 것은 서버에서 오는 트랜잭션 순서에 의존하지 않고 작업 순서를 올바르게 구성하는 것입니다. 그리고 이 순서를 올바르게 이해하는 것이 중요 합니다. 다시 말하지만, 내 관찰에 따르면 트랜잭션 유형에서 순서를 위반할 수 있습니다. 즉, 먼저 TRADE_TRANSACTION_DEAL_ADD, 그 다음 이 TRADE_TRANSACTION_HISTORY_ADD일 수 있으며 , 논리에 따르면 먼저 히스토리에 주문을 추가한 다음 거래를 추가해야 할 것 같습니다.

추신; 그런 다음 내가 말했듯이 거래 TRADE_TRANSACTION_DEAL_ADD를 필터링한 후 포지션 열기 및 포지션 닫기를 필터링할 수 있습니다. 결국 우리는 외환 시장의 고문과 헤지 계좌에 대해 이야기하고 있습니다. 맞습니까? 따라서 재채기를 할 때마다 모든 위치를 다시 계산할 필요가 없습니다. 여는 것이 있으면 하나를 추가하고 닫는 것이 있으면 계산에서 하나를 제거하는 것으로 충분합니다.
 
Alexey Viktorov :

외환 시장과 헤지 계정이 맞습니까?

그리드 :) 네.

현재 논리는 다음과 같습니다. 각 그리드에 대한 모든 정보를 저장하는 구조가 있습니다: 기호-포지션 수-총 로트 이익 및 이 대화에서 중요하지 않은 몇 가지 기타 사항... 이익은 다음으로 재계산됩니다. 주문이 있는 경우 타이머(다중 기호 로봇). 그러나 로트와 수량은 OnTradeTransaction 에서 다시 계산되었습니다(사용자가 "도움"한 경우).

예를 들어, 한 그리드는 $100만큼 플러스에 있고 다른 그리드는 $50만큼 마이너스에 있는 경우를 확인하고 싶었습니다. 두 그리드를 모두 50의 이익으로 마감하여 성장하지 않도록 합니다.

현재 다음과 같이 완료됩니다.

 void    OnTradeTransaction (
   const MqlTradeTransaction &    trans,     // trade transaction structure 
   const MqlTradeRequest &        reqst,     // request structure 
   const MqlTradeResult &         reslt       // response structure 
    )
{
 int index=- 1 ;
 for (index= 0 ;index<symbols_total;index++)
   if (ARRAY[index].symbol==trans.symbol) break ; //нашли индекс символа по которому прошла трансакция в массиве структур
 
 if (index>= 0 ) CountOrders(index); //пересчитали элемент
}

지금까지 몇 개의 그리드를 닫은 후 CountOrders() 를 추가했습니다. 테스터의 경우 - 작동합니다. 사실은 블라디미르의 계획대로 할게

그건 그렇고, 이중 폐쇄는 그 자체를 정당화하지 못했습니다. 감소는 크게 줄어들지 않지만 이익은 적당히 줄어 듭니다.

 
Vladimir Karputov :

나는 포지션 마감 작업을 위해 Sleep과 OnTimer를 모두 버릴 것입니다. 나는 이것을 할 것입니다 : 닫기 명령 - OnTick 종료, 다음 틱 확인 : 필요한 티켓이있는 위치가 아직 살아있는 경우 - onTick의 입구 / 출구를 통해 원을 따라 다시 닫으라는 명령을 실행합니다.

논리는 다음과 같습니다. 포지션을 청산하는 것이 최우선이므로 청산 주기는 OnTick의 맨 처음에 있습니다. 그리고 마감 티켓 배열의 형성은 OnTick의 어느 곳에서나 가능합니다. 적어도 맨 마지막에는 말이죠.

그리고 조만간 다음을 얻게 될 것입니다. 포지션을 청산해야 하고 청산 주문(MQL5)을 보내야 합니다. 반대 유형의 주문을 보냈습니다. 해당 핸들러에서 거래 행동을 추적하지 않기 때문에(또는 조언자의 위치 상태를 저장하지 않기 때문에) 다음 틱에서 마감 주문이 전송되는 과정에 있을 수 있습니다. , 그리고 당신은 또 다른 명령을 내리고 있습니다. 결과는 반대 방향의 위치입니다.

 
Alexey Kozitsyn :

그리고 조만간 다음을 얻게 될 것입니다. 포지션을 청산해야 하고 청산 주문(MQL5)을 보내야 합니다. 반대 유형의 주문을 보냈습니다. 해당 핸들러에서 거래 행동을 추적하지 않기 때문에(또는 조언자의 위치 상태를 저장하지 않기 때문에) 다음 틱에서 닫기 주문이 전송되는 과정에 있을 수 있습니다. , 그리고 당신은 또 다른 명령을 내리고 있습니다. 결과는 반대 방향의 위치입니다.

이 경우 다음이 있습니다.

10036

TRADE_RETCODE_POSITION_CLOSED

지정된 POSITION_IDENTIFIER 의 직위 는 이미 마감되었습니다.

마감 위치는 티켓이 마감된 상태로 전송되므로 설명하는 일이 발생하지 않을 것입니다.

 
Sergey Dzyublik :

어디에 쓰여 있는지 이해가 가지 않았지만 그것은 중요하지 않습니다 ...
쿨러 감사합니다.

목발을 짚고 다음과 같이 달렸다.

글쎄, 일반적으로 배열은 이상하게 복사되지만 누군가는 그것을 좋아합니다 ...

나는 배열에 대해 어느 정도 적절한 래퍼를 만들었고 문제를 모릅니다.

https://www.mql5.com/ru/forum/221917/page26#comment_11233214

 
A100 :

내 생각은 아니지만 개발자

나는 그들이 그렇게 말한 것을 기억하지 못합니다.

할당 연산자 는 개체의 동일한 복사본을 만들도록 설계되었습니다. 이것이 그 의미입니다. 무언가를 무언가와 동일시할 때 분명히 왼쪽에 완전한 사본이 있어야 합니다. 따라서 이것은 분명히 버그입니다.