Voglio imparare il linguaggio di programmazione per il terminale MT5. Da dove comincio come principiante? - pagina 6

 
Vasiliy Kolesov:

Non è conveniente imparare dal libro di testo di Kovalev da zero, perché è superato. Iniziate a fare alcuni esercizi e non si compilano. E la semplice lettura, senza pratica, rende più difficile ricordare le cose.

Non credo che stiamo parlando di esempi semplici. Probabilmente è già alla fine di un libro di testo. E probabilmente è una questione di sintassi, che, se si capiscono le basi, è facilmente correggibile. In ogni caso, TC può sempre chiedere perché questo o quell'esempio non compila.

Puoi dare un esempio dal tutorial che non compila? Per fare un esempio, rompiamo il cerchio.

 
Ilya Malev:

Ti è stato giustamente consigliato di imparare il C++, perché MQL è proprio questo, e ci sono molti più materiali sul C++.

Se conosci il C++, allora studia MQL dalla guida, analizzando gli EA di altre persone.

Questo se uno pianifica le sue attività al di fuori di MT. Ma non si può pianificare una cosa del genere in anticipo. In questo momento l'obiettivo è imparare a scrivere per la MT. E se una persona inizia con C o C++, sarà bloccata lì per queste cose che sono assenti in MQL dall'inizio. Dopo tutto, anche una semplice stampa di valori non può essere fatta con cout. Da questo punto di vista MQL è molto più facile - Print o Alert.

Quindi è meglio iniziare a imparare ciò di cui si ha bisogno. E più tardi, se ti piace e vuoi continuare, puoi passare al C++.

 

Impara il C++ se sei un principiante. Ecco una buona risorsahttps://foxford.ru/wiki/informatika/otlichiya-yazykov-programmirovaniya-si-i-s

Evita i non professionisti, il loro linguaggio è troppo secco per ricordare qualcosa. Usa le tecniche mnemoniche, ci sono molti libri su questo argomento su Internet.

Personalmente, per memorizzare qualcosa, bisogna immaginare una funzione, per esempio, come un oggetto del mondo reale, aggiungendo più luminosità e umorismo, sesso e surrealismo.

 
multiplicator:

è meglio

Altri 6 parametri devono essere inseriti in PositionOpen.


Gli altri parametri non hanno bisogno di essere prescritti

 
Ihor Herasko:

Questi non sono esempi semplici. Probabilmente è già alla fine di un libro di testo. E probabilmente si tratta di sintassi, che, se si capiscono le basi, può essere facilmente risolta. In ogni caso, TC può sempre chiedere perché questo o quell'esempio non compila.

Puoi dare un esempio dal tutorial che non compila? Facciamo un esempio.

Sì, dall'inizio, per esempio non c'è la funzione Start, ora èOnInit().

Ho trovato una buona descrizione qui, se si parte da zerohttps://sgr-tradeinvest.ru/mql4

 
Vasiliy Kolesov :

sì fin dall'inizio, ad esempio non esiste la funzione Start, ora è OnInit()


compilato. Non ci sono errori. Un solo avviso, facilmente correggibile con una comprensione elementare del termine "funzione".

Ho anche preso un esempio leggermente più grande:

 //--------------------------------------------------------------------
// tradingexpert.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
#property copyright "Copyright © Book, 2007"
#property link        "http://AutoGraf.dp.ua"
//--------------------------------------------------------------- 1 --
                                   // Численные значения для М15
extern double StopLoss   = 200 ;     // SL для открываемого ордера
extern double TakeProfit = 39 ;       // ТР для открываемого ордера
extern int     Period_MA_1= 11 ;       // Период МА 1
extern int     Period_MA_2= 31 ;       // Период МА 2
extern double Rastvor    = 28.0 ;     // Расстояние между МА 
extern double Lots       = 0.1 ;     // Жестко заданное колич. лотов
extern double Prots      = 0.07 ;     // Процент свободных средств
 
bool Work= true ;                     // Эксперт будет работать.
string Symb;                       // Название финанс. инструмента
//--------------------------------------------------------------- 2 --
int start()
  {
   int
   Total,                           // Количество ордеров в окне 
   Tip=- 1 ,                           // Тип выбран. ордера (B=0,S=1)
   Ticket;                           // Номер ордера
   double
   MA_1_t,                           // Значен. МА_1 текущее
   MA_2_t,                           // Значен. МА_2 текущее 
   Lot,                             // Колич. лотов в выбран.ордере
   Lts,                             // Колич. лотов в открыв.ордере
   Min_Lot,                         // Минимальное количество лотов
   Step,                             // Шаг изменения размера лота
   Free,                             // Текущие свободные средства
   One_Lot,                         // Стоимость одного лота
   Price,                           // Цена выбранного ордера
   SL,                               // SL выбранного ордера 
   TP;                               // TP выбранного ордера
   bool
   Ans  = false ,                     // Ответ сервера после закрытия
   Cls_B= false ,                     // Критерий для закрытия  Buy
   Cls_S= false ,                     // Критерий для закрытия  Sell
   Opn_B= false ,                     // Критерий для открытия  Buy
   Opn_S= false ;                     // Критерий для открытия  Sell
//--------------------------------------------------------------- 3 --
   // Предварит.обработка
   if ( Bars < Period_MA_2)                       // Недостаточно баров
     {
       Alert ( "Недостаточно баров в окне. Эксперт не работает." );
       return ;                                   // Выход из start()
     }
   if (Work== false )                               // Критическая ошибка
     {
       Alert ( "Критическая ошибка. Эксперт не работает." );
       return ;                                   // Выход из start()
     }
//--------------------------------------------------------------- 4 --
   // Учёт ордеров
   Symb= Symbol ();                               // Название фин.инстр.
   Total= 0 ;                                     // Количество ордеров
   for ( int i= 1 ; i<= OrdersTotal (); i++)           // Цикл перебора ордер
     {
       if ( OrderSelect (i- 1 , SELECT_BY_POS )== true ) // Если есть следующий
        {                                       // Анализ ордеров:
         if ( OrderSymbol ()!=Symb) continue ;       // Не наш фин. инструм
         if ( OrderType ()> 1 )                     // Попался отложенный
           {
             Alert ( "Обнаружен отложенный ордер. Эксперт не работает." );
             return ;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total> 1 )                           // Не более одного орд
           {
             Alert ( "Несколько рыночных ордеров. Эксперт не работает." );
             return ;                             // Выход из start()
           }
         Ticket= OrderTicket ();                   // Номер выбранн. орд.
         Tip   = OrderType ();                     // Тип выбранного орд.
         Price = OrderOpenPrice ();               // Цена выбранн. орд.
         SL    = OrderStopLoss ();                 // SL выбранного орд.
         TP    = OrderTakeProfit ();               // TP выбранного орд.
         Lot   = OrderLots ();                     // Количество лотов
        }
     }
//--------------------------------------------------------------- 5 --
   // Торговые критерии
   MA_1_t= iMA ( NULL , 0 ,Period_MA_1, 0 , MODE_LWMA , PRICE_TYPICAL , 0 ); // МА_1
   MA_2_t= iMA ( NULL , 0 ,Period_MA_2, 0 , MODE_LWMA , PRICE_TYPICAL , 0 ); // МА_2
 
   if (MA_1_t > MA_2_t + Rastvor* Point )         // Если разница между
     {                                           // ..МА 1 и 2 большая
      Opn_B= true ;                               // Критерий откр. Buy
      Cls_S= true ;                               // Критерий закр. Sell
     }
   if (MA_1_t < MA_2_t - Rastvor* Point )         // Если разница между
     {                                           // ..МА 1 и 2 большая
      Opn_S= true ;                               // Критерий откр. Sell
      Cls_B= true ;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 6 --
   // Закрытие ордеров
   while ( true )                                   // Цикл закрытия орд.
     {
       if (Tip== 0 && Cls_B== true )                 // Открыт ордер Buy..
        {                                       //и есть критерий закр
         Alert ( "Попытка закрыть Buy " ,Ticket, ". Ожидание ответа.." );
         RefreshRates ();                         // Обновление данных
         Ans= OrderClose (Ticket,Lot, Bid , 2 );       // Закрытие Buy
         if (Ans== true )                         // Получилось :)
           {
             Alert ( "Закрыт ордер Buy " ,Ticket);
             break ;                               // Выход из цикла закр
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
 
       if (Tip== 1 && Cls_S== true )                 // Открыт ордер Sell..
        {                                       // и есть критерий закр
         Alert ( "Попытка закрыть Sell " ,Ticket, ". Ожидание ответа.." );
         RefreshRates ();                         // Обновление данных
         Ans= OrderClose (Ticket,Lot, Ask , 2 );       // Закрытие Sell
         if (Ans== true )                         // Получилось :)
           {
             Alert ( "Закрыт ордер Sell " ,Ticket);
             break ;                               // Выход из цикла закр
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       break ;                                     // Выход из while
     }
//--------------------------------------------------------------- 7 --
   // Стоимость ордеров
   RefreshRates ();                               // Обновление данных
   Min_Lot= MarketInfo (Symb, MODE_MINLOT );         // Миним. колич. лотов 
   Free   = AccountFreeMargin ();                 // Свободн средства
   MarketInfo (Symb, MODE_MARGINREQUIRED ); // Стоимость 1 лота
   Step   = MarketInfo (Symb, MODE_LOTSTEP );       // Шаг изменен размера
 
   if (Lots > 0 )                                 // Если заданы лоты,то 
      Lts =Lots;                                 // с ними и работаем 
   else                                          // % свободных средств
      Lts= MathFloor (Free*Prots/One_Lot/Step)*Step; // Для открытия
 
   if (Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                       // Лот дороже свободн.
     {
       Alert ( " Не хватает денег на " , Lts, " лотов" );
       return ;                                   // Выход из start()
     }
//--------------------------------------------------------------- 8 --
   // Открытие ордеров
   while ( true )                                   // Цикл закрытия орд.
     {
       if (Total== 0 && Opn_B== true )               // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates ();                         // Обновление данных
         SL= Bid - New_Stop(StopLoss)* Point ;     // Вычисление SL откр.
         TP= Bid + New_Stop(TakeProfit)* Point ;   // Вычисление TP откр.
         Alert ( "Попытка открыть Buy. Ожидание ответа.." );
         Ticket= OrderSend (Symb, OP_BUY ,Lts, Ask , 2 ,SL,TP); //Открытие Buy
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Buy " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       if (Total== 0 && Opn_S== true )               // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates ();                         // Обновление данных
         SL= Ask + New_Stop(StopLoss)* Point ;     // Вычисление SL откр.
         TP= Ask - New_Stop(TakeProfit)* Point ;   // Вычисление TP откр.
         Alert ( "Попытка открыть Sell. Ожидание ответа.." );
         Ticket= OrderSend (Symb, OP_SELL ,Lts, Bid , 2 ,SL,TP); //Открытие Sel
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Sell " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       break ;                                     // Выход из while
     }
//--------------------------------------------------------------- 9 --
   return ;                                       // Выход из start()
  }
//-------------------------------------------------------------- 10 --
int Fun_Error( int Error)                         // Ф-ия обработ ошибок
  {
   switch (Error)
     {                                           // Преодолимые ошибки            
       case    4 : Alert ( "Торговый сервер занят. Пробуем ещё раз.." );
         Sleep ( 3000 );                           // Простое решение
         return ( 1 );                             // Выход из функции
       case 135 : Alert ( "Цена изменилась. Пробуем ещё раз.." );
         RefreshRates ();                         // Обновим данные
         return ( 1 );                             // Выход из функции
       case 136 : Alert ( "Нет цен. Ждём новый тик.." );
         while ( RefreshRates ()== false )           // До нового тика
             Sleep ( 1 );                           // Задержка в цикле
         return ( 1 );                             // Выход из функции
       case 137 : Alert ( "Брокер занят. Пробуем ещё раз.." );
         Sleep ( 3000 );                           // Простое решение
         return ( 1 );                             // Выход из функции
       case 146 : Alert ( "Подсистема торговли занята. Пробуем ещё.." );
         Sleep ( 500 );                             // Простое решение
         return ( 1 );                             // Выход из функции
         // Критические ошибки
       case    2 : Alert ( "Общая ошибка." );
         return ( 0 );                             // Выход из функции
       case    5 : Alert ( "Старая версия терминала." );
         Work= false ;                             // Больше не работать
         return ( 0 );                             // Выход из функции
       case 64 : Alert ( "Счет заблокирован." );
         Work= false ;                             // Больше не работать
         return ( 0 );                             // Выход из функции
       case 133 : Alert ( "Торговля запрещена." );
         return ( 0 );                             // Выход из функции
       case 134 : Alert ( "Недостаточно денег для совершения операции." );
         return ( 0 );                             // Выход из функции
       default : Alert ( "Возникла ошибка " ,Error); // Другие варианты   
         return ( 0 );                             // Выход из функции
     }
  }
//-------------------------------------------------------------- 11 --
int New_Stop( int Parametr)                       // Проверка стоп-прик.
  {
   int Min_Dist= MarketInfo (Symb, MODE_STOPLEVEL ); // Миним. дистанция
   if (Parametr < Min_Dist)                     // Если меньше допуст.
     {
      Parametr=Min_Dist;                         // Установим допуст.
       Alert ( "Увеличена дистанция стоп-приказа." );
     }
   return (Parametr);                             // Возврат значения
  }
//-------------------------------------------------------------- 12 --

Si compila anche. 12 avvisi, ma nessuno di essi pregiudica le prestazioni del programma. Sono anche corretti. Pertanto, per iniziare il Tutorial, il gioco è fatto.

 
BillionerClub:

Impara il C++ se sei un principiante. Ecco una buona risorsahttps://foxford.ru/wiki/informatika/otlichiya-yazykov-programmirovaniya-si-i-s

Quell'uomo ha bisogno di un passaggio e voi gli state dando la zappa sui piedi. Nella fase di padronanza di MQL la questione se il programmatore ha bisogno di programmazione in linea di principio, se può tirarlo fuori. MQL è più facile di C++. Perché preoccuparsi di cose complicate?

In particolare, il link di cui sopra include tutto ciò che MQL non ha: libreria standard (MLQ ha, ma la sua, non C++), spazio dei nomi, input e output tramite cout e cin.

 
Ihor Herasko:

Compilato. Non ci sono errori. Solo un avvertimento, che è facilmente correggibile con una comprensione di base del termine "funzione".

Ho anche preso un esempio un po' più grande:

Si compila anche. Ci sono 12 avvertimenti, ma nessuno di essi influisce sull'operatività del programma. Si possono anche aggiustare facilmente. Ecco perché il Tutorial è un buon punto di partenza.

Ho provato per qualche motivo e non ha funzionato. Ho pensato che fosse a causa del cambio di nome. Grazie per averla provata. Forse dovremmo tornare a farlo.

 
Vitaly Muzichenko:

Yuri, beh, tutti iniziano da qualche parte.

Ho iniziato con .php, poi ho studiato .js perché senza di esso, scrivere qualcosa di normale non è semplicemente realistico. Quando .js è stato integrato con la libreria jquery, era una gioia, ma bisognava impararla. Molte persone scrissero allora che era una sciocchezza e che si doveva usare solo .js puro, più tardi tutti si sono spostati ad usare jquery, perché le librerie sono fighe.

Quando ho toccato il forex, ho studiato .mql perché ne avevo bisogno, anche se era difficile, non è lo stesso di php e js.

Quindi tutto ciò che conta è il desiderio.

Ora, per essere un ragazzo figo, jquery non basta, devi studiare ***teen altri frameworks... È così che il programmatore medio vive tutta la sua vita da programmatore incompiuto - impara un framework e ne appaiono altri tre contemporaneamente.

 
Anastasia Vasilenko:
Cosa hai studiato?

Se solo sapeste quello che già sapete e che potete fare. In generale - basta prendere l'Expert Advisor dal kit del terminale, aprirlo nell'editor e vedere se qualcosa nel codice è evidenziato in un colore diverso - mettere il cursore lì, premere f1 e leggere la guida.

Se non avete alcuna familiarità con la programmazione, non sapete cosa per, se, ecc. - Si può iniziare con qualsiasi libro di lingua for dummies o libri per bambini.