Полезные функции от KimIV - страница 74

 
allarkoms писал(а) >>

Здравствуйте Игорь!

Пытаюсь изучить язык MQL4 и, за недостаточностью описания операторов языка, одна проблема поставила меня просто в тупик. Есть индикатор, в нем 8 буферов накопления данных, мне нужно чтобы на выбранном мной таймфрейме он отображался с периодом следующего таймфрейма. Для этого служит оператор iCustom(). Но он возвращает значение double, и я никак не могу понять как возможно,и возможно ли, в данном случае использовать iCustom.

Очень надеюсь на Вашу помощь.

Здравствуйте, Алексей!

Вам нужно сделать новый индикатор, в котором бы использовалась функция iCustom(). Значения, возвращаемые этой функцией присваивайте буферам нового индикатора.

 
ProfitTrader писал(а) >>

Здравствуйте Игорь! И всем Добрый день!

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

Нашел такой, но он не работает в тестере стратегий, хотелось бы потестить, каким кодом можно заменить?

Тогда в условия входа нужно вставть

Здравствуйте, Сергей!

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

 

Есть вопросы по различиям и особенностям функций SetOrder() и OpenPosition() в обработке ошибок.


SetOrder():

      if (err==8 || err==141) Sleep(1000*100);
      if (err!=135 && err!=138) Sleep(1000*7.7);
      if (err==139 || err==140 || err==148) break;

OpenPositions(): Ошибки 8 (ERR_TOO_FREQUENT_REQUESTS), 138 (ERR_REQUOTE), 139 (ERR_ORDER_LOCKED) не обрабатываются, в отличие от SetOrder():

      if (err==141) Sleep(1000*100);
      if (err!=135) Sleep(1000*7.7);
      if (err==140 || err==148 || err==4110 || err==4111) break;

В SetOrder() ошибка 130 (ERR_INVALID_STOPS) обрабатывается коррекцией стопов, а в OpenPositions() она никак не обрабатывается.

В OpenPosition() присутствует обработка 145 (ERR_TRADE_MODIFY_DENIED). Непонятен смысл ее обработки здесь.

Кроме того, на первой странице этого обсуждения есть упоминание ошибок, обработка которых отсутствует в обеих функциях:

KimIV >>:

На паузу 7.7 секунды нарвутся ошибки 129 (Неправильная цена bid или ask), 130 (Неправильные стопы), 134 (Недостаточно денег), 136 (Нет цен).

Также отстутствует обработка других (возможно, важных в данном случае) ошибок, например 3 (ERR_INVALID_TRADE_PARAMETERS), 6 (ERR_NO_CONNECTION), 7 (ERR_NOT_ENOUGH_RIGHTS), 9 ERR_MALFUNCTIONAL_TRADE, 137 (ERR_BROKER_BUSY), 144(!), 4067 (ERR_TRADE_ERROR), 4106 (ERR_UNKNOWN_SYMBOL), 4107 (ERR_INVALID_PRICE_PARAM)


Игорь, прошу прокомментировать описанные моменты.

Упоминаемые мной функции SetOrder() и OpenPositions() взяты из библиотек b-Orders от 05.11.2008 и b-Positions от 29.10.2008 с сайта kimiv.ru


Хочу добавить. При возникновении ошибки 5 ERR_OLD_VERSION ее можно обрабатывать аналогично 2, 64, 65, 133; 4109 ERR_TRADE_NOT_ALLOWED аналогично 4110, 4111

 
А 142 ошибка что означает? Я что-то в кодах ошибок такой не нашёл. Ещё хотелось бы узнать для пипсатора может можно кое-где уменьшить задержки?
 
khorosh >>:
А 142 ошибка что означает? Я что-то в кодах ошибок такой не нашёл.

https://docs.mql4.com/ru/trading/errors

142 Ордер поставлен в очередь. Это не ошибка, а один из кодов взаимодействия между клиентским терминалом и торговым сервером. Этот код может быть получен в редком случае, когда во время выполнения торговой операции произошёл обрыв и последующее восстановление связи. Необходимо обрабатывать так же как и ошибку 128.

 
Здравствуйте Игорь! И всем Добрый день!

Меня интересует вопрос по ГЭПам, они в книге не описаны, а в этой теме много нового. Хотелось бы узнать, как сделать так, чтобы сделка открывалась каждый раз, когда появляется ГЭП. Эта тема обсуждалась ранее, но так и не был решен этот вопрос, интересует мнение опытного програмиста, хотя советник вроде и простой. Вот,что получилось, но почему-то этот алгоритм отказывается работать,  в чем тут ошибка???

extern int     Magic                = 777;
extern int       TP                 = 6;
extern int       SL                 = 2;
extern double  Lots                 = 0.01;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if(  iClose(NULL,0,1)>iOpen(NULL,0,0) && (iClose(NULL,0,1)-iOpen(NULL,0,0))>1*Point )
   { //покупаем
  OrderSend(Symbol(),OP_BUY,Lots,Ask,2,Bid-SL*Point,Bid+TP*Point,
                                               NULL,Magic,0,CLR_NONE);}
                                                  
if(  iClose(NULL,0,1)<iOpen(NULL,0,0) && (iClose(NULL,0,1)-iOpen(NULL,0,0))>1*Point )
   { //продаем
 OrderSend(Symbol(),OP_SELL,Lots,Bid,2,Ask+SL*Point,Ask-TP*Point,
                                              NULL,Magic,0,CLR_NONE);}

   return(0);
  }
//+------------------------------------------------------------------+
 
В первом условии первое подусловие лишнее, второе условие на продажу вообще невыполнимо. У Вас что один пункт это уже гэп? У Вас слиппаж равен 2 и стоп равен 2, могут быть накладки.
 
Roger >>:
В первом условии первое подусловие лишнее, второе условие на продажу вообще невыполнимо. У Вас что один пункт это уже гэп? У Вас слиппаж равен 2 и стоп равен 2, могут быть накладки.

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

if(  iClose(NULL,0,1)<iOpen(NULL,0,0) && (iClose(NULL,0,1)-iOpen(NULL,0,0))>2*Point )
   { //покупаем
  OrderSend(Symbol(),OP_BUY,Lots,Ask,2,Bid-SL*Point,Bid+TP*Point,
                                               NULL,Magic,0,CLR_NONE);}
                                                  
if(  iClose(NULL,0,1)>iOpen(NULL,0,0) && (iClose(NULL,0,1)-iOpen(NULL,0,0))>2*Point )
   { //продаем
 OrderSend(Symbol(),OP_SELL,Lots,Bid,2,Ask+SL*Point,Ask-TP*Point,
                                              NULL,Magic,0,CLR_NONE);}
 
Правильно так
if(  iClose(NULL,0,1)-iOpen(NULL,0,0)>10*Point )
   { //покупаем
  OrderSend(Symbol(),OP_BUY,Lots,Ask,2,Bid-SL*Point,Bid+TP*Point,
                                               NULL,Magic,0,CLR_NONE);}
                                                  
if( iOpen(NULL,0,0)- iClose(NULL,0,1)>10*Point )
   { //продаем
OrderSend(Symbol(),OP_SELL,Lots,Bid,2,Ask+SL*Point,Ask-TP*Point,
                                              NULL,Magic,0,CLR_NONE);}
 
Roger >>:
Правильно так

Насколько я понимаю в первом условии автоматически подразумевается, что чена закрытия больше цены открытия. Во втором наоборот??????