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

 
jaffer wilson :

@ Artyom 트리슈킨

제 질문에 답변해 주시겠습니까? 아무도 신경쓰지 않는다고 생각합니다.

여기에서 질문해 보세요.

Пользовательские символы. Ошибки, баги, вопросы, предложения.
Пользовательские символы. Ошибки, баги, вопросы, предложения.
  • 2019.02.23
  • www.mql5.com
Так как тема достаточна обширна, решил, что стоит выделить её в отдельное обсуждение...
 

안녕하세요.

저는 초보자이고 첫 번째 문제는 컴파일에서 오류가 발생하는 이유입니다. 어떻게 고치는 지?

//+----------------------------------------------- --------------------+
//| 내 var1.mq4 |
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#속성 링크 "https://www.mql5.com"
#속성 버전 "1.00"
#속성엄격

외부 int 매직 = 111;
정수 CountSell()
//+----------------------------------------------- --------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- ------------------+
int OnInit()
{
반환(INIT_SUCCESSED);
}
//+----------------------------------------------- --------------------+
//| 전문적인 초기화 해제 기능 |
//+----------------------------------------------- --------------------+
무효 OnDeinit(const int 이유)
{
}
//+----------------------------------------------- --------------------+
//| 전문가 틱 기능 |
//+----------------------------------------------- --------------------+
무효 OnTick()
{
{
정수 = 0;

for(int i = OrdersTotal() - 1, i >= 0, i--)
{
if(주문선택(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
카운트++;
}
}
반품;
}
}

//+----------------------------------------------- --------------------+

'int' - 내 var1.mq4 13 1에 세미콜론이 필요합니다.

오류 1개, 경고 0개 2 1


Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Хочу собрать ПК для работы с МТ 5, что посоветуете и...
 
petrovich1 :

안녕하세요.

저는 초보자이고 첫 번째 문제는 컴파일에서 오류가 발생하는 이유입니다. 어떻게 고치는 지?

//+----------------------------------------------- --------------------+

코드를 올바르게 붙여넣으십시오.


 
안녕하세요. 라인을 오른쪽으로 확장하지 않고는 mt-4에서 fibo 객체( OBJ_FIBO )를 그릴 수 없습니다. OBJPROP_RAY_RIGHT 매개변수를 변경해도 광선은 계속 오른쪽으로 그려집니다. 또한 교과서의 교육 스크립트도 같은 방식으로 작동합니다. 세그먼트에 대해 OBJPROP_RAY로 대체하려고 시도했지만 도움이되지 않습니다. 무슨 일이 일어나고 있는지 설명 할 수 있다면. 미리 감사드립니다.
 
Sergey Fionin :
안녕하세요. 라인을 오른쪽으로 확장하지 않고는 mt-4에서 fibo 객체( OBJ_FIBO )를 그릴 수 없습니다. OBJPROP_RAY_RIGHT 매개변수를 변경해도 광선은 계속 오른쪽으로 그려집니다. 또한 교과서의 교육 스크립트도 같은 방식으로 작동합니다. 세그먼트에 대해 OBJPROP_RAY로 대체하려고 시도했지만 도움이되지 않습니다. 무슨 일이 일어나고 있는지 설명 할 수 있다면. 미리 감사드립니다.

사실 MT4는 MT5가 아니며 코드가 컴파일된다고 해서 작동한다는 의미는 아닙니다.

 
Alexey Viktorov :

사실 MT4는 MT5가 아니며 코드가 컴파일된다고 해서 작동한다는 의미는 아닙니다.

이해합니다. 그리고 그것이 OBJPROP_RAY_RIGHT를 통해 "객체를 오른쪽으로 계속 " 설정이 MT-4에서 ( OBJ_FIBO )에 대해 실제로 작동하는지 묻는 이유입니다 . 스크립트의 예는 mt-4에 대한 교과서에서 가져옵니다.

#property strict 
//--- описание 
#property description "Скрипт строит графический объект \"Уровни Фибоначчи\"." 
#property description "Координаты точек привязки задаются в процентах от" 
#property description "размеров окна графика." 
//--- покажем окно входных параметров при запуске скрипта 
#property script_show_inputs 
//--- входные параметры скрипта 
input string           InpName= "FiboLevels" ;       // Имя объекта 
input int              InpDate1= 10 ;               // Дата 1-ой точки в % 
input int              InpPrice1= 65 ;               // Цена 1-ой точки в % 
input int              InpDate2= 90 ;               // Дата 2-ой точки в % 
input int              InpPrice2= 85 ;               // Цена 2-ой точки в % 
input color            InpColor= clrRed ;           // Цвет объекта 
input ENUM_LINE_STYLE InpStyle= STYLE_DASHDOTDOT ; // Стиль линии 
input int              InpWidth= 1 ;                 // Толщина линии 
input bool             InpBack= false ;             // Объект на заднем плане 
input bool             InpSelection= true ;         // Выделить для перемещений 
input bool             InpRayRight= false ;         // Продолжение объекта вправо 
input bool             InpHidden= true ;             // Скрыт в списке объектов 
input long             InpZOrder= 0 ;               // Приоритет на нажатие мышью 
//+------------------------------------------------------------------+ 
//| Cоздает "Уровни Фибоначчи" по заданным координатам               | 
//+------------------------------------------------------------------+ 
bool FiboLevelsCreate( const long             chart_ID= 0 ,         // ID графика 
                       const string           name= "FiboLevels" , // имя объекта 
                       const int              sub_window= 0 ,       // номер подокна  
                       datetime               time1= 0 ,           // время первой точки 
                       double                 price1= 0 ,           // цена первой точки 
                       datetime               time2= 0 ,           // время второй точки 
                       double                 price2= 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_right= false ,   // продолжение объекта вправо 
                       const bool             hidden= true ,       // скрыт в списке объектов 
                       const long             z_order= 0 )         // приоритет на нажатие мышью 
  { 
//--- установим координаты точек привязки, если они не заданы 
   ChangeFiboLevelsEmptyPoints(time1,price1,time2,price2); 
//--- сбросим значение ошибки 
   ResetLastError (); 
//--- создадим "Уровни Фибоначчи" по заданным координатам 
   if (! ObjectCreate (chart_ID,name, OBJ_FIBO ,sub_window,time1,price1,time2,price2)) 
     { 
       Print ( __FUNCTION__ , 
             ": не удалось создать \"Уровни Фибоначчи\"! Код ошибки = " , GetLastError ()); 
       return ( false ); 
     } 
//--- установим цвет 
   ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr); 
//--- установим стиль линии 
   ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style); 
//--- установим толщину линии 
   ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,width); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back); 
//--- включим (true) или отключим (false) режим выделения объекта для перемещений 
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект 
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection 
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект 
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection); 
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection); 
//--- включим (true) или отключим (false) режим продолжения отображения объекта вправо 
   ObjectSetInteger (chart_ID,name, OBJPROP_RAY_RIGHT ,ray_right); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden); 
//--- установи приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order); 
//--- успешное выполнение 
   return ( true ); 
  } 
//+------------------------------------------------------------------+ 
//| Задает количество уровней и их параметры                         | 
//+------------------------------------------------------------------+ 
bool FiboLevelsSet( int              levels,             // количество линий уровня 
                   double           &values[],         // значения линий уровня 
                   color            &colors[],         // цвет линий уровня 
                   ENUM_LINE_STYLE &styles[],         // стиль линий уровня 
                   int              &widths[],         // толщина линий уровня 
                   const long       chart_ID= 0 ,         // ID графика 
                   const string     name= "FiboLevels" ) // имя объекта 
  { 
//--- проверим размеры массивов 
   if (levels!= ArraySize (colors) || levels!= ArraySize (styles) || 
      levels!= ArraySize (widths) || levels!= ArraySize (widths)) 
     { 
       Print ( __FUNCTION__ , ": длина массива не соответствует количеству уровней, ошибка!" ); 
       return ( false ); 
     } 
//--- установим количество уровней 
   ObjectSetInteger (chart_ID,name, OBJPROP_LEVELS ,levels); 
//--- установим свойства уровней в цикле 
   for ( int i= 0 ;i<levels;i++) 
     { 
       //--- значение уровня 
       ObjectSetDouble (chart_ID,name, OBJPROP_LEVELVALUE ,i,values[i]); 
       //--- цвет уровня 
       ObjectSetInteger (chart_ID,name, OBJPROP_LEVELCOLOR ,i,colors[i]); 
       //--- стиль уровня 
       ObjectSetInteger (chart_ID,name, OBJPROP_LEVELSTYLE ,i,styles[i]); 
       //--- толщина уровня 
       ObjectSetInteger (chart_ID,name, OBJPROP_LEVELWIDTH ,i,widths[i]); 
       //--- описание уровня 
       ObjectSetString (chart_ID,name, OBJPROP_LEVELTEXT ,i, DoubleToString ( 100 *values[i], 1 )); 
     } 
//--- успешное выполнение 
   return ( true ); 
  } 
//+------------------------------------------------------------------+ 
//| Перемещает точку привязки "Уровней Фибоначчи"                    | 
//+------------------------------------------------------------------+ 
bool FiboLevelsPointChange( const long    chart_ID= 0 ,         // ID графика 
                           const string name= "FiboLevels" , // имя объекта 
                           const int     point_index= 0 ,     // номер точки привязки 
                           datetime      time= 0 ,             // координата времени точки привязки 
                           double        price= 0 )           // координата цены точки привязки 
  { 
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid 
   if (!time) 
      time= TimeCurrent (); 
   if (!price) 
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID ); 
//--- сбросим значение ошибки 
   ResetLastError (); 
//--- переместим точку привязки 
   if (! ObjectMove (chart_ID,name,point_index,time,price)) 
     { 
       Print ( __FUNCTION__ , 
             ": не удалось переместить точку привязки! Код ошибки = " , GetLastError ()); 
       return ( false ); 
     } 
//--- успешное выполнение 
   return ( true ); 
  } 
//+------------------------------------------------------------------+ 
//| Удаляет "Уровни Фибоначчи"                                       | 
//+------------------------------------------------------------------+ 
bool FiboLevelsDelete( const long    chart_ID= 0 ,         // ID графика 
                       const string name= "FiboLevels" ) // имя объекта 
  { 
//--- сбросим значение ошибки 
   ResetLastError (); 
//--- удалим объект 
   if (! ObjectDelete (chart_ID,name)) 
     { 
       Print ( __FUNCTION__ , 
             ": не удалось удалить \"Уровни Фибоначчи\"! Код ошибки = " , GetLastError ()); 
       return ( false ); 
     } 
//--- успешное выполнение 
   return ( true ); 
  } 
//+------------------------------------------------------------------+ 
//| Проверяет значения точек привязки "Уровней Фибоначчи" и для      | 
//| пустых значений устанавливает значения по умолчанию              | 
//+------------------------------------------------------------------+ 
void ChangeFiboLevelsEmptyPoints( datetime &time1, double &price1, 
                                 datetime &time2, double &price2) 
  { 
//--- если время второй точки не задано, то она будет на текущем баре 
   if (!time2) 
      time2= TimeCurrent (); 
//--- если цена второй точки не задана, то она будет иметь значение Bid 
   if (!price2) 
      price2= SymbolInfoDouble ( Symbol (), SYMBOL_BID ); 
//--- если время первой точки не задано, то она лежит на 9 баров левее второй 
   if (!time1) 
     { 
       //--- массив для приема времени открытия 10 последних баров 
       datetime temp[ 10 ]; 
       CopyTime ( Symbol (), Period (),time2, 10 ,temp); 
       //--- установим первую точку на 9 баров левее второй 
      time1=temp[ 0 ]; 
     } 
//--- если цена первой точки не задана, то сдвинем ее на 200 пунктов ниже второй 
   if (!price1) 
      price1=price2- 200 * SymbolInfoDouble ( Symbol (), SYMBOL_POINT ); 
  } 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart () 
  { 
//--- проверим входные параметры на корректность 
   if (InpDate1< 0 || InpDate1> 100 || InpPrice1< 0 || InpPrice1> 100 ||  
      InpDate2< 0 || InpDate2> 100 || InpPrice2< 0 || InpPrice2> 100 ) 
     { 
       Print ( "Ошибка! Некорректные значения входных параметров!" ); 
       return ; 
     } 
//--- количество видимых баров в окне графика 
   int bars=( int ) ChartGetInteger ( 0 , CHART_VISIBLE_BARS ); 
//--- размер массива price 
   int accuracy= 1000 ; 
//--- массивы для хранения значений дат и цен, которые будут использованы 
//--- для установки и изменения координат точек привязки "Уровней Фибоначчи" 
   datetime date[]; 
   double    price[]; 
//--- выделение памяти 
   ArrayResize (date,bars); 
   ArrayResize (price,accuracy); 
//--- заполним массив дат 
   ResetLastError (); 
   if ( CopyTime ( Symbol (), Period (), 0 ,bars,date)==- 1 ) 
     { 
       Print ( "Не удалось скопировать значения времени! Код ошибки = " , GetLastError ()); 
       return ; 
     } 
//--- заполним массив цен 
//--- найдем максимальное и минимальное значение графика 
   double max_price= ChartGetDouble ( 0 , CHART_PRICE_MAX ); 
   double min_price= ChartGetDouble ( 0 , CHART_PRICE_MIN ); 
//--- определим шаг изменения цены и заполним массив 
   double step=(max_price-min_price)/accuracy; 
   for ( int i= 0 ;i<accuracy;i++) 
      price[i]=min_price+i*step; 
//--- определим точки для рисования "Уровней Фибоначчи" 
   int d1=InpDate1*(bars- 1 )/ 100 ; 
   int d2=InpDate2*(bars- 1 )/ 100 ; 
   int p1=InpPrice1*(accuracy- 1 )/ 100 ; 
   int p2=InpPrice2*(accuracy- 1 )/ 100 ; 
//--- создадим объект 
   if (!FiboLevelsCreate( 0 ,InpName, 0 ,date[d1],price[p1],date[d2],price[p2],InpColor, 
      InpStyle,InpWidth,InpBack,InpSelection,InpRayRight,InpHidden,InpZOrder)) 
     { 
       return ; 
     } 
//--- перерисуем график и подождем 1 секунду 
   ChartRedraw (); 
   Sleep ( 1000 ); 
//--- теперь будем перемещать точки привязки 
//--- счетчик цикла 
   int v_steps=accuracy* 2 / 5 ; 
//--- перемещаем первую точку привязки 
   for ( int i= 0 ;i<v_steps;i++) 
     { 
       //--- возьмем следующее значение 
       if (p1> 1 ) 
         p1-= 1 ; 
       //--- сдвигаем точку 
       if (!FiboLevelsPointChange( 0 ,InpName, 0 ,date[d1],price[p1])) 
         return ; 
       //--- проверим факт принудительного завершения скрипта 
       if ( IsStopped ()) 
         return ; 
       //--- перерисуем график 
       ChartRedraw (); 
     } 
//--- задержка в 1 секунду 
   Sleep ( 1000 ); 
//--- счетчик цикла 
   v_steps=accuracy* 4 / 5 ; 
//--- перемещаем вторую точку привязки 
   for ( int i= 0 ;i<v_steps;i++) 
     { 
       //--- возьмем следующее значение 
       if (p2> 1 ) 
         p2-= 1 ; 
       //--- сдвигаем точку 
       if (!FiboLevelsPointChange( 0 ,InpName, 1 ,date[d2],price[p2])) 
         return ; 
       //--- проверим факт принудительного завершения скрипта 
       if ( IsStopped ()) 
         return ; 
       //--- перерисуем график 
       ChartRedraw (); 
     } 
//--- задержка в 1 секунду 
   Sleep ( 1000 ); 
//--- удалим объект с графика 
   FiboLevelsDelete( 0 ,InpName); 
   ChartRedraw (); 
//--- задержка в 1 секунду 
   Sleep ( 1000 ); 
//--- 
  }
 
 
Sergey Fionin :

이해합니다. 그리고 그것이 OBJPROP_RAY_RIGHT를 통해 "객체를 오른쪽으로 계속 " 설정이 MT-4에서 ( OBJ_FIBO )에 대해 실제로 작동하는지 묻는 이유입니다 . 스크립트의 예는 mt-4에 대한 교과서에서 가져옵니다.

도움말을 편집할 때 누락되었을 수 있습니다. 결국, 그것은 mql5 문서에서 지배되었습니다.

 
안녕하세요. 나는 일주일 동안 mql 언어를 배우기 시작했고 이제 그러한 메커니즘을 구현하는 방법에 대해 머리를 맞대고 있습니다. 차트에는 버튼( OBJ_BUTTON )이 있으며, 버튼을 눌렀을 때 주어진 시퀀스의 숫자가 순서대로 표시되도록 코드에 어떻게 그리고 무엇을 작성해야 하는지입니다. 저것들. 일련의 숫자 2,4,8,16,32,64,128이 있습니다. 예를 들어 차트의 버튼을 클릭하면 이 시퀀스의 숫자가 순서대로 주석으로 화면에 표시되어야 합니다. 버튼을 눌렀습니다 - 2가 나타났고, 다른 것을 눌렀습니다 - 4가 나타났습니다. 예를 들어 두 번째 버튼을 클릭하면 이 숫자가 역순으로 나타납니다. 작동하는 코드를 작성할 수 있다면 내 기쁨은 끝나지 않을 것입니다)))
 
Ivan Revedzhuk :
안녕하세요. 나는 일주일 동안 mql 언어를 배우기 시작했고 이제 그러한 메커니즘을 구현하는 방법에 대해 머리를 맞대고 있습니다. 차트에는 버튼( OBJ_BUTTON )이 있으며, 버튼을 눌렀을 때 주어진 시퀀스의 숫자가 순서대로 표시되도록 코드에 어떻게 그리고 무엇을 작성해야 하는지입니다. 저것들. 일련의 숫자 2,4,8,16,32,64,128이 있습니다. 예를 들어 차트의 버튼을 클릭하면 이 시퀀스의 숫자가 순서대로 주석의 화면에 표시되어야 합니다. 버튼을 눌렀습니다 - 2가 나타났고, 다른 것을 눌렀습니다 - 4가 나타났습니다. 예를 들어 두 번째 버튼을 클릭하면 이 숫자가 역순으로 나타납니다. 작동하는 코드를 작성할 수 있다면 내 기쁨은 끝나지 않을 것입니다)))
 if ( ObjectGetInteger ( 0 , "name" , OBJPROP_STATE ) == true )
 // Кнопка нажата
// Вывести в Comment какое нужно число 

// Отжать кнопку
ObjectSetInteger ( 0 , " name " , OBJPROP_STATE ) == false

주석에서 현재 숫자가 무엇인지 확인하려면 차트 작업에 대한 설명서를 읽으십시오. 댓글을 읽는 기능이 있습니다.

또는 가장 간단한 방법으로 이 숫자를 정적 변수에 넣고 Comment()에 넣습니다.

 
Alexey Viktorov :

주석에서 현재 숫자가 무엇인지 확인하려면 차트 작업에 대한 설명서를 읽으십시오. 댓글을 읽는 기능이 있습니다.

또는 가장 간단한 방법으로 이 숫자를 정적 변수에 넣고 Comment()에 넣습니다.

당신의 답변에 감사드립니다. 도움말에서 버튼 누름을 처리하는 방법을 찾았지만 나머지 어려움이 있습니다. 작업은 하나의 숫자가 아니라 일련의 정수로 이루어지며 이 순서의 숫자를 2에서 128까지 순서대로 표시하려면 버튼을 한 번만 눌러야 합니다. 문제는 정확히 어떻게 하느냐 입니다...

사유: