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

 
Artyom Trishkin :

Mantık şu:

  1. türüne ve kapanış saatine göre son kapatılan siparişi bulun
  2. bu siparişi kapatana kadar kapatıldığı barı bulun
  3. sonuçtaki çubuk değeri sıfırdan büyükse, yeni bir pozisyon açabilirsiniz, aksi takdirde - hayır.
Küstahlık için özür dilerim) Böyle bir kodun bir örneğini bir yerde görmek mümkün mü?
 
Viachaslau Baiko :
Küstahlık için özür dilerim) Böyle bir kodun bir örneğini bir yerde görmek mümkün mü?

her şey basit

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара закрытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos( string sy= "0" , int tf= 0 , int op=- 1 , int mn=- 1 ) {
   datetime t;
   int       i, k= OrdersHistoryTotal ();

   if (sy== "" || sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) {
       if ( OrderSymbol ()==sy) {
         if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) {
           if (op< 0 || OrderType ()==op) {
             if (mn< 0 || OrderMagicNumber ()==mn) {
               if (t< OrderCloseTime ()) t= OrderCloseTime ();
            }
          }
        }
      }
    }
  }
   return ( iBarShift (sy, tf, t, True ));
}


Üzgünüm, belki bundan bahsetmiyorum.

 
Dmitry Fedoseev :

Burada bu gösterge üzerinde meditasyon yapın. Bir sürü statik değişkene sahiptir:

   static datetime LastTime= 0 ;
   static int cDir= 0 ;
   static int pDir= 0 ;

Tamponları değiştirmek için yapılırlar.

IndicatorCounted()=0 ise, LastTime sıfıra ayarlanmalıdır (diğerleri isteğe bağlıdır, ancak istenir).

Ardından, döngünün başında değerleri taşıyın:

if ( Time [i]>LastTime)
        {
         LastTime= Time [i];
         pDir=cDir;

        }
       else
        {
         cDir=pDir;
        }

"c" ile başlayan değişkenler mevcut değerdir ve "p" ile başlayanlar bir önceki değerdir.

Bağlantı açılmıyor - 404 hatası

Zamanla denemeye çalıştım ama bir şeyler olmadı... "Son çubukta hesaplamaları nasıl durdurabilirim" yönünde düşündüm, sanırım bu benim hatam. Şimdi mevcut çubuğu değiştirmeden önce hesaplamadaki son adımı nasıl değiştirmeyeceğimi düşüneceğim.

 
Alekseu Fedotov :

her şey basit

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара закрытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos( string sy= "0" , int tf= 0 , int op=- 1 , int mn=- 1 ) {
   datetime t;
   int       i, k= OrdersHistoryTotal ();

   if (sy== "" || sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) {
       if ( OrderSymbol ()==sy) {
         if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) {
           if (op< 0 || OrderType ()==op) {
             if (mn< 0 || OrderMagicNumber ()==mn) {
               if (t< OrderCloseTime ()) t= OrderCloseTime ();
            }
          }
        }
      }
    }
  }
   return ( iBarShift (sy, tf, t, True ));
}


Üzgünüm, belki bundan bahsetmiyorum.

Teşekkürler, deneyeceğim!
 

Merhaba! Lütfen algoritmaya yardım edin!
Pearson korelasyon katsayısını hesaplayan basit bir komut dosyası yazdı. İlk çubuktan başlayarak kapanış fiyatlarında seçilen diziler

int start()
   {
   int n= 25 ;
   int w= 18 ;
   double sum_x= 0 ;                                                 // Сумма цен закрытия для пары 1
   double sum_y= 0 ;                                                 // Сумма цен закрытия для пары 2
   double Price_Close_x[];                                         // Массив Price_Close для пары 1
   double Price_Close_y[];                                         // Массив Price_Close для пары 2
   double dx[];                                                    // Отклонение от среднего значения для пары 1 dx
   double dy[];                                                    // Отклонение от среднего значения для пары 2 dy
   double dx2[];                                                   // Квадрат отклонения ср.значения dx2
   double dy2[];                                                   // Квадрат отклонения ср.значения dy2
   double dxdy[];                                                 // Произведение dx и dy



   ArrayResize (Price_Close_x, n);
   ArrayResize (Price_Close_y, n);
   ArrayResize (dx, n);
   ArrayResize (dy, n);  
   ArrayResize (dx2, n);
   ArrayResize (dy2, n);
   ArrayResize (dxdy, n);
   string sym_x= "EURUSD" ;
   string sym_y= "GBPUSD" ;
  
   for ( int p= 1 ; p<n; p++)
      {
      Price_Close_x[p]= iClose (sym_x, PERIOD_H1 , p);
      Price_Close_y[p]= iClose (sym_y, PERIOD_H1 , p);
      sum_x=sum_x+Price_Close_x[p];
      sum_y=sum_y+Price_Close_y[p];
      }
      
   Alert ( "Sum_x равно " , sum_x);
   Alert ( "Sum_y равно " , sum_y);
   double Mx=sum_x/(n- 1 );                                         // Среднее значение цен закрытия пары 1 Mx
   double My=sum_y/(n- 1 );                                         // Среднее значение цен закрытия пары 2 My
   Alert ( "Mx равно " , Mx);
   Alert ( "My равно " , My);  
  
   for ( int i= 1 ; i<n; i++)
      {
      dx[i]=Price_Close_x[i]-Mx;
      dy[i]=Price_Close_y[i]-My;
      dx2[i]= DoubleToString (dx[i]*dx[i], w);
      dy2[i]= DoubleToString (dy[i]*dy[i], w);
      dxdy[i]= DoubleToString (dx[i]*dy[i], w);
       Alert ( "Отклонение dx на баре " , i, " равно " , DoubleToString (dx[i], w));
       Alert ( "Отклонение dy на баре " , i, " равно " , DoubleToString (dy[i], w));
       Alert ( "Квадрат dx на баре " , i, " равен " , DoubleToString (dx2[i], w));
       Alert ( "Квадрат dy на баре " , i, " равен " , DoubleToString (dy2[i], w));
       Alert ( "dxdy на баре " , i, " равен " , DoubleToString (dxdy[i], w));    
      }
   double Edx2= 0 ;                                                 // Сумма квадратов отклонений Edx2
   double Edy2= 0 ;                                                 // Сумма квадратов отклонений Edy2
   double Edxdy= 0 ;                                                 // Сумма произведений отклонений Edxdy
   for ( int q= 0 ; q<n; q++)
      {
      Edx2= DoubleToString ((Edx2+dx2[q]), w);
      Edy2= DoubleToString ((Edy2+dy2[q]), w);
      Edxdy= DoubleToString ((Edxdy+dxdy[q]), w);
      }  
   Alert ( "Сумма Edx2 равна " , DoubleToString (Edx2, w));
   Alert ( "Сумма Edy2 равна " , DoubleToString (Edy2, w));
   Alert ( "Сумма Edxdy равна " , DoubleToString (Edxdy, w));
  
   double Koef;                                                     // Коэффициент Пирсона
   Koef=Edxdy/( sqrt ( DoubleToString ((Edx2*Edy2), w)));
   Alert ( "Коэффициент корреляции Пирсона между " , sym_x, " и " , sym_y, " равен " , DoubleToString (Koef, w));    
   return ;
  }

Fiyat dizisi, birinciden başlayıp 24 çubukla biten alınır.
Şimdi korelasyonu 24 çubuk için de hesaplamak istiyorum, ancak İKİNCİ(!) çubuğundan fiyat dizisini alıyorum.

Algoritmayı bilmeden her fiyat dizisini manuel olarak girdim:

for ( int p= 1 ; p<n; p++)

      {

      Price_Close_x[p]= iClose (sym_x, PERIOD_H1 , p);

      Price_Close_y[p]= iClose (sym_y, PERIOD_H1 , p);

      sum_x=sum_x+Price_Close_x[p];

      sum_y=sum_y+Price_Close_y[p];

         Price_Close_x1[p]= iClose (sym_x, PERIOD_H1 , p+ 1 );

         Price_Close_y1[p]= iClose (sym_y, PERIOD_H1 , p+ 1 );

         Price_Close_x2[p]= iClose (sym_x, PERIOD_H1 , p+ 2 );

         Price_Close_y2[p]= iClose (sym_y, PERIOD_H1 , p+ 2 );

         Price_Close_x3[p]= iClose (sym_x, PERIOD_H1 , p+ 3 );

         Price_Close_y3[p]= iClose (sym_y, PERIOD_H1 , p+ 3 );
         ...
   
         ...
         Price_Close_x24[p]= iClose (sym_x, PERIOD_H1 , p+ 24 );

         Price_Close_y24[p]= iClose (sym_y, PERIOD_H1 , p+ 24 );
}

24 bar çok fazla ve eğer 100 bar için korelasyonu bulmak istersem, o zaman her diziye girmek işkence oluyor.
Peki ya insanlar?)

 
Timur1988 :

Merhaba! Lütfen algoritmaya yardım edin!
Pearson'ın korelasyon katsayısını hesaplayan bir komut dosyası yazdım. İlk çubuktan başlayarak kapanış fiyatları ile alınan diziler

for(int p=1; p<n; p++)
{
Price_Close_x[p]=iClose(sym_x, PERIOD_H1, p);
Price_Close_y[p]=iClose(sym_y, PERIOD_H1, p);
toplam_x=sum_x+Fiyat_Kapat_x[p];
toplam_y=sum_y+Fiyat_Kapat_y[p];
}
__________________________

for(int p=1; p<n; p++)

{

Price_Close_x[p]=iClose(sym_x, PERIOD_H1, p);

Price_Close_y[p]=iClose(sym_y, PERIOD_H1, p);

toplam_x=sum_x+Fiyat_Kapat_x[p];

toplam_y=sum_y+Fiyat_Kapat_y[p];

Price_Close_x1[p]=iClose(sym_x, PERIOD_H1, p+1);

Price_Close_y1[p]=iClose(sym_y, PERIOD_H1, p+1);

Price_Close_x2[p]=iClose(sym_x, PERIOD_H1, p+2);

Price_Close_y2[p]=iClose(sym_y, PERIOD_H1, p+2);

Price_Close_x3[p]=iClose(sym_x, PERIOD_H1, p+3);

Price_Close_y3[p]=iClose(sym_y, PERIOD_H1, p+3);
...
Price_Close_x24[p]=iClose(sym_x, PERIOD_H1, p+24);

Price_Close_y24[p]=iClose(sym_y, PERIOD_H1, p+24);
}
____________________________________________________________________________


İki boyutlu dizi...

FiyatKapat[][2];

double PriceClose[][ 2 ];
int n= 24 ;
ArrayResize (PriceClose,n);
for ( int p= 0 ; p<n; p++) {
   PriceClose[p][ 0 ]= iClose (sym_x, PERIOD_H1 , p);
   PriceClose[p][ 1 ]= iClose (sym_y, PERIOD_H1 , p);
   sum_x+=PriceClose[p][ 0 ];
   sum_y+=PriceClose[p][ 1 ];
   }
 

Nerede yanlış yapıyorum anlamıyorum...

//+------------------------------------------------------------------+
//|                                                       SVA_03.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link        "http://www.metaquotes.net/"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow

//---- input parameters
extern int RSIPeriod= 14 ;
extern int Levl= 50 ;
extern int TF= 0 ;
//---- buffers
double MABuffer[];
static datetime TimeN= 0 ;
static datetime TimeX= 0 ;
int StopCalc= 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
   IndicatorBuffers ( 1 );
   SetIndexBuffer ( 0 ,MABuffer);

//---- indicator line
   SetIndexStyle ( 0 , DRAW_LINE );
//----
//---- name for DataWindow and indicator subwindow label
//   short_name="RSI("+IntegerToString(RSIPeriod)+")";
   short_name= "RSI(" +RSIPeriod+ ")" ;
   IndicatorShortName (short_name);
   SetIndexLabel ( 0 ,short_name);

   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int     i,counted_bars= IndicatorCounted ();
   double rel,negative,positive,sma,x,y,Pos,Neg;
   double sumn= 0.0 ,sump= 0.0 ;
//----
   if ( Bars <=RSIPeriod) return ( 0 );
   if (TF!= 0 )
     {
       string name= WindowExpertName ();
       for (i= 0 ; i< Bars -counted_bars+ 1 ; i++)
        {
         int barIndex= iBarShift ( NULL ,TF, Time [i], false );
         MABuffer[i]= iCustom ( Symbol (),TF,name,RSIPeriod,Levl, 0 , 0 ,barIndex);
        }
       return ( 0 );
     }

   i= Bars -RSIPeriod- 1 ;
   if (counted_bars>=RSIPeriod) i= Bars -counted_bars- 1 ;
   datetime TimeC= iTime ( NULL ,TF, 0 );
   while (i>= 0 )
     {
       if (i!= 0 && StopCalc== 0 )
        {
         sumn= 0.0 ;sump= 0.0 ;
         if (i== Bars -RSIPeriod- 1 )
           {
             int k= Bars - 2 ;
             //---- initial accumulation
             while (k>=i)
              {
               rel= Close [k]- Close [k+ 1 ];
               if (rel> 0 ) sump+=rel;
               else       sumn-=rel;
               k--;
              }
            positive=sump/RSIPeriod;
            negative=sumn/RSIPeriod;
           }
         else
           {
             //---- smoothed moving average
            rel= Close [i]- Close [i+ 1 ];
             if (rel> 0 ) sump=rel;
             else       sumn=-rel;
            positive=(Pos*(RSIPeriod- 1 )+sump)/RSIPeriod;
            negative=(Neg*(RSIPeriod- 1 )+sumn)/RSIPeriod;
           }

         x=Pos;
         y=Neg;
         Pos=positive;
         Neg=negative;
         if (x> 0 )sma= Close [i+ 1 ]+x;
         else sma= Close [i+ 1 ]-y;
         MABuffer[i]=sma;
         Print ( "Этап 01 i=" ,i);      
        }

       if (i== 0 )
        {
           if (TimeC!=TimeX)
          {
        
            rel= Close [i+ 1 ]- Close [i+ 2 ];
             if (rel> 0 ) sump=rel;
             else       sumn=-rel;
            positive=(Pos*(RSIPeriod- 1 )+sump)/RSIPeriod;
            negative=(Neg*(RSIPeriod- 1 )+sumn)/RSIPeriod;
            x=Pos;
            y=Neg;
            Pos=positive;
            Neg=negative;
             Print ( "positive=" ,positive);
             Print ( "negative=" ,negative);


             if (x> 0 )sma= Close [i+ 1 ]+x;
             else sma= Close [i+ 1 ]-y;
            MABuffer[i]=sma;
             Print ( "Этап 2 i=" ,i);          
            TimeX= iTime ( NULL ,TF, 0 );
            StopCalc= 1 ;
          }          
        }
      i--;
     }

//----
   return ( 0 );
  }
//+------------------------------------------------------------------+

sonuçlar seçenek 4'ten farklı - sorun ne?

 
-Aleks- :

Bağlantı açılmıyor - 404 hatası

Zamanla denemeye çalıştım ama bir şeyler olmadı... "Son çubukta hesaplamaları nasıl durdurabilirim" yönünde düşündüm, sanırım bu benim hatam. Şimdi, mevcut çubuğu değiştirmeden önce hesaplamadaki son adımı nasıl değiştirmeyeceğimi düşüneceğim.

Neden bu kadar ağırsın ve çevik değilsin? Size zaten bir karar verildi, sadece oturup düşünmeniz gerekiyor. Sonuç elbette, kelime yok - Zaman kelimesini gördüler ve hemen yaptığınız sonucu ...

Linke gerek yok, yoksa tamamen boğulursunuz, ihtiyacınız olan her şey o yazıda yazıyor, daha detaylı tekrar edeceğim:

1. Statik bir LastTime değişkeni bildirin.

2. c ve p önekleri ile bir çift statik değişken tanımlayın.

3. IndicatorCounted()=0 ile 1. ve 2. adımlarda oluşturulan tüm değişkenleri sıfırlayın.

4. Döngünün başında değerleri atın:

if ( Time [i]>LastTime)
        {
         LastTime= Time [i];
         pDir=cDir;

        }
       else
        {
         cDir=pDir;
        }
 
Dmitry Fedoseev :

Neden bu kadar ağırsın ve çevik değilsin? Size zaten bir karar verildi, sadece oturup düşünmeniz gerekiyor. Sonuç elbette, kelime yok - Zaman kelimesini gördüler ve hemen yaptığınız sonucu ...

Linke gerek yok, yoksa tamamen boğulursunuz, ihtiyacınız olan her şey o yazıda yazıyor, daha detaylı tekrar edeceğim:

1. Statik bir LastTime değişkeni bildirin.

2. c ve p önekleri ile bir çift statik değişken tanımlayın.

3. IndicatorCounted()=0 ile 1. ve 2. adımlarda oluşturulan tüm değişkenleri sıfırlayın.

4. Döngünün başında değerleri atın:

if ( Time [i]>LastTime)
        {
         LastTime= Time [i];
         pDir=cDir;

        }
       else
        {
         cDir=pDir;
        }

Yardım etme isteğiniz için teşekkürler!

Gösterge yazma konusunda fazla deneyimim yok, bu yüzden bir takım zorluklar var - aradığım çözüm - bu da hemen yukarıdaki son kodumu kanıtlıyor.

Önerdiğiniz değişken, başlangıçta hesaplanan değerleri korumak için - fikir açık olsa da - hangi değişkenleri sıfıra sıfırlamam önerildiğini anlayamıyorum çünkü zorluk yaratıyor.

Zor değilse, varyantımın neden çalışmadığını açıklayın - ayrıca hesaplamayı çubuk başına bir onay işaretiyle sınırlandırıyorum ve teoride değişkenler değişmemeli ve boşta kalma döngüsü olmayacağından bu varyantın daha ucuz olması bekleniyor. önerdiğinizden farklı olarak her kene üzerine yerleştirin.

 
Artyom Trishkin :

Mantık şu:

  1. türüne ve kapanış saatine göre son kapatılan siparişi bulun
  2. bu siparişi kapatana kadar kapatıldığı barı bulun
  3. sonuçtaki çubuk değeri sıfırdan büyükse, yeni bir pozisyon açabilirsiniz, aksi takdirde - hayır.

İşte böyle bir nüansım var: Bu kodu aldım ( Alekseu Fedotov sayesinde):

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара закрытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos( string sy= "0" , int tf= 0 , int op=- 1 , int mn=- 1 ) {
   datetime t;
   int       i, k= OrdersHistoryTotal ();

   if (sy== "" || sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) {
       if ( OrderSymbol ()==sy) {
         if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) {
           if (op< 0 || OrderType ()==op) {
             if (mn< 0 || OrderMagicNumber ()==mn) {
               if (t< OrderCloseTime ()) t= OrderCloseTime ();
            }
          }
        }
      }
    }
  }
   return ( iBarShift (sy, tf, t, True ));
}

Ve şimdi kontrol ediyorum:

if (УСЛОВИЕ && NumberOfBarCloseLastPos()> 0 )

Ve işte bütün engel, çünkü. başlangıçta NumberOfBarCloseLastPos "-1" olacaktır. Ve buna göre, ilk sipariş asla açılmayacak.

Böyle bir durumda ne yapılabilir? Yoksa bir şeyi yanlış mı anladım?