Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 114

 
Rewerpool :
Tünaydın ! Nasıl bir tetikleyici oluşturabilirsiniz? Örneğin, DayDown = 1 yürütülürse if(iClose(NULL,HTF,4)<BlueLine) bu koşula ihtiyacım var! Soru: DayDown'ı nasıl 1'de bırakıp ertesi güne kadar yoklama yapabilirim?
 int ДеньОпроса= 0 ;
void OnTick ()
{
   if (ДеньОпроса != Day ())   // Если новый день - нужно опросить
  {
     if ( iClose ( NULL ,HTF, 4 )<BlueLine) DayDown = 1 ;   // Опрос
     ДеньОпроса = Day ();   // Запомнить день
  }
 
Teşekkür ederim! Onu mahvetmeye çalışacağım)
 
Merhaba, grafikten 1 nesneyi kaldırırsanız geri kalanın (isteğe bağlı) silineceği koşulu için bir kod yazmanızı affedeceğim.

1 nesneye eklenmiş başkaları var ve bu nesne silindiğinde, gerisi sadece çizelgede asılı kalıyor
 
STARIJ :

Ben şöyle anladım:

if(DayNext!= Day()) // Yeni bir günse, yoklama yapmamız gerekiyor

{

// Anket

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

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

PROBOI1 = 1;Print("BlueLine Üzerinde Kapalı = ",iClose(NULL,HTF,1));

if(iClose(NULL,1440,2)>RedLine)

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

PROBOI1 = -1;Print("RedLine'ın altında kapalı = ",iClose(NULL,HTF,1));

DayNext = Gün(); // Günü hatırla

}

Yanlış bir şey varsa lütfen beni düzeltin! Ayrıca, şu anda genç bir TF'de neler olup bittiğini takip etmek istersem, Anket Günü dışında yazmam gerekir mi? Bu doğru - STARIJ :

if(iClose(NULL,60,1)>RedLine&&iClose(NULL,1440,2)>RedLine)) Satış = 1

 
Bunu yaptığım için beni bağışlayın ama lütfen cevap verin:
https://www.mql5.com/en/forum/226620#comment_6481536
 
Vladimir Karputov :

Koşul 1 için tanımlayıcıyı sihirli sayı +1'e, koşul 2 için sihirli sayı +2'ye vb. ayarlayın. Böylece daha sonra bu pozisyonun koşul 1 veya koşul 2'ye göre açıldığı anlaşılabilir...

Tünaydın. Sadece bir pozisyon BY için çıktı. HÜCRE için sihir seti bir nedenden dolayı çalışmıyor. Elbette sihirbaz dışında her şey kesinlikle aynıdır. Neyi yanlış yaptım?

 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 :

Neyi yanlış yaptım?

Yazışmanın başlangıcını bulamadığım için özür dilerim, ancak bunlarda karmaşık koşullardan ve hesaplamalardan kaçınmanızı derhal tavsiye etmek istiyorum - bu, kodu okunamaz hale getirir ve sonuç olarak mantıksal hataları aramayı zorlaştırır, şöyle kod:

 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 ;  

      }

Neyin tehlikede olduğunu anlıyorsanız o zaman verdiğim kodu biraz daha değiştirebilirsiniz, onu ayrı bir duruma taşımaktan bahsediyorum if ( OrderType () == OP_BUY....

o zaman mantıksal hataları bulmak çok daha kolay olacak, IMHO

 
Igor Makanu :

Yazışmanın başlangıcını bulamadığım için özür dilerim, ancak bunlarda karmaşık koşullardan ve hesaplamalardan kaçınmanızı derhal tavsiye etmek istiyorum - bu, kodu okunamaz hale getirir ve sonuç olarak mantıksal hataları aramayı zorlaştırır, şöyle kod:

Neyin tehlikede olduğunu anlıyorsanız o zaman verdiğim kodu biraz daha değiştirebilirsiniz, onu ayrı bir duruma taşımaktan bahsediyorum if ( OrderType () == OP_BUY....

o zaman mantıksal hataları bulmak çok daha kolay olacak, IMHO

Anladım, teşekkürler, ama anladığım kadarıyla, kodu platform tarafından anlamak için bir fark yok, ama benim için tam tersine, bir koşulu birkaç kısa koşula bölmek, hataları bulmak daha zor görünüyor çünkü operatörlerin birbiri içinde bulunma sayısı artar. Ama belki haklısın ve yakında yanına geleceğim. Kodun mantığı ile ilgili olarak - benimkiyle sizinki arasında bir fark bulamadım ve hala bir hata görmüyorum.

 
novichok2018 :

Kodun mantığı ile ilgili olarak - benimkiyle sizinki arasında bir fark bulamadım ve hala bir hata görmüyorum.

tam olarak budur - kodun mantığı aynıdır, sadece koşulları bölerseniz, mantıksal hatanın nerede olduğunu çabucak bulacaksınız, sizin durumunuzda, eğer çıkarırsanız:

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

ayrı bir koşulda, kod optimizasyonu elde ederiz - koşul, örneğinizdeki gibi 4 kez değil, bir kez kontrol edilecektir.

Çıktıyı uzman günlüğüne şu şekilde gönderin:

 Print ()

kodun hangi bölümünün yürütüldüğünü ve hangi parametrelerle yürütüldüğünü görmek için günlükler yazmak

 

Çocuklar

EA kodunda Morning Flat göstergesinin okumaları nasıl okunur?

deniyorum ve çalışmıyor.

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

göstergenin kendisi

 //+------------------------------------------------------------------+
//| 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 );
  }
//+------------------------------------------------------------------+
Neden: