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

 

좋은 저녁이에요.

선택한 상품에 대한 변동성 요약표인 지표를 작성했습니다. 지표가 설정된 차트에 관계없이 데이터는 동일한 방식으로 계산되어야 합니다. 그러나 그는 다르게 생각합니다. 차트 이름의 분모에 JPY가 포함되어 있는지 여부에 따라 다릅니다.

그렇다면 테이블은 다음과 같습니다.


그렇지 않은 경우 다음과 같이 :


코드는 다음과 같습니다.

 #property copyright "Vasya Pupkin"
#property link        ""
#property indicator_separate_window

//------- Внешние параметры индикатора ----------------------------------------+

extern int    BARS = 100 ;                 // Кол-во баров для рассчета
extern int    eiOffsetY = 15 ;           // Смещение текста по вертикали
extern int    eiStepY   = 12 ;           // Шаг смещения текста по вертикали
extern int    eiX1Row   = 3 ;             // Координата X первой колонки
extern int    eiX2Row   = 50 ;           // Координата X второй колонки
extern int    eiX3Row   = 100 ;           // Координата X третей колонки
extern int    eiX4Row   = 150 ;           // Координата X четвёртой колонки
extern int    eiX5Row   = 200 ;           // Координата X пятой колонки
extern int    eiX6Row   = 250 ;           // Координата X шестой колонки
extern int    eiX7Row   = 300 ;           // Координата X седьмой колонки
extern int    eiX8Row   = 350 ;           // Координата X восьмой колонки
extern int    eiX9Row   = 400 ;           // Координата X восьмой колонки
extern color ecText    = Gray;         // Цвет текста
extern string Symbols  = "audcad,audchf,audjpy,audnzd,audusd,cadchf,cadjpy,chfjpy,euraud,eurcad" ;

//------- Глобальные переменные индикатора ------------------------------------+
int nWindow_ToDay;       // Номер окна

//------- Буферы индикатора ---------------------------------------------------+

//------- Поключение внешних модулей ------------------------------------------+

//+----------------------------------------------------------------------------+
//|  Custom indicator initialization function                                  |
//+----------------------------------------------------------------------------+
void init() {
  nWindow_ToDay= WindowFind ( "VolatilityTab" );
   if (nWindow_ToDay< 0 ) nWindow_ToDay= WindowsTotal ();
  DeleteObjects();
   Comment ( "" );
}

//+----------------------------------------------------------------------------+
//|  Custom indicator deinitialization function                                |
//+----------------------------------------------------------------------------+
void deinit() {
  DeleteObjects();
   Comment ( "" );
}

//+----------------------------------------------------------------------------+
//|  Custom indicator iteration function                                       |
//+----------------------------------------------------------------------------+
void start() {
  DeleteObjects();
  

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 
   SetLabel( "Volatility_00" , "TF" , Red, eiX1Row, eiOffsetY+eiStepY);
   SetLabel( "Volatility_10" , "M5" , ecText, eiX1Row, eiOffsetY+ 2 *eiStepY);
   SetLabel( "Volatility_20" , "M15" , ecText, eiX1Row, eiOffsetY+ 3 *eiStepY);
   SetLabel( "Volatility_30" , "M30" , ecText, eiX1Row, eiOffsetY+ 4 *eiStepY);
   SetLabel( "Volatility_40" , "H1" , ecText, eiX1Row, eiOffsetY+ 5 *eiStepY);
   SetLabel( "Volatility_50" , "H4" , ecText, eiX1Row, eiOffsetY+ 6 *eiStepY);  
   SetLabel( "Volatility_60" , "D1" , ecText, eiX1Row, eiOffsetY+ 7 *eiStepY);
   SetLabel( "Volatility_70" , "Week" , ecText, eiX1Row, eiOffsetY+ 8 *eiStepY);
   SetLabel( "Volatility_80" , "Month" , ecText, eiX1Row, eiOffsetY+ 9 *eiStepY);

   string syb[];
   int    k, r, countX,countY= 1 ;

  StrSplit(Symbols, syb, "," );
   if ( ArraySize (syb)== 0 ) StrSplit(Symbols, syb, ";" );
  r= ArraySize (syb);
   for (k= 0 ; k<r; k++) {
    syb[k]=StringUpper(syb[k]);     
    countX++;
    SetLabel( "Volatility_" + "0" +countX, syb[k], Red, countX*eiX2Row, eiOffsetY+eiStepY);
  
       int i,s1= 0 ,s2= 0 ,s3= 0 ,s4= 0 ,s5= 0 ,s6= 0 ,s7= 0 ,s8= 0 ,b;
  
       for (i=BARS; i> 0 ; i--)
        {
          s1+=( iHigh (syb[k], 5 ,i)- iLow (syb[k], 5 ,i))/ Point ;
           //Comment(MarketInfo(syb[k],MODE_DIGITS));
          s2+=( iHigh (syb[k], 15 ,i)- iLow (syb[k], 15 ,i))/ Point ;
          s3+=( iHigh (syb[k], 30 ,i)- iLow (syb[k], 30 ,i))/ Point ;
          s4+=( iHigh (syb[k], 60 ,i)- iLow (syb[k], 60 ,i))/ Point ;
          s5+=( iHigh (syb[k], 240 ,i)- iLow (syb[k], 240 ,i))/ Point ;
          s6+=( iHigh (syb[k], 1440 ,i)- iLow (syb[k], 1440 ,i))/ Point ;
          s7+=( iHigh (syb[k], 10080 ,i)- iLow (syb[k], 10080 ,i))/ Point ;
          s8+=( iHigh (syb[k], 43200 ,i)- iLow (syb[k], 43200 ,i))/ Point ;
          b++;
        }
      SetLabel( "Volatility_" +countY+countX,s1/b+ " п." , ecText, countX*eiX2Row, eiOffsetY+ 2 *eiStepY);
      countY++;
      SetLabel( "Volatility_" +countY+countX,s2/b+ " п." , ecText, countX*eiX2Row, eiOffsetY+ 3 *eiStepY);
      countY++;
      SetLabel( "Volatility_" +countY+countX,s3/b+ " п." , ecText, countX*eiX2Row, eiOffsetY+ 4 *eiStepY);
      countY++;
      SetLabel( "Volatility_" +countY+countX,s4/b+ " п." , ecText, countX*eiX2Row, eiOffsetY+ 5 *eiStepY);
      countY++;
      SetLabel( "Volatility_" +countY+countX,s5/b+ " п." , ecText, countX*eiX2Row, eiOffsetY+ 6 *eiStepY);
      countY++;
      SetLabel( "Volatility_" +countY+countX,s6/b+ " п." , ecText, countX*eiX2Row, eiOffsetY+ 7 *eiStepY);
      countY++;
      SetLabel( "Volatility_" +countY+countX,s7/b+ " п." , ecText, countX*eiX2Row, eiOffsetY+ 8 *eiStepY);
      countY++;
      SetLabel( "Volatility_" +countY+countX,s8/b+ " п." , ecText, countX*eiX2Row, eiOffsetY+ 9 *eiStepY);
      s1= 0 ;
      s2= 0 ;
      s3= 0 ;
      s4= 0 ;
      s5= 0 ;
      s6= 0 ;
      s7= 0 ;
      s8= 0 ;
      b= 0 ;
      countY= 1 ;
}
  
}

//+----------------------------------------------------------------------------+
//|  Удаление объектов.                                                        |
//+----------------------------------------------------------------------------+
void DeleteObjects() {
   string st= "Volatility_" ;
   int     i, j;

   for (i= 0 ; i< 9 ; i++) {
     for (j= 0 ; j< 15 ; j++) ObjectDelete (st+i+j);
  }
}



//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки                                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний)                     |
//|    fs - размер шрифта              (8 - по умолчанию)                      |
//+----------------------------------------------------------------------------+
void SetLabel( string nm, string tx, color cl, int xd, int yd, int cr= 0 , int fs= 8 ) {
   if ( ObjectFind (nm)< 0 ) ObjectCreate (nm, OBJ_LABEL , nWindow_ToDay, 0 , 0 );
   ObjectSetText (nm, tx, fs);
   ObjectSet (nm, OBJPROP_COLOR     , cl);
   ObjectSet (nm, OBJPROP_XDISTANCE , xd);
   ObjectSet (nm, OBJPROP_YDISTANCE , yd);
   ObjectSet (nm, OBJPROP_CORNER    , cr);
   ObjectSet (nm, OBJPROP_FONTSIZE , fs);
}
//+----------------------------------------------------------------------------+

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Разбиение строки на массив элементов                           |
//+----------------------------------------------------------------------------+
//|  Возврат:                                                                  |
//|    Количество элементов в массиве                                          |
//|  Параметры:                                                                |
//|    source    - текстовая строка                                            |
//|    dest      - выходной массив                                             |
//|    delimeter - разделитель                                                 |
//+----------------------------------------------------------------------------+
int StrSplit( string source, string & dest[], string delimeter= ";" ) { 
   int cnt= 0 ;
   int last_pos= 0 ;
   int pos= StringFind (source, delimeter, last_pos);

   while (pos!=- 1 ) {
     ArrayResize (dest, cnt+ 1 );
    dest[cnt]= StringSubstr (source, last_pos, pos-last_pos);
    cnt++;
    last_pos=pos+ 1 ;
    pos= StringFind (source, delimeter, last_pos);
  }
   if (last_pos!= 0 && last_pos< StringLen (source)) {
     ArrayResize (dest, cnt+ 1 );
    dest[cnt]= StringSubstr (source, last_pos, StringLen (source)-last_pos);
    cnt++;
  }
   return (cnt);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает строку в ВЕРХНЕМ регистре                           |
//+----------------------------------------------------------------------------+
string StringUpper( string s) {
   int c, i, k= StringLen (s), n;
   for (i= 0 ; i<k; i++) {
    n= 0 ;
    c= StringGetChar (s, i);
     if (c> 96 && c< 123 ) n=c- 32 ;     // a-z -> A-Z
     if (c> 223 && c< 256 ) n=c- 32 ;   // а-я -> А-Я
     if (c== 184 ) n= 168 ;             //  ё  ->  Ё
     if (n> 0 ) s= StringSetChar (s, i, n);
  }
   return (s);
}
Автоматизация торговли на финансовых рынках - Главная
Автоматизация торговли на финансовых рынках - Главная
  • www.kimiv.ru
Что нового по сравнению с версией 1.4? stSender. Изменена процедура записи файлов под требования билда 610 и выше. stReceiver. Функции проверки существования файла и копирования файлов заменены на аналогичные, поддерживающие UNICODE (для работоспособности в билде 610 и выше). Разработан и доступен для покупки новый советник e-Reverser...
 
Sergey :

좋은 저녁이에요.

선택한 상품에 대한 변동성 요약표인 지표를 작성했습니다. 지표가 설정된 차트에 관계없이 데이터는 동일한 방식으로 계산되어야 합니다. 그러나 그는 다르게 생각합니다. 분모의 차트 이름에 JPY가 있는지 여부에 따라 다릅니다.

이미 이것을 충족했습니다 - JPY에는 분수 부호가 더 적습니다. 따라서 Point가 다릅니다. 또는 다른 것?

s1+=( iHigh (syb[k], 5 ,i)- iLow (syb[k], 5 ,i))/ Point ;
//Comment(MarketInfo(syb[k],MODE_DIGITS));
s2+=( iHigh (syb[k], 15 ,i)- iLow (syb[k], 15 ,i))/ Point ;
s3+=( iHigh (syb[k], 30 ,i)- iLow (syb[k], 30 ,i))/ Point ;
s4+=( iHigh (syb[k], 60 ,i)- iLow (syb[k], 60 ,i))/ Point ;
s5+=( iHigh (syb[k], 240 ,i)- iLow (syb[k], 240 ,i))/ Point ;
s6+=( iHigh (syb[k], 1440 ,i)- iLow (syb[k], 1440 ,i))/ Point ;
s7+=( iHigh (syb[k], 10080 ,i)- iLow (syb[k], 10080 ,i))/ Point ;
s8+=( iHigh (syb[k], 43200 ,i)- iLow (syb[k], 43200 ,i))/ Point ;
그건 그렇고 Point() 또는 _Point를 사용 하는 것이 좋습니다
 
STARIJ :

이미 이것을 충족했습니다 - JPY에는 분수 부호가 더 적습니다. 따라서 포인트가 다를 것입니다


조건 추가를 시도했습니다

 if ( MarketInfo (syb[k], MODE_DIGITS )== 3 ) {z= 100 ;}
     else z= 1 ;

그런 다음 Z^로 나눕니다.

  
       for (i=BARS; i> 0 ; i--)
        {
          s1+=( iHigh (syb[k], 5 ,i)- iLow (syb[k], 5 ,i))/(z* Point );
           //Comment(MarketInfo(syb[k],MODE_DIGITS));
          s2+=( iHigh (syb[k], 15 ,i)- iLow (syb[k], 15 ,i))/(z* Point );
          s3+=( iHigh (syb[k], 30 ,i)- iLow (syb[k], 30 ,i))/(z* Point );
          s4+=( iHigh (syb[k], 60 ,i)- iLow (syb[k], 60 ,i))/(z* Point );
          s5+=( iHigh (syb[k], 240 ,i)- iLow (syb[k], 240 ,i))/(z* Point );
          s6+=( iHigh (syb[k], 1440 ,i)- iLow (syb[k], 1440 ,i))/(z* Point );
          s7+=( iHigh (syb[k], 10080 ,i)- iLow (syb[k], 10080 ,i))/(z* Point );
          s8+=( iHigh (syb[k], 43200 ,i)- iLow (syb[k], 43200 ,i))/(z* Point );
          b++;
        }

그러나 결국에는 ene이 없는 쌍에서 모든 것이 명확합니다.

그녀와 함께 쓰레기 :


 
Sergey :

조건 추가를 시도했습니다

그런 다음 Z^로 나눕니다.

그러나 결국에는 ene이 없는 쌍에서 모든 것이 명확합니다.

그녀와 함께 쓰레기 :


포인트 를 "SymbolInfoDouble( syb[k] , SYMBOL_POINT )"로 바꿉니다.

 
Vitaly Muzichenko :

포인트 를 "SymbolInfoDouble( syb[k] , SYMBOL_POINT )"로 바꿉니다.


감사합니다. 이제 모든 곳이 맑아지고 쓰레기가 없습니다.

 
Sergey :

감사합니다. 이제 모든 곳이 맑아지고 쓰레기가 없습니다.

코드를 약간 최적화하고 하나의 기호에 대해 한 번만 계산을 호출합니다.

       for (i=BARS; i> 0 ; i--)
        {
          point= SymbolInfoDouble (syb[k], SYMBOL_POINT );
          s1+=( iHigh (syb[k], 5 ,i)- iLow (syb[k], 5 ,i))/point;
          s2+=( iHigh (syb[k], 15 ,i)- iLow (syb[k], 15 ,i))/point;
          s3+=( iHigh (syb[k], 30 ,i)- iLow (syb[k], 30 ,i))/point;
          s4+=( iHigh (syb[k], 60 ,i)- iLow (syb[k], 60 ,i))/point;
          s5+=( iHigh (syb[k], 240 ,i)- iLow (syb[k], 240 ,i))/point;
          s6+=( iHigh (syb[k], 1440 ,i)- iLow (syb[k], 1440 ,i))/point;
          s7+=( iHigh (syb[k], 10080 ,i)- iLow (syb[k], 10080 ,i))/point;
          s8+=( iHigh (syb[k], 43200 ,i)- iLow (syb[k], 43200 ,i))/point;
          b++;
        }
 
Vitaly Muzichenko :

코드를 약간 최적화하고 하나의 기호에 대해 한 번만 계산을 호출합니다.

 #define AMOUNT_PERIODS ( sizeof (Periods) / sizeof ( ENUM_TIMEFRAMES )) // Лучше, чем ArraySize(Periods)

static const ENUM_TIMEFRAMES Periods[] = { PERIOD_M5 , PERIOD_M15 , PERIOD_M30 , PERIOD_H1 , PERIOD_H4 , PERIOD_D1 , PERIOD_W1 , PERIOD_MN1 };

double s[AMOUNT_PERIODS];
ArrayInitialize (s, 0 );

for ( int i=BARS; i> 0 ; i--)
  {
     const string Symb = syb[k];
     const double point= SymbolInfoDouble (syb[k], SYMBOL_POINT );

     for ( int j = 0 ; j < AMOUNT_PERIODS; j++)
      s[j]+=( iHigh (Symb,Periods[j],i)- iLow (Symb,Periods[j],i))/point;
  }

그리고 이러한 정신으로 전체 코드를 배열을 사용하여 간결하게 작업하도록 줄이십시오. 동일한 논리의 반복은 루프로 구성되어야 합니다.

 
안녕하세요! 말해 주세요. 후행이 표시기 바로 옆에 있지 않고 각각 10포인트 낮거나 높도록 규정하는 방법은 무엇입니까?
 if ( OrderMagicNumber ()==Magic&& OrderSymbol ()== Symbol ()&& OrderType ()== OP_BUY &&
   NormalizeDouble (SAR, Digits )> NormalizeDouble ( OrderStopLoss (), Digits )&& NormalizeDouble (SAR, Digits )< NormalizeDouble ( Bid , Digits ))
       OrderModify ( OrderTicket (), 0 ,SAR, 0 , 0 ,Blue);
 

안녕하세요!

문제를 해결하는 방법을 알려주십시오 . 조언자 작성 , 실패한 거래의 경우 보류 로트가 증가된 로트로 설정됩니다(예: 2배),

그러나 이 보류 주문이 실행될 때(드물게 10개의 경우 중 1개의 경우) 알고리즘에 따라 초기에 설정되었지만 로트에 계수가 곱해지지 않습니다.

다음은 예입니다.

0.4랏의 거래가 성사되고 0.8랏의 보류 주문이 즉시 배치되고 실행 시 볼륨은 0.4랏입니다.


뭐가 될수 있었는지?


고맙습니다.

 
yaaarik777 :

안녕하세요!

문제를 해결하는 방법을 알려주십시오 . 조언자 작성 , 실패한 거래의 경우 보류 로트가 증가된 로트로 설정됩니다(예: 2배),

그러나 이 보류 주문이 실행될 때(드물게 10개의 경우 중 1개의 경우) 알고리즘에 따라 초기에 설정되었지만 로트에 계수가 곱해지지 않습니다.

다음은 예입니다.

0.4랏의 거래가 성사되고 0.8랏의 보류 주문이 즉시 배치되고 실행 시 볼륨은 0.4랏입니다.


뭐가 될수 있었는지?


고맙습니다.

어쩌면 그것은 단지 부분적인 실행입니까? 잡지에는 무엇이 있습니까?