기고글 토론 "여러 상품을 거래하는 Expert Advisor 생성" - 페이지 5

 
Interesting:
By Tnew[1] 잘못된 배열 범위 - 범위 오버런인 것 같습니다. 배열 요소의 번호 매기기는 배열 범위의 시작부터 시작한다는 것을 잊지 마세요.

2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #에서 메시지 편집에 액세스할 수 없습니다.

대체:8.왜 Exp_TEMA.mq5가 테스트할 때 바 안에서 거래를 여는가?

8.Exp_TEMA.mq5가 테스트할 때 하나의 바에서 여러 거래를 여는 이유는 무엇입니까?

 
ias:
2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #.

게시물은 게시 후 3일 이내에만 수정할 수 있습니다.

 

ias:

8. Exp_TEMA.mq5가 테스트할 때 하나의 바에서 여러 개의 거래를 여는 이유는 무엇인가요?

이전에 개설된 포지션이 있는지 확인하고 주문을 설정하지 않는다고 가정하는 것이 합리적일 것입니다.....
 

Interesting:
Логично будт предположить то, что там нет проверки наличия ранее открытых позиций и установленных отложников...

흥미롭습니다:
이전에 개설된 포지션이 확인되지 않는다고 가정하고 보류 주문을 설정하는 것이 논리적입니다....

Exp_TEMA.mq5에서는 지정가 주문 이 사용되지 않습니다. 이전에 개설된 포지션이 체크인됩니다:

//+X================================================================X+
bool BuyPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool SellPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool BuyPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
     {
      if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_BUY) return(false);
     }
    else  return(false);
//+X================================================================X+
bool SellPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
    {
     if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL)return(false);
    }
   else return(false); 

아마도 뭔가 잘못되었을 것입니다:

//+X================================================================X+
bool IsNewBar(int Number, string symbol, ENUM_TIMEFRAMES timeframe)
  {
//----+
   static datetime Told[];
   datetime Tnew[1];
   
   //----+ 가변 배열의 크기를 저장하기 위한 변수 선언
   static int Size_ = 0;
   
   //----+ 가변 배열 크기 조정하기
   if (Number + 1 > Size_)
    {
     uint size = Number + 1;
     //----
     if (ArrayResize(Told, size) == -1)
      {
       string word = "";
       StringConcatenate(word, "IsNewBar( ", Number,
                    " ): 오류!!! 변수 배열의 크기를 조정하지 못했습니다!!!"); 
       Print(word); 
       //---- 
       int error = GetLastError();
       ResetLastError();
       if (error > 4000)
        {
         StringConcatenate(word, "IsNewBar( ", Number, " ): 오류 코드 ", error);
         Print(word); 
        }  
       //---- 
       Size_ = -2;
       return(false);
      }
    }
   
   CopyTime(symbol, timeframe, 0, 1, Tnew); 
   if (Tnew[0] != Told[Number])
    {
     Told[Number] = Tnew[0];
     return(true);
    }
//----+
   return(false);
  }

또는

//+X================================================================X+
bool TradeSignalCounter
                      (
                       int Number,
                       string Symbol_,
                       bool Trade,
                       int period,
                       ENUM_APPLIED_PRICE ApPrice,
                       bool& UpSignal[],
                       bool& DnSignal[],
                       bool& UpStop[],
                       bool& DnStop[]
                      )
  
  {
//----+
   //----+ 거래 금지 확인
   if (!Trade)return(true);
   
   //----+ 가변 배열의 총 크기를 저장할 변수를 선언합니다.
   static int Size_ = 0;
   
   //----+ 인디케이터 핸들을 정적 변수로 저장하기 위한 배열 선언하기
   static int Handle[];
   
   static int Recount[], MinBars[];
   double TEMA[4], dtema1, dtema2;
   
   //----+ 초기화 
   if (Number + 1 > Size_) // 처음 시작할 때만 초기화 블록에 항목 입력
    {
     Size_ = Number + 1; // 이 번호에 대한 블록 진입이 종료되었습니다.
     
     //---- 가변 배열 크기 조정하기
     ArrayResize(Handle,   Size_);
     ArrayResize(Recount,  Size_);
     ArrayResize(MinBars,  Size_);
     
     //---- 계산에 충분한 최소 막대 수 결정하기 
     MinBars[Number] = 3 * period;
     
     //---- 어레이 셀의 예비 영점 조정
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //---- 배열을 시계열로 사용
     ArraySetAsSeries(TEMA, true);
     
     //----+ 표시기 핸들 가져오기
     Handle[Number] = iTEMA(Symbol_, PERIOD_CURRENT, period, 0, ApPrice);
    }
     
   //----+ 계산에 충분한 막대 수를 확인합니다. 
   if (Bars(Symbol_, 0) < MinBars[Number])return(true);

   //----+ 거래 신호 수신 
   if (IsNewBar(Number, Symbol_, PERIOD_CURRENT) || Recount[Number]) // 막대 변경 또는 데이터 복사 실패 시 블록에 항목 입력
    {
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //----+ 표시기 핸들을 사용하여 표시기의 값을 복사합니다.
                   // 버퍼를 특별히 준비된 정적 배열에 넣습니다.
     if (CopyBuffer(Handle[Number], 0, 0, 4, TEMA) < 0)
      {
       Recount[Number] = true; // 데이터가 수신되지 않았으므로 다음을 반환해야 합니다. 
                                 //를 다음 틱에 거래 신호를 수신하는 이 블록에 입력하세요!
       return(false); // 거래 신호를 수신하지 않고 TradeSignalCounter() 함수를 종료합니다.
      }
      
     //---- 표시기 버퍼에서 복사하는 모든 작업이 성공적으로 완료되었습니다.
     Recount[Number] = false; // 다음 바가 변경될 때까지 이 블록으로 돌아가지 않을 수 있습니다.
     
     int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS) + 4;
     dtema2 = NormalizeDouble(TEMA[2] - TEMA[3], Digits_);
     dtema1 = NormalizeDouble(TEMA[1] - TEMA[2], Digits_);
     
     //---- 입력 신호의 정의
     if (dtema2 > 0 && dtema1 < 0) DnSignal[Number] = true;
     if (dtema2 < 0 && dtema1 > 0) UpSignal[Number] = true;
     
     //---- 출력 신호의 정의
     if (dtema1 > 0) DnStop[Number] = true;
     if (dtema1 < 0) UpStop[Number] = true;
    }
//----+
   return(true);
  } 

EURUSD, 기간 D1에서 Exp_TEMA.mq5 테스트 시 하나의 바에 여러 개의 거래가 있음

 
, 기사 작성자에게 가는 것이 좋습니다....
 
ias:

Exp_TEMA.mq5가 테스트할 때 바 안에서 거래를 여는 이유는 무엇입니까?

Exp_TEMA.mq5가 테스트 할 때 하나의 바에서 여러 거래를 여는 이유는 무엇입니까?

요점은이 기사의 맥락에서 본질을 이해하는 데 방해가되는 사소한 세부 사항으로 주요 아이디어를 어지럽히 지 않고 간단한 다중 통화 전문가 조언자를 구현하는 것이 과제였습니다. 그리고 모든 사람은 세부 사항을 채우는 자신 만의 방법이 있습니다. 귀하의 상황에서는 모든 것이 기본적으로 해결됩니다. 거래 신호의 변수는 거래 기능의 입력으로 만들어지고 링크로 연결되며 이러한 변수는 거래 기능 내에서 거래 후 재설정됩니다.
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
GODZILLA:
요점은 이 글의 맥락에서 본질을 이해하는 데 방해가 되는 사소한 세부 사항으로 주요 아이디어를 어지럽히지 않고 간단한 다중 통화 전문가 어드바이저를 구현하는 것이 목표였다는 것입니다. 그리고 모든 사람은 세부 사항을 채우는 자신 만의 방법이 있습니다. 귀하의 상황에서는 모든 것이 기본적으로 해결됩니다. 거래 신호의 변수는 거래 기능의 입력으로 만들어지고 링크로 연결되며 이러한 변수는 거래 기능 내에서 거래가 실행 된 후 재설정됩니다.
Expert Advisor Exp_TEMA.mq5의 예에서 어떻게 하는지 보여주세요.
 

ias:
Покажите, пожалустайста, на примере вышего эксперта Exp_TEMA.mq5, как это сделать.

제 생각에 프로그래밍 언어를 배우고 이해하는 것은 개인이 자신의 필요에 따라 코드를 재정렬하는 작은 작업을 해결하는 것으로 구성됩니다. 그렇지 않다면 이 사이트와 프로그래밍 기사가 왜 필요한가요? 기사 작성자의 능력을 보여주기 위해? 스스로 이해하고 싶지 않은 사람들은 https://www.mql5.com/ru/job
예를 들어 MQL4에서는이 접근 방식을 다음과 같이 가장 간단한 형태로 구현했습니다 https://www.mql5.com/ko/articles/1516. MQL5의 경우 아무것도 변경되지 않고 모든 것이 동일한 방식으로 수행됩니다(

).

 
GODZILLA:

"다른 상품에서 거래하는 전문가 조언자 만들기"기사의 작성자에게 큰 존경을 표합니다.
1.이 주제에 대해 앞서보고 한 바와 같이 테스트 중에 하나의 막대에서 여러 거래를 여는 전문가 조언자 Exp_TEMA.mq5의 코드
이 사실은 많은 사이트 방문자가 제거하고자하는 전문가 조언자에 잘못된 코드 또는 버그가 있음을 확인합니다.
2."전문가 조언자 : 멀티 캐스트"주제에 대한 Roche의 답변 : "게다가 새 막대를 결정하는 기능은 시간 복사 기능을 사용하지 않고도 구현할 수 있습니다." - 또한 전문가 조언자에서 IsNewBar () 함수의보다 합리적인 작성 가능성을 확인합니다.
누구나 실수를 할 수 있고 전문가 만이이를 올바르게 수정할 수 있으므로 작성자가 이러한 결함을 어떻게 전문적으로 제거 할 것인지보고 싶습니다.
 
ias:

기사에 제시된 거래 시스템을 자세히 살펴보면 전복 시스템이라는 결론을 내릴 수 있습니다. 이러한 시스템에서 스톱로스는 부차적 인 역할을하며 진입에서 매우 적절한 거리에 배치되며 적어도 여러 개의 양초로 계산됩니다. 자료 발표의 전문성은 스스로 생각하고 싶지 않은 대중을 기반으로하지 않고 추가 속임수로 주제를 어지럽히 지 않고 가능한 가장 단순한 형태로 전개하는 것으로 구성됩니다. 모든 교과서는 항상 이상이라는 측면에서 결함이 있습니다. 그리고 이것은 허용 가능하고 정상적인 것으로 간주됩니다. 앞으로는 거래 시스템 구축에 대한 이러한 세부 사항을 자세히 설명하는 순서가있을 것이며 구현에 대한 자세한 검토가있을 것이며 이는 그렇게 간단하지도 않습니다.
시간 복사에 관해서는 확실히 말할 수 있지만, 나는 그것을 측정했지만 Expert Advisor에서 IsNewBar () 함수의보다 합리적인 작성과 큰 차이를 보지 못했습니다! 이 주제에 대한 기사도 썼습니다.
그리고 예를 들어 원한다면이 사이트의 모든 기사를 아무런 문제없이 찢어 버릴 수 있습니다. 그러나 저는 정보가 이상에 대한 제 생각과 일치하기 때문이 아니라 우선 정보를 사용할 수 있기 때문에 감사합니다.
따라서 나는 억지스러운 결함을 제거하지 않을 것이며 동시에 매우 이해할 수 있고 매우 전문적인 이유로 그렇게 간단하지 않은 코드를 상당히 복잡하게 만들지 않을 것입니다.