Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 748

 
RogozaIV:
недавно перешел с mql4 на mql5. тестирую советник по индексу РТС и возникла такая проблема, открывает по несколько сделок, хотя одним из условий к заключению сделки прописано: if (...OrdersTotal()==0). Почему не срабатывает данное условие? Что можно сделать чтобы открывал только одну сделку?

OrdersTotal

OrdersTotal Возвращает количество действующих ордеров.

PositionsTotal

PositionsTotal Возвращает количество открытых позиций.


Примечание

Не следует путать между собой действующие отложенные ордера и позиции, которые также отображаются на вкладке "Торговля" в панели "Инструменты". Ордер – это распоряжение на проведение торговой операции, а позиция является результатом одной или нескольких сделок.

При "неттинговом" учете позиций (ACCOUNT_MARGIN_MODE_RETAIL_NETTING и ACCOUNT_MARGIN_MODE_EXCHANGE) по каждому символу в любой момент времени может быть открыта только одна позиция, которая является результатом одной или более сделок. Не следует путать между собой позиции и действующие отложенные ордера, которые также отображаются на вкладке "Торговля" в панели "Инструменты".

При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций.


То есть используя OrdersTotal Вы проверяете сколько всего на данный момент ОТЛОЖЕННЫХ ОРДЕРОВ:

ORDER_TYPE_BUY_LIMIT

Отложенный ордер Buy Limit

ORDER_TYPE_SELL_LIMIT

Отложенный ордер Sell Limit

ORDER_TYPE_BUY_STOP

Отложенный ордер Buy Stop

ORDER_TYPE_SELL_STOP

Отложенный ордер Sell Stop

ORDER_TYPE_BUY_STOP_LIMIT

По достижении цены ордера выставляется отложенный ордер Buy Limit по цене StopLimit

ORDER_TYPE_SELL_STOP_LIMIT

По достижении цены ордера выставляется отложенный ордер Sell Limit по цене StopLimit


а Вам нужно проверять сколько на данный момент открытых ПОЗИЦИЙ:

POSITION_TYPE_BUY

Покупка

POSITION_TYPE_SELL

Продажа


 - для этого нужно пользовать PositionsTotal.

 

Vladimir Karputov Спасибо!

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

 Такое впечатление, что резко стало не хватать истории. Не подскажете, что могло случиться?
Оказывается, глюк возник в тех МТ, где не были открыты младшие таймфреймы. Пришлось проклацать графики от ТФ М1 и выше и всё наладилось. Вопрос закрыт.
 
Ага, рано обрадовался, при перезапуске терминала всё то же самое, надо каждый раз сидеть щёлкать по всем графикам.
Такое не годится, работать невозможно. Ну хоть кто-то скажет слово по существу вопроса или нет? Явно обновление глючное.

Куда вообще обращаются по таким вопросам?
 
Здравствуйте! 2017.06.02_17:45 GMT+3. У меня вопрос. Программа .mq5 писал вычисление своего лота, -- результат, -- программа в тестере стратегий пытается открыть сделку запредельно большим лотом. При проценте риска 1.09. Размер залога получается больше депозита (по умолчанию $10 000). Попробовал пользоваться стандартным ООП файлом из папки Include>Expert>Money>MoneyFixedRisk.mqh . Результат: программа пытается открывать сделку с нулевым лотом. (0.00). Я думаю, -- это приколы программистов корпорации. Или я чего-то не понимаю? Ну сделать так, чтобы твой советник был бесполезным. На сторону загнуть лот. Может кто знает что нужно написать, чтобы советник открывал сделки вычисленным лотом, с заданным процентом риска? А то я сам не справляюсь, только зря время теряю. Надеюсь, программисты корпорации не сильно обидятся? Прилагаю включаемый файл Lot.mqh . Надеюсь что кто-нибудь ответит. 18:00 GMT+3. Вставил в 18:11 GMT+3.    
Файлы:
Lot.mqh  2 kb
 
Agat:
Добрый день. После последнего обновления МТ5 на билд 1604 мои индикаторы перестали корректно работать. Я использую
т.н "жидкие" индикаторы. К примеру, в одном окне установлено несколько разнопериодных стохастиков. Так вот теперь короткие отрисовываются
нормально, как и раньше, чуть более длинные рисуют всего несколько баров, а самые длинные не рисуются вообще.

 Такое впечатление, что резко стало не хватать истории. Не подскажете, что могло случиться?


Каким образом осуществляете доступ к истории чужого периода? Какие проверки результата доступа осуществляете? Какие кода ошибок получаете? 

 
Николай Никитюк:
Здравствуйте! 2017.06.02_17:45 GMT+3. У меня вопрос. Программа .mq5 писал вычисление своего лота, -- результат, -- программа в тестере стратегий пытается открыть сделку запредельно большим лотом. При проценте риска 1.09. Размер залога получается больше депозита (по умолчанию $10 000). Попробовал пользоваться стандартным ООП файлом из папки Include>Expert>Money>MoneyFixedRisk.mqh . Результат: программа пытается открывать сделку с нулевым лотом. (0.00). Я думаю, -- это приколы программистов корпорации. Или я чего-то не понимаю? Ну сделать так, чтобы твой советник был бесполезным. На сторону загнуть лот. Может кто знает что нужно написать, чтобы советник открывал сделки вычисленным лотом, с заданным процентом риска? А то я сам не справляюсь, только зря время теряю. Надеюсь, программисты корпорации не сильно обидятся? Прилагаю включаемый файл Lot.mqh . Надеюсь что кто-нибудь ответит. 18:00 GMT+3. Вставил в 18:11 GMT+3.    

Запустите этот советник: Money Fixed Risk - измените оба входных параметра и посмотрите принты в закладке "Эксперты" терминала.
 

Никак не могу получить данные индикатора в своем индикаторе.

int OnInit()
  {  
   handle1=iMA(NULL,0,per1,0,MODE_LWMA,PRICE_CLOSE);
   handle2=iMA(NULL,0,PLength1,0,MODE_LWMA,PRICE_CLOSE);
  }
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int copied1=CopyBuffer(handle1,0,0,toCount,TMP_Buf1);
   if(copied1<=0)
     {
      Sleep(50);
      for(int i=0;i<100;i++)
        {
         if(BarsCalculated(handle1)>0)
            break;
         Sleep(50);
        }
      copied1=CopyBuffer(handle1,0,0,toCount,TMP_Buf1);
      if(copied1<=0)
        {
         Print(__FUNCTION__+": copying indicator data failed. Error=",GetLastError());
         return(0);
        }
     }  
   int copied2=CopyBuffer(handle2,0,0,toCount,TMP_Buf2);
   if(copied2<=0)
     {
      Sleep(50);
      for(int i=0;i<100;i++)
        {
         if(BarsCalculated(handle2)>0)
            break;
         Sleep(50);
        }
      copied2=CopyBuffer(handle2,0,0,toCount,TMP_Buf2);
      if(copied2<=0)
        {
         Print(__FUNCTION__+": copying indicator data failed. Error=",GetLastError());
         return(0);
        }
     }
  }

Не копируется ничего. Переменные copied1/2 всегда меньше нуля. В отладчике я вообще не могу попасть дальше этого кода. Как правильно это делать, уже голову сломал.

 
Хм.. до этого была ошибка 4806, сейчас 4807, когда создание хэндла в OnInit() перенёс. Как это делается-то?
 
Разобрался кажется. Хэндл не создавался. Не все данные инициализировал.
Причина обращения: