新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 981

 
jaffer wilson:

@ Artyom Trishkin

请你回答我的问题。我认为没有人在乎。

试着在这里提出你的问题。

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

你好。

我是个新手,我有第一个问题--为什么编译会出现错误?如何解决这个问题?

//+------------------------------------------------------------------+
//|moy var1.ǞǞǞ
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#属性链接 "https://www.mql5.com"
#财产版本 "1.00"
#属性严格

外来的int Magic = 111;
int CountSell()
//+------------------------------------------------------------------+
//| 专家初始化功能|
//+-----------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED)。
}
//+------------------------------------------------------------------+
//| 专家去初始化功能|
//+------------------------------------------------------------------+
空白的OnDeinit(const int reason)。
{
}
//+------------------------------------------------------------------+
//|专家勾选功能|
//+------------------------------------------------------------------+
空白的OnTick()
{
{
int count =0。

for(int i = OrdersTotal() - 1; i >= 0; i--)
{
如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
count++。
}
}
返回。
}
}

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

'int' - 预期分号 moy var1.mq4 13 1

1个错误(s), 0个警告(s) 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 for ( 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:

我明白。这就是为什么我问,在mt-4中用OBJPROP_RAY_RIGHT 设置"将物体继续向右 "(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。 问题是究竟如何做到这一点...

原因: