Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 981

 
jaffer wilson:

@ Artyom Trishkin

Per favore, puoi rispondere alla mia domanda? Credo che non interessi a nessuno.

Prova a porre la tua domanda qui:

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

Salve.

Sono un principiante e ho il primo problema: perché la compilazione dà un errore? Come risolvere il problema?

//+------------------------------------------------------------------+
//|moy var1.mq4 |
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#proprietà link "https://www.mql5.com"
#proprietà versione "1.00"
#proprietà rigorosa

extern int Magic = 111;
int CountSell()
//+------------------------------------------------------------------+
//|Funzione di inizializzazione dell'esperto|
//+-----------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione degli esperti|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| funzione tick esperto|
//+------------------------------------------------------------------+
void OnTick()
{
{
int count =0;

for(int i = OrdiniTotali() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
count++;
}
}
ritorno;
}
}

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

'int' - punto e virgola previsto moy var1.mq4 13 1

1 errore(i), 0 avviso(i) 2 1


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

Salve.

Sono un principiante e ho il primo problema: perché la compilazione dà un errore? Come risolvere il problema?

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

Si prega di inserire il codice correttamente:


 
Pomeriggio. Non posso disegnare un oggetto Fibo(OBJ_FIBO) in MT-4 senza estendere le linee a destra. Quando si cambia il parametro OBJPROP_RAY_RIGHT, il raggio è ancora disegnato tutto a destra. E lo script del tutorial si comporta allo stesso modo. Ho provato a cambiarlo in OBJPROP_RAY come per il segmento, ma non funziona. Grazie in anticipo.
 
Sergey Fionin:
Pomeriggio. Non posso disegnare un oggetto Fibo (OBJ_FIBO) in MT-4 senza estendere le linee a destra. Quando si cambia il parametro OBJPROP_RAY_RIGHT, il raggio è ancora disegnato tutto a destra. E lo script del tutorial si comporta allo stesso modo. Ho provato a cambiarlo in OBJPROP_RAY come per il segmento, ma non funziona. Grazie in anticipo.

La questione è che MT4 non è MT5 e se il codice si compila, non significa che funzionerà.

 
Alexey Viktorov :

Il fatto è che MT4 non è MT5 e se il codice viene compilato, ciò non significa che funzionerà.

Capisco. Ed è per questo che chiedo se l'impostazione " Continuazione dell'oggetto a destra" tramite OBJPROP_RAY_RIGHT funziona davvero in MT-4 per ( OBJ_FIBO ) ? Un esempio di script è tratto da un libro di testo per 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:

Ho capito. Ecco perché sto chiedendo se l'impostazione "Continua oggetto a destra" con OBJPROP_RAY_RIGHT funziona davvero in mt-4 per (OBJ_FIBO)? Lo script di esempioè preso dal tutorial per mt-4.

È possibile che gli sia sfuggito quando hanno modificato la guida. È stato corretto dalla documentazione di mql5.

 
Ciao a tutti. È passata una settimana da quando ho iniziato a studiare mql e ora sono perplesso su come implementare un tale meccanismo. Il grafico ha un pulsante(OBJ_BUTTON), come e cosa dovrebbe essere scritto nel codice, in modo che quando si fa clic sul pulsante sarebbe derivato da una data sequenza di numeri in ordine. Cioè, c'è una sequenza di 2, 4, 8, 16, 32, 64, 128. Io, per esempio, premo il pulsante sul grafico e il numero di questa sequenza dovrebbe essere visualizzato in un commento, rigorosamente in ordine. Ho premuto il pulsante - mostrerà 2, l'ho premuto di nuovo - mostrerà 4 e così via. E premendo il secondo pulsante, per esempio, questi numeri appariranno in ordine inverso. Se riesci a scrivere un codice funzionante, la mia gioia sarà finita)))
 
Ivan Revedzhuk:
Ciao a tutti. È passata una settimana da quando ho iniziato a studiare mql, e sono stato perplesso su come implementare un tale meccanismo. Il grafico ha un pulsante (OBJ_BUTTON), come e cosa dovrebbe essere scritto nel codice per stampare un numero da una data sequenza in ordine quando si clicca sul pulsante. Cioè, c'è una sequenza di 2, 4, 8, 16, 32, 64, 128. Io, per esempio, premo il pulsante sul grafico e il numero di questa sequenza dovrebbe essere visualizzato in un commento, rigorosamente in ordine. Ho premuto il pulsante - mostrerà 2, l'ho premuto di nuovo - mostrerà 4 e così via. E premendo il secondo pulsante, per esempio, questi numeri appariranno in ordine inverso. Se riesci a scrivere un codice funzionante, la mia gioia sarà finita)))
if(ObjectGetInteger(0, "name", OBJPROP_STATE) == true)
 // Кнопка нажата
// Вывести в Comment какое нужно число 

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

Per determinare quale numero è nel commento, leggete la documentazione del grafico. C'è una funzione per leggere il commento.

O il più semplice, questo numero da mettere in una variabile statica, e in Comment()

 
Alexey Viktorov:

Per determinare quale numero è nel commento, leggete la documentazione del grafico. C'è una funzione per leggere il commento.

O il modo più semplice è quello di mettere questo numero in una variabile statica e metterlo in Comment()

Grazie per la risposta. Ho trovato come gestire la pressione dei pulsanti nell'aiuto, ma ho problemi con il resto. Sto lavorando non solo con un numero, ma con una sequenza di numeri interi e ho bisogno di una pressione del pulsante per emettere un numero da questa sequenza, in ordine da 2 a 128. La domanda è esattamente come fare questo...