MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 12

 
Artyom Trishkin :

논리는 이렇습니다.

  1. 유형 및 마감 시간별로 마지막 마감 주문을 찾습니다.
  2. 이 주문을 마감할 때까지 마감된 바를 찾습니다.
  3. 결과 막대 값이 0보다 크면 새 위치를 열 수 있습니다. 그렇지 않으면 아니요.
무례하게 사과드립니다) 어딘가에서 그러한 코드의 예를 볼 수 있습니까?
 
Viachaslau Baiko :
무례하게 사과드립니다) 어딘가에서 그러한 코드의 예를 볼 수 있습니까?

모든 것이 간단합니다

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 ));
}


죄송합니다. 아마도 그것에 대해 이야기하고 있지 않을 것입니다.

 
Dmitry Fedoseev :

여기에서 지표를 묵상하십시오. 여기에는 많은 정적 변수가 있습니다.

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

버퍼를 대체하기 위해 만들어졌습니다.

IndicatorCounted()=0이면 LastTime을 0으로 설정해야 합니다(다른 것은 선택 사항이지만 바람직함).

그런 다음 루프 시작 부분에서 값을 이동합니다.

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

        }
       else
        {
         cDir=pDir;
        }

"c"로 시작하는 변수는 현재 값이고 "p"로 시작하는 변수는 이전 값입니다.

링크가 열리지 않음 - 404 오류

시간을 가지고 실험을 해봤는데 뭔가 잘 안되네요... "마지막 막대에서 계산을 멈추는 방법" 방향으로 생각했는데, 이건 제 실수인 것 같습니다. 이제 현재 막대를 변경하기 전에 계산의 마지막 단계를 변경하지 않는 방법에 대해 생각해 보겠습니다.

 
Alekseu Fedotov :

모든 것이 간단합니다

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 ));
}


죄송합니다. 아마도 그것에 대해 이야기하고 있지 않을 것입니다.

감사합니다. 시도하겠습니다!
 

안녕하세요! 알고리즘을 도와주세요!
Pearson 상관 계수를 계산하는 간단한 스크립트를 작성했습니다. 첫 번째 막대에서 시작하여 종가 로 선택된 배열

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 ;
  }

가격 배열은 첫 번째 막대에서 시작하여 24개 막대로 끝나는 값을 가져옵니다.
이제 24개 막대에 대한 상관 관계도 계산하고 싶지만 SECOND(!) 막대에서 가격 배열을 가져옵니다.

알고리즘을 모르는 상태에서 각 가격 배열을 수동으로 입력했습니다.

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개의 막대는 너무 많고 100개의 막대에 대한 상관관계를 알고 싶다면 각 배열을 입력하는 것이 괴롭습니다.
사람들은 어떻습니까?)

 
Timur1988 :

안녕하세요! 알고리즘을 도와주세요!
Pearson의 상관 계수를 계산하는 스크립트를 작성했습니다. 첫 번째 막대부터 시작하여 종가로 취한 배열

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+가격_종료_x[p];
sum_y=sum_y+Price_Close_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);

sum_x=sum_x+가격_종료_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);
}
__________________________________________________________________________________________


2차원 배열...

가격닫기[][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 ];
   }
 

나는 내가 어디에서 잘못되고 있는지 이해하지 못합니다 ...

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

결과가 옵션 4와 다릅니다. 무엇이 잘못되었나요?

 
-Aleks- :

링크가 열리지 않음 - 404 오류

시간을 가지고 실험을 해봤는데 뭔가 잘 안되네요... "마지막 막대에서 계산을 멈추는 방법" 방향으로 생각했는데, 이건 제 실수인 것 같습니다. 이제 현재 막대를 변경하기 전에 계산의 마지막 단계를 변경하지 않는 방법에 대해 생각해 보겠습니다.

왜 그렇게 무겁고 민첩하지 않습니까? 당신은 이미 결정을 받았고, 앉아서 생각하기만 하면 됩니다. 결론은 물론, 글쎄, 단어가 없습니다-그들은 시간이라는 단어를 보았고 즉시 당신이 그것을했다는 결론 ...

링크가 필요하지 않습니다. 그렇지 않으면 완전히 익사할 것입니다. 필요한 모든 것이 해당 게시물에 기록되어 있습니다. 더 자세히 반복하겠습니다.

1. 정적 변수 LastTime을 선언합니다 .

2. c 및 p 접두사를 사용하여 한 쌍의 정적 변수를 선언합니다.

3. IndicatorCounted()=0으로 1단계와 2단계에서 생성된 모든 변수를 재설정합니다.

4. 루프의 시작 부분에서 값을 던집니다.

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

        }
       else
        {
         cDir=pDir;
        }
 
Dmitry Fedoseev :

왜 그렇게 무겁고 민첩하지 않습니까? 당신은 이미 결정을 받았고, 앉아서 생각하기만 하면 됩니다. 결론은 물론, 글쎄, 단어가 없습니다-그들은 시간이라는 단어를 보았고 즉시 당신이 그것을했다는 결론 ...

링크가 필요하지 않습니다. 그렇지 않으면 완전히 익사할 것입니다. 필요한 모든 것이 해당 게시물에 기록되어 있습니다. 더 자세히 반복하겠습니다.

1. 정적 변수 LastTime을 선언합니다 .

2. c 및 p 접두사를 사용하여 한 쌍의 정적 변수를 선언합니다.

3. IndicatorCounted()=0으로 1단계와 2단계에서 생성된 모든 변수를 재설정합니다.

4. 루프의 시작 부분에서 값을 던집니다.

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

        }
       else
        {
         cDir=pDir;
        }

기꺼이 도와주셔서 감사합니다!

지표 작성에 대한 경험이 많지 않기 때문에 바로 위의 마지막 코드를 증명하는 여러 가지 어려움이 있습니다. 제가 찾고 있는 솔루션입니다.

귀하가 제공한 변형은 처음에 계산된 값을 유지하기 위해 (아이디어와 명확함에도 불구하고) 무효화하기 위해 제공되는 변수가 무엇인지 이해할 수 없기 때문에 어려움을 야기합니다.

어렵지 않은 경우 내 변형이 작동하지 않는 이유를 설명하십시오. 또한 계산을 막대당 하나의 틱으로 제한하고 이론상 변수는 변경되지 않아야 하며 이 변형은 유휴 주기가 걸리지 않기 때문에 더 저렴할 것으로 예상됩니다. 당신이 제안한 것과 다른 모든 눈금에 배치하십시오.

 
Artyom Trishkin :

논리는 이렇습니다.

  1. 유형 및 마감 시간별로 마지막 마감 주문을 찾습니다.
  2. 이 주문을 마감할 때까지 마감된 바를 찾습니다.
  3. 결과 막대 값이 0보다 크면 새 위치를 열 수 있습니다. 그렇지 않으면 아니요.

여기에 그런 뉘앙스가 있습니다. 이 코드를 사용했습니다( Alekseu Fedotov 덕분에 ).

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 ));
}

그리고 이제 확인합니다.

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

그리고 여기에 전체 걸림돌이 있습니다. 왜냐하면. 처음에 NumberOfBarCloseLastPos는 "-1"이 됩니다. 따라서 첫 번째 주문은 열리지 않습니다.

그러한 상황에서 무엇을 할 수 있습니까? 아니면 내가 뭔가를 잘못 이해 했습니까?