[ARŞİV] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 5. - sayfa 326

 

Göstergelerin destekçisi değilim, ancak bir şeyi kontrol etmeye karar verdim. Uzmanın sırasıyla RSI göstergesinin üst seviyesinin fiyatından satın alması ve daha düşük olanın fiyatından satması gerekir. Yalnızca fiyat zaten RSI göstergesinin üst sınırının üzerindeyse, satın alma bu sınırın üzerinde ve bu sınırın değerinin altında olmalıdır + sınırdan yukarıya doğru girintinin bir değeri (az önce belirttiğim kodda) 0.1 sayısı ), Aksine satışlar için.

şöyle yaptım:

Harici seçenekler:

 extern string ___H1 = " __________ Параметры RSI _________ " ;
extern int      i_RSITF = 5 ,
               i_RSIPeriod = 21 ,
               i_RSIApplied = PRICE_CLOSE ;
 extern   double   i_RSIToUpLimit = 55,                                      // Верхняя граница RSI
               i_RSIToDnLimit = 45;                                      // Нижняя граница RSI

Sinyali alan fonksiyonun kodu ve RSI değerinin kendisi: (burada alış veya satış aralığı için marj 0.1'dir )

 //+-------------------------------------------------------------------------------------+
//| Получаем RSI с заданными параметрами                                                |
//+-------------------------------------------------------------------------------------+
double GetRSI( int RSIIndex)
{
   return ( iRSI ( NULL , i_RSITF, i_RSIPeriod, i_RSIApplied, RSIIndex));
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   if (FindOrders() > 0 )
       return (SIGNAL_NO);

 //  if (GetRSI(PRICE_CLOSE, 0) > GetRSI(PRICE_CLOSE, 1))
   if (GetRSI( 0 ) > i_RSIToUpLimit)
       if (GetRSI( 0 ) < (i_RSIToUpLimit + 0. 1 ))
         return (SIGNAL_BUY);                  // Запускаем функцию открытия покупки
           
   if (GetRSI( 0 ) < i_RSIToDnLimit)
       if (GetRSI( 0 ) > (i_RSIToDnLimit - 0.1 ))
         return (SIGNAL_SELL);                // Запускаем функцию открытия продаж
   
   return (SIGNAL_NO);
}

Expert Advisor, siparişleri bazen seviyenin kendisinden açar, bazen çok daha yüksek (satın almalar için), çok daha düşük (satışlar için). Niye ya? Sonuçta, algoritma temeldir.

 
Herkese selam. Bir sorum var. Bir fotokopi makinesi /**/ kurdum, birkaç hesapla çalışırken iyi ve kullanışlı bir şey. Ancak sorun şu ki, bilgisayarınızda başka bir programı (video, oyun, sadece kartlar) paralel olarak çalıştırdığınızda, hoparlörlerden sürekli bir cızırtı geliyor. Bu sorunu (çatlak) düzeltmek mümkün mü? Şimdiden teşekkürler.
 

Lütfen yardım edin beynim yanıyor kaç gündür uğraşıyorum ama sorunun ne olduğunu çözemedim.

RSI'ye dayalı basit bir gösterge yazmaya çalışıyorum (The MQL4 Language for Dummies makalesinden RandomIndicatorSignals.mq4 göstergesi. Özel Göstergeler (Bölüm 1) ( https://www.mql5.com/ru/articles/1500 ) analog olarak alınmıştır.

Özü basittir, RSI bir üst veya alt çizerse, grafikte bir ok çizer.

Görünüşe göre her şeyi doğru yaptım, ama bence her mum için RSI değerlerinin tamponu dolu değil, bu yüzden çalışmıyor. İşte kod.

 //+------------------------------------------------------------------+
//|                                                    RSI+Arrow.mq4 |
//|                                                         _______ |
//|                                                    |
//+------------------------------------------------------------------+
#property copyright "_______"
#property link       "_________"


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Crimson
#property indicator_color2 RoyalBlue
//---- input parameters
extern int        barsToProcess= 500 ;
//---- buffers
double ExtMapBuffer1[],
       ExtMapBuffer2[],
       RSIBuffer3[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers( 3 );
   SetIndexStyle( 0 , DRAW_ARROW );
   SetIndexArrow( 0 , 236 );
   SetIndexBuffer ( 0 ,ExtMapBuffer1);
   SetIndexEmptyValue( 0 , 0.0 );
   SetIndexStyle( 1 , DRAW_ARROW );
   SetIndexArrow( 1 , 238 );
   SetIndexBuffer ( 1 ,ExtMapBuffer2);
   SetIndexEmptyValue( 1 , 0.0 );
   SetIndexBuffer ( 2 ,RSIBuffer3);
   // для информации о значениях буфера
   SetIndexLabel  ( 2 , "RSIBuffer3" );
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {    
   //расчет индикатора на последних барах 
   int limit,i;
   int counted_bars=IndicatorCounted();
   if (counted_bars> 0 ) counted_bars--;
   limit= Bars -counted_bars;
   if (limit>barsToProcess)
   limit=barsToProcess;
   
   //заполняем буфер RSI значениями 
   for (i= 0 ; i<limit; i++)
   if (i>= 1 )
     {
       RSIBuffer3[i]= iRSI ( 0 , 0 , 8 , PRICE_CLOSE , 0 );
     }       
   //проводим сравнения                        
   for (i= 0 ; i<limit; i++)
   if (i>= 1 )
        
        {
         if (RSIBuffer3[i+ 2 ]-RSIBuffer3[i+ 1 ]> 0 && RSIBuffer3[i+ 1 ]-RSIBuffer3[i]> 0 ) // условия выставления стрелки 

         /* так тоже не работает
        if(RSIBuffer3[i+2]>=RSIBuffer3[i+1] && RSIBuffer3[i+1]<=RSIBuffer3[i])
        */
        
        ExtMapBuffer2[i]=Low[i]- 5 * Point ;
                    
         else
           
        ExtMapBuffer2[i]= 0.0 ;
               
         if (RSIBuffer3[i+ 2 ]-RSIBuffer3[i+ 1 ]< 0 && RSIBuffer3[i+ 1 ]-RSIBuffer3[i]< 0 ) // условия выставления стрелки
        
         /* так тоже не работает
        if(RSIBuffer3[i+2]<=RSIBuffer3[i+1] && RSIBuffer3[i+1]>=RSIBuffer3[i])
        */
              
        ExtMapBuffer1[i]=High[i]+ 5 * Point ;
           
         else       
           
        ExtMapBuffer1[i]= 0.0 ;           
        }
                   
   return ( 0 );
   }
        
//+------------------------------------------------------------------+      
 
Merincool :

Lütfen yardım edin beynim yanıyor kaç gündür uğraşıyorum ama sorunun ne olduğunu çözemedim.

RSI'ye dayalı basit bir gösterge yazmaya çalışıyorum (The MQL4 Language for Dummies makalesinden RandomIndicatorSignals.mq4 göstergesi. Özel Göstergeler (Bölüm 1) ( https://www.mql5.com/ru/articles/1500 ) analog olarak alınmıştır.

Özü basittir, RSI bir üst veya alt çizerse, grafikte bir ok çizer.

Görünüşe göre her şeyi doğru yaptım, ama bence her mum için RSI değerlerinin tamponu dolu değil, bu yüzden çalışmıyor. İşte kod.

Bir döngüde hesaplanmamış gösterge değerlerine erişiyorsunuz.

Değişiklik

 for (i= 0 ; i<limit; i++)

üzerinde

 for (i=limit-1; i>= 0 ; i--)
 
PapaYozh :

Bir döngüde hesaplanmamış gösterge değerlerine erişiyorsunuz.

Değişiklik

üzerinde


bana bir fikir verdiğin için teşekkürler! Ancak fizikçimizin dediği gibi "fiziksel ANLAMI" anlamak isterim :)

sorunun kendisi: 2 "biraz" farklı, ancak temelde aynı işlem kodları: Bekleyen TÜM siparişleri sil

1) olması gerektiği gibi çalışmıyor - yalnızca bir siparişi siler

 void start()

  {

   bool    result;     int     cmd,total,OT;

   total= OrdersTotal ();

   for ( int i= 0 ; i<total; i++)

     {

       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))

        {

         cmd=OrderType();    OT=OrderTicket();

         if (cmd> 1 )   // !=OP_BUY && cmd!=OP_SELL)

           {

            result=OrderDelete(OT);

           }

        }

     } //end FOR

  }

2) iyi çalışıyor - her şeyi kaldırır

 void start()
{
     string msg= "Удалить все отложенные ордера?    " ;
//   if (MessageBox(msg,title,MB_YESNO|MB_ICONQUESTION)!=IDYES) return;

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) if (OrderType()> 1 ) OrderDelete(OrderTicket());
   }
}

Açıklayın: "bir döngüde hesaplanmamış gösterge değerlerine erişirsiniz"in anlamı

 
PapaYozh :

Bir döngüde hesaplanmamış gösterge değerlerine erişiyorsunuz.

Değişiklik

üzerinde


çiğneyebilir misin nedenmiş? gelecekte hata yapmayayım diye.
 
PapaYozh :

Bir döngüde hesaplanmamış gösterge değerlerine erişiyorsunuz.

Değişiklik

üzerinde


ve hala çalışmıyor, bir çubuğun üzerine gelindiğinde RSIBffer3 yalnızca son çubukta RSI değerini gösteriyor
 
Merincool :

ve hala çalışmıyor, bir çubuğun üzerine gelindiğinde RSIBffer3 yalnızca son çubukta RSI değerini gösteriyor

5. parametreniz 0 - yani. son çubuk!

Bunu şu şekilde yapın:

       RSIBuffer3[i]= iRSI ( 0 , 0 , 8 , PRICE_CLOSE ,i);  

