Вопросы, практика программирования на MQL5
Страница 1 из 46 1 2 3 4 5 11 ... ПоследняяПоследняя
Показано с 1 по 10 из 451

Тема: Вопросы, практика программирования на MQL5

  1. #1
    Денис Кириченко
    Guest

    Question Вопросы, практика программирования на MQL5

    В этой теме будут обсуждаться вопросы, непосредственно связанные с практикой программирования на MQL5.
    Большая просьба по возможности формулировать вопросы чётко.
    Желательно прикладывать к своему сообщению код, относительно которого есть вопросы.
    И просьба понимать,что:

    1) Ветка создана для обсуждения MQL5, а не MQL4 или чего-то ещё;

    2) Просьбы запрограммировать торговую идею будут игнорироваться и пресекаться;

    3) Приветствуется подход "мучался, пробовал, но не вышло".

    Вы не можете благодарить!
    Последний раз редактировалось Денис Кириченко; 24.05.2013 в 22:25.

  2. #2
    Уже не гость
    Регистрация
    08.01.2012
    Сообщений
    2
    Promo (¢)
    5
    Благодарности
    Получено: 0
    Отправлено: 0
    И объясните пожалуйста, что за ошибка: class type expected.
    Я просто пытался описать функцию void Write(LBL, side, pos_x, pos_y, text, fontsize, fontname, Tcolor=CLR_NONE, angle=0)

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

  3. #3
    Новичок
    Регистрация
    26.12.2011
    Адрес
    Россия
    Сообщений
    20
    Promo (¢)
    105
    Благодарности
    Получено: 3
    Отправлено: 0
    Как в МТ5 правильно обработать ошибки при выставлении ордера? Можно показать пример? Например обработать реквоту?

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

  4. #4
    Денис Кириченко
    Guest
    Цитата Сообщение от A_S Посмотреть сообщение
    И объясните пожалуйста, что за ошибка: class type expected.
    Я просто пытался описать функцию void Write(LBL, side, pos_x, pos_y, text, fontsize, fontname, Tcolor=CLR_NONE, angle=0)
    Вероятно, что вы не указали тип какого-то параметра функции. Можете привести код, определяющий функцию?

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

  5. #5
    Денис Кириченко
    Guest
    Цитата Сообщение от Dragon Посмотреть сообщение
    Как в МТ5 правильно обработать ошибки при выставлении ордера? Можно показать пример? Например обработать реквоту?
    Как утверждает разработчик MT5:
    Все приказы на совершение торговых операций отправляются в виде структуры торгового запроса MqlTradeRequest с помощью функции OrderSend(). Результат выполнения этой функции помещается в структуру MqlTradeResult, поле retcode которой содержит код возврата торгового сервера.
    Т.е. какая стоит задача? Получить код возврата, в случае неудачи торгового приказа попробовать его обработать. Так, Вы отправили торговый запрос. Его обработал сервер и вернул вам код. Допустим, что получили реквоту. Значит, что код равен 10004 с идентификатором TRADE_RETCODE_REQUOTE. Программно выглядит примерно так:
    Код:
    MqlTradeRequest request; // структура запроса
    MqlTradeResult   result; // структура ответа
    Заполняете тут поля структуры, а потом отправляете.
    Код:
    OrderSend(request,result);
    Потом смотрите. Например такое есть:
    Код:
    result.retcode=10004; // реквота
    Как её обрабатывать, это уже вопрос второй... Можно сделать паузу и попробовать снова отправить торговый запрос. Если сервер постоянно возвращает реквоты, то можно зациклить торговый приказ. Т.е. пробовать n-ное число раз отправить приказ...

    Вы не можете благодарить!
    Последний раз редактировалось Денис Кириченко; 13.01.2012 в 14:02.

  6. #6
    Теоретик Аватар для PAZITIV
    Регистрация
    20.12.2011
    Адрес
    47°57′16.04″ с. ш. 33°25′22.28″ в. д
    Сообщений
    1,472
    Promo (¢)
    -10
    Благодарности
    Получено: 52
    Отправлено: 77
    Набросал советник на основе кода индикатора, но есть несколько вопросов:
    1) Почему советник не рисуюет стрелки покупки/продажи на графике как индикатор
    2) Почему не открываются ордера (ну я так думаю, что неправильно отлавливаю эти самые сигналы покупки/продажи по которым рисуются стрелки)
    3) Почему не выдаётся Alert на покупку/продажу

    Оригинальный код индикатора

    Код:
    //+------------------------------------------------------------------+
    //|                                                 QQE Alert v3.mq4 |
    //|                                                    Skyline, 2007 |
    //|                                             www.forexpertutti.it |
    //+------------------------------------------------------------------+
    #property copyright "Skyline, 2007"
    #property link      "www.forexpertutti.it"
    
    #property indicator_chart_window
    
    #property indicator_buffers 2
    #property indicator_color1 DodgerBlue
    #property indicator_color2 Magenta
    
    extern string Comment1             = "QQEA Alert v3 compiled by Skyline on 31 Oct 2007";
    extern string Comment2             = "email : glicci@yahoo.it"; 
    //extern bool   ShowCrossQQE_RSISlow = true;
    extern int    QQE_SF               = 1;
    extern int    QQE_RSI_Period       = 14;
    extern double QQE_DARFACTOR        = 4.236; 
    extern int    QQE_Width            = 1;
    extern double QQE_Position         = 0.5;
    extern bool   EnableSoundAlert     = true;
    extern bool   EnableVisualAlert    = false;
    extern bool   EnableEmailAlert     = true;
    
    double CrossUp[];
    double CrossDown[];
    
    static datetime alertTag = D'1980.01.01'; 
    static datetime soundTag = D'1980.01.01';
    static datetime emailTag = D'1980.01.01';
    
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
      {
    //---- indicators
        SetIndexStyle(0, DRAW_ARROW, EMPTY,QQE_Width);
        SetIndexArrow(0, 241);
        SetIndexBuffer(0, CrossUp);
        SetIndexStyle(1, DRAW_ARROW, EMPTY,QQE_Width);
        SetIndexArrow(1, 242);
        SetIndexBuffer(1, CrossDown);   
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //---- 
    
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Custom indicator iteration function                              |
    //+------------------------------------------------------------------+
    int start() 
    {
       int limit, i, counter;
       //double fasterEMAnow, slowerEMAnow, fasterEMAprevious, slowerEMAprevious, fasterEMAafter, slowerEMAafter;
       double fasterRSInow,slowerRSInow,fasterRSIprevious,slowerRSIprevious,fasterRSIafter,slowerRSIafter;
       double Range, AvgRange;
       
       int counted_bars=IndicatorCounted();
    //---- check for possible errors
    
       if(counted_bars<0) return(-1);
       
    //---- last counted bar will be recounted
       if(counted_bars>0) counted_bars--;
    
       limit=Bars-counted_bars;
       
       for(i = 0; i <= limit; i++) 
       {
       
          counter=i;
          Range=0;
          AvgRange=0;
          for (counter=i ;counter<=i+9;counter++)
          {
             AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
          }
          Range=AvgRange/10;
          
          fasterRSInow      = iCustom(NULL,0,"QQEA",QQE_SF,QQE_RSI_Period,QQE_DARFACTOR,0,i);
          fasterRSIprevious = iCustom(NULL,0,"QQEA",QQE_SF,QQE_RSI_Period,QQE_DARFACTOR,0,i+1); 
          fasterRSIafter    = iCustom(NULL,0,"QQEA",QQE_SF,QQE_RSI_Period,QQE_DARFACTOR,0,i-1); 
    
          slowerRSInow      = iCustom(NULL,0,"QQEA",QQE_SF,QQE_RSI_Period,QQE_DARFACTOR,1,i);
          slowerRSIprevious = iCustom(NULL,0,"QQEA",QQE_SF,QQE_RSI_Period,QQE_DARFACTOR,1,i+1); 
          slowerRSIafter    = iCustom(NULL,0,"QQEA",QQE_SF,QQE_RSI_Period,QQE_DARFACTOR,1,i-1); 
    
    
          if ((fasterRSInow > slowerRSInow) && (fasterRSIprevious < slowerRSIprevious) && (fasterRSIafter > slowerRSIafter)) 
          {
             CrossUp[i] = Low[i] - Range*QQE_Position;
          }
          else 
          if ((fasterRSInow < slowerRSInow) && (fasterRSIprevious > slowerRSIprevious) && (fasterRSIafter < slowerRSIafter)) 
          {
              CrossDown[i] = High[i] + Range*QQE_Position;
          }
          
            // Gestione Alert visivo //
            if (EnableVisualAlert==true && i==1 && CrossUp[i] > CrossDown[i] && alertTag!=Time[0])
            {
             Alert("QQE Cross Trend going DOWN on ",Symbol()," ",Periodo(Period()));
             alertTag = Time[0];
            }
            if (EnableVisualAlert==true && i==1 && CrossUp[i] < CrossDown[i] && alertTag!=Time[0])
            {
             Alert("QQE Cross Trend going UP on ",Symbol()," ",Periodo(Period()));
             alertTag = Time[0];
            }   
              
            // Gestione Alert sonoro //      
            if (EnableSoundAlert==true && i==1 && CrossUp[i] > CrossDown[i] && soundTag!=Time[0])
            {
             PlaySound ("short.wav");
             soundTag = Time[0];
            }
            if (EnableSoundAlert==true && i==1 && CrossUp[i] < CrossDown[i] && soundTag!=Time[0])
            {
             PlaySound ("long.wav");
             soundTag = Time[0];
            } 
            
            // Gestione Alert con email //      
            if (EnableEmailAlert==true && i==1 && CrossUp[i] > CrossDown[i] && emailTag!=Time[0])
            {
             SendMail("Supernova alert signal!","QQE Cross Trend going DONWN on " + (StringConcatenate(Symbol()," ",Periodo(Period()))));
             emailTag = Time[0];
            }
            if (EnableEmailAlert==true && i==1 && CrossUp[i] < CrossDown[i] && emailTag!=Time[0])
            {
             SendMail("Supernova alert signal!","QQE Cross Trend going UP on " + (StringConcatenate(Symbol()," ",Periodo(Period()))));
             emailTag = Time[0];
            } 
      }
       return(0);
    }
    
    string Periodo(int TF)
    {
     if (TF==1)    { return("M1"); }
     if (TF==5)    { return("M5"); }
     if (TF==15)   { return("M15"); }
     if (TF==30)   { return("M30"); } 
     if (TF==60)   { return("H1"); } 
     if (TF==240)  { return("H4"); } 
     if (TF==1440) { return("D1"); }  
    }
    [свернуть]

    Код моего советника по индикатору

    //+------------------------------------------------------------------+
    //| SimpleProfit.mq4 |
    //| Copyright © 2012, PAZITIV |
    //| pazitiv.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2012, PAZITIV"
    #property link "pazitiv.net"


    //--- input parameters
    //настройки советника
    extern string info1 = "Настройки советника" ;
    extern double LotSize=0.1;
    extern int Avarages=3;
    extern int TakeProfit=10;
    extern int StopLoss=10;
    extern bool Buy=false; //для открытия ордера на покупку
    extern bool Sell=false; //для открытия ордера на продажу

    // настройка индикатора
    extern string info2 = "Настройки индикатора" ;
    extern int QQE_SF = 1;
    extern int QQE_RSI_Period = 14;
    extern double QQE_DARFACTOR = 4.236;
    extern int QQE_Width = 1;
    extern double QQE_Position = 0.5;
    extern bool EnableVisualAlert = true;

    double CrossUp[];
    double CrossDown[];

    static datetime alertTag = D'1980.01.01';

    //+------------------------------------------------------------------+
    //| expert initialization function |
    //+------------------------------------------------------------------+
    int init()
    {
    //----

    //----
    return(0);
    }
    //+------------------------------------------------------------------+
    //| expert deinitialization function |
    //+------------------------------------------------------------------+
    int deinit()
    {
    //----

    //----
    return(0);
    }
    //+------------------------------------------------------------------+
    //| expert start function |
    //+------------------------------------------------------------------+
    int start()
    {
    int limit, i, counter;
    //double fasterEMAnow, slowerEMAnow, fasterEMAprevious, slowerEMAprevious, fasterEMAafter, slowerEMAafter;
    double fasterRSInow,slowerRSInow,fasterRSIprevious,slowerRSIprevious,fasterRSIafter,slowerRSIafter;
    double Range, AvgRange;

    int counted_bars=IndicatorCounted();
    if(counted_bars<0) return(-1);

    if(counted_bars>0) counted_bars--;

    limit=Bars-counted_bars;

    for(i = 0; i <= limit; i++)
    {

    counter=i;
    Range=0;
    AvgRange=0;
    for (counter=i ;counter<=i+9;counter++)
    {
    AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
    }
    Range=AvgRange/10;

    fasterRSInow = iCustom(NULL,0,"QQEA",QQE_SF,QQE_RSI_Period,QQE_DARFACTOR,0,i);
    fasterRSIprevious = iCustom(NULL,0,"QQEA",QQE_SF,QQE_RSI_Period,QQE_DARFACTOR,0,i+1);
    fasterRSIafter = iCustom(NULL,0,"QQEA",QQE_SF,QQE_RSI_Period,QQE_DARFACTOR,0,i-1);

    slowerRSInow = iCustom(NULL,0,"QQEA",QQE_SF,QQE_RSI_Period,QQE_DARFACTOR,1,i);
    slowerRSIprevious = iCustom(NULL,0,"QQEA",QQE_SF,QQE_RSI_Period,QQE_DARFACTOR,1,i+1);
    slowerRSIafter = iCustom(NULL,0,"QQEA",QQE_SF,QQE_RSI_Period,QQE_DARFACTOR,1,i-1);


    if ((fasterRSInow > slowerRSInow) && (fasterRSIprevious < slowerRSIprevious) && (fasterRSIafter > slowerRSIafter))
    {
    CrossUp[i] = Low[i] - Range*QQE_Position;
    }
    else
    if ((fasterRSInow < slowerRSInow) && (fasterRSIprevious > slowerRSIprevious) && (fasterRSIafter < slowerRSIafter))
    {
    CrossDown[i] = High[i] + Range*QQE_Position;
    }
    }

    //визуальное оповещение о смене тренда
    if (EnableVisualAlert==true && i==1 && CrossUp[i] > CrossDown[i] && alertTag!=Time[0])
    {
    Alert("QQE Cross Trend going DOWN on ",Symbol()," ",Periodo(Period()));
    alertTag = Time[0];
    }
    if (EnableVisualAlert==true && i==1 && CrossUp[i] < CrossDown[i] && alertTag!=Time[0])
    {
    Alert("QQE Cross Trend going UP on ",Symbol()," ",Periodo(Period()));
    alertTag = Time[0];
    }



    //----

    if(!IsTradeAllowed()) return(0);

    double BuyTP=0; //тейкпрофит для покупки
    double SellTP=0; //тейкпрофит для продажи
    double BuySL=0; //стоплосс для покупки
    double SellSL=0; //стоплосс для продажи

    if(TakeProfit>0)
    {BuyTP=Ask+TakeProfit*Point;
    SellTP=Bid-TakeProfit*Point;}

    /* if(StopLoss>0)
    {BuySL=Ask-StopLoss*Point;
    SellSL=Bid+StopLoss*Point;}
    */

    //открытие ордера Buy
    while(!IsTradeAllowed()) Sleep(100);
    if (EnableVisualAlert==true && i==1 && CrossUp[i] < CrossDown[i] && alertTag!=Time[0])
    OrderSend(Symbol(),OP_BUY,LotSize,Ask,Avarages,BuySL,BuyTP," ",0,0,CLR_NONE);

    //открытие ордера Sell
    while(!IsTradeAllowed()) Sleep(100);
    if (EnableVisualAlert==true && i==1 && CrossUp[i] > CrossDown[i] && alertTag!=Time[0])
    OrderSend(Symbol(),OP_SELL,LotSize,Bid,Avarages,SellSL,SellTP," ",0,0,CLR_NONE);

    //----
    return(0);
    }
    //+------------------------------------------------------------------+
    string Periodo(int TF)
    {
    if (TF==1) { return("M1"); }
    if (TF==5) { return("M5"); }
    if (TF==15) { return("M15"); }
    if (TF==30) { return("M30"); }
    if (TF==60) { return("H1"); }
    if (TF==240) { return("H4"); }
    if (TF==1440) { return("D1"); }
    }
    [свернуть]

    Файлы советника и индикатора
    аттач.rar

    UPD
    Вопрос про ордера пока снимается. Забыл, что суббота

    Вы не можете благодарить!
    Последний раз редактировалось PAZITIV; 21.01.2012 в 22:19.

  7. #7
    Теоретик Аватар для PAZITIV
    Регистрация
    20.12.2011
    Адрес
    47°57′16.04″ с. ш. 33°25′22.28″ в. д
    Сообщений
    1,472
    Promo (¢)
    -10
    Благодарности
    Получено: 52
    Отправлено: 77
    Погуглил и нашёл ф-цию iCustom() . Денис, как вы считаете, через неё будет легче получать данные из индикатора?

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

  8. #8
    Новичок Аватар для aleksunderz
    Регистрация
    10.01.2012
    Адрес
    Дергачи
    Сообщений
    197
    Promo (¢)
    120
    Благодарности
    Получено: 7
    Отправлено: 1
    Ну ни фига себе какие крутые штучки с кодом!
    На копочку нажал и выехало.
    Такого ни одном форуме наверное нету!
    Крутячая шутка!

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

  9. #9
    Теоретик Аватар для PAZITIV
    Регистрация
    20.12.2011
    Адрес
    47°57′16.04″ с. ш. 33°25′22.28″ в. д
    Сообщений
    1,472
    Promo (¢)
    -10
    Благодарности
    Получено: 52
    Отправлено: 77
    Цитата Сообщение от aleksunderz Посмотреть сообщение
    Ну ни фига себе какие крутые штучки с кодом!
    На копочку нажал и выехало.
    Такого ни одном форуме наверное нету!
    Крутячая шутка!
    Да это просто спойлер))) на каждом форуме есть. Просто в vBulletin 4.x добавили анимацию)))

    ---------- Добавлено в 15:55 ---------- Предыдущее сообщение было размещено в 14:59 ----------

    UPD2
    По ходу со стрелками разобрался. Не внёс в код советника конструкцию
    Код:
    SetIndexStyle(0, DRAW_ARROW, EMPTY,QQE_Width);
        SetIndexArrow(0, 241);
        SetIndexBuffer(0, CrossUp);
        SetIndexStyle(1, DRAW_ARROW, EMPTY,QQE_Width);
        SetIndexArrow(1, 242);
        SetIndexBuffer(1, CrossDown);
    из индикатора. Но вот как её теперь вызывать что бы стелки рисовались?!

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

  10. #10
    Теоретик Аватар для PAZITIV
    Регистрация
    20.12.2011
    Адрес
    47°57′16.04″ с. ш. 33°25′22.28″ в. д
    Сообщений
    1,472
    Promo (¢)
    -10
    Благодарности
    Получено: 52
    Отправлено: 77
    Ещё мне тестер стратегий выдал сообщение о том, что SetIndexBuffrer можно вызвать только из индикатора. Значит остаётся только ф-ция iCustom. Буду с ней разбираться, так что вопрос о неработоспособности советника пока снимается

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

Страница 1 из 46 1 2 3 4 5 11 ... ПоследняяПоследняя

Метки этой темы

Ваши права

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