MQL4에 대한 질문 - 페이지 7

 
포럼 어딘가에서 개발자들은 init / deinit 작업에 대해 자세히 썼습니다. 누구든지 링크를 제공할 수 있습니까?
 
안녕하세요 여러분, 질문은 다음과 같습니다.
저는 Delphi에서 DLL을 생성했으며 MT4에서 호출합니다. 참조로 간단한 매개변수를 전달하는 것을 제외하고는 모든 것이 작동합니다. 델파이에서는 다음과 같이 선언했습니다.

절차 Test2(변수 i: 정수); 표준 호출;
시작하다
if addr(i) = nil then ShowMessage('도대체 뭐야?!');
끝;

그렇게 부르는 개그

#가져오기 "DLL1.dll"
무효 테스트2(int&i);

나는 이렇게 부른다.
정수() {
정수 x = 5;
테스트2(x);
리턴(x);
}

호출될 때 스택은 정수 변수에 대한 참조를 포함해야 하지만 null을 포함합니다.
그래서 참조로 int 매개변수를 전달하는 방법은 무엇입니까?
배열을 전달할 때 배열의 값은 일반적으로 참조로 전달됩니다.

사용
메타에디터 4.00 빌드 183
MetaTrader 4.00 빌드 186

즉시 또 다른 질문: 문자열이 링크로 전달되면 문자열의 수신 버퍼 크기는 어떻게 됩니까?

또 다른 질문:
함수의 결과로 문자열을 전달하면 문자열의 메모리 영역을 어디에 할당해야 합니까? DLL의 전역 변수 에 대한 포인터를 전달해야 합니까? 동시에, DLL이 메타트레이더의 어떤 모드에서도 동시에 다른 스레드에서 호출되지 않는다고 확신할 수 있습니까?

미리 감사드립니다
 
현재 구현은 동일한 소스 코드 내에서만 참조로 매개변수를 전달할 수 있도록 하고 있습니다. 배열은 예외입니다. 배열을 dll에 전달하면 해당 요소의 값을 변경할 수 있으며 이러한 변경 사항은 호출 함수 에서 사용할 수 있습니다. 즉, 매우 작은 배열을 전송할 수 있습니다.
 
MQL4에서 이것을 구현하는 방법
하루의 시작에 우리는 두 개의 보류 주문 을 설정했습니다
하나(임의)가 작동한 후 - 두 번째가 제거됨
바가 닫히기 5분 전(일일이라고 가정해 봅시다), 트리거된 바를 닫습니다(SL 또는 TP로 닫히지 않은 경우).
보류 중인 주문이 작동하지 않으면 막대가 닫히기 5분 전에 두 주문을 모두 삭제합니다.
미리 감사드립니다
 
1) 문자열이 링크로 전달되면 문자열 수신 버퍼의 크기는 얼마입니까?

2) 함수의 결과로 문자열을 전달하면 문자열에 대한 메모리 영역을 어디에 할당해야 합니까? DLL의 전역 변수 에 대한 포인터를 전달해야 합니까? 동시에 메타트레이더의 어떤 모드에서도 DLL이 다른 스레드에서 동시에 호출되지 않는다고 확신할 수 있습니까?

미리 감사드립니다
 
MQL4에서 이것을 구현하는 방법
하루의 시작에 우리는 두 개의 보류 주문을 설정했습니다
하나(임의)가 작동한 후 - 두 번째가 제거됨
바가 닫히기 5분 전(일일이라고 가정해 봅시다), 트리거된 바를 닫습니다(SL 또는 TP로 닫히지 않은 경우).
보류 중인 주문이 작동하지 않으면 막대가 닫히기 5분 전에 두 주문을 모두 삭제합니다.
미리 감사드립니다

따라서 이를 구현하고 적절한 시간에 보류 주문을 제출합니다(쉽습니다). 그리고 주문 확인을 시작합니다. 매수 또는 매도 주문이 나타나자 마자 보류 중인 주문을 삭제하는 연습을 하십시오(훨씬 더 쉽습니다). 그런 다음 적시에 모든 주문을 마감합니다(매우 간단합니다).
 
Как в MQL4 реализовать такое
в начале дня устанавливаем два отложенных ордера
После того как один(любой) сработал - второй удаляется
За пять минут до закрытия бара(допустим дневного) закрыть сработавший (если он не был закрыт по SL или TP)
Если ни один отложенный ордер не соработал то за пять минут до закрытия бара удаляем их обоих
Заранее спасибо

따라서 이를 구현하고 적절한 시간에 보류 주문을 제출합니다(쉽습니다). 그리고 주문 확인을 시작합니다. 매수 또는 매도 주문이 나타나자 마자 보류 중인 주문을 삭제하는 연습을 하십시오(훨씬 더 쉽습니다). 그런 다음 적시에 모든 주문을 마감합니다(매우 간단합니다).


작동하는 코드를 요청했습니다(누군가가 구현했을 수 있음)
내가 하지 않은 모든 것이 ... 어쩐지 서투르게 처리 된 odrerdelete
또 다른 질문은 때때로 이 상품의 가격이 몇 분 동안 고정된다는 것입니다(틱 없음). 주문을 마감할 방법이 없기 때문에 int start()의 본문은 실행되지 않지만 다른 매개변수에 대한 틱이 수신되지만 틱이 오는 모든 도구에서 Curetime 값을 어떻게든 전달할 수 있습니까?
간단히 말해서 큐어타임의 가치가 실질적으로 떨어지지 않도록
 
당신이하고 싶은 것은 알파벳입니다. 주요 운영자가 어떻게 작동하는지 이해하지 않고는 깊이 들어갈 수 없습니다. 그리고 모든 차트에서 모든 주문을 마감할 수 있습니다. 다음과 같이 될 수 있습니다.
 cnt=0; 
   동안(cnt<1) 
    { 
    if(OrdersTotal()<1) break;                          
    주문 선택(cnt, SELECT_BY_POS, MODE_TRADES); 
    cmd=주문 유형(); 
    for(z=0;z<3;z++) 
     { 
     새로 고침(); 
     if(cmd==2||cmd==3||cmd==4||cmd==5)result=OrderDelete(OrderTicket()); 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); 
     if(cmd==1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); 
     if(결과) 휴식; 절전(1000); 
     } 
    수면(10000); 
    }
 
당신이하고 싶은 것은 알파벳입니다. 주요 운영자가 어떻게 작동하는지 이해하지 않고는 깊이 들어갈 수 없습니다. 그리고 모든 차트에서 모든 주문을 마감할 수 있습니다. 다음과 같이 될 수 있습니다.
 cnt=0; 
   동안(cnt<1) 
    { 
    if(OrdersTotal()<1) break;                          
    주문 선택(cnt, SELECT_BY_POS, MODE_TRADES); 
    cmd=주문 유형(); 
    for(z=0;z<3;z++) 
     { 
     새로 고침(); 
     if(cmd==2||cmd==3||cmd==4||cmd==5)result=OrderDelete(OrderTicket()); 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); 
     if(cmd==1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); 
     if(결과) 휴식; 절전(1000); 
     } 
    수면(10000); 
    }



그리고 이 코드 조각은 무엇을 합니까?
아직 실행되지 않은 보류 주문 을 모두 삭제합니다.
 
당신은 술집이 닫히기 5분 전에 모든 주문을 파기하도록 요청했습니다. 그래서 그는 모든 것을 제거할 것입니다. 그에게 적절한 시간을 주십시오. 그리고 다른 코드를 사용하여 불필요한 주문을 마감하십시오. 아니면 전체 프로그램이 당신을 위해 작성되기를 원하십니까?