초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1312

 
Alexey Belyakov :
변경 및 오류 발생: " 'array_atr' - 잘못된 배열 액세스 "


아마도 무언가가 도움이 될 것입니다. 전문가가 아니라 지표를 만들어야합니다.

- 글쎄, 유형 전문가도 작동하며 테스터에만 표시됩니다.

 //+------------------------------------------------------------------+
//|                                                         тест.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot iATR
#property indicator_label1    "iATR"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrLightSeaGreen
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- входные параметры
input int                   atr_period= 14 ;           // период для вычисления
input string                symbol= " " ;             // символ
input ENUM_TIMEFRAMES       period= PERIOD_CURRENT ;   // таймфрейм
//--- индикаторный буфер
double  iATRBuffer[];
//--- переменная для хранения хэндла индикатора iAC
int     handle;
//--- переменная для хранения
string name=symbol;
//--- имя индикатора на графике
string short_name;
//--- будем хранить количество значений в индикаторе Average True Range
int     bars_calculated= 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- привязка массива к индикаторному буферу
   SetIndexBuffer ( 0 ,iATRBuffer, INDICATOR_DATA );
//--- определимся с символом, на котором строится индикатор
   name=symbol;
//--- удалим пробелы слева и справа
   StringTrimRight (name);
   StringTrimLeft (name);
//--- если после этого длина строки name нулевая
   if ( StringLen (name)== 0 )
     {
       //--- возьмем символ с графика, на котором запущен индикатор
      name= _Symbol ;
     }
//--- создадим хэндл индикатора
   handle= iATR (name,period,atr_period);
   if (handle== INVALID_HANDLE )
     {
       //--- сообщим о неудаче и выведем номер ошикби
       PrintFormat ( "Не удалось создать хэндл индикатора iATR для пары %s/%s, код ошибки %d" ,
                  name,
                   EnumToString (period),
                   GetLastError ());
       //--- работа индикатора завершается досрочно
       return ( INIT_FAILED );
     }
//--- покажем на какой паре символ/таймфрейм рассчитан индикатор Average True Range
   short_name= StringFormat ( "iATR(%s/%s, period=%d)" ,name, EnumToString (period),atr_period);
   IndicatorSetString ( INDICATOR_SHORTNAME ,short_name);
//--- нормальное выполнение инициализации индикатора
//---
   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 ( BarsCalculated (handle)<rates_total
      ||rates_total< 0 )
       return ( 0 );
//---- объявления локальных переменных
   int to_copy,limit;
//---- расчеты необходимого количества копируемых данных и
//стартового номера limit для цикла пересчета баров
   if (prev_calculated>rates_total || prev_calculated<= 0 ) // проверка на первый старт расчета индикатора
     {
      to_copy=rates_total; // расчетное количество всех баров
      limit=rates_total- 1 ; // стартовый номер для расчета всех баров
     }
   else
     {
      to_copy=rates_total-prev_calculated+ 1 ; // расчетное количество только новых баров
      limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров
     }
//---- копируем вновь появившиеся данные в массивы
   if ( CopyBuffer (handle, 0 , 0 ,to_copy,iATRBuffer)<= 0 )
       return ( 0 );
//---- индексация элементов в массивах как в таймсериях
   ArraySetAsSeries (iATRBuffer, true );
   ArraySetAsSeries (open, true );
   ArraySetAsSeries (high, true );
   ArraySetAsSeries (low, true );
   ArraySetAsSeries (close, true );
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Alexey Belyakov :
변경 및 오류 발생: " 'array_atr' - 잘못된 배열 액세스 "


배열 요소 는 '[]'를 통해 액세스됩니다.

예를 들어 null 요소에 액세스하는 경우:

array_atr[ 0 ]
 
Vladimir Karputov :

배열 요소 는 '[]'를 통해 액세스됩니다.

예를 들어 null 요소에 액세스하는 경우:


 double array_atr[];   

int ATR14;

int OnInit ()
  {
ATR14= iATR ( NULL , PERIOD_CURRENT , 14 );
   return ( 0 );   
  }
   
void OnDeinit ( const int reason)
  {
//---  
  }

void OnTick ()
{

CopyBuffer (ATR14, 0 , 0 , 2 ,array_atr);

Comment (

       "ATR14==: " , DoubleToString ((array_atr[ 1 ])* 100000 , 0 ), "\n" );

}
블라디미르 감사합니다! 준비가 된!
 
Alexey Belyakov :


블라디미르 감사합니다! 준비가 된!

나는 당신이 얻으려는 것이 무엇인지 알고 싶었고 여기까지만 밟았고 아무것도 이해하지 못했습니다.

 //+------------------------------------------------------------------+
//|                                              Alexey Belyakov.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"
#include <Trade\Trade.mqh>
CTrade ExtTrade;
//---
int ATR14;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create ATR indicator and add it to collection
   ATR14= iATR ( _Symbol , _Period , 14 );
   if (ATR14== INVALID_HANDLE )
     {
       printf ( "Error creating ATR indicator" );
       return ( INIT_FAILED );
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   OnATR14();
  }
//+------------------------------------------------------------------+
//| refresh indicators                                               |
//+------------------------------------------------------------------+
void OnATR14()
  {
   MqlRates rt[ 2 ];
//--- go trading only for first ticks of new bar
   if ( CopyRates ( _Symbol , _Period , 0 , 2 ,rt)!= 2 )
     {
       Print ( "CopyRates of " , _Symbol , " failed, no history" );
       return ;
     }
   if (rt[ 1 ].tick_volume> 1 )
       return ;
//--- get current Moving Average
   double array_atr[ 1 ];
//--- get current ATR
   if ( CopyBuffer (ATR14, 0 , 0 , 1 ,array_atr)!= 1 )
     {
       Print ( "CopyBuffer from ATR failed, no data" );
       return ;
     }
   if (array_atr[ 0 ]>= 0.00100 && rt[ 0 ].close>array_atr[ 0 ])
     {
       Print ( "ATR14==: BUY" );
     }
   if (array_atr[ 0 ]<= 0.00100 && rt[ 0 ].close>array_atr[ 0 ])
     {
       Print ( "ATR14==: SELL" );
     }
  }
//+------------------------------------------------------------------+
 
여기요!
나는 이제 막 코드를 다루기 시작했고 프로그래밍에 대한 나의 무지에 관대해지기를 요청합니다.
mql5에서 이 조각의 번역에 대처할 수 없습니다.

 int init() 
   {
   parus = MarketInfo( Symbol (), MODE_SPREAD ) * Point ;
   if (IsTesting() == true ) rf();
   if (IsTesting() == false ) rm();
   return ( 0 );
   }

MarketInfo를 SymbolInfoInteger로 변경하고 다음과 같이 얻습니다.

 int init() 
   {
   parus = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD_FLOAT) * Point;
   if (IsTesting() == true ) rf();
   if (IsTesting() == false ) rm();
   return ( 0 );
   }

오류가 발생합니다.

유형 변환으로 인한 데이터 손실 가능성

';' - 여는 괄호가 필요함


현실에서 어떻게 해야 하는지 도와주시고 써주세요.





 
Sprut 185 :
여기요!
나는 이제 막 코드를 다루기 시작했고 프로그래밍에 대한 나의 무지에 관대해지기를 요청합니다.
이 조각을 mql5로 번역하는 데 대처할 수 없습니다.

MarketInfo를 SymbolInfoInteger로 변경하고 다음과 같이 얻습니다.

오류가 발생합니다.

유형 변환으로 인한 데이터 손실 가능성

';' - 여는 괄호가 필요함


현실에서 어떻게 해야 하는지 도와주시고 써주세요.

   parus = SymbolInfoInteger ( Symbol (), SYMBOL_SPREAD ) * Point () ;
   if ( MQLInfoInteger ( MQL_TESTER ) == true ) rf();
   if ( MQLInfoInteger ( MQL_TESTER ) == false ) rm();

그리고 이대로가 더 좋다

   parus = SymbolInfoInteger ( Symbol (), SYMBOL_SPREAD ) * Point ();
   if ( MQLInfoInteger ( MQL_TESTER )) rf();
     else rm();
 
Vitaly Muzichenko :

그리고 이대로가 더 좋다

도와 주셔서 정말로 고맙습니다 !


이제 나는 이것이 왜 맹세하는지 이해할 수 없습니다.

 int user_0 = SymbolInfoInteger ( Symbol (), SYMBOL_TRADE_STOPS_LEVEL );

유형 변환으로 인한 데이터 손실 가능성

여기서 무슨 문제가 있습니까?


 
Sprut 185 :
도와 주셔서 정말로 고맙습니다 !


이제 나는 이것이 왜 맹세하는지 이해할 수 없습니다.

유형 변환으로 인한 데이터 손실 가능성

여기서 무슨 문제가 있습니까?


Long 또는 bul 이 int가 아님

Документация по MQL5: Получение рыночной информации / SymbolInfoInteger
Документация по MQL5: Получение рыночной информации / SymbolInfoInteger
  • www.mql5.com
SymbolInfoInteger - Получение рыночной информации - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Valeriy Yastremskiy :

Long 또는 bul 이 int가 아님

감사합니다!!!

이제 명확하지 않습니다 - 무엇이 잘못되었는지 - 여기:

trendstep = "Tredstep start on" +Trendstep_start+ " order" ;

오류: '숫자'에서 '문자열'로의 암시적 변환 ("숫자"에서 "문자열"로의 암시적 변환)

혜택이 뭐가 잘못됐나요?


 
Sprut 185 :
감사합니다!!!

이제 명확하지 않습니다 - 무엇이 잘못되었는지 - 여기:

오류: '숫자'에서 '문자열'로의 암시적 변환 ("숫자"에서 "문자열"로의 암시적 변환)

혜택이 뭐가 잘못됐나요?


명시적 변환이 아닙니다. 숫자가 있는 문자열을 추가하면 숫자가 문자열 변수로 변환됩니다. 하지만 명시적인 것이 필요합니다. 그리고 나는 trendstep에 문자열 유형이 있기를 바랍니다. )))

trendstep = "Tredstep start on" + ( string ) Trendstep_start+ " order" ;
사유: