Вопросы Алексею Волчанскому по программированию советников на языке MQL4
Страница 1 из 3 1 2 3 ПоследняяПоследняя
Показано с 1 по 10 из 30

Тема: Вопросы Алексею Волчанскому по программированию советников на языке MQL4

  1. #1
    RoboForex SPb Аватар для Антонина Бойкова
    Регистрация
    20.12.2011
    Адрес
    St. Petersburg
    Сообщений
    70
    Promo (¢)
    355
    Благодарности
    Получено: 42
    Отправлено: 4

    Вопросы Алексею Волчанскому по программированию советников на языке MQL4

    Уважаемые клиенты компании и слушатели курса.

    В этой теме Вы можете задать любые интересующие Вас вопросы нашему преподавателю Алексею Волчанскому. Вы можете уточнить подробности о занятиях, записи, плану лекций, домашних заданиях или спросить о программировании, попросить прояснить непонятные Вам моменты и трудности.

    Алексей будет рад Вам помочь.

    Вы не можете благодарить!
    Последний раз редактировалось Антонина Бойкова; 13.11.2012 в 17:10.

  2. #2
    Новичок
    Регистрация
    23.08.2012
    Сообщений
    29
    Promo (¢)
    330
    Благодарности
    Получено: 1
    Отправлено: 12
    Доброго дня! Я третий день не могу понять, с чем же может быть связана ошибка 129. Вот код, в нем, чтоб очень не разбираться, есть строки ордерсенд. Цену нормализовал. Вообще не пойму, в чём дело! Хотя бы тиоритически!

    Код:
    /+------------------------------------------------------------------+
    //|                                                     советник.mq4 |
    //|                        Copyright 2012, MetaQuotes Software Corp. |
    //|                                        _http://www.metaquotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2012, MetaQuotes Software Corp."
    #property link      "http://www.metaquotes.net"
    
    #include <WinUser32.mqh>
      extern double  lot         = 1;                          
      extern int     taymfreym   = 0 ;                           
      extern double  stoplos     = 200 ;                          
      extern double  takeprofit  = 500 ; 
      extern int     magicnumber = 350;
      extern int     ControlBar  = 1;      // номер бара на котором снимаем показания индикатора                     
    
    
    void BreakPoint()
    {//if (!IsVisualMode()) return(0);
        keybd_event (19,0,0,0);
        Sleep (10);
        keybd_event (19,0,2,0);
    }
    
    //+------------------------------------------------------------------+
    //| expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
      {
    //----
       Print (   "  НачалоНачал " ); 
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //----
       
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| expert start function                                            |
    //+------------------------------------------------------------------+
    int i;
    int start()
    {
      //Print (   "  Начало " ); 
    //----
        for (int A = 0; A <100 ; A++) // ни к чему этот перебор баров
        {
            double strela1 = iCustom (NULL, taymfreym, "индикатор", 2, A),
                   strela2 = iCustom (NULL, taymfreym, "индикатор", 3, A);
            int BUY = 0, SELL = 0, ticket; Sleep(600);
            Print (A, "  strela1 " , strela1 , "    strela2  " , strela2);
        
        for (int i = OrdersTotal() - 1; i >= 0; i--)
        {  Print (" i   " ,  i );
            if (!OrderSelect (i, SELECT_BY_POS)) continue;  // Если есть следующий
            if (OrderSymbol() != Symbol()) continue;      // Не наш фин. инструм
            if (OrderMagicNumber() != magicnumber) continue;
            int type = OrderType();
            if (type > 1) continue;
            ticket = OrderTicket();
            if (type == 0) {BUY++; Print ("BUY++   " , BUY  ,"  ticket ", ticket); break;}
            if (type == 1) {SELL++; Print ("SELL++   " , SELL  ,"  ticket ", ticket); break;}
        }
        if (strela1 < strela2)
        {Sleep(600);
            if (SELL > 0) udalenie (OP_SELL);Sleep(600);
            if (BUY == 0)
            {Sleep(600);
                OrderSend (Symbol( ), OP_BUY, lot,NormalizeDouble(Ask, Digits), 3, NormalizeDouble( Bid- (stoplos*Point),Digits),   NormalizeDouble( Ask+( takeprofit*Point),Digits), NULL, magicnumber, 0, CLR_NONE);           
               int Error=GetLastError(); Print ("strela1<strela2&&BUY==0&&SELL==0   " , Error  ," NormalizeDouble(Ask, Digits) ",NormalizeDouble(Ask, Digits),"   stoplos= NormalizeDouble( Bid- (stoplos*Point),Digits)  ",
                NormalizeDouble ( Bid- (stoplos*Point),Digits),"    takeprofit= NormalizeDouble( Ask+( takeprofit*Point),Digits) ", NormalizeDouble( Ask+( takeprofit*Point),Digits));Sleep(60);
        if (Error==129)continue;    }
        
        
        }
        else if (strela1 > strela2)
        {Sleep(600);
            if (BUY > 0) udalenie (OP_BUY);Sleep(600);
            if (SELL == 0)
            {Sleep(600);Print( "Sleep(600)   " ); 
                OrderSend (Symbol( ), OP_SELL, lot, NormalizeDouble (Bid, Digits), 3, NormalizeDouble( Ask+ (stoplos*Point),Digits),   NormalizeDouble( Ask-( takeprofit*Point),Digits), NULL, magicnumber, 0, CLR_NONE) ; 
               Error=GetLastError(); Print ("strela1>strela2&& OP_SELL  " , Error  ,"  Bid ",Bid,"    stoplos=   NormalizeDouble( Ask- (stoplos*Point),Digits)  ",
                NormalizeDouble (Ask- (stoplos*Point),Digits),"    takeprofit= NormalizeDouble( Bid+( takeprofit*Point),Digits) ", NormalizeDouble(Ask+( takeprofit*Point),Digits));Sleep(60);
                Print( "strela1>strela2&& OP_SELL   " , Error  ," (stoplos*Point) ",(stoplos*Point),"   Point  ", Point,"   Digits  ", Digits);
            if (Error==129)continue;Print( "continue   " );  }
        }
        }
        BreakPoint(); Sleep(600);    
    //----
        return (0);
    }
    //+------------------------------------------------------------------+
    
    void udalenie (int Type = -1)
    {
        int total = OrdersTotal();
        for (i = total - 1; i >= 0; i--)
        {
            if (!OrderSelect (i, SELECT_BY_POS)) continue;
            if (OrderSymbol() != Symbol()) continue;      // Не наш фин. инструм
            if (OrderMagicNumber( ) != magicnumber) continue;
            int type = OrderType();
            if (type > 1) continue;
            if (Type > -1) if (Type != type) continue;
            bool result = false;
            switch (type)
            { 
                case OP_BUY       : result = OrderClose (OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 3, CLR_NONE ); break;
                case OP_SELL      : result = OrderClose (OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 3, CLR_NONE ); break; 
            }
            if (!result)
            {
                int error =  GetLastError(); 
                string errorcomment = "Неудалось закрыть ордер №" + OrderTicket() + " " + Symbol() + " " + OrderType() + " " + error; 
                Print (errorcomment);
            }  
        }       
    }

    Вы не можете благодарить!
    Последний раз редактировалось Hamster; 02.11.2012 в 18:16.

  3. #3
    Banned
    Регистрация
    22.10.2012
    Адрес
    Питер
    Сообщений
    603
    Promo (¢)
    0
    Благодарности
    Получено: 246
    Отправлено: 48
    Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
    Доброго дня! Я третий день не могу понять, с чем же может быть связана ошибка 129. Вот код, в нем, чтоб очень не разбираться, есть строки ордерсенд. Цену нормализовал. Вообще не пойму, в чём дело! Хотя бы теоретически!
    А уточните, когда эта ошибка проявляется? Я же не могу тестировать ваш код )) Пока я вижу, что он компилируется и запускается. Вижу, что не хватает индикатора.
    2012.11.02 17:29:25 Cannot open file 'C:\Forex\School\RoboforexMT4\experts\indicators\ íäèêàòîð.ex4' on the EURUSD.m,M1
    2012.11.02 17:29:25 Cannot open file 'C:\Forex\School\RoboforexMT4\experts\indicators\ íäèêàòîð.ex4' on the EURUSD.m,M1
    2012.11.02 17:29:25 from_forum EURUSD.m,M1: 59 strela1 0 strela2 0
    2012.11.02 17:29:25 Cannot open file 'C:\Forex\School\RoboforexMT4\experts\indicators\ íäèêàòîð.ex4' on the EURUSD.m,M1
    2012.11.02 17:29:25 Cannot open file 'C:\Forex\School\RoboforexMT4\experts\indicators\ íäèêàòîð.ex4' on the EURUSD.m,M1
    2012.11.02 17:29:25 from_forum EURUSD.m,M1: 58 strela1 0 strela2 0

    Вы не можете благодарить!
    Последний раз редактировалось Hamster; 02.11.2012 в 18:17.

  4. #4
    Banned
    Регистрация
    22.10.2012
    Адрес
    Питер
    Сообщений
    603
    Promo (¢)
    0
    Благодарности
    Получено: 246
    Отправлено: 48
    2012.11.02 17:29:25 Cannot open file 'C:\Forex\School\RoboforexMT4\experts\indicators\èíäèêàòîð.ex4' on the EURUSD.m,M1

    И, кстати, я всем говорю - ну не используйте вы русский в именах переменных, функций и файлов, а то потом выскакивают вот такие кракозябры. В оригинале там было слово "индикатор". Это связано с тем, что редактор Metatrader 4 не поддерживает кодировку Юникод, которая используется во всех современных программах. Он работает на старой 8-битной кодировке Win1251 и при переносе вашей программы на сайты или другие компьютеры, на которых эта кодировка не стоит, будут показываться вот такие закорючки.
    Живой пример - вчера переслал человеку из США свой скрипт, там в параметрах были комментарии на русском, естественно, он не смог прочитать, пришлось сделать вариант на английском.

    Вы не можете благодарить!
    Последний раз редактировалось Алексей Волчанский; 02.11.2012 в 17:56.

  5. #5
    Новичок
    Регистрация
    23.08.2012
    Сообщений
    29
    Promo (¢)
    330
    Благодарности
    Получено: 1
    Отправлено: 12
    Спасибо! Щас опишу.

    ---------- Добавлено в 17:40 ---------- Предыдущее сообщение было размещено в 17:39 ----------

    По большей части, вместо того, что бы поставить ордер, советник пишет ошибка 129. Три дня уже код рассматриваю... Вот, собствено.

    ---------- Добавлено в 17:43 ---------- Предыдущее сообщение было размещено в 17:40 ----------

    Первый цицл фор, с переменной A, я использовал, в режиме проверки советника- что бы получать сообщения принтов и видеть его действия.

    Вы не можете благодарить!

  6. #6
    Banned
    Регистрация
    22.10.2012
    Адрес
    Питер
    Сообщений
    603
    Promo (¢)
    0
    Благодарности
    Получено: 246
    Отправлено: 48
    Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
    Спасибо! Щас опишу.

    ---------- Добавлено в 17:40 ---------- Предыдущее сообщение было размещено в 17:39 ----------

    По большей части, вместо того, что бы поставить ордер, советник пишет ошибка 129. Три дня уже код рассматриваю... Вот, собствено.

    ---------- Добавлено в 17:43 ---------- Предыдущее сообщение было размещено в 17:40 ----------

    Первый цицл фор, с переменной A, я использовал, в режиме проверки советника- что бы получать сообщения принтов и видеть его действия.
    1. Что означает код 129, вы выяснили? Знаете, где смотреть?
    Это ошибка с ценой, смотреть коды в файле include\stderror.mqh
    Код:
    #define ERR_INVALID_PRICE  129
    
    Кстати, вот функция, которая выдает сразу текстовое сообщение об ошибке, удобнее ее использовать
    #include <stderror.mqh>
    #include <stdlib.mqh>
    
    // узнает код последней ошибки и возвращает строку с описанием
    // код ошибки возвращается, т.к. передается по ссылке
    string GetMyLastError(int &err)
    {
       err = GetLastError();
       string serr = ErrorDescription(err);
       return(serr);
    }
    // вызывается так
    int err;
    string serr = GetMyLastError(err);
    Print("Ошибка: ", serr, "  код=", err);
    Без индикатора советник же не будет работать?

    И кстати, какой тип счета используется? Если fix, slippage 3 очень маленький

    Вы не можете благодарить!
    Последний раз редактировалось Hamster; 02.11.2012 в 18:25.

  7. #7
    Уже не гость
    Регистрация
    07.11.2012
    Сообщений
    2
    Promo (¢)
    30
    Благодарности
    Получено: 0
    Отправлено: 0
    Здравствуйте, Алексей!
    Компилятор выдает ошибку - никак не могу понять, чего надо
    вот мой простенький код

    double max;
    double arr[] = {2.0, -34.2, 123.77, -4200, 40348.532, -11.438784,
    23228.4038, 256.88};
    int start()
    {
    for (int n=0; n<ArraySize; n++)
    {
    for (int m=0; m<ArraySize; m++)
    if (arr[n]>arr[m])
    max=(arr[n]);
    }
    return(0);
    }

    Вы не можете благодарить!

  8. #8
    Banned
    Регистрация
    22.10.2012
    Адрес
    Питер
    Сообщений
    603
    Promo (¢)
    0
    Благодарности
    Получено: 246
    Отправлено: 48
    А что такое ArraySize? Если вы хотите вызвать функцию с таким именем, надо ей передавать имя массива, функции мысли читать не умеют

    Смотрим в хелп
    int ArraySize( object array[])
    Возвращает количество элементов массива.

    То есть надо написать ArraySize(arr)

    Вы не можете благодарить!

  9. #9
    Уже не гость
    Регистрация
    07.11.2012
    Сообщений
    2
    Promo (¢)
    30
    Благодарности
    Получено: 0
    Отправлено: 0
    ок! спасибо!
    надо внимательно изучать грамматику )))
    иначе с навыками работы в Омеге и Амиброкере далеко не уедешь...
    вопрос, который не укладывается в мою бытовую логику: что такое "сложение с присваиванием"? ну, или умножение, или сдвиг и т.п.
    /про побитовое ИЛИ - даже не спрашиваю/

    Вы не можете благодарить!

  10. #10
    Banned
    Регистрация
    22.10.2012
    Адрес
    Питер
    Сообщений
    603
    Promo (¢)
    0
    Благодарности
    Получено: 246
    Отправлено: 48
    Цитата Сообщение от VSOP Посмотреть сообщение
    вопрос, который не укладывается в мою бытовую логику: что такое "сложение с присваиванием"? ну, или умножение, или сдвиг и т.п.
    /про побитовое ИЛИ - даже не спрашиваю/
    Это просто сокращенная форма записи, когда к переменной что-то прибавляется, вычитается и т.д. К тому же более наглядная, например эти две записи идентичны, но вторая короче и информативнее

    Код:
    int x=3, y=4, z=5;
    // обычная форма
    x = x + y*z;
    
    // сложение с присваиванием, результат тот же
    x += y*z;
    Точно так же записываются и остальные операции: -= *= /=
    <<= сдвиг влево с присв.
    >>= сдвиг вправо с присв.
    |= побитовое ИЛИ с присв.

    Вы не можете благодарить!

Страница 1 из 3 1 2 3 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •