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

 
Vitaly Muzichenko :

원래 어둠 속에서 수정되었습니다.

PS Dot.mq4 - 전체 원본

시간이 오래 걸려서 죄송합니다. 일이 바빴습니다.

잡고 있다:

 //+------------------------------------------------------------------+
//|                                                      VMTest1.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        "https://mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 7
#property indicator_plots    3
//--- plot ARR
#property indicator_label1    "MaOSC"
#property indicator_type1    DRAW_COLOR_ARROW
#property indicator_color1    clrLimeGreen , clrOrangeRed , clrSilver
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- plot ArrUP
#property indicator_label2    "Up"
#property indicator_type2    DRAW_ARROW
#property indicator_color2    clrBlue
#property indicator_style2    STYLE_SOLID
#property indicator_width2    1
//--- plot ArrDN
#property indicator_label3    "Down"
#property indicator_type3    DRAW_ARROW
#property indicator_color3    clrCrimson
#property indicator_style3    STYLE_SOLID
#property indicator_width3    1
//---
#include <MovingAverages.mqh>

//--- input parameters
input uint      InpA= 40 ;
//--- indicator buffers
double          BufferMAOSC[];
double          BufferColorsARR[];
double          BufferArrUP[];
double          BufferArrDN[];
double          BufferMAV[];
double          BufferMAA[];
double          BufferTMP[];
//--- gv
int a= 0 ;
int per= 0 ;
int val= 0 ;
int handle_mav= INVALID_HANDLE ;
int handle_maa= INVALID_HANDLE ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,BufferMAOSC, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,BufferColorsARR, INDICATOR_COLOR_INDEX );
   SetIndexBuffer ( 2 ,BufferArrUP, INDICATOR_DATA );
   SetIndexBuffer ( 3 ,BufferArrDN, INDICATOR_DATA );
   SetIndexBuffer ( 4 ,BufferMAV, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 5 ,BufferMAA, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 6 ,BufferTMP, INDICATOR_CALCULATIONS );
   
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger ( 0 , PLOT_ARROW , 159 );
   PlotIndexSetInteger ( 1 , PLOT_ARROW , 225 );
   PlotIndexSetInteger ( 2 , PLOT_ARROW , 226 );
//---
   ArraySetAsSeries (BufferMAOSC, true );
   ArraySetAsSeries (BufferColorsARR, true );
   ArraySetAsSeries (BufferArrUP, true );
   ArraySetAsSeries (BufferArrDN, true );
   ArraySetAsSeries (BufferMAV, true );
   ArraySetAsSeries (BufferMAA, true );
   ArraySetAsSeries (BufferTMP, true );
//---
   a=(InpA< 4 ? 4 : InpA);
   per=( int ) floor ( sqrt (a));
   val=( int ) floor (a/ 1.9 );
//---
   handle_mav= iMA ( NULL , PERIOD_CURRENT ,val, 0 , MODE_SMA , PRICE_LOW );
   if (handle_mav== INVALID_HANDLE )
     {
       Print ( "Не удалось создать хэндл индикатора MA(" ,val, "), ошибка " , GetLastError ());
       return INIT_FAILED ;
     }
   handle_maa= iMA ( NULL , PERIOD_CURRENT ,a, 0 , MODE_SMA , PRICE_LOW );
   if (handle_maa== INVALID_HANDLE )
     {
       Print ( "Не удалось создать хэндл индикатора MA(" ,a, "), ошибка " , GetLastError ());
       return INIT_FAILED ;
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   int limit=rates_total-prev_calculated;
   if (limit> 1 )
     {
      limit=rates_total- 2 ;
       ArrayInitialize (BufferMAOSC, EMPTY_VALUE );
       ArrayInitialize (BufferColorsARR, 2 );
       ArrayInitialize (BufferArrUP, EMPTY_VALUE );
       ArrayInitialize (BufferArrDN, EMPTY_VALUE );
       ArrayInitialize (BufferMAV, 0 );
       ArrayInitialize (BufferMAA, 0 );
       ArrayInitialize (BufferTMP, 0 );
     }
//--- Подготовка данных
   int count=(limit> 1 ? rates_total : 1 ),copied= 0 ;
   copied= CopyBuffer (handle_mav, 0 , 0 ,count,BufferMAV);
   if (copied!=count) return 0 ;
   copied= CopyBuffer (handle_maa, 0 , 0 ,count,BufferMAA);
   if (copied!=count) return 0 ;

//--- Предварительный расчёт
   for ( int i=limit;i> WRONG_VALUE ;i--)
      BufferTMP[i]= 2.0 *BufferMAV[i]-BufferMAA[i];
      
//--- Расчёт индикатора
   if (SimpleMAOnBuffer(rates_total,prev_calculated,a,per,BufferTMP,BufferMAOSC)== 0 )
       return 0 ;
   for ( int i=limit;i> WRONG_VALUE ;i--)
     {
      BufferArrUP[i]= EMPTY_VALUE ;
      BufferArrDN[i]= EMPTY_VALUE ;
      BufferColorsARR[i]=(BufferMAOSC[i]>BufferMAOSC[i+ 1 ] ? 0 : BufferMAOSC[i]<BufferMAOSC[i+ 1 ] ? 1 : 2 );
       if ((BufferColorsARR[i]== 0 && BufferColorsARR[i+ 1 ]== 1 ) || (BufferColorsARR[i]== 0 && BufferColorsARR[i+ 1 ]== 2 ))
         BufferArrUP[i]=BufferMAOSC[i];
       if ((BufferColorsARR[i]== 1 && BufferColorsARR[i+ 1 ]== 0 ) || (BufferColorsARR[i]== 1 && BufferColorsARR[i+ 1 ]== 2 ))
         BufferArrDN[i]=BufferMAOSC[i];
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Valeriy Yastremskiy :

나는이 아이디어를 이해하고 유용하지만이 경우에는 저에게 적합하지 않습니다. 표시기에서 감지해야 합니다.   테스터: 정지 버튼 눌림

버튼을 누른 후 인쇄가 잡지에 기록된다는 사실이 아닙니다.

따라서 거래, 테스트, 프로그램 종료 금지와 같은 환경 작업의 모든 기능을 새 막대 마다 파일에 쓰십시오. https://docs.mql4.com/ru/check

도움이되지 않으면 불가능합니다. WinAPI를 사용하여 무언가를 찾아야합니다.

추신 : 버튼을 만들고 누르십시오 - 클릭하고 모든 작업을 수행 한 다음 시각화 도우미가 유휴 실행을 마치도록하십시오. 검색보다 IMHO가 빠릅니다.

 
Igor Makanu :

버튼을 누른 후 인쇄가 잡지에 기록된다는 사실이 아닙니다.

따라서 거래, 테스트, 프로그램 종료 금지와 같은 환경 작업의 모든 기능을 각각의 새 막대 파일에 쓰십시오.

도움이되지 않으면 불가능합니다. WinAPI를 사용하여 무언가를 찾아야합니다.

추신 : 버튼을 만들고 누르십시오 - 클릭하고 모든 작업을 수행 한 다음 시각화 도우미가 유휴 실행을 마치도록하십시오. 검색보다 IMHO가 빠릅니다.

잡지에서 버튼 인쇄 중지   테스터: 정지 버튼 눌림

그러나 나는 문서에서 그것을 찾지 못했습니다. Expert Advisor의 경우 중지는 OnDeinit를 호출하고 지표의 경우 저널의 인쇄만 합니다. 표시기에서 테스트가 중지됩니다. 사실, 멈춤이 있습니다. 그러나 여기에서는 잡지에 인쇄되지 않습니다.

위협

표시기를 제거하거나 손으로 창을 닫는 것은 전혀 어렵지 않습니다. 그러나 질문은 흥미롭습니다. 제3자 심볼에 대한 요청을 통해 실시간으로 접근하는 것과 같습니다) 중지 버튼으로 테스트 완료를 어떻게든 추적해야 할 것 같습니다.)

 
Valeriy Yastremskiy :

잡지에서 버튼 인쇄 중지   테스터: 정지 버튼 눌림

그러나 나는 문서에서 그것을 찾지 못했습니다. Expert Advisor의 경우 중지는 OnDeinit를 호출하고 지표의 경우 저널의 인쇄만 합니다. 표시기에서 테스트가 중지됩니다. 사실, 멈춤이 있습니다. 그러나 여기에서는 잡지에 인쇄되지 않습니다.

위협

표시기를 제거하거나 손으로 창을 닫는 것은 전혀 어렵지 않습니다. 그러나 질문은 흥미롭습니다. 제3자 심볼에 대한 요청을 통해 실시간으로 접근하는 것과 같습니다) 중지 버튼으로 테스트 완료를 어떻게든 추적해야 할 것 같습니다.)

모르겠어

포럼 검색 IsTesting() - 유사한 토론을 찾았습니다.

추신: 제 생각에는 터미널 출력이 로그에 인쇄되지만 이를 수행하려면 MQL 코드가 필요합니다.

ZYZY: EA, IMHO 쓰기, 표시기의 시각화는 지루함))))

 
Artyom Trishkin :

시간이 오래 걸려서 죄송합니다. 일이 바빴습니다.

잡고 있다:

변화는 극적이지만 그것이 요점이 아닙니다.

나는 iMAOnArray를 다룰 것입니다. 그것이 목표였습니다.

고맙습니다!

 
Vitaly Muzichenko :

변화는 극적이지만 그것이 요점이 아닙니다.

나는 iMAOnArray를 다룰 것입니다. 그것이 목표였습니다.

고맙습니다!

예, 여기에 있는 모든 것이 거기에 있는 그대로입니다. 거기에만 있습니다. 상위 4개에서는 탬버린으로 춤을 출 필요가 있지만 MQL5에서는 매우 간단합니다.

 

안녕하세요. ObjectCreate() 에 설명되지 않은 상수를 삭제할 때 이유는 무엇입니까?

예를 들어 z_order 또는 hidden? 컴파일 후 오류가 있습니까? 그들은 라인 건설에 참여하지 않습니다.

 bool VLineCreate( const long             chart_ID= 0 ,         // ID графика 
                 const string           name= "VLine" ,       // имя линии 
                 const int              sub_window= 0 ,       // номер подокна 
                 datetime               time= 0 ,             // время линии 
                 const color            clr= clrRed ,         // цвет линии 
                 const ENUM_LINE_STYLE style= STYLE_SOLID , // стиль линии 
                 const int              width= 1 ,           // толщина линии 
                 const bool             back= false ,         // на заднем плане 
                 const bool             selection= true ,     // выделить для перемещений 
                 const bool             ray= true ,           // продолжение линии вниз 
                 const bool             hidden= true ,       // скрыт в списке объектов 
                 const long             z_order= 0 )         // приоритет на нажатие мышью 
  { 
//--- если время линии не задано, то проводим ее через последний бар 
   if (!time) 
      time= TimeCurrent (); 
//--- сбросим значение ошибки 
   ResetLastError (); 
//--- создадим вертикальную линию 
   if (! ObjectCreate (chart_ID,name, OBJ_VLINE ,sub_window,time, 0 )) 
     { 
       Print ( __FUNCTION__ , 
             ": не удалось создать вертикальную линию! Код ошибки = " , GetLastError ()); 
       return ( false ); 
     } 
 
Дмитрий :

안녕하세요. 왜, ObjectCreate()에 설명되지 않은 상수를 삭제할 때;

예를 들어 z_order 또는 hidden? 컴파일 후 오류가 있습니까? 그들은 라인 건설에 참여하지 않습니다.

함수의 입력 매개변수 중 하나를 삭제할 때 쉼표와 닫는 괄호에 주의하십시오.

 
Alexey Viktorov :

함수의 입력 매개변수 중 하나를 삭제할 때 쉼표와 닫는 괄호에 주의하십시오.

고마워 알렉세이. 가장 먼저 눈에 들어온 것은 구두점이었다. 스크립트는 ObjectCreate()( 앵커 포인트 , 심볼 등)에 필요한 것을 남겨두고 최소한으로 축소되었습니다. 그리고 헤더에서만 코드의 상수가 어디에도 없다는 것이 밝혀졌습니다. 그래서 적어도 하나의 오류를 삭제하는 것이 나타나는 이유에 대한 질문이 생겼습니다. 그리고 사용자 헤더에 상수 목록이 있는 필수 조건이 있을 수 있다는 질문이 생깁니다. 기능)))?
 
Dzmitry Zaitsau :
고마워 알렉세이. 가장 먼저 눈에 들어온 것은 구두점이었다. 스크립트는 ObjectCreate()( 앵커 포인트 , 심볼 등)에 필요한 것을 남겨두고 최소한으로 축소되었습니다. 그리고 헤더에서만 코드의 상수가 어디에도 없다는 것이 밝혀졌습니다. 그래서 적어도 하나의 오류를 삭제하는 것이 나타나는 이유에 대한 질문이 생겼습니다. 그리고 사용자 헤더에 상수 목록이 있는 필수 조건이 있을 수 있다는 질문이 생깁니다. 기능)))?

어떤 오류가 나타나는지 작성하면 즉시 명확해질 것입니다. 그렇지 않으면 텔레파시가 나옵니다 - 내 오류가 무엇인지 추측)