특정 시간에 양초의 시가를 가집니다.

 

안녕하세요 여러분,

새로운 질문이 있습니다. 간단합니다.

그래서 예를 들어 15:00 일 때 시간이 9:00 인 양초의 시가를 알고 싶습니다.

 if (TC >= 15 : 00 )
{
     if (Openprice < iclose(symbol(), period_H1, 1 )
    {
       Action
    }
}
그렇다면 미리 정의된 시간의 양초의 Openprice를 얻기 위해 코드를 작성하는 방법은 무엇입니까?
 

시간을 datetime 변수로 계산하고 iBarshift()와 함께 사용하여 막대 번호를 가져옵니다. 막대 번호가 있는 경우 Open[] 또는 iOpen()과 함께 사용하십시오.

 
RaptorUK :

시간을 datetime 변수로 계산하고 iBarshift()와 함께 사용하여 막대 번호를 가져옵니다. 막대 번호가 있는 경우 Open[] 또는 iOpen()과 함께 사용하십시오.


네 나쁘지 않습니다 :)

감사합니다 잘 사용하겠습니다!

 

그리고 그렇게 할 수 있습니다:

   int Bar;
   double OpenPrice;
   
   int B(k);
   {
       switch (HeureSH[k])
      {
         case 0 : Bar= iBarShift( Symbol (), PERIOD_H1 , StrToTime( "23:00" ));
         break ;
            
         case 1 : Bar= iBarShift( Symbol (), PERIOD_H1 , StrToTime( "09:00" ));
         break ;
            
         case 1 : Bar= iBarShift( Symbol (), PERIOD_H1 , StrToTime( "15:00" ));
         break ;
            
         case 3 : Bar= iBarShift( Symbol (), PERIOD_H1 , StrToTime( "19:00" ));
         break ;
      }
   }
   OpenPrice= iOpen( Symbol (), PERIOD_H1 , B);


HeureSH는 4시간의 arraysize입니다.

특정 시간이면 막대가 달라야 하지만 네 개의 다른 줄이 아닌 한 줄만 갖도록 스위치를 만들어야 합니다.

오 맞나요? 코드가 올바르게 작성되었습니까?

 
Kane59 :

그리고 그렇게 할 수 있습니다:


HeureSH는 4시간의 arraysize입니다.

특정 시간이면 막대가 달라야 하지만 네 개의 다른 라인이 아닌 하나의 라인만 갖도록 스위치를 생성해야 합니다.

오 맞나요? 코드가 올바르게 작성되었습니까?

사례 1 이 두 번 있으므로 복사/붙여넣기 오류가 있다고 가정합니다. . . 두 번째 경우 1이 경우 2여야 한다고 가정하겠습니다.

이것이 작동하려면 HeureSH[] 배열에 저장된 값이 1, 2, 3 또는 4입니다. 맞습니까? int 유형 값만 될 수 있습니다. 문자열 또는 이중 없음. . .

iOpen() 호출에서 BBar 여야 한다고 가정합니다. 아니면 B(int) 라는 뜻이었습니까? 해당 호출에서 함수를 사용하려면 함수 가 올바른 값을 반환하도록 해야 합니다.


의미 있는 변수와 함수 이름을 사용하면 자신과 다른 모든 사람에게 큰 도움이 될 것입니다. . . B, k 및 Bar는 그다지 기술적이지 않습니다.

 

아 제 오류네요. 제 코드를 복사했는데 제가 뭘 썼는지 모르겠네요....... 그렇게 해결했습니다.

내 iopen에서는 시간이 다르기 때문에 "Bar"인 B를 썼으므로 Bar도 다릅니다.


아 예, 문자열 값은 몇 가지 문제를 일으킬 것입니다. 나는 그것이 문제라고 생각하므로 변경하려고 노력할 것입니다.

 
   int B(k);
   {
       switch (HeureSH[k])
      {
         case 0 : Bar= iBarShift( Symbol (), PERIOD_H1 , StrToTime( "23:00" ));
         break ;
            
         case 1 : Bar= iBarShift( Symbol (), PERIOD_H1 , StrToTime( "09:00" ));
         break ;
            
         case 1 : Bar= iBarShift( Symbol (), PERIOD_H1 , StrToTime( "15:00" ));
         break ;
            
         case 3 : Bar = iBarShift( Symbol (), PERIOD_H1 , StrToTime( "19:00" ));
         break ;
      }
   }
   OpenPrice= iOpen( Symbol (), PERIOD_H1 , B );
작동하지 않습니다. 1) iBarShift는 Bar 에 할당되었지만 iOpen은 B 를 사용합니다. 2) StrToTime("23:00")은 항상 미래(또는 현재 H1 막대)가 될 23:00의 오늘 날짜를 반환합니다.
 #define HR2400       86400            // 24 * 3600
datetime TimeOfDay( datetime when){   return ( when % HR2400          );       }
datetime DateOfDay( datetime when){   return ( when - TimeOfDay(when) );       }
   int B(k);
   {
     #define HR0900 23400      // 9*3600
     #define HR1500 54000
     #define HR1900 68400
     #define HR2300 59800
     int times[]={ HR2300, HR0900, HR1500, HR1900 };
     datetime     now = TimeCurrent (),
                Bod = DateOfDay(now),
                want= Bod + times[HeureSH[k]];
     if (want > now){     // Yesterdays?
         datetime prevTradingDate = iTime( Symbol (), PERIOD_D1 , 1 );
        want = prevTradingDate + times[HeureSH[k]];
    }
   int iBar= iBarShift( Symbol (), PERIOD_H1 , want);
   OpenPrice= iOpen( Symbol (), PERIOD_H1 , iBar);
   }
 

안녕하세요 WHRoeder님,

나는 당신이 코드를 작성하는 것이 나보다 효율적이라고 생각하고 시간 가치가 어제인지 오늘인지 확인합니다. 동의합니다: 23:00, 내 코드는 너무 늦을 때 항상 미래 또는 현재입니다...


정말 감사합니다 ! 제가 검색한 바로 그것입니다.

 

안녕하세요 WHRoader님,

정보를 위해:

당신은 ibarshift가 Bar에, iOpen이 B에 할당되었다고 말했습니다. Ok

그러나 함수 B(k), 이 함수는 무엇입니까? 여기가 왜요?

내 코드에서 배열 크기의 문자열 시간(HeuresSH)과 다른 StrToTime 사이의 관계를 원했기 때문에 배치했습니다. 그렇게 거짓이었습니다.


또 사용했어, 왜?

안부 :)

 

예, HeureSH[]가 문자열 값에서 4개의 다른 시간의 arraySize라는 것을 잊었습니다.

 

좋아, 내 EA에 코드를 삽입했고 완벽하게 작동합니다! EA가 원하는 대로 실행되는 것을 보고 미소를 지었습니다!!!

매우매우매우감사합니다......

시장이 닫혀서 백테스트 중입니다...

하지만 문제가 있습니다.

Ea Open은 올바른 위치에 있지만 매수는 절대 청산되지 않으며 열리면 즉시 청산됩니다.

내 전략은 다음과 같습니다.

동시에 매개변수가 true인 경우 EA는 판매 또는 구매를 열어야 합니다. SL이나 TP는 없습니다.

그리고 동시에 다음 함수가 참이면 모든 거래를 반복하고 닫아야 합니다.

 if ( OrdersTotal ()> 0 )
            { 
               for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
               {
                   if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
                  {
                     if (OrderMagicNumber() == MagicSH && OrderOpenTime() > iTime( Symbol (), PERIOD_H1 , 1 ))
                     {
                         if (OrderType() == OP_BUY)
                        {
                           OrderClose(OrderTicket(),LotsSH, bid, 300 , CLR_NONE );
                        }
                         if (OrderType() == OP_SELL)
                        {
                           OrderClose(OrderTicket(),LotsSH, ask, 300 , CLR_NONE );
이익 필터를 추가해야 하지만 이에 대해 작업하겠습니다. 그것 없이는 매수를 닫아야 하지만 결코 닫히지 않고, 매도를 실행하되 매도는 즉시 닫아야 합니다. 마지막 코드에 오류가 있습니까?