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

 
mwwm :

그리고 그것을 올바르게하는 방법?

어떻게 합니까?
 
Artyom Trishkin :
어떻게 합니까?
 int OnCalculate ( const int rates_total, 
                 const int prev_calculated, 
                 const datetime &time[], 
                 const double &Op[], 
                 const double &Hi[], 
                 const double &Lo[], 
                 const double &Cl[], 
                 const long &tick_volume[], 
                 const long &volume[], 
                 const int &spread[]) 
  { 
   ArraySetAsSeries (time, true ); 
   ArraySetAsSeries (Op, true ); 
   ArraySetAsSeries (Hi, true ); 
   ArraySetAsSeries (Lo, true ); 
   ArraySetAsSeries (Cl, true ); 
//--- 
double mas[];
   if (prev_calculated== 0 ) 
     { 
       int prices1= CopyOpen ( Symbol (), 0 , 0 , Bars ( _Symbol , _Period ),Op);
       int prices2= CopyHigh ( Symbol (), 0 , 0 , Bars ( _Symbol , _Period ),Hi); 
       int prices3= CopyLow ( Symbol (), 0 , 0 , Bars ( _Symbol , _Period ),Lo); 
       int prices4= CopyClose ( Symbol (), 0 , 0 , Bars ( _Symbol , _Period ),Cl); 
       int prices5= CopyTime ( Symbol (), 0 , 0 , Bars ( _Symbol , _Period ),time); 

     } 
   else 
     { 

       int prices1= CopyOpen ( Symbol (), 0 , 0 , 1 ,Op);
       int prices2= CopyHigh ( Symbol (), 0 , 0 , 1 ,Hi); 
       int prices3= CopyLow ( Symbol (), 0 , 0 , 1 ,Lo); 
       int prices4= CopyClose ( Symbol (), 0 , 0 , 1 ,Cl);     
       int prices5= CopyTime ( Symbol (), 0 , 0 , 1 ,time);     
       }   
       for ( int i=rates_total- 1 ;i>= 0 && ! IsStopped ();) {
      mas[i]=Op[i]/Cl[i];
      i--;
      }
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+-------------------------------

이렇게 단순화하면 CopyOpen 은 OnCalculate에 불필요하지만 터미널 창에서만 기록을 볼 수 있습니까?

 
mwwm :

단순화된 CopyOpen은 OnCalculate에 불필요하지만 터미널 창에서만 기록을 볼 수 있습니까?

mas 배열은 크기가 0인 각 틱에서 생성된 다음 어디에서나 크기를 변경하지 않습니다. 따라서 액세스하면 배열이 범위를 벗어납니다.

문제를 해결하려면 히스토리의 모든 막대 판독값에 맞도록 크기를 변경하거나 표시기 버퍼에 연결해야 합니다(따라서 전역 프로그램 변수 로 선언해야 함). 결국, 내가 올바르게 이해한다면 지표를 사용하여 표시해야 할 것은 이러한 값입니다.

 
mwwm :

단순화된 CopyOpen은 OnCalculate에 불필요하지만 터미널 창에서만 기록을 볼 수 있습니까?

예시:

 //+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot OC
#property indicator_label1    "Open/Close"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- indicator buffers
double          BufferOC[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- Задаём массив BufferOC как буфер индикатора
   SetIndexBuffer ( 0 ,BufferOC, INDICATOR_DATA );
//--- Устанавливаем ему направление индексации как у таймсерии
   ArraySetAsSeries (BufferOC, true );
//---
   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[])
  {
//--- Проверка на минимальное колиество баров для расчёта
   if (rates_total< 1 ) return 0 ;
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries (open, true );
   ArraySetAsSeries (close, true );
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if (limit> 1 ) // если это первый запуск, или изменение истории, или открытие нового бара
     {
      limit=rates_total- 1 ;                   // установим начало цикла на начало исторических данных
       ArrayInitialize (BufferOC, EMPTY_VALUE ); // инициализируем массив
     }
//--- Расчёт индикатора
   for ( int i=limit; i>= 0 && ! IsStopped (); i--)
     {
       if (close[i]== 0 ) continue ;
      BufferOC[i]=open[i]/close[i];
     }

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Ihor Herasko :

mas 배열은 크기가 0인 각 틱에서 생성된 다음 어디에서나 크기를 변경하지 않습니다. 따라서 액세스하면 배열이 범위를 벗어납니다.

문제를 해결하려면 히스토리의 모든 막대 판독값에 맞도록 크기를 변경하거나 표시기 버퍼에 연결해야 합니다(따라서 전역 프로그램 변수 로 선언해야 함). 결국, 내가 올바르게 이해한다면 지표를 사용하여 표시해야 할 것은 이러한 값입니다.

내 부정확성, mas[]는 실제로 전역 배열이어야 하지만 표시기 버퍼도 적합하지 않으며 오히려 중간 다차원 배열이 됩니다. 표시기 버퍼를 통하지 않고 M5에 대한 최적의 배열 크기를 결정하는 가장 좋은 방법은 무엇입니까?

 
mwwm :

내 부정확성, mas[]는 실제로 전역 배열이어야 하지만 표시기 버퍼도 적합하지 않으며 오히려 중간 다차원 배열이 됩니다. 표시기 버퍼를 통하지 않고 M5에 대한 최적의 배열 크기를 결정하는 가장 좋은 방법은 무엇입니까?

다차원 정보 - 이해하지 못했습니다. 결국, 우리는 1차원 배열에 대해 이야기하고 있습니다. 또한 MQL4에서 최대 어레이 차원은 4입니다.

시계열과 같은 크기의 배열을 만들려면 필요한 기호 및 기간의 차트에서 사용할 수 있는 막대 수에 따라 크기를 변경해야 합니다.

 double fArray[];
int nBarsCnt = iBars (<символ>, <таймфрейм>);
if ( ArrayResize (fArray, nBarsCnt) != nBarsCnt)
{
   // Не удалось изменить размер массива
   return ;
}

ArraySetAsSeries (fArray, true );
 
mwwm :

내 부정확성, mas[]는 실제로 전역 배열이어야 하지만 표시기 버퍼도 적합하지 않으며 오히려 중간 다차원 배열이 됩니다. 표시기 버퍼를 통하지 않고 M5에 대한 최적의 배열 크기를 결정하는 가장 좋은 방법은 무엇입니까?

배열을 표시기 버퍼로 사용하고 싶지 않은 이유는 무엇입니까? 하위 시스템에서 모니터링하므로 작업이 더 쉬워집니다.

그리고 표시기의 중간 배열 버퍼는 다음과 같이 하기 쉽습니다.

 SetIndexBuffer ( 1 ,BufferMA, INDICATOR_CALCULATIONS );
 

안녕하세요.

플랫폼에서 볼륨이 틱입니다. 실제 볼륨이 있습니까?

 
Олег Литинский :

안녕하세요.

플랫폼에서 볼륨이 틱입니다. 실제 볼륨이 있습니까?

하지 않을 것이다. 일부 브로커가 실제 볼륨을 제공하는 MT5를 사용하십시오.

 

안녕하세요!

다음 문제를 도와주세요.

1) 특정 조건이 충족되면 보류 중인 주문이 열립니다.

{
price= High [ 1 ]+OrderPoint* Point ;
stoploss= Low [ 1 ]- Point ;
takeprofit=price+price-stoploss;
OrderSend ( Symbol (), OP_BUYSTOP , 1 ,price, 3 ,stoploss,takeprofit);
}

가격이 이미 손절매(이 미개봉 주문의)를 통과한 경우 미개봉 보류 주문이 삭제되도록 추가해야 할 항목과 위치를 알려주십시오.

어리석은 질문에 대해 죄송합니다. 답변을 찾는 동안 포럼에서 길을 잃었습니다.

미리 감사합니다!