Rıhtımlardan alıntı:

çift iRSI ( string sembolü, int zaman çerçevesi, int periyodu, int uygulanan_fiyat, int shift)
Göreceli güç endeksini hesaplar ve değerini döndürür.
parametreler:
semboller - Göstergeyi hesaplamak için verilerinin kullanılması gereken sembol. NULL, geçerli sembol anlamına gelir.
zaman aralığı - zaman aralığı. Zaman Çerçevesi numaralandırma değerlerinden herhangi biri olabilir. 0, mevcut grafik zaman çerçevesi anlamına gelir.
dönem - Hesaplama için dönem sayısı.
uygulanan_fiyat - Uygulanan fiyat. Uygulanan fiyat numaralandırma değerlerinden herhangi biri olabilir.
vardiya - Gösterge tamponundan alınan değerin indeksi (geçerli periyotlar öncesindeki mevcut çubuğa göre kayma).
 
PapaYozh :

Bir döngüde hesaplanmamış gösterge değerlerine erişiyorsunuz.

Değişiklik

üzerinde


Ve işte başka ne düşündüm, sizin mantığınıza göre, hindi RSI'yi limitten 0 bar'a kadar hesaplamalı, ancak RSI'yi sondan veya baştan itibaren hangi tarafın hesaplaması gerçekten önemli mi? ayrıca belirtilen aralıktaki her çubuk için RSI'yi hesaplamalı ve değeri bir arabelleğe (yani bir diziye) koymalı ve ardından dizideki ardışık üç değeri birbiriyle karşılaştırmalıdır. Ya da değil?

 
amurik61 :

5. parametreniz 0 - yani. son çubuk!

Bunu şu şekilde yapın:

Rıhtımlardan alıntı:

çift iRSI ( string sembolü, int zaman çerçevesi, int periyodu, int uygulanan_fiyat, int shift)
Göreceli güç endeksini hesaplar ve değerini döndürür.
parametreler:
semboller - Göstergeyi hesaplamak için verilerinin kullanılması gereken sembol. NULL, geçerli sembol anlamına gelir.
zaman aralığı - zaman aralığı. Zaman Çerçevesi numaralandırma değerlerinden herhangi biri olabilir. 0, mevcut grafik zaman çerçevesi anlamına gelir.
dönem - Hesaplama için dönem sayısı.
uygulanan_fiyat - Uygulanan fiyat. Uygulanan fiyat numaralandırma değerlerinden herhangi biri olabilir.
vardiya - Gösterge tamponundan alınan değerin indeksi (geçerli periyotlar öncesindeki mevcut çubuğa göre kayma).

deneyeceğim, teşekkürler
Neden: