Форум трейдеров » Торговые роботы, советники, индикаторы » Язык MQL4 для "чайников"
+ Подписаться
Страница 10 из 16 ПерваяПервая ... 89101112 ... ПоследняяПоследняя
  1. 776
    Комментарии
    6
    Темы
    781
    Репутация Pro
    Аватар для fidel_fx  
    В начале пути

    3 Медалей
    Цитата Сообщение от Vlad_FX Посмотреть сообщение
    Что-то я не пойму, как перебрать все открытые ордера и узнать, по каким инструментам они открыты?
    for(int x=0;x<=OrdersTotal-1;x++)
    if (OrderSelect(x, SELECT_BY_POS )==true)
    if (OrderType()==OP_BUY || OrderType()==OP_SELL)
    if(OrderSymbol()!=Symbol()) continue;// тут сверяем с текущим инструментом. или просто сохраняем в переменной.
    string Symb = OrderSymbol();
  2. 55
    Комментарии
    6
    Темы
    55
    Репутация Pro
     
    В начале пути

    3 Медалей
    Точно, через OrderSelect и OrderSymbol(). Спасибо!
    Вот же в Справочнике такое есть, но я как-то мимо просмотрел...

    Код:
    string OrderSymbol( ) 
    
    Возвращает наименование финансового инструмента для текущего выбранного ордера.
    Ордер должен быть предварительно выбран с помощью функции OrderSelect(). 
    
    Пример:
    
      if(OrderSelect(12, SELECT_BY_POS)==true)
        Print("symbol of order #", OrderTicket(), " is ", OrderSymbol());
      else
        Print("OrderSelect() вернул ошибку - ",GetLastError());
  3. 1,666
    Комментарии
    13
    Темы
    1681
    Репутация Pro
    Аватар для Chrome DNA  
    Мастер форумных наук

    5 Медалей
    Цитата Сообщение от Dark67 Посмотреть сообщение
    Вот так работает


    int start()
    {
    // GBPUSD ----------------------------------------------------------

    double bid = MarketInfo("GBPUSD",MODE_BID);
    double ask = MarketInfo("GBPUSD",MODE_ASK);
    int Ticket;
    double SL_long = bid-25*0.0001;
    double TP_long = bid+50*0.0001;

    Ticket = OrderSend("GBPUSD", OP_BUY, 0.1, Ask, 5, 0, 0);
    OrderModify(Ticket, 0, SL_long, TP_long,0);

    // USDCAD ----------------------------------------------------------

    bid = MarketInfo("USDCAD",MODE_BID);
    ask = MarketInfo("USDCAD",MODE_ASK);
    SL_long = bid-25*0.0001;
    TP_long = bid+50*0.0001;

    Ticket = OrderSend("USDCAD", OP_BUY, 0.1, Ask, 5, 0, 0);
    OrderModify(Ticket, 0, SL_long, TP_long,0);

    // USDJPY ----------------------------------------------------------

    int win_handle=WindowHandle("USDJPY",0);
    bid = MarketInfo("USDJPY",MODE_BID);
    ask = MarketInfo("USDJPY",MODE_ASK);
    SL_long = bid-25*0.01;
    TP_long = bid+50*0.01;

    Ticket = OrderSend("USDJPY", OP_BUY, 0.1, Ask, 5, 0, 0);
    OrderModify(Ticket, 0, SL_long, TP_long,0);

    Alert(GetLastError());

    return(0);
    }
    //+------------------------------------------------------------------+


    Такой скрипт можно накладывать на любой график даже на фуй. Всё равно работает.
    Наложил. Не работает чего-то. Выставляет ордер только на тот инструмент, на который наложен эксперт. По остальным вот такая в журнале запись: "... unknown symbol name GBPUSD for OrderSend function".

    Где после symbol name идёт имя того символа, к которому как раз не привязан этот символ. Если наложу на график фунтодоллара , то всё выставляется. Код скопировал один к одному. Кто поможет с проблемкой, вышлю 15$ на WMZ. Я серьёзно. ;)
  4. 55
    Комментарии
    6
    Темы
    55
    Репутация Pro
     
    В начале пути

    3 Медалей
    Вот так попробуйте. 15$ отошлете Dark67. :)

    Цитата Сообщение от Dark67 Посмотреть сообщение
    Проверяйте. У меня опять работает.

    int start()
    {
    // GBPUSD ----------------------------------------------------------

    double bid = MarketInfo("GBPUSD",MODE_BID);
    int Ticket;
    double SL_long = bid-25*0.0001;
    double TP_long = bid+50*0.0001;

    Ticket = OrderSend("GBPUSD", OP_BUY, 0.1, 0, 5, 0, 0);
    OrderModify(Ticket, 0, SL_long, TP_long,0);

    // USDCAD ----------------------------------------------------------

    bid = MarketInfo("USDCAD",MODE_BID);
    SL_long = bid-25*0.0001;
    TP_long = bid+50*0.0001;

    Ticket = OrderSend("USDCAD", OP_BUY, 0.1, 0, 5, 0, 0);
    OrderModify(Ticket, 0, SL_long, TP_long,0);

    // USDJPY ----------------------------------------------------------

    bid = MarketInfo("USDJPY",MODE_BID);
    SL_long = bid-25*0.01;
    TP_long = bid+50*0.01;

    Ticket = OrderSend("USDJPY", OP_BUY, 0.1, 0, 5, 0, 0);
    OrderModify(Ticket, 0, SL_long, TP_long,0);

    Alert(GetLastError());

    return(0);
    }
    //+------------------------------------------------------------------+
  5. 1,666
    Комментарии
    13
    Темы
    1681
    Репутация Pro
    Аватар для Chrome DNA  
    Мастер форумных наук

    5 Медалей
    Блин, спасиб, конечно, но по дури не ту цитату скопировал. Я и с нулём вместо Ask-а тоже пробовал, я ж всю ветку тут прочитал, не просто ж с первого поста начал шарашить. Короче, ни с 0, ни с бидом, ни с аском. Проходит через MarketInfo, но только по инструменту, который привязан графику. Печально всё это...
    ...
    Убрал даже все OrderModify и выставление 2-го и 3-го ордера, но до них даже не доходит... :(
    ...
    Скиньте кто-нить сюда файл полностью работающего какого-нибудь пробного советника с использованием 2-х пар, я ничего не трогая его откомпилю. А вдруг и он не пройдёт? Блин, пойду тогда искать стену намазную ЙАДОМ! :)
    ...
    Вот кусок моего текста:
     
  6. 55
    Комментарии
    6
    Темы
    55
    Репутация Pro
     
    В начале пути

    3 Медалей
    Погоди, тебе скрипт нужен или советник? Выше я привел код скрипта. Сейчас попробую насчет советника разобраться.
  7. 1,666
    Комментарии
    13
    Темы
    1681
    Репутация Pro
    Аватар для Chrome DNA  
    Мастер форумных наук

    5 Медалей
    Цитата Сообщение от Vlad_FX Посмотреть сообщение
    Погоди, тебе скрипт нужен или советник? Выше я привел код скрипта. Сейчас попробую насчет советника разобраться.
    :eek: Так я и понял, что где-то я в высших материях ошибся, а не в низших...
    Жду-с...
  8. 55
    Комментарии
    6
    Темы
    55
    Репутация Pro
     
    В начале пути

    3 Медалей
    Это советник. Открывает длинную позицию по инструменту, на график которого он наложен. Позиция открывается 1 раз в сутки в заданном интервале времени.

    Код:
    //+------------------------------------------------------------------+
    //|                                                      +Lock_1.mq4 |
    //|                                                          Vlad_FX |
    //|                                        http://www.giga-money.com |
    //+------------------------------------------------------------------+
    
      int Ticket;
      double bid;
      double ask;
      double point;
      
      extern double SL_lng=20;  //extern - чтобы можно было оптимизировать
      extern double TP_lng=20;
    
      extern int THour=20;       //Время открытия позиций только в заданное время:
      extern int TMin=0;        //с 20:00 до 20:59 (по времени терминала)
      
      double SL_long;
      double TP_long;
      
    //+------------------------------------------------------------------+
    //| expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
      {
       return(0);
      }
    
    //+------------------------------------------------------------------+
    //| expert start function                                            |
    //+------------------------------------------------------------------+
    int start()
      {
      
      if (Hour()==THour && Minute()>=TMin)       //Позиции открываются только 
      {                                          //в заданное время (например, с 20:00 до 20:59
                                                 //если THour=20, и TMin=00)
                                                 
    //Проверить все открытые позиции, чтобы снова их не открывать 
    //(открывается только одна позиция в сутки)
    
      for(int x=0;x<=OrdersTotal()-1;x++)        //Ищем среди открытых и отложенных ордеров
      {
       if(OrderSelect(x, SELECT_BY_POS,MODE_TRADES)==true)
       {
        if(OrderSymbol()==Symbol()) return;      //Позиция по данному инструменту открыта - выход
       }
      }
      for(x=0;x<=OrdersHistoryTotal()-1;x++)     //Ищем среди закрытых и удаленных ордеров
      {
       if(OrderSelect(x, SELECT_BY_POS,MODE_HISTORY)==true)
        {
         if(OrderSymbol()==Symbol())             //Нашли нужный символ
         {
          datetime ctm1=OrderOpenTime()/3600/24;    //Дата открытия ордера (кол-во дней с 1970)
          datetime ctm2=TimeCurrent()/3600/24;      //Текущая дата
          if (ctm1==ctm2) return;                   //Сегодня позиция уже было открыта - выход
         }
        }
      }
      
    // Открыть позицию по текущему инструменту  -------------
    
      bid = MarketInfo(Symbol(),MODE_BID);
      point = MarketInfo(Symbol(),MODE_POINT);
      SL_long = bid - SL_lng*point;
      TP_long = bid + TP_lng*point;
    
      
    //--------------------------------------------------------
    // Открыть длинную позицию
    //--------------------------------------------------------
      Ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 5, 0, 0,"Long",1,0,Blue);
      Error(GetLastError());         //Проверка ошибок
      OrderModify(Ticket, 0, SL_long, TP_long,0,Blue);
      Error(GetLastError());         //Проверка ошибок
    
    //--------------------------------------------------------
      }
    //+------------------------------------------------------------------+
       
       return(0);
      }
      
    //+------------------------------------------------------------------+
    //| expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
      {
       return(0);
      }
    //+------------------------------------------------------------------+
    
    
    // Обработка ошибок ------------------------  
      void Error(int GLE)
      {
       if (GLE == 0) return;
       else
        {
        Alert(Symbol()," Ошибка: ",GLE);
        }
      }
      return;
    // -----------------------------------------
  9. 1,666
    Комментарии
    13
    Темы
    1681
    Репутация Pro
    Аватар для Chrome DNA  
    Мастер форумных наук

    5 Медалей
    Это понятно. А вот как бы теперь так дописать код, чтобы наложенный на график этот советник открывал (к примеру) при открытии текущего инструмента ещё и AUD/CAD в ту же сторону? Советник, наложенный на текущий график у меня тоже работает, а вот 2-ю пару (чужую, не принадлежащую графику) не хочет, - пишет "нет такого инструмента".
  10. 96
    Комментарии
    1
    Темы
    96
    Репутация Pro
     
    В начале пути

    2 Медалей
    пожалуйста. это то, что надо? выставляет все ордера без ошибок

    Код:
    //+------------------------------------------------------------------+
    //|                                                 ForChromeDNA.mq4 |
    //|                                          Copyright © 2008, Silem |
    //|                                                     silem@k66.ru |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2008, Silem"
    #property link      "silem@k66.ru"
    
    //---- input parameters
    extern int       ID=500;
    extern int       SL=25;
    extern int       TP=50;
    
    #define NumOfVal  4
    
    string SymbolsArray[NumOfVal]      ={"","GBPUSD","USDCAD","USDJPY"};
    
    //+------------------------------------------------------------------+
    //| expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
      {
    //----
       
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //----
       
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| expert start function                                            |
    //+------------------------------------------------------------------+
    int start()
     {
      int SymbolCounter;
      if (!IsTradeAllowed()) return;
      for (SymbolCounter=1;SymbolCounter<=NumOfVal;SymbolCounter++)
       {
        string valP=GetSymbolString(SymbolCounter);
        if (!isMgNum(valP,ID)) orderSend(valP,1,0.1,SL,TP,ID,1);
       }
      return(0);
     }
    //+------------------------------------------------------------------+
    
    int orderSend(string val, int napr, double lot, double sl, double tp, int mn,int abs=0)
     {
      RefreshRates();
      double _bid=MarketInfo(val,MODE_BID);
      double _digits=MarketInfo(val,MODE_DIGITS);
      double _point=MarketInfo(val,MODE_POINT);
      double _ts=MarketInfo(val,MODE_TICKSIZE);
      double _spr=MarketInfo(val,MODE_SPREAD)*_ts;
      double SL=0;
      double TP=0;
      string com=iifStr(napr>0,"BUY market order. ID ","SELL market order. ID ");
      color c=iifC(napr>0,Blue,Red);
      int ordertype=iif(napr>0,OP_BUY,OP_SELL);
      double entPrice=NormalizeDouble(_bid,_digits);
      if (sl>0)
       {
        SL=iif(abs>0,NormalizeDouble(entPrice-(sl*_ts)*napr,_digits),sl);
       }
      if (tp>0)
       {
        TP=iif(abs>0,NormalizeDouble(entPrice+(tp*_ts)*napr,_digits),tp);
       }
      string comm=StringConcatenate(com,mn);
      Print("Try to open market order. Current Bid ",_bid," Type OP_BUY, price ",entPrice," lot ",lot," stop ",SL," profit ",TP);
      int ticket=OrderSend(val,ordertype,lot,entPrice,5,0,0,comm,mn,0,c);
      if (ticket<=0)
       {
        Print("Order is not Opened ",mn);
        Print("Error - ",GetLastError());
        Print("entry - ",entPrice," stop - ",SL," Take - ",TP);
        return(-1);
       } else
       {
        Print("Order is Opened ",mn);
        ticket=OrderModify(ticket,OrderOpenPrice(),SL,TP,0,c);    
        return(1);
       }
     }
    
    double iif (bool condition, double ifTrue, double ifFalse)
     {
      if (condition) return( ifTrue );
      return (ifFalse);
     }
    string iifStr (bool condition, string ifTrue, string ifFalse)
     {
      if (condition) return (ifTrue);
      return (ifFalse);
     }
    color iifC (bool condition, color ifTrue, color ifFalse)
     {
      if (condition) return( ifTrue );
      return (ifFalse);
     }
    
    string GetSymbolString (int Number)
     {
      string res="";
      res=SymbolsArray[Number];   
      return(res);
     }
    
    bool isMgNum(string val, int num, int mode=-1)
     {       
      int t, cnt1;
      t=OrdersTotal();
      for(cnt1=0;cnt1<t;cnt1++)
       {
        OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
        if (OrderSymbol() != val) continue;
        if (OrderMagicNumber()!=num) continue;
        if (mode != -1 && OrderType() != mode) continue;
        return (True);
       }  
      return (False);
     }

Вверх
РегистрацияX

чтобы писать, читать, комментировать