이동 평균이 교차하는 막대의 시간을 찾는 방법은 무엇입니까? (내부 코드)

 

모두 안녕!

내 코드에 도움이 되기를 바랐습니다 - 현재 이 빌어먹을 부분에 붙어 있습니다!


이것은 아래 코드에 작성하려고 하는 프로세스입니다.

1) 가격이 모든 이동 평균 위에 있고 장기 잠재력을 나타내도록 모든 MA가 "팬아웃"되고 교차되는 경우.

2) 이동 평균이 이동 평균의 교차점에서 "분리"되는 정확한 막대(시간 사용)를 알고 싶습니다.

3) 1과 2가 참이면 막대가 다시 내려오기를 기다리고(롱 포지션의 경우) 21 EMA를 터치합니다.

4) 첫 번째 막대(MA가 교차하고 확장된 위치)에서 현재 21 EMA에 닿은 막대까지 - 이 범위(1 & 3)의 고점 위에 위치한 시장 거래 또는 보류 주문 을 원합니다.

5) 주문을 실행하기 전에 가격이 60 EMA 아래로 닫히면 주문이 취소됩니다.

이것은 분명히 모든 코드는 아니지만 이것이 내가 머리를 뽑는 주요 부분입니다. "<<<<<<<<<<<<"로 코드를 확인하십시오. 제가 헷갈리는 부분들입니다.

누군가의 도움으로 정말 할 수 있습니다. 정말 감사할 것입니다!

미리 감사드립니다!

 datetime          triggerBarTime;   <<<<< Global settings.
datetime          triggerBarTime1;  <<<<< Global settings.	



