EA에서 막대를 거꾸로 분석하기 - 페이지 2

 
FMIC :

EA에는 OnStart() 가 없지만 의미하는 바는 알겠습니다. 그러나 OP는 귀하의 의견에 대해 다음과 같이 말했습니다.

예, OnTick()을 의미했습니다. 당신은 여전히 "EA가 실행되는 동안"에 너무 많은 의미를 부여하고 있습니다. "EA가 차트에 첨부되는 동안, 즉 전체 수명 동안"이 아니라 "EA가 OnTick()을 실행하는 동안"을 반드시 의미하지는 않거나 가장 그럴듯하게 의미합니다.

paranoyakX에서 더 많은 정보가 필요합니다.

 
jjc :

예, OnTick()을 의미했습니다. 당신은 여전히 "EA가 실행되는 동안"에 너무 많은 의미를 부여하고 있습니다. "EA가 차트에 첨부되는 동안, 즉 전체 수명 동안"이 아니라 "EA가 OnTick()을 실행하는 동안"을 반드시 의미하지는 않거나 가장 그럴듯하게 의미합니다.

paranoyakX에서 더 많은 정보가 필요합니다.

안녕하세요 여러분,

이것을 명확히 하겠습니다. 내 코드는 이전 막대에서 매우 기본적인 패턴을 찾고 있으며 주문이 열릴지 여부를 결정하지만 새 주문을 여는 것은 새 막대가 나타날 때만 확인 됩니다. 내 말은 내가 마지막 바 닫기를 기다리고 있다는 뜻입니다. 그런 다음 패턴이 정상이면 주문을 열겠습니다. 그래서 오프닝은 새로운 바의 오프닝에서 일어나고 있습니다. @jjc가 말했듯이 나는 내 패턴이 언제 시작되고 종료되었는지, 가장 높은 값과 가장 낮은 값이 무엇인지 등과 같은 전역 변수에 기본 패턴 정보를 보유하고 있습니다.

어떻게든 EA를 다시 실행해야 하는 경우 이러한 기본 정보(패턴 시작 및 끝 막대, 최고가, 최저 가격 등)를 다시 찾고 전역 변수를 다시 채우고 싶기 때문에 이것이 필요합니다. 시작 및 종료 정보를 사용하여 주문을 마감할 시기를 결정합니다. 그래서 OnInit에 새로운 바가 안 뜨면 충분하고, EA가 실행되는 동안에는 문제가 되지 않습니다.

 
jjc :

예, OnTick()을 의미했습니다. 당신은 여전히 "EA가 실행되는 동안"에 너무 많은 의미를 부여하고 있습니다. "EA가 차트에 첨부되는 동안, 즉 전체 수명 동안"이 아니라 "EA가 OnTick()을 실행하는 동안"을 반드시 의미하지는 않거나 가장 그럴듯하게 의미합니다.

paranoyakX에서 더 많은 정보가 필요합니다.

예! 당신이 올바른지! OP의 최신 정보에서 그는 OnTick() 이 아닌 OnInit() 에서 모든 것을 확실히 실행하고 있습니다. 나는 OP가 일을 조금 더 올바르게 하고 있다고 잘못 가정했습니다. 그의 모든 논리가 OnInit() 에 있다는 것은 생각지도 못했습니다.
 
paranoyakX :

안녕하세요 여러분,

이것을 명확히 하겠습니다. 내 코드는 이전 막대에서 매우 기본적인 패턴을 찾고 있으며 주문이 열릴지 여부를 결정하지만 새 주문을 여는 것은 새 막대가 나타날 때만 확인됩니다. 내 말은 내가 마지막 바 닫기를 기다리고 있다는 뜻입니다. 그런 다음 패턴이 정상이면 주문을 열겠습니다. 그래서 오프닝은 새로운 바의 오프닝에서 일어나고 있습니다. @jjc가 말했듯이 나는 내 패턴이 언제 시작되고 종료되었는지, 가장 높은 값과 가장 낮은 값이 무엇인지 등과 같은 전역 변수에 기본 패턴 정보를 보유하고 있습니다.

어떻게든 EA를 다시 실행해야 하는 경우 이러한 기본 정보(패턴 시작 및 끝 막대, 최고가, 최저 가격 등)를 다시 찾고 전역 변수를 다시 채우고 싶기 때문에 이것이 필요합니다. 시작 및 종료 정보를 사용하여 주문을 마감할 시기를 결정합니다. 그래서 OnInit에 새로운 바가 안 뜨면 충분하고, EA가 실행되는 동안에는 문제가 되지 않습니다.

OnInit() 에서 이 모든 작업을 수행해서는 안 됩니다. OnTick() 에서 모든 논리(복구 포함)를 수행해야 합니다. 이것은 중요합니다 ! OnInit() 에서 수행하면 예상하지 못한 추가 문제가 발생하고 해당 논리를 모두 수행하는 동안 EA가 "초기화" 상태로 남게 됩니다. 그러니 제대로 하세요! 초기화(변수, 외부 매개변수 검사 등)만 OnInit() 에서 수행하고 다른 모든 것은 OnTick() 에서 수행하십시오.
 
FMIC :
OnInit() 에서 이 모든 작업을 수행해서는 안 됩니다. OnTick() 에서 모든 논리(복구 포함)를 수행해야 합니다. 이것은 중요하다! OnInit() 에서 수행하면 예상하지 못한 추가 문제가 발생하고 해당 논리를 모두 수행하는 동안 EA가 "초기화" 상태로 남게 됩니다. 그러니 제대로 하세요! 초기화(변수, 외부 매개변수 검사 등)만 OnInit() 에서 수행하고 다른 모든 것은 OnTick() 에서 수행하십시오.

아니, 아니! 죄송합니다. OnTick에서 모든 것을 실행하고 있습니다. 그러나 단순히 이 진드기가 새로운 바에 속하는지 확인 하고 직원을 수행합니다. 내가 OnInit에서 실행하는 것은 이전에 계산한 주문과 패턴을 다시 찾아 다시 계산하는 것입니다. 나는 이것이 OnInit에서 실행 중이라고 말했고, 현재 열려 있는 주문이 속한 내 패턴을 찾습니다.

설명할 수 있기를 바랍니다.

 
paranoyakX :

아니, 아니! 죄송합니다. OnTick에서 모든 것을 실행하고 있습니다. 그러나 단순히 이 진드기가 새 바에 속하는지 확인하고 직원을 수행합니다. 내가 OnInit에서 실행하는 것은 이전에 계산한 주문과 패턴을 다시 찾아 다시 계산하는 것입니다. 나는 이것이 OnInit에서 실행 중이라고 말했고, 현재 열려 있는 주문이 속한 내 패턴을 찾습니다.

설명할 수 있기를 바랍니다.

예, 귀하의 게시물에서 이해했습니다! 내가 말하는 것은 OnInit()에서 그렇게 하지 말라는 것입니다. OnTick()에서 주문과 패턴 및 모든 계산을 찾아야 합니다.

OnTick()에서 로컬 정적 변수를 정의하고 모든 검사 및 패턴 정의를 수행한 다음 변수를 false로 설정합니다.

 void OnTick ()
{
   static bool FirstOnTick = true ;

   if ( FirstOnTick )
   {
       // Check Orders, Patterns, whatever

      FirstOnTick = false ;
   }

   // Here you do your normal OnTick handling
}
 
FMIC :

예, 귀하의 게시물에서 이해했습니다! 내가 말하는 것은 OnInit()에서 그렇게 하지 말라는 것입니다. OnTick()에서 주문과 패턴 및 모든 계산을 찾아야 합니다.

OnTick()에서 로컬 정적 변수를 정의하고 모든 검사 및 패턴 정의를 수행한 다음 변수를 false로 설정합니다.

죄송합니다. 전에 잘못 이해했습니다. 왜 OnInit을 하지 않습니까? 더 편리하지 않습니까? 그렇게 할 때 첫 번째 틱 이후의 모든 틱 에 대해 실행되고 if 문은 true가 아닐 것입니다. 코드에 불필요한 부하가 걸린다고 생각했습니다.

내 전역 변수와 같은 것을 초기화하기 위해 OnInit가 존재하는 이유가 아닌가요?

 
paranoyakX :

설명할 수 있기를 바랍니다.

나는 당신이 말하는 것을 확실히 하기 위해 몇 가지 코드를 볼 필요가 있다고 생각합니다. 예를 들어, (a) 공개 거래를 관리하는 방법, 언제 종료해야 하는지 등을 알려주기 때문에 기존 공개 거래를 생성한 역사적 패턴을 찾고 있는지 또는 (b) 기존 거래가 시작된 이유를 설명하는 차트에 몇 가지 마커를 그립니다.

나는 일반적으로 OnTick()에서 가능한 한 많은 작업을 수행하고 전역 변수에서 가능한 한 적은 상태를 유지해야 한다는 FMIC에 동의합니다.

 
paranoyakX :

죄송합니다. 전에 잘못 이해했습니다. 왜 OnInit을 하지 않습니까? 더 편리하지 않습니까? 그렇게 할 때 첫 번째 틱 이후의 모든 틱에 대해 실행되고 if 문은 true가 아닐 것입니다. 코드에 불필요한 부하가 걸린다고 생각했습니다.

내 전역 변수와 같은 것을 초기화하기 위해 OnInit가 존재하는 이유가 아닌가요?

아니요, 초기화 실행을 보류하고 정적 변수가 상태를 유지하므로 OnInit() 에서 그렇게 하는 것은 옳지 않습니다. 그래서 모든 OnTick ( ) . "if( FirstOnTick )" 는 매우 빠르고 부하가 매우 적습니다. 특히 OnTick() 에서 실행 중인 다른 모든 코드와 비교할 때 특히 그렇습니다.
 

조언에 감사드립니다. 여기에 내 코드의 매우 간단한 버전이 있습니다. 이것은 실제 코드가 아니지만 이것이 더 명확하기를 바랍니다.

내가 말했듯이 이것은 실제 코드가 아니며 패턴 등을 찾는 것은 단지 예일 뿐입니다. 이 스레드를 연 이유는 DetectExistingPattern() 함수 입니다.

 //+------------------------------------------------------------------+
//|                                                          Mustafa |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mustafa"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int MagicNumber= 100 ;


int OnInit ()
  {
//---
   DetectExistingPattern();
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


int LastBar= 0 ;
double HighestValue, LowestValue;

void OnTick ()
  {
//---
    MyStart();

  }


void MyStart(){
    
    CloseOpenedOrders();

     if (LastBar == Bars ) return ;
    LastBar = Bars ;

     if (!CheckForExistedOrders()) {       
       
       if (CheckTrendPattern()){
           PlaceOrders();
       };
    };
};

bool CheckForExistedOrders(){
   for ( int TradeNumber = OrdersTotal (); TradeNumber >= 0 ; TradeNumber--){
     if ( ( OrderSelect (TradeNumber, SELECT_BY_POS, MODE_TRADES)) && (OrderMagicNumber() == MagicNumber )) return true ;
  };
   return false ;

};


bool CheckTrendPattern(){
 
   for ( int i= 10 ; i>= 1 ; i--) {
     if (High[i]>High[i- 1 ])
       return false ;
  };
  HighestValue = High[ 10 ];
  LowestValue  = Low[ 1 ];
  
   return true ;
};



void PlaceOrders(){  
     int OrderResult = OrderSend ( Symbol (), OP_BUY, 1 , Ask, 5 , 0 , 0 , "" , MagicNumber);
}
//+------------------------------------------------------------------+

void CloseOpenedOrders(){
   // I will use HighestValue and LowestValue here, so I need to re calculate them.
};

void DetectExistingPattern() {
   // Find HighestValue and LowestValue again, this part is the reason why I opened the thread!!! I want to run this in OnInıt()
   // I will find opened order and find the previos pattern that cause me to open that order.
};