초보자의 질문 MQL4 MT4 MetaTrader 4 - 페이지 114

 
Rewerpool :
안녕하세요 ! 어떻게 방아쇠를 만들 수 있습니까? 예를 들어, DayDown = 1이 실행되면 if(iClose(NULL,HTF,4)<BlueLine) 이 조건이 필요합니다! 질문: DayDown을 1로 두고 다음 날까지 투표하지 않으려면 어떻게 해야 합니까?
 int ДеньОпроса= 0 ;
void OnTick ()
{
   if (ДеньОпроса != Day ())   // Если новый день - нужно опросить
  {
     if ( iClose ( NULL ,HTF, 4 )<BlueLine) DayDown = 1 ;   // Опрос
     ДеньОпроса = Day ();   // Запомнить день
  }
 
고맙습니다! 망쳐보도록 할게요)
 
안녕하세요, 차트에서 하나의 개체를 제거하면 나머지(선택 사항)가 삭제된다는 조건에 대한 코드를 작성하는 것을 용서하겠습니다.

하나의 개체에 다른 개체가 첨부되어 있고 이 개체가 삭제되면 나머지 개체는 차트에 매달려 있습니다.
 
STARIJ :

나는 다음과 같이 얻었다.

if(DayNext!= Day()) // 새로운 날이면 폴링해야 합니다.

{

// 투표

if( iClose (NULL,1440,2)<BlueLine)

if(iOpen(NULL,1440,1)<BlueLine && iClose(NULL,HTF,1)>BlueLine)

PROBOI1 = 1;Print("BlueLine 위에 닫힘 = ",iClose(NULL,HTF,1));

if(iClose(NULL,1440,2)>레드라인)

if(iOpen(NULL,1440,1)>RedLine && iClose(NULL,HTF,1)<RedLine)

PROBOI1 = -1;Print("RedLine 아래에서 닫힘 = ",iClose(NULL,HTF,1));

DayNext = Day(); // 그날을 기억한다

}

잘못된 부분이 있으면 수정해주세요! 또한 주니어 TF에서 현재 진행 중인 일을 추적하려면 투표일 외에 글을 작성해야 합니까? 맞습니다 - STARIJ :

if(iClose(NULL,60,1)>RedLine&&iClose(NULL,1440,2)>RedLine) ) 매도 = 1

 
이렇게 해서 죄송합니다. 하지만 다음과 같이 대답해 주십시오.
https://www.mql5.com/en/forum/226620#comment_6481536
 
Vladimir Karputov :

조건 1의 경우 식별자를 매직 넘버 +1, 조건 2의 경우 매직 넘버 +2 등으로 설정합니다. 따라서 나중에 이 포지션이 조건 1 또는 조건 2에 따라 열렸다는 것을 알 수 있습니다 ...

안녕하세요. BY 한 자리에 대해서만 밝혀졌습니다. CELL에 대한 매직 세트가 어떤 이유로 작동하지 않습니다. 물론 마술사를 제외하고는 모든 것이 완전히 동일합니다. 내가 뭘 잘못했어?

 int total= OrdersTotal ();

       for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)

      {

         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))

         {

         if ( TimeCurrent ()> OrderOpenTime ()+ 100 && OrderTicket () && OrderType ()== OP_BUY && ( MathAbs (WPR1)< 5 ))

         rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_BID ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow); 

        

         if ( TimeCurrent ()> OrderOpenTime ()+ 100 && OrderTicket () && OrderType ()== OP_BUY && OrderMagicNumber == 111 && MathAbs (WPR1)< 20 )

         rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_BID ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow);

      

         if ( TimeCurrent ()> OrderOpenTime ()+ 100 && OrderTicket () && OrderType ()== OP_SELL && OrderMagicNumber == 222 && MathAbs (WPR1)> 97.55 )

         rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_ASK ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow); 

           

         if ( TimeCurrent ()> OrderOpenTime ()+ 100 && OrderTicket () && OrderType ()== OP_SELL && MathAbs (WPR1)> 96 )

         rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_ASK ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow);               

         }

       continue ;  

      }  
 
novichok2018 :

내가 뭘 잘못했어?

서신의 시작 부분을 찾지 못해 죄송하지만 복잡한 조건과 계산을 피하도록 즉시 조언하고 싶습니다. 이는 코드를 읽을 수 없게 만들고 결과적으로 논리적 오류 검색을 복잡하게 만듭니다. 다음과 같은 코드:

 int total= OrdersTotal ();

   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)

      {

         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))

         {

             if ( TimeCurrent ()> OrderOpenTime ()+ 100 )&& OrderTicket ())

            {   

         if ( OrderType ()== OP_BUY && ( MathAbs (WPR1)< 5 ))

            rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_BID ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow); 

         if ( OrderType ()== OP_BUY && OrderMagicNumber == 111 && MathAbs (WPR1)< 20 )

            rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_BID ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow);

         if ( OrderType ()== OP_SELL && OrderMagicNumber == 222 && MathAbs (WPR1)> 97.55 )

            rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_ASK ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow); 

         if ( OrderType ()== OP_SELL && MathAbs (WPR1)> 96 )

            rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_ASK ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow);

            }

         }

       continue ;  

      }

위태로운 것이 무엇인지 이해 한다면 내가 제공한 코드를 조금 더 수정할 수 있습니다. ( OrderType () == OP_BUY....

그러면 논리적 오류를 찾는 것이 훨씬 쉬울 것입니다. IMHO

 
Igor Makanu :

서신의 시작 부분을 찾지 못해 죄송하지만 복잡한 조건과 계산을 피하도록 즉시 조언하고 싶습니다. 이는 코드를 읽을 수 없게 만들고 결과적으로 논리적 오류 검색을 복잡하게 만듭니다. 다음과 같은 코드:

위태로운 것이 무엇인지 이해 한다면 내가 제공한 코드를 조금 더 수정할 수 있습니다. ( OrderType () == OP_BUY....

그러면 논리적 오류를 찾는 것이 훨씬 쉬울 것입니다. IMHO

알겠습니다. 감사합니다. 제가 알기로는 플랫폼별로 코드를 이해하는 데 별 차이가 없지만 저에게는 반대로 하나의 조건을 여러 개의 짧은 조건으로 나누는 것이 오류를 찾기가 더 어려워 보입니다. 서로 연산자의 발생 횟수가 증가합니다. 하지만 아마도 당신이 옳았을 것이고 나는 곧 당신 편으로 갈 것입니다. 코드의 논리와 관련하여 - 내 것과 당신의 것 사이에 차이점을 찾지 못했고 여전히 오류가 표시되지 않습니다.

 
novichok2018 :

코드의 논리와 관련하여 - 내 것과 당신의 것 사이에 차이점을 찾지 못했고 여전히 오류가 표시되지 않습니다.

그것이 바로 그것입니다. 코드의 논리는 동일합니다. 조건을 분할하면 논리 오류가 있는 위치를 빠르게 찾을 수 있습니다.

 if ( TimeCurrent ()> OrderOpenTime ()+ 100 )&& OrderTicket ())

별도의 조건으로 코드 최적화 를 수행합니다. 조건은 귀하의 예에서와 같이 4번이 아니라 한 번 확인됩니다.

다음을 통해 전문가 저널에 결과물 제출

 Print ()

코드의 어느 부분이 실행되고 어떤 매개변수가 있는지 보기 위해 로그를 작성합니다.

 

얘들아

EA 코드에서 Morning Flat 표시기의 판독값 을 읽는 방법은 무엇입니까?

시도하고 작동하지 않습니다.

min= iCustom ( Symbol (), 0 , "Morning Flat" ,StartHour,EndHour,TargetLevel, 1 , 0 );

지표 자체

 //+------------------------------------------------------------------+
//| MorningFlat.mq4 |
//| Scriptong |
//| |
//+------------------------------------------------------------------+
#property copyright "Scriptong"
#property link ""

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Turquoise
#property indicator_color2 Red
#property indicator_color3 Gold
#property indicator_color4 Silver

extern int StartHour= 0 ;
extern int EndHour= 8 ;
extern double TargetLevel= 161.8 ;
extern color UpColor = Turquoise;
extern color DnColor = Red;
extern color TargetUpColor = Gold;
extern color TargetDnColor = Silver;

//---- buffers
double Up[];
double Down[];
double TargetUp[];
double TargetDn[];
bool Activate= False ;
datetime LastDay;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   if ( Period ()> PERIOD_H1 )
     {
       Comment ( "Индикатор работает на таймфреймах меньше H4!" );
       return ( 0 );
     }
   if (StartHour< 0 || EndHour< 0 || StartHour> 23 || EndHour> 23 || StartHour>=EndHour)
     {
       Comment ( "Значения StartHour и EndHour должны лежать в диапазоне от 0 до 24 и StartHour < EndHour." );
       return ( 0 );
     }

   SetIndexStyle ( 0 , DRAW_LINE );
   SetIndexBuffer ( 0 ,Up);
   SetIndexStyle ( 1 , DRAW_LINE );
   SetIndexBuffer ( 1 ,Down);
   SetIndexStyle ( 2 , DRAW_LINE );
   SetIndexBuffer ( 2 ,TargetUp);
   SetIndexStyle ( 3 , DRAW_LINE );
   SetIndexBuffer ( 3 ,TargetDn);
   SetIndexEmptyValue ( 0 , 0.0 );
   SetIndexEmptyValue ( 1 , 0.0 );
   SetIndexEmptyValue ( 2 , 0.0 );
   SetIndexEmptyValue ( 3 , 0.0 );

   Activate= True ;
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
  {
//----
// Удаление объектов-ценовых меток
   for ( int i= ObjectsTotal ()- 1 ; i>= 0 ; i--)
     {
       string Name= ObjectName (i);
       if ( StringSubstr (Name, 0 , 3 )== "Lab" )
         ObjectDelete (Name);
     }
   Comment ( "" );
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Ценовая метка со значением уровня |
//+------------------------------------------------------------------+
void DrawLabel( datetime TimeL, double Price, bool Upper, color Col, int Code)
  {
   if (Upper)
       string Name= "Lab" + DoubleToStr (TimeL, 0 )+ "U" ;
   else
      Name= "Lab" + DoubleToStr (TimeL, 0 )+ "D" ;

   if ( ObjectCreate (Name, OBJ_ARROW , 0 ,TimeL,Price))
     {
       ObjectSet (Name, OBJPROP_ARROWCODE ,Code);
       ObjectSet (Name, OBJPROP_COLOR ,Col);
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
  {
//----
   if (!Activate) return ( 0 );

   LastDay= 0 ;
   int counted_bars= IndicatorCounted ();
   if (counted_bars> 0 ) counted_bars--;
   int limit= Bars -counted_bars;
   for ( int i=limit; i>= 0 ; i--)
       if ( TimeHour ( Time [i])>=EndHour)
        {
         datetime BeginDay= iTime ( Symbol (), PERIOD_D1 , iBarShift ( Symbol (), PERIOD_D1 , Time [i])); // Расчет времени начала суток
         datetime NextDay=BeginDay+ 86400 ; // Расчет времени начала следующих суток
         if (LastDay>= BeginDay) continue ; // Если в этот день уже рисовали уровни, то продолжаем основной цикл
         int StartBar= iBarShift ( Symbol (), 0 ,BeginDay+StartHour* 3600 ); // Бар, соответсвующий началу суток плюс смещение в часах
         int FinishBar= iBarShift ( Symbol (), 0 ,BeginDay+(EndHour- 1 )* 3600 ); // Бар, соответствующий последнему бару "утреннего флэта"
         double LowV= Low [ iLowest ( Symbol (), 0 , MODE_LOW ,StartBar-FinishBar+ 1 ,FinishBar)]; // Нижняя граница
         double HighV= High [ iHighest ( Symbol (), 0 , MODE_HIGH ,StartBar-FinishBar+ 1 ,FinishBar)]; // Верхняя граница
         double TargetU = (HighV-LowV)*(TargetLevel- 100 )/ 100 +HighV;
         double TargetD = LowV-(HighV-LowV)*(TargetLevel- 100 )/ 100 ;
         // Канал "утреннего флэта"
         for ( int j=StartBar; j>=FinishBar; j--)
           {
            Up[j]=HighV;
            Down[j]=LowV;
             //Есть такой индикатор
             // -----------------------
             // Ожидаемые цели при пробое флэта 
             for (j=FinishBar; Time [j]<NextDay && j>= 0 ; j--)
              {
               TargetUp[j] = TargetU;
               TargetDn[j] = TargetD;
              }
             // ------------------- 

            DrawLabel( Time [ iBarShift ( Symbol (), 0 , BeginDay)], HighV, True , UpColor, 5 ); // Рисуем верхнюю ценовую метку канала
            DrawLabel( Time [ iBarShift ( Symbol (), 0 , BeginDay)], LowV, False , DnColor, 5 ); // Рисуем нижнюю ценовую метку канала
            DrawLabel( Time [FinishBar],TargetU, True ,TargetUpColor, 5 ); // Рисуем верхнюю ценовую метку цели
            DrawLabel( Time [FinishBar],TargetD, False ,TargetDnColor, 5 ); // Рисуем нижнюю ценовую метку цели
            LastDay=BeginDay; // Отмечаем, что в этот день уровни уже были нарисованы
           }
        }
   WindowRedraw ();
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+