MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1853

 
EVGENII SHELIPOV # :

Rostislav 나는 이것을 이해한다

이 함수 내에서 플래그를 차단하면 어드바이저가 한 번에 100-200개 주문을 열고 닫기 시작하는 이유를 모르겠습니다.

플래그가 "0"이 아니면 지속적으로 CloseAll() 함수를 호출하기 때문입니다.
 
EVGENII SHELIPOV # :

이 함수 내에서 플래그를 차단하면 어드바이저가 한 번에 100-200개 주문을 열고 닫기 시작하는 이유가 명확하지 않습니다.

귀하의 코드로 설명합니다.

처음에는 깃발

 int flag_close= 0 ;
//+------------------------------------------------------------------+

다음은 오더 오픈

 //-------------------------------------------------------------------+  Команда на открытие первых ордеров в сетке
   if ((UseHour== 1 && Hour() >= StartTime && Hour()<=StopTime)||UseHour== 0 )
     {

또한 주문 마감에 대한 조건이 표시되는 경우(세 가지가 있음)

 //-------------------------------------------------------------------+  Команда на закрытие сетки ордеров при условии (Суммарный профит сетки >=0 и Просадка больше заданного уровня)
   if (CalculiteProfit() >= 0 && Drawdown > DrawdownClosingTakeprofitZero)
     {
      flag_close= 1 ;
//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров
   if ((CountTrade( 0 ) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()== 0 )||(CountTrade( 1 ) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()== 1 ))
     {
      flag_close= 1 ;
//-------------------------------------------------------------------+  Команда на закрытие первых ордеров
   if ((CountTrade( 0 ) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()== 0 )||(CountTrade( 1 ) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()== 1 ))
     {
      flag_close= 1 ;

플래그는 값 "1"을 얻고 주문 마감을 시작합니다.

 //-------------------------------------------------------------------+  Команда на закрытие ордеров
       if (flag_close== 1 )ClosseAll();

모든 주문이 마감되자마자 플래그는 "0" 값을 얻습니다.

   if (CountTrade() == 0 )
     {
       flag_close= 0 ;
 
Tretyakov Rostyslav # :
플래그가 "0"이 아니면 지속적으로 CloseAll() 함수를 호출하기 때문입니다.

명령이 명령을 여는 것으로 이어진다면 그렇게 할 수 있습니다. 여기에서 일종의 "루핑"이 발생합니다.

 
EVGENII SHELIPOV # :

명령이 명령을 여는 것으로 이어진다면 그렇게 할 수 있습니다. 여기에서 일종의 "루핑"이 발생합니다.

신용카드가 있습니까?

가게에 들어가서 맥주 한병씩 사서 카드에 0이 나올때까지 카드로 결제할때마다

그 후 카드를 채우고 다시 맥주를 마시러 갑니다.

 
Mihail Matkovskij # :

네. 그러나 자물쇠는 같은 로트에서 열립니다. 그리고 두 개의 다방향 주문이 동시에 열립니다. 그리고 헤징은 거래가 하락에 들어갔을 때 거래자가 같은 방향으로 더 큰 로트 의 포지션을 열 때(저는 다른 방향과 혼동했습니다), 이는 더 큰 로트를 사용하고 더 작은 로트로 거래 손실을 보상하거나 평균을 0으로 만듭니다. 혼동이 있는 경우 저를 수정하십시오.

헤징은 절대적으로 잠금이 아니며 부분 잠금이 아니라 완전히 다른 시스템입니다.

 
Vitaly Muzichenko # :

헤징은 절대적으로 잠금이 아니며 부분 잠금이 아니라 완전히 다른 시스템입니다.

그러나 나는 그것이 손실이라고 말하는 것이 아닙니다. 나는 어제 혼란스러웠다(그는 말했다: 단방향 포지션 대신 반대 포지션을 열어야 한다). 시간은 이미 늦었다. 오늘 나는 내가 어디에서 잘못되었는지 깨달았습니다.

 
Mihail Matkovskij # :

그러나 나는 그것이 손실이라고 말하는 것이 아닙니다. 나는 어제 혼란스러웠다(그는 말했다: 단방향 포지션 대신 반대 포지션을 열어야 한다). 시간은 이미 늦었다. 오늘 나는 내가 어디에서 잘못되었는지 깨달았습니다.

그러면 모든 것이 명확해집니다. :)

 
EVGENII SHELIPOV # :

명령이 명령을 여는 것으로 이어진다면 그렇게 할 수 있습니다. 여기에서 일종의 "루핑"이 발생합니다.

마감하려면 티켓과 함께 주문 목록을 만들어야 합니다(많은 사람들이 이미 여기에서 말했듯이). 로봇이 종료 신호를 감지한 경우 해당 주문(티켓)을 마감 목록에 추가합니다. 목록은 닫기(OrderClose) 요청을 보내는 루프에 의해 순회됩니다. 그런 다음 이 목록에 추가된 티켓이 있는 미결 주문이 있는지 지속적으로 확인해야 합니다. 하나 이상의 티켓을 찾을 수 없으면 목록에서 제거해야 합니다. 따라서 함수는 존재하지 않는 주문을 마감하라는 요청을 보내지 않습니다.

채워진 목록 기간 동안 나타난 새로운 신호 및 주문은 어떻게 해야 합니까? 종료 닫기 목록에 추가할 수도 있습니다. 그래서 그들은 또한 차례로 닫힐 것입니다. 그게 다야. 이러한 목록을 만들고 주기적으로 티켓별로 주문을 마감합니다. 루프 패스당 몇 초 또는 몇 초의 간격으로 가능합니다. 이 알고리즘을 구현하는 것이 남아 있으며 모든 것이 작동합니다.

 
Mihail Matkovskij # :

티켓으로 마감할 주문 목록을 만들어야 합니다(많은 사람들이 이미 여기에서 말했듯이). 로봇이 종료 신호를 감지한 경우 해당 주문(티켓)을 마감 목록에 추가합니다. 목록은 닫기(OrderClose) 요청을 보내는 루프에 의해 순회됩니다. 그런 다음 이 목록에 추가된 티켓이 있는 미결 주문이 있는지 지속적으로 확인해야 합니다. 하나 이상의 티켓을 찾을 수 없으면 목록에서 티켓을 제거해야 합니다. 따라서 함수는 존재하지 않는 주문을 마감하라는 요청을 보내지 않습니다.

채워진 목록 기간 동안 나타난 새로운 주문은 어떻게 해야 합니까? 닫기 목록에 추가할 수도 있습니다. 그래서 그들은 또한 차례로 닫힐 것입니다. 그게 다야. 그러한 목록을 작성하고 주기적으로 에티켓에 대한 주문을 마감하십시오. 루프 패스당 몇 초 또는 몇 초 간격으로 가능합니다. 이 알고리즘을 구현하는 것이 남아 있으며 모든 것이 작동합니다.

그리드가 이만큼 길면 눈이 오른쪽 그리드를 닫습니다.
후자가 마감되면 이미 10개의 주문을 마감해야 하는 일이 발생할 수 있으며 이제 모든 것이 차례로 닫히고 무기한 끌립니다.

 
Alexander Avksentyev # :

그리드가 이만큼 길면 눈이 오른쪽 그리드를 닫습니다.
후자가 닫힐 때 이미 10개의 주문을 닫아야 하는 상황이 발생할 수 있으며, 이제는 하나씩 모든 것이 닫히고 무한히 오래 지속됩니다.

확실히 그런 방식은 아닙니다. 어쨌든 모든 주문은 터미널에서 하나씩 닫힙니다. OrderSend 루프에서   초당 여러 번 실행할 수 있습니다(하드웨어에 따라 다름). 그러나 OrderSend는 닫기를 위해 대기열에 해당 명령만 추가합니다. 그런 다음 터미널 은 지정된 간격으로 또는 서버로부터 이전 요청에 대한 응답을 받은 후 이러한 명령을 즉시가 아니라 서버에 보냅니다. 따라서 어쨌든 많은 수의 주문(포지션)이 하나의 주문보다 훨씬 느리게 마감됩니다.