Ich möchte die Programmiersprache für das MT5-Terminal lernen. Wo kann ich als Anfänger anfangen? - Seite 6

 
Vasiliy Kolesov:

Es ist nicht sinnvoll, das Lehrbuch von Kovalev von Grund auf zu lernen, da es veraltet ist. Sie fangen an, einige Übungen zu machen, und sie lassen sich nicht kompilieren. Und wenn man einfach nur liest, ohne zu üben, wird es schwieriger, sich Dinge zu merken.

Ich glaube nicht, dass es sich um einfache Beispiele handelt. Es steht wahrscheinlich schon am Ende eines Lehrbuchs. Und es ist wahrscheinlich eine Frage der Syntax, die, wenn man die Grundlagen versteht, leicht zu korrigieren ist. In jedem Fall kann TC immer fragen, warum dieses oder jenes Beispiel nicht kompiliert werden kann.

Können Sie ein Beispiel aus dem Lernprogramm nennen, das nicht kompiliert werden kann? Lassen Sie uns das Beispiel aufschlüsseln.

 
Ilya Malev:

Es wurde Ihnen zu Recht geraten, C++ zu lernen, denn MQL ist genau das, und es gibt viel mehr Material zu C++.

Wenn Sie sich mit C++ auskennen, dann lernen Sie MQL von der Hilfe, indem Sie die EAs anderer Leute analysieren.

Dies ist der Fall, wenn man seine Aktivitäten außerhalb von MT plant. Aber so etwas kann man nicht im Voraus planen. Im Moment besteht das Ziel darin, zu lernen, wie man für MT schreibt. Und wenn jemand mit C oder C++ anfängt, wird er dort wegen solcher Dinge feststecken, die es in MQL von Anfang an nicht gibt. Schließlich kann selbst ein einfacher Wertdruck nicht mit cout durchgeführt werden. In dieser Hinsicht ist MQL viel einfacher - Print or Alert.

Es ist also besser, mit dem Lernen zu beginnen, was man braucht. Und später, wenn es Ihnen gefällt und Sie weitermachen wollen, können Sie zu C++ wechseln.

 

Lernen Sie C++, wenn Sie ein Anfänger sind. Hier ist eine gute Quellehttps://foxford.ru/wiki/informatika/otlichiya-yazykov-programmirovaniya-si-i-s

Vermeiden Sie Laien, ihre Sprache ist zu trocken, um sich überhaupt etwas merken zu können. Verwenden Sie Mnemotechniken, es gibt viele Bücher zu diesem Thema im Internet.

Um sich etwas einzuprägen, muss man sich zum Beispiel eine Funktion als reales Objekt vorstellen und dabei mehr Glanz und Humor, Sex und Surrealismus hinzufügen.

 
multiplicator:

ist es besser, wenn

In PositionOpen müssen 6 weitere Parameter eingegeben werden.


Die anderen Parameter brauchen nicht vorgeschrieben zu werden

 
Ihor Herasko:

Dies sind keine einfachen Beispiele. Es steht wahrscheinlich schon am Ende eines Lehrbuchs. Und wahrscheinlich geht es um die Syntax, die, wenn man die Grundlagen versteht, leicht behoben werden kann. In jedem Fall kann TC immer fragen, warum dieses oder jenes Beispiel nicht kompiliert werden kann.

Können Sie ein Beispiel aus dem Lernprogramm nennen, das nicht kompiliert werden kann? Nehmen wir ein Beispiel.

Ja, von Anfang an, zum Beispiel gibt es keine Start-Funktion, jetzt ist esOnInit().

Ich habe hier eine gute Beschreibung gefunden, wenn man bei Null anfängthttps://sgr-tradeinvest.ru/mql4

 
Vasiliy Kolesov :

ja von Anfang an, zum Beispiel gibt es keine Startfunktion, jetzt ist es OnInit()


Kompiliert. Es gibt keine Fehler. Nur eine Warnung, die mit einem elementaren Verständnis des Begriffs "Funktion" leicht korrigiert werden kann.

Ich habe sogar ein etwas größeres Beispiel genommen:

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

Es kompiliert auch. 12 Warnungen, aber keine davon beeinträchtigt die Leistung des Programms. Sie werden auch korrigiert. Also, um das Tutorial zu starten - das war's.

 
BillionerClub:

Lernen Sie C++, wenn Sie ein Anfänger sind. Hier ist eine gute Quellehttps://foxford.ru/wiki/informatika/otlichiya-yazykov-programmirovaniya-si-i-s

Der Mann braucht eine Mitfahrgelegenheit und Sie lassen ihn im Stich. In der Phase der Beherrschung von MQL stellt sich die Frage, ob der Programmierer prinzipiell programmieren muss, ob er es schaffen kann. MQL ist einfacher als C++. Warum sich mit komplizierten Dingen herumschlagen?

Insbesondere, dass der obige Link alles enthält, was MQL nicht hat: Standardbibliothek (MLQ hat, aber seine eigene, nicht C++), Namespace, Ein- und Ausgabe über cout und cin.

 
Ihor Herasko:

Zusammengestellt. Es liegen keine Fehler vor. Nur eine Warnung, die mit einem grundlegenden Verständnis des Begriffs "Funktion" leicht zu korrigieren ist.

Ich habe sogar ein etwas größeres Beispiel genommen:

Es kompiliert auch. Es gibt 12 Warnungen, aber keine davon beeinträchtigt die Funktionsfähigkeit des Programms. Auch sie können leicht behoben werden. Deshalb ist das Tutorial ein guter Ausgangspunkt.

Ich habe es aus irgendeinem Grund versucht und es hat nicht funktioniert. Ich dachte, es läge an der Namensänderung. Danke, dass Sie es ausprobiert haben. Vielleicht sollten wir darauf zurückkommen.

 
Vitaly Muzichenko:

Juri, nun ja, jeder fängt irgendwo an.

Ich habe mit .php angefangen, dann habe ich .js studiert, weil es ohne .php einfach nicht realistisch ist, etwas Normales zu schreiben. Als .js mit der Jquery-Bibliothek ergänzt wurde, war es eine Freude, aber man musste es lernen. Viele Leute schrieben damals, dass es Unsinn sei und man nur reines .js verwenden sollte, später gingen alle dazu über, Jquery zu verwenden, weil Bibliotheken cool sind.

Als ich mit Forex in Berührung kam, lernte ich .mql, weil ich es brauchte, auch wenn es schwer war, es ist nicht dasselbe wie php und js.

Alles, was zählt, ist also der Wunsch.

Nun, ein cooles Kind zu sein, ist jquery nicht genug, müssen Sie ***teen mehr Frameworks studieren ... So lebt der durchschnittliche Programmierer sein ganzes Leben als unfertiger Programmierer - er lernt ein Framework und drei weitere erscheinen auf einmal.

 
Anastasia Vasilenko:
Was haben Sie studiert?

Wenn Sie nur wüssten, was Sie bereits wissen und was Sie tun können. Generell gilt: Nehmen Sie den Expert Advisor aus dem Terminal-Kit, öffnen Sie ihn im Editor und schauen Sie, ob etwas im Code farblich hervorgehoben ist - setzen Sie den Cursor dorthin, drücken Sie f1 und lesen Sie die Hilfe.

Wenn Sie mit der Programmierung überhaupt nicht vertraut sind, wissen Sie nicht, wofür, wenn usw. - Sie können mit jedem Sprachbuch für Dummies oder Kinderbüchern beginnen.

Grund der Beschwerde: