Вопросы по MQL5

  • Автор темы Автор темы chocolate
  • Дата начала Дата начала

matro3

Почетный гражданин
Похоже что mql5 не пользуется популярностью?
По крайней мере на этом форуме....

Все же спрошу.
В mql5 OrdersTotal() возвращает кол-во отложенных ордеров?
Как получить кол-во действующих, если это возможно?
 

AlexeyVik

Программист mql4 mql5
Похоже что mql5 не пользуется популярностью?
По крайней мере на этом форуме....

Все же спрошу.
В mql5 OrdersTotal() возвращает кол-во отложенных ордеров?
Как получить кол-во действующих, если это возможно?
OrdersTotal() возвращает количество рыночных и отложенных ордеров, как в mql5 так и в mql4 одинаково.
Получить количество рыночных ордеров можно только написав собственную функцию.
 

matro3

Почетный гражданин
Код:
int CountOpenOrders()
{
   int i, k=OrdersTotal(), kp=0;
   for (i=0; i<k; i++)
      if(OrderGetTicket(i)>0)
         if(orderInfo.Type() == ORDER_TYPE_BUY || orderInfo.Type() == ORDER_TYPE_SELL)
            if(orderInfo.Magic() == magicNumber) kp++;
   return(kp);
}
}

В тестере видно что ордер висит. Однако OrdersTotal() возвращает 0
 

vadynik

Активный участник
Ордер или позиция? в 5ке это разные вещи
PositionsTotal()
OrdersTotal()
 

matro3

Почетный гражданин
Пользую это:
_http://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade

Код:
bool pos_open = positionInfo.Select(_Symbol);
int pos_type=(ENUM_POSITION_TYPE)positionInfo.PositionType();
lot = symbolInfo.NormalizePrice(GetSizeLot());
   
ResetLastError();
   
if(nResult == ENTER_BUY) // сигнал на покупку
{
   if(!pos_open) // Позиции нет
   {
      comment = "Открыта позиция BUY";
         if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,lot,Ask,StopLoss,TakeProfit,comment))
            Print("Ошибка при открытии позиции BUY: ",GetLastError()," - ", ErrorDescription(GetLastError()));
      }

На самом деле positionInfo.Select(_Symbol) на следующем тике говорит false.
Хотя, если вывести в лог это же сразу после PositionOpen, то будет true.

Что-то не так, не пойму где ошибся.
 
Последнее редактирование модератором:

matro3

Почетный гражданин
Взял код из статьи, может кому пригодится:
Код:
int    total       =0;  // Всего сделок в списке выбранной истории
   int    count       =0;  // Счетчик сделок по символу позиции
   string deal_symbol =""; // символ сделки
//--- Если история позиции получена
   bool pos_open = positionInfo.Select(_Symbol);
   if(HistorySelect(positionInfo.Time(),TimeCurrent()))
     {
      //--- Получим количество сделок в полученном списке
      total=HistoryDealsTotal();
      //--- Пройдем по всем сделкам в полученном списке
      for(int i=0; i<total; i++)
        {
            //--- Получим символ сделки
            deal_symbol=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_SYMBOL);
            //--- Если символ сделки и текущий символ совпадают, увеличим счетчик
            if(deal_symbol==_Symbol)
               count++;
        }
     return(count);
     }
 

Milord

Местный знаток
скачал МТ5 билд1010, не могу запустить тестер на проверку советника...нажимаю кнопку старт, и ничего не происходит вапще...что за хрень с тестером, ктонить подскажет???
 

Milord

Местный знаток
Что за ошибки в журнале?

ошибок вроде нету,все запустилось!*hi*

правда скорость черепаховая по сравнению с тестером МТ4, кошмар, а обещали что скорость вырастет....
кошмар комп завис напрочь, когда посмотрел в диспетчер запущенных программ, там было аж 5ть запущенных тестеров...вот дурдом...
 
Последнее редактирование:

bondv

Программист
Плюс ко всему в новом билде почему-то "облачное" тестирование сделали доступным только для 64-х битных систем. Что за несправедливость!?
 

paylesss

Интересующийся
здравствуйте! есть специалисты? подскажите плз.


Написал советника в mql4 самого простейшего, так потренироваться ну и появилась необходимость перевести в mql5. Перевел, но возникла проблема переменные «input» которые я задаю в самом начале почему-то не "задаются". Например, переменная lot=1 в тестере выскакивает ошибка, что объем ордера равен 0 и не может быть открыт. Если в функции открытия ордера жестко вбить 1 лот, тогда все ОК ордер срабатывает открываю ордер с помощью CTrade в чем проблема то?!И переменная трейлинг стоп, которая задается там же почему-то равна 150(а стоит 100).стопы тоже по 0.
 

AlexeyVik

Программист mql4 mql5
здравствуйте! есть специалисты? подскажите плз.


Написал советника в mql4 самого простейшего, так потренироваться ну и появилась необходимость перевести в mql5. Перевел, но возникла проблема переменные «input» которые я задаю в самом начале почему-то не "задаются". Например, переменная lot=1 в тестере выскакивает ошибка, что объем ордера равен 0 и не может быть открыт. Если в функции открытия ордера жестко вбить 1 лот, тогда все ОК ордер срабатывает открываю ордер с помощью CTrade в чем проблема то?!И переменная трейлинг стоп, которая задается там же почему-то равна 150(а стоит 100).стопы тоже по 0.
Ну как можно найти ошибку не видя кода?
 

CastEt

Активный участник
Я скопировал MqlRates в R и обращаюсь к её элементам типа (R[x].high+R[x].low)/2,
можно-ли это дело как-нибудь расширить\унаследовать так, что бы вместо этого писать типа R[x].medprice ???
 

CastEt

Активный участник
Сам себе отвечу, НИЗЯ!
MqlRates и иже с ней суть тупо СТРУКТУРА, а не класс.
 

Drotik

Интересующийся
Помогите начинающему разобраться с функцией OrderSend. Мало в интернете материалов по понятному обучению MQL5:
{
int ticet;
ticet =OrderSend (TRADE_ACTION_DEAL,"EURUSD",0.01,ORDER_TYPE_BUY,ORDER_FILLING_FOK,111,"ордер на покупку");
}
При компиляции выходит ошибка:"OrderSend'- wrong parameters count.Что неправильно? И если можно исправьте на правильно.
 

AlexeyVik

Программист mql4 mql5
Помогите начинающему разобраться с функцией OrderSend. Мало в интернете материалов по понятному обучению MQL5:
{
int ticet;
ticet =OrderSend (TRADE_ACTION_DEAL,"EURUSD",0.01,ORDER_TYPE_BUY,ORDER_FILLING_FOK,111,"ордер на покупку");
}
При компиляции выходит ошибка:"OrderSend'- wrong parameters count.Что неправильно? И если можно исправьте на правильно.
Неправильно ВСЁ... А почему не почитать документацию? -https://www.mql5.com/ru/docs/trading/ordersend
Код:
bool  OrderSend( 
   MqlTradeRequest&  request[COLOR=#000000],[/COLOR]      // структура запроса 
   MqlTradeResult&   result        // структура ответа 
   );
 

bondv

Программист
Я скопировал MqlRates в R и обращаюсь к её элементам типа (R[x].high+R[x].low)/2,
можно-ли это дело как-нибудь расширить\унаследовать так, что бы вместо этого писать типа R[x].medprice ???
Можно. Структуры могут наследоваться только от структур.
Можно сделать так:
Код:
struct MyMQLRates : MqlRates
  {
      double MedPrice()
      {
         return (high + low)/2;
      }
  }
 

paylesss

Интересующийся
Здравствуйте! Прошу вашей помощи. Сразу поясню, что я новичок. Написал простого эксперта. При появлении позиции, например селл, советник выставляет отложенные ордера бай стоп и бай лимит. зачем? вместо стоп лосса и тейк профита т.к у них проскальзывание до нескольких пунктов, а лимитки срабатывают четко.
так вот...как только один из отложенных ордеров сработал(позиция соответсвенно закрывается), то оставшийся отложеный ордер удаляется.
вот вся проблема в удалении этого отложенного ордера.

failed cancel order #0 buy 0.00 at market [Invalid request]
уже 12 часов бьюсь.
в терминале, в колонке ордер, соответсвенно тикеты ордеров. когда начинаю тестировать , тикет ордера начинается с 1 и т.д...ну как и положено по порядку.
Но в переменной, в которой должен хранится этот тикет, почему-то совершенно другой номер например...2147332096. поэтому нифига оставшийся отложеный ордер не удаляется. т.к его номер(в терминале), например,5, а в переменной тикета 2147332096. и я не понимаю почему так! помогите
PHP:
int tiket;
 double TPL,SPL,price;
 int limit,stop;
 CTrade m_trade;
   if( !PositionSelect(Symbol()))
   m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,lot,SYMBOL_BID,0,0,"");
   if(PositionSelect(Symbol()) && OrdersTotal()==0  )  
     {  
       price=PositionGetDouble(POSITION_PRICE_OPEN);
       if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) 
         {
           TPL=price-TP*_Point;
           SPL=price+SL*_Point;
           m_trade.BuyLimit(lot,TPL,Symbol(),0,0,ORDER_TIME_GTC,0,"");
           limit = m_trade.RequestOrder();
           m_trade.BuyStop(lot,SPL,Symbol(),0,0,ORDER_TIME_GTC,0,"");
           stop = m_trade.RequestOrder();
         }
       else
         {
           TPL=price+TP*_Point;
           SPL=price-SL*_Point;
           limit = m_trade.SellLimit(lot,TPL,Symbol(),0,0,ORDER_TIME_GTC,0,"");
           stop = m_trade.SellStop(lot,SPL,Symbol(),0,0,ORDER_TIME_GTC,0,"");
         }           
     }
    if ( OrdersTotal()==1)
         {
           if (OrderSelect(Symbol()));
           {
           if (limit!=0)
           {m_trade.OrderDelete(limit);Print(limit,"лимит");}
           if (stop!=0)
           {m_trade.OrderDelete(stop);Print(stop,"стоп");}
           
            }  
         }  
   }
 

Алекc1234

Местный житель
5

Alix11 2016.01.28 10:13 # RU


Приветствую всех!

Вот какая проблемка. Есть советник(прикрепляю), который модифицирует отложенный байлимит ордер. Когда пишу его в таймере, то выдает ошибку - вот такую -

2016.01.28 13:07:36.063 Trades : failed modify order #9296101 buy limit 1.00 at 1.08990 sl: 0.00000 tp: 0.00000 -> 1.09000, sl: 0.00000 tp: 0.00000 [Invalid request]
2016.01.28 13:07:36.050 Trades : failed modify order #9296101 buy limit 1.00 at 1.08990 sl: 0.00000 tp: 0.00000 -> 1.09000, sl: 0.00000 tp: 0.00000 [Invalid request]
2016.01.28 13:07:36.050 Trades : modify order #9296101 buy limit 1.00 ED-3.16 at 1.0899 sl: 0.0000 tp: 0.0000 -> 1.0900, sl: 0.0000 tp: 0.0000 placed for execution in 36 ms
2016.01.28 13:07:36.013 Trades : modify order #9296101 buy limit 1.00 ED-3.16 at 1.0899 sl: 0.0000 tp: 0.0000 -> 1.0900, sl: 0.0000 tp: 0.0000

То есть после первой успешной модификации, идет модификация на ту же цену, но уже почему то пятизначную(котировки в терминале четырехзначные).

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

Вложения

Посмотрели (3) Посмотреть

Верх