MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 209

 
Alexey Viktorov :

Sorun bu satırda

Bir çubukta birkaç para birimi kontrol edildiğinden, zamana ek olarak, bir uyarının bir çubuk ve bir sembol üzerinde tekrarlanmasını hariç tutmak, ancak aynı çubukta farklı bir uyarı ile bir uyarıya izin vermek için para birimini de kontrol etmek gerekir. sembol. İlk bakışta, bayraklı başka bir dizi, karakterin görüntülenip görüntülenmediğini gösterir.

Genel olarak, bu satıra bir sembol eklemek için bir kontrol ekleyin veya genel olarak, sadece yeni bir çubuk açıldığında döngüyü tekrarlayın. Ancak bu göstergeye sahip bir sembol üzerinde yeni bir çubuk göründüğünde, başka bir sembole henüz yeni bir çubuk çizilmediği korkusu vardır.

Dolayısıyla sonuç: Her bir sembol üzerinde yeni bir çubuğun görünümünü ayrı ayrı belirlemek için başın kaslarını zorlamak, ancak aynı zamanda çizgi sayısını sonsuza kadar uzatmamak gerekir. Hazır bir çözümüm yok. Ve kod yazmayı önermeyi sevmiyorum ...

Onun sorununu çözdüm mü?

Belki bir yerde bir şeyi kaçırdım - kodu dizime yazdım.

 
Artyom Trishkin :

Onun sorununu çözdüm mü?

Belki bir yerde bir şeyi kaçırdım - kodu dizime yazdım.

Artyom, yazımın son cümlesi her şeyi açıklıyor. Koduna bakmadım bile. İlk okunmamış soruyu bir önceki cevabımdan bir alıntı ile açtım, cevapladım ve ardından diğer ipuçlarını gördüm. Dizlerimden bile kodunuzun doğruluğundan şüphem yok ...

 
Alexey Viktorov :

Artyom, yazımın son cümlesi her şeyi açıklıyor. Koduna bakmadım bile. İlk okunmamış soruyu bir önceki cevabımdan bir alıntı ile açtım, cevapladım ve ardından diğer ipuçlarını gördüm. Dizlerimden bile kodunuzun doğruluğundan şüphem yok ...

Yani tembellik derdim ;)

İlk bakışta bile kodun o anki sembol üzerindeki tiklere bağlı olduğunu görebilirsiniz. Bu yüzden çevrimi OnTick'ten () kaldırmanız ve zamanlayıcıya itmeniz gerekir. Ve uyarı zamanının tanımını biraz değiştirin.

 

Herkese merhaba, mm++ döngüsünde "start" fonksiyonunda işlemin yanlış anlaşılması var; ve içindeki değişiklikleri Print() ; aracılığıyla takip edin, yani soru şudur: "Neden 1,2,3,4, vb. yerine dört basamaklı sayılar çıkıyor?"

kodun kendisi

 int start()

  {
   int     counted_bars= IndicatorCounted ();
   int limit, i;
                                               int mm= 0 ;     // ======= ПЕРВОЕ========
  

   if (counted_bars< 0 ) return (- 1 );

   limit=( Bars -counted_bars)- 1 ;

for (i=limit; i>= 0 ;i--)
    { 
       if ( TimeDayOfWeek ( Time [i]) != 0 )
       { if ( High [i+ 1 ]>LastHigh) LastHigh= High [i+ 1 ]; if ( Low [i+ 1 ]<LastLow) LastLow= Low [i+ 1 ];}
 

if ( TimeDay ( Time [i])!= TimeDay ( Time [i+ 1 ]) && TimeDayOfWeek ( Time [i])!= 0 )
   {
      
                                                   mm++; // ==========ВТОРОЕ==========
       
   
   
                                                   Print ( " TEST= " ,mm); // ========ТРЕТЬЕ========
  
   LastLow= Open [i]; LastHigh= Open [i];

  /* ObjectMove("Pivot", 0, Time[i],P);
     ObjectMove("S1", 0, Time[i],S1);
      ObjectMove("R1", 0, Time[i],R1); */
   }
   
   // S1Buffer[i]=S1;
   // R1Buffer[i]=R1;

}

//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 
виталик :

Herkese merhaba, mm++ döngüsünde "start" fonksiyonunda işlemin yanlış anlaşılması var; ve Print(); aracılığıyla değişiklikleri takip edin, yani soru şudur: "Neden 1,2,3,4, vb. yerine dört basamaklı sayılar çıkıyor?"

kodun kendisi


İlk başlangıçta, saniye 10 IndicatorCounted ()=0

 limit=( Bars -counted_bars)- 1 ;

limit=maks. tarihteki barlar-1

 
Alekseu Fedotov :


İlk başlangıçta, saniye 10 IndicatorCounted ()=0

limit=maks. tarihteki barlar-1

hala net değil, beyan ve döngü dışında sıfır ile başlatma int mm=0; ve mm++ döngüsüne yerleştirilir; print() 'de dört basamaklı sayıların bir birim farkla nasıl değiştiğini, yalnızca bir nedenden dolayı azalan yönde görebilirsiniz.
 
виталик :
hala net değil, beyan ve döngü dışında sıfır ile başlatma int mm=0; ve mm++ döngüsüne yerleştirilir; print()'de dört basamaklı sayıların bir birim farkla nasıl değiştiğini, yalnızca bir nedenden dolayı azalan yönde görebilirsiniz.
Tüm baskılar bu dergide gösterilmez. Dosyaya bakın.
 

Alexey Viktorov :

... kafanın kaslarını zorlaman gerekiyor ...

Cevap veren herkese teşekkürler.

Artyom Trishkin : Örneğin, şöyle:

Artyom, neden karar vermediğini yazıyorsun? Tüm enstrümanlarda bip sesi çıkarır, sadece sistemi ağır yükler. Yükü azaltmanın bir yolu var mı?

Kontrolü yeni bir çubukta sınırlamak işe yaramaz, çünkü her işarette kontrol edilmesi gereken daha fazla koşul olacaktır.

Kodunuza OnTimer() eklemeye çalışıyorum, OnTick() olduğunda Expert Advisor'da çalıştı ama OnCalculate ile nasıl yapılır?

 int OnInit ()
  {
   EventSetMillisecondTimer ( 1 );
//--- indicator buffers mapping
   IndicatorShortName ( "UP DN" );
   ushort sz=SetSymbols(Symbols,symbols_array);
   if (sz== 0 ) {
       Print ( "Список символов пуст!" );
       return ( INIT_FAILED );
      }
//---
   return ( INIT_SUCCEEDED );
  }
  
   void OnDeinit ( const int reason)
{ // ---
         EventKillTimer ();
 // ---
}
void OnTimer ()
  {
   RefreshRates ();
   // OnTick();
   OnCalculate ();
  }

 
Ibragim Dzhanaev :

Söyle bana neden emirleri açmıyor?


Böylece açılacaktır:
 //пересечение вверх
bool PeresVverh()
  { //Объявление пересечения вверх
   //if(Ma(MaPer1,2)>Ma(MaPer2,2))
       if (Ma(MaPer1, 1 )>=Ma(MaPer2, 1 ))
         if (Ma(MaPer1, 0 )<Ma(MaPer2, 0 ))
             return ( true );
   return ( false );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool PeresVniz()
  { //Объявление пересечения вниз
   //if(Ma(MaPer1,2)<Ma(MaPer2,2))
       if (Ma(MaPer1, 1 )<=Ma(MaPer2, 1 ))
         if (Ma(MaPer1, 0 )>Ma(MaPer2, 0 ))
             return ( true );
   return ( false );
  }

 
Sile Si :

Cevap veren herkese teşekkürler.

Artyom, neden karar vermediğini yazıyorsun? Tüm enstrümanlarda bip sesi çıkarır, sadece sistemi ağır yükler. Yükü azaltmanın bir yolu var mı?

Kontrolü yeni bir çubukta sınırlamak işe yaramaz, çünkü her işarette kontrol edilmesi gereken daha fazla koşul olacaktır.

Kodunuza OnTimer() eklemeye çalışıyorum, OnTick() olduğunda Expert Advisor'da çalıştı ama OnCalculate ile nasıl yapılır?


O zaman dene. 200 milisaniye için zamanlayıcı

 //+------------------------------------------------------------------+
//|                                                      Test_01.mq4 |
//|              Copyright 2017, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Artem A. Trishkin, Skype artmedia70"
#property link        "https://login.mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property strict
#property indicator_chart_window

input string Symbols = "EURUSD, GBPUSD, USDJPY" ; // Список символов, разделитель - запятая
//---
struct SSymbolsData
  {
   string    name;       // Имя символа
   datetime time_alert; // Время последнего алерта
  };
SSymbolsData symbols_array[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer ( 200 );
   IndicatorShortName ( "UP DN" );
   ushort sz=SetSymbols(Symbols,symbols_array);
   if (sz== 0 ) {
       Print ( "Список символов пуст!" );
       return ( INIT_FAILED );
      }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   EventKillTimer ();
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   for ( int i= 0 ; i< ArraySize (symbols_array); i++) {
       if (Condition(symbols_array[i].name, 1 )== ORDER_TYPE_BUY ) {
         datetime tm= iTime (symbols_array[i].name, PERIOD_CURRENT , 0 );;
         if (symbols_array[i].time_alert!=tm) {
             Alert ( "UP - " ,symbols_array[i].name, ", time: " , TimeToString (tm, TIME_DATE | TIME_MINUTES ));
            symbols_array[i].time_alert=tm;
            }
         }
       if (Condition(symbols_array[i].name, 1 )== ORDER_TYPE_SELL ) {
         datetime tm= iTime (symbols_array[i].name, PERIOD_CURRENT , 0 );
         if (symbols_array[i].time_alert!=tm) {
             Alert ( "Down - " ,symbols_array[i].name, ", time: " , TimeToString (tm, TIME_DATE | TIME_MINUTES ));
            symbols_array[i].time_alert=tm;
            }
         }
      }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Condition( string symbol_name, int shift) {
   MqlRates array[];
   if ( CopyRates (symbol_name, PERIOD_CURRENT ,shift, 2 ,array)== 2 ){
       if (array[ 0 ].open<array[ 0 ].close && array[ 1 ].open>array[ 1 ].close) return ( ORDER_TYPE_BUY );
       if (array[ 0 ].open>array[ 0 ].close && array[ 1 ].open<array[ 1 ].close) return ( ORDER_TYPE_SELL );
      }
   return ( WRONG_VALUE );
}
//+------------------------------------------------------------------+
ushort SetSymbols( string symbols_list,SSymbolsData &array[]){
   symbols_list+= "," ; // Добавим признак конца строки
   short beg= WRONG_VALUE , end= 1 , len=( short ) StringLen (symbols_list);
   string sy= "" ;
   Print ( __FUNCTION__ , " > " ,symbols_list); // Посмотрим символы в строке
   while (beg<len) {
      beg++;
      end=( short ) StringFind (symbols_list, "," ,beg);
       if (end==beg || end< 0 ) continue ;
      sy= StringSubstr (symbols_list,beg,end-beg);
       if (CheckSymbol(sy,array) || !IsPresentSymbol(sy)) continue ;
       ushort sz=( ushort ) ArraySize (array);
       ArrayResize (array,sz+ 1 );
      array[sz].name=sy;
      array[sz].time_alert= 0 ;
       //--- Посмотрим корректность найденного символа и записи его в массив
       Print ( "beg=" , IntegerToString (beg, 2 , '0' ), ", end=" , IntegerToString (end, 2 , '0' ), ", sy=|" ,sy, "|" , ", in array[" ,sz, "]=" ,array[sz].name);
      }
   return (( ushort ) ArraySize (array));
}
//+------------------------------------------------------------------+
bool CheckSymbol( string symbol_name,SSymbolsData &array[]){
   for ( short i= 0 ; i< ArraySize (array); i++) if (array[i].name==symbol_name) return ( true );
   return ( false );
}
//+------------------------------------------------------------------+
bool IsPresentSymbol( string symbol_name){
   for ( ushort i= 0 ; i< SymbolsTotal ( false ); i++){
       if ( SymbolName (i, false )==symbol_name) {
         SymbolSelect (symbol_name, true );
         return ( true );
         }
      }
   return ( false );
}
//+------------------------------------------------------------------+