void CheckForMaTrade()
{

//+-----------------------------------------------------------------------------------------------------------------------+ 
     //Small and Big Fish on the H1 Time Frame.                                                                           |
//+-----------------------------------------------------------------------------------------------------------------------+              

   {
   double PreviousSmallFish1  =   iMA ( NULL , 60 , 3 , 0 , 1 , 0 , 2 ); 
   double CurrentSmallFish1   =   iMA ( NULL , 60 , 3 , 0 , 1 , 0 , 1 );
   double PreviousSmallFish2  =   iMA ( NULL , 60 , 5 , 0 , 1 , 0 , 2 );
   double CurrentSmallFish2   =   iMA ( NULL , 60 , 5 , 0 , 1 , 0 , 1 );
   double PreviousSmallFish3  =   iMA ( NULL , 60 , 8 , 0 , 1 , 0 , 2 );
   double CurrentSmallFish3   =   iMA ( NULL , 60 , 8 , 0 , 1 , 0 , 1 );
   double PreviousSmallFish4  =   iMA ( NULL , 60 , 10 , 0 , 1 , 0 , 2 );
   double CurrentSmallFish4   =   iMA ( NULL , 60 , 10 , 0 , 1 , 0 , 1 );  
   double PreviousSmallFish5  =   iMA ( NULL , 60 , 12 , 0 , 1 , 0 , 2 );
   double CurrentSmallFish5   =   iMA ( NULL , 60 , 12 , 0 , 1 , 0 , 1 );
   double PreviousSmallFish6  =   iMA ( NULL , 60 , 15 , 0 , 1 , 0 , 2 );
   double CurrentSmallFish6   =   iMA ( NULL , 60 , 15 , 0 , 1 , 0 , 1 );  
   
       double PreviousBigFish1  =   iMA ( NULL , 60 , 30 , 0 , 1 , 0 , 2 ); 
       double CurrentBigFish1   =   iMA ( NULL , 60 , 30 , 0 , 1 , 0 , 1 );
       double PreviousBigFish2  =   iMA ( NULL , 60 , 35 , 0 , 1 , 0 , 2 );
       double CurrentBigFish2   =   iMA ( NULL , 60 , 35 , 0 , 1 , 0 , 1 );
       double PreviousBigFish3  =   iMA ( NULL , 60 , 40 , 0 , 1 , 0 , 2 );
       double CurrentBigFish3   =   iMA ( NULL , 60 , 40 , 0 , 1 , 0 , 1 );
       double PreviousBigFish4  =   iMA ( NULL , 60 , 45 , 0 , 1 , 0 , 2 );
       double CurrentBigFish4   =   iMA ( NULL , 60 , 45 , 0 , 1 , 0 , 1 );
       double PreviousBigFish5  =   iMA ( NULL , 60 , 50 , 0 , 1 , 0 , 2 );
       double CurrentBigFish5   =   iMA ( NULL , 60 , 50 , 0 , 1 , 0 , 1 );
       double PreviousBigFish6  =   iMA ( NULL , 60 , 60 , 0 , 1 , 0 , 2 );
       double CurrentBigFish6   =   iMA ( NULL , 60 , 60 , 0 , 1 , 0 , 1 ); 
      
             if (PreviousBigFish1<CurrentBigFish2 && CurrentBigFish1>PreviousBigFish2)
               if (PreviousBigFish2<CurrentBigFish3 && CurrentBigFish2>PreviousBigFish3)
                   if (PreviousBigFish3<CurrentBigFish4 && CurrentBigFish3>PreviousBigFish4)
                     if (PreviousBigFish4<CurrentBigFish5 && CurrentBigFish4>PreviousBigFish5)
                         if (PreviousBigFish5<CurrentBigFish6 && CurrentBigFish5>PreviousBigFish6)  
                           
                           if (PreviousSmallFish1<CurrentSmallFish2 && CurrentSmallFish1>PreviousSmallFish2)
                         if (PreviousSmallFish2<CurrentSmallFish3 && CurrentSmallFish2>PreviousSmallFish3)
                     if (PreviousSmallFish3<CurrentSmallFish4 && CurrentSmallFish3>PreviousSmallFish4)
                   if (PreviousSmallFish4<CurrentSmallFish5 && CurrentSmallFish4>PreviousSmallFish5)
                 if (PreviousSmallFish5<CurrentSmallFish6 && CurrentSmallFish5>PreviousSmallFish6)triggerBarTime = Time[ 1 ];  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      
      
       double ema21 = iMA ( NULL , 60 , 21 , 0 , 1 , 0 , 1 ); 
       
        
         if (Low[ 1 ]<ema21)
         {
         
           OrderEntry( 0 ); // BUY 
            }     
      
      
                
     if (PreviousBigFish1>CurrentBigFish2 && CurrentBigFish1<PreviousBigFish2)
       if (PreviousBigFish2>CurrentBigFish3 && CurrentBigFish2<PreviousBigFish3)
         if (PreviousBigFish3>CurrentBigFish4 && CurrentBigFish3<PreviousBigFish4)
             if (PreviousBigFish4>CurrentBigFish5 && CurrentBigFish4<PreviousBigFish5)
               if (PreviousBigFish5>CurrentBigFish6 && CurrentBigFish5<PreviousBigFish6)
               
               if (PreviousSmallFish1>CurrentSmallFish2 && CurrentSmallFish1<PreviousSmallFish2)
             if (PreviousSmallFish2>CurrentSmallFish3 && CurrentSmallFish2<PreviousSmallFish3)
         if (PreviousSmallFish3>CurrentSmallFish4 && CurrentSmallFish3<PreviousSmallFish4)
       if (PreviousSmallFish4>CurrentSmallFish5 && CurrentSmallFish4<PreviousSmallFish5)
     if (PreviousSmallFish5>CurrentSmallFish6 && CurrentSmallFish5<PreviousSmallFish6)triggerBarTime = Time[ 1 ]; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
     double ema21_2 = iMA ( NULL , 60 , 21 , 0 , 1 , 0 , 1 ); 
  
             if (High[ 1 ]>ema21_2)
            {
             
              OrderEntry( 1 ); // SELL
             }  
   
       }

}


//+------------------------------------------------------------------+  
//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+

void OrderEntry ( int direction)
{    
   double LotSize= 0 ;
   double Equity=AccountEquity();
   double RiskedAmount=Equity*RiskPercent* 0.01 ;
   int buyStopCandle = iLowest( NULL , 0 , 1 ,CandlesBack, 1 ); 
   int sellStopCandle = iHighest( NULL , 0 , 2 ,CandlesBack, 1 );
   
   double buyPrice = iHighest( Symbol (), 0 , MODE_HIGH, iBarShift( Symbol (), 0 , triggerBarTime, true ), 0 );    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
   double sellPrice = iLowest( Symbol (), 0 , MODE_LOW, iBarShift( Symbol (), 0 , triggerBarTime1, true ), 0 );   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
   double buy_stop_price = iMA ( NULL , 60 , 60 , 0 , 1 , 0 , 1 )-PadAmount*pips; 
   double pips_to_bsl = Ask-buy_stop_price;         //double pips_to_bsl = Ask-buy_stop_price;   --- Old code
   double buy_takeprofit_price = Ask+pips_to_bsl*RewardRatio;   
   double sell_stop_price = iMA ( NULL , 60 , 60 , 0 , 1 , 0 , 1 )+PadAmount*pips; //- Greyed out, this is an old code line.
   double pips_to_ssl = sell_stop_price-Bid;     ////double pips_to_ssl = sell_stop_price-Bid;   --- Old code
   double sell_takeprofit_price = Bid-pips_to_ssl*RewardRatio;   
   
  
   if (direction== 0 ) //<< "0" pushes out a Buy direction
   {
       //double buyPrice = iHighest(Symbol(), 60, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);//-PadAmount*pips; // new line
       int Buy_Price = buyPrice;
      
       double bsl=buy_stop_price;
       double btp=buy_takeprofit_price;
       //LotSize = (100/(0.00500/0.00010))/10
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/ 10 ;
       if (OpenOrdersThisPair( Symbol ())== 0 ) //--- This means that it will not open a new order if there is one already open!If greyed out, it will take everything.
       int buyticket = OrderSend ( Symbol (),Buy_Price,LotSize,Ask, 3 , 0 , 0 , NULL ,MagicNumber, 0 ,Green); //ask
       if (buyticket> 0 )OrderModify(buyticket,OrderOpenPrice(),bsl,btp, 0 , CLR_NONE );
   }
            
   if (direction== 1 ) //<< "1" pushes out a Sell direction
   {
      
       //double sellPrice = iLowest(Symbol(), 60, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);//+PadAmount*pips;   // new line.
       int Sell_Price = sellPrice;
      
       double ssl=sell_stop_price;
       double stp=sell_takeprofit_price; 
       //LotSize = (100/(0.00500/0.00010))/10;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/ 10 ;    
       if (OpenOrdersThisPair( Symbol ())== 0 )   //--- This means that it will not open a new order if there is one already open! If greyed out, it will take everything.
       int sellticket = OrderSend ( Symbol (),Sell_Price,LotSize,Bid, 3 ,ssl,stp, NULL ,MagicNumber, 0 ,Red); //bid
       if (sellticket> 0 )OrderModify(sellticket,OrderOpenPrice(),ssl,stp, 0 , CLR_NONE );
   }
   
}

return ( 0 );

 
DomGilberto :

모두 안녕!

이것은 분명히 모든 코드는 아니지만 이것이 내가 머리를 뽑는 주요 부분입니다. "<<<<<<<<<<<<"로 코드를 확인하십시오. 제가 헷갈리는 부분들입니다.

사용 중인 기능에 대한 설명서를 읽으십시오. . . iHighest() 는 가격을 반환하지 않습니다. . . int 를 반환합니다. "유형에 따라 특정 기간 동안 최대값의 이동 을 반환합니다."
 

감사합니다 RaptorUK - 가능한 가장 친절한 방법으로, 그것은 나에게 아무 것도 설명하지 않습니까? 평신도 용어로?

기능 정의를 반복하는 것 외에 누군가가 실제로 나를 도울 수 있는 포럼입니까(여기서 "도움말" 섹션에서 100번을 읽었습니다...)

결국, 나는 내가 묻는 것이 (여기의 일부 스레드와 비교하여!) 누군가가 시간을 청구할 만큼 충분하다고 생각하지 않습니다...?

 

평신도의 용어로 번역하면 도움이 될 것입니다... 한 번, 오늘, 이 특정 문제에 대해.. 설명하는 데 약간의 시간이 걸립니다.

정의 중 어떤 것이 이해되지 않는지 말하면 다음에는 자신의 문제를 해결할 수 있고 잠시 후 다른 사람의 문제를 해결하는 사람 중 하나가 될 수 있습니다.

스스로 문제를 조사하고 조사하면 더 많은 것을 배우게 될 것입니다. 예를 들어 다음을 시도하십시오.

 Alert (iHighest( Symbol (), 0 , MODE_HIGH, iBarShift( Symbol (), 0 , triggerBarTime, true ), 0 ));

그리고 당신은 함수 에 의해 어떤 값이 반환되는지 볼 수 있을 것입니다 ... (Raptor가 말했듯이, 그것은 가격이 아닙니다).. 그리고 당신은 아마도 함수의 정의를 더 쉽게 이해할 것입니다.

