MT5端末のプログラミング言語を学びたいのですが、初心者なので何から始めればいいですか? - ページ 6

 
Vasiliy Kolesov:

コバレフの教科書を一から学ぶのは、時代遅れで不便です。演習を始めても、コンパイルができない。また、練習をせずにただ読むだけでは、物事を覚えられなくなります。

何か単純な例の話をしているわけではないと思うのですが。もう教科書の最後のほうにあるんでしょうね。そして、それはおそらく構文の問題で、基本を理解していれば、簡単に修正できるものです。いずれにせよ、TCはいつでも、この例やこの例はなぜコンパイルできないのか、と問うことができます。

チュートリアルの中で、コンパイルできない例を教えてください。一例として、分解してみましょう。

 
Ilya Malev:

MQLだからC++を学べというのはごもっともな意見で、C++の方が資料もたくさんありますしね。

C++が分かるなら、ヘルプから他人のEAを解析してMQLを勉強してください。

MT以外の活動を計画的に行う場合です。しかし、そんなことを事前に計画することはできない。今は、MTのライティングを習得することが目標です。また、CやC++で始めた人は、MQLに最初からないそのようなもののために、そこで立ち往生してしまうでしょう。結局、単純な値の印字でも、coutではできないのです。この点では、MQLはプリントや アラートなど、より簡単です。

だから、必要なものから勉強したほうがいいんです。そして後で、気に入って続けたいと思ったら、C++に切り替えればいいのです。

 

初心者の方はC++を学んでください。ここに良い資料がありますhttps://foxford.ru/wiki/informatika/otlichiya-yazykov-programmirovaniya-si-i-s

プロでない人は避けてください。彼らの言葉は乾いていて、まったく記憶に残りません。ニーモニクスのテクニックを使う。インターネットでこのトピックに関する本がたくさん出ている。

個人的には、何かを記憶するためには、例えば機能などを現実のものとして想像し、さらに明るさやユーモア、セックス、シュールさなどを加えていく必要があります。

 
multiplicator:

にこしたことはない

PositionOpenには、さらに6つのパラメータを入力する必要があります。


その他のパラメータは規定する必要はない

 
Ihor Herasko:

これらは単純な例とは言い難い。すでに教科書の巻末に掲載されているのでしょう。そして、それはおそらく構文に関するもので、基本を理解していれば、簡単に修正することができます。いずれにせよ、TCはいつでも、この例やこの例はなぜコンパイルできないのか、と問うことができます。

チュートリアルの中で、コンパイルできない例を教えてください。一例を挙げましょう。

はい、最初から、例えばStart関数がなく、今はOnInit() になっています。

ここに良い記述がありました、ゼロから始めるならhttps://sgr-tradeinvest.ru/mql4

 
Vasiliy Kolesov :

はい、最初から、たとえばStart関数はありませんが、現在はOnInit()です。


編集済み。エラーはありません。 「機能」という用語を基本的に理解することで簡単に修正できる警告は1つだけです。

私は少し大きな例を取りました:

 //--------------------------------------------------------------------
// 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 --

また、コンパイルします。 12の警告がありますが、プログラムのパフォーマンスに影響を与えるものはありません。それらも修正されます。したがって、チュートリアルを開始するには、それだけです。

 
BillionerClub:

初心者の方はC++を学んでください。ここに良い資料がありますhttps://foxford.ru/wiki/informatika/otlichiya-yazykov-programmirovaniya-si-i-s

あの人は車が必要なのに、あなたは彼に逃げ回ってる。MQLを学ぶ段階では、プログラマーが原則的にプログラミングを必要とするかどうか、それをやり遂げられるかどうかという問題があります。MQLはC++より簡単です。なぜわざわざ複雑なことをするのか?

特に、上記のリンクは、標準ライブラリ(MLQにはありますが、C++ではありません)、名前空間、coutとcinによる入出力など、MQLが持っていないものをすべて含んでいます。

 
Ihor Herasko:

コンパイルされました。エラーはありません。警告は1つだけですが、これは「機能」という用語の基本的な理解で簡単に修正できます。

もう少し大きな例も撮りました。

コンパイルもできる。12個の警告が表示されますが、いずれもプログラムの動作に影響を与えるものではありません。それらも簡単に修正することができます。だからこそ、チュートリアルは良いきっかけになるのです。

何となくやってみたけど、うまくいかなかった。名前が変わったからだと思いました。試していただき、ありがとうございます。もう一回、やり直した方がいいんじゃない?

 
Vitaly Muzichenko:

由利 まあ、誰でもどこかで始めるものですからね。

.phpから始めて、.jsを勉強したのは、これがないと普通のものを書いても現実的じゃないからです。.jsにjqueryライブラリが追加されたときは、楽しかったけど、覚えなきゃいけないし、ナンセンスだから純粋な.jsだけでいいという意見も多かったけど、ライブラリはかっこいいからみんなjqueryに移行していったね。

FXを触った時、大変だけど必要だから.mqlを勉強した、phpやjsとは違うんだ。

だから、大切なのは想いだけなんです。

今、カッコいい子になるには、jqueryだけではダメで、あと○○個のフレームワークを勉強しないと...。そうやって、平均的なプログラマーは、1つのフレームワークを習得した直後に、さらに3つの新しいフレームワークが一気に現れるという、中途半端なプログラマーとしての一生を送ることになる。

 
Anastasia Vasilenko:
何を勉強したのですか?

すでに知っていること、できることがあれば。一般的には、ターミナル・キットからExpert Advisorを取り出し、エディタで開いて、コード内の何かが別の色で強調表示されているかどうかを確認します - カーソルをそこに置いて、f1を押し、ヘルプを読みます。

プログラミングに全く慣れていない方、what for, ifなどがわからない方。- ダミーのための語学書や子供向けの本から始めてもよいでしょう。