이와 같은 것은 보드의 누군가가 당신의 코드를 테스트하고 당신이 스스로 어떻게 해야 하는지 배워야 하는 동일한 문제 해결을 수행할 시간을 갖기를 바라는 것보다 당신에게 더 많은 도움이 될 것입니다.

 

뭐? 너무 혼란스러워요 - 도움을 너무 많이 요청하고 있나요?

결국, 나는 처음부터 전체 EA를 구축했습니다.

 

" 이와 같은 것은 보드의 누군가가 당신의 코드를 테스트할 시간을 갖고 당신이 스스로 수행하는 방법을 배워야 하는 동일한 문제 해결을 수행하기를 바라는 것보다 당신에게 더 많은 도움이 될 것입니다."

뭐야...누구한테도 기대 안했는데!?

귀하의 게시물은 상황에 대해 더 많은 정보를 제공했습니다. 감사합니다.

이 포럼은 정말 재미있습니다... 저는 아무에게도 무료로 로드할 계획이 없었습니다! 나는 단순히 EMA와 교차하는 막대를 올바르게 식별하는 방법에 대한 설명을 원했습니다...

이런....

 

내가 랩터의 답변을 읽을 때 그것은 당신이 만든 정확한 문제를 말하고 있습니다.

가격은 이중 변수(예: 1.12345)로 저장됩니다.

iHighest 함수 는 1 또는 2 또는 -100과 같은 정수(i nt )를 반환합니다. .... 분명히 가격이 아닙니다.

나는 당신이 달성하려는 것이 무엇인지 모르지만 iHighest 기능은 아마도 당신이 사용하고 싶은 것이 아닐 것입니다.

메타에디터에서 코드에서 iHighest를 클릭한 다음 F1을 누르면 이것을 스스로 발견했을 것입니다. 정수를 반환하는 것을 볼 수 있습니다(Raptor도 알려줌)

나는 당신의 혼란의 근원을 모릅니다. int 변수와 double 변수의 차이점을 모른다면 몇 가지 중요한 기본 지식을 놓치고 있는 것입니다. 즉, 걸을 수 있기 전에 달리기를 시도하고 다른 사람이 당신을 데려가기를 원한다는 의미입니다./

편집: 다른 사람에게 묻기 전에 스스로 문제 해결을 해야 한다는 것을 예상하지 못했습니까?!?

 

여러 이동 평균은 동시에 교차하지 않습니다 .

왜 이중포스팅을 하시나요? 귀하의 질문은 이전에 답변 되었습니다.

그들이 모두 적절한 순서로 있었던 가장 이른 막대를 찾으십시오.

 int DIR = 0 ;
for ( int iBar = 0 ; iBar < Bar; iBar++){
   double MA20 = ... iBar), 
           MA5 = ... iBar);
          :
   if (     MA20 > MA5 && MA5 > ...) DIR = - 1 ;
   else if (MA20 < MA5 && MA5 < ...) DIR = + 1 ; // All fanning up.
   else if (DIR != 0 ){ iBar--; break ; }       // Last one was cross.
}
 

int와 double의 차이점을 이해합니다.

If 문이 true인 후 MA가 떨어져 있는 지점에서 교차한 막대를 찾고 싶습니다. 내가 사용한다면 나는 생각했다 :

"triggerBarTime = 시간[1];" - "If" 문 다음에 triggerBarTime을 iBarShift와 함께 사용하여 내가 관심 있는 범위의 첫 번째 막대를 잠글 수 있습니까?

그런 다음 iHighest를 사용하여 이 정보를 int로 변환하고 내 주문 기능 에 사용할 수 있습니까? (구매_가격)?

 

int와 double의 차이점은 이해하겠지만 막대 번호(int)와 가격(double)의 차이점은 이해하지 못할 수 있습니다.

iHighest를 사용하면 날짜/시간을 막대 번호(int)로 변환할 수 있습니다. 그러나 OrderSend는 가격(2배)만 사용하므로 9시에 주문을 여는 것은 의미가 없습니다

 

아! 갓치야!

정말 감사합니다 :) 정말 감사합니다!

저를 기다려 주셔서 감사합니다. 누군가가 저를 위해 무엇이든 해 주기를 기대하는 방식으로 만나려고 한 것은 아닙니다. 도움말에 대한 설명을 제공하는 것(모든 항목에서 F1 키를 누르는 것이 항상 명확하지는 않습니다.)이 제가 원했던 전부입니다.