Обсуждение статьи "Пошаговое руководство по написанию советников в MQL5 для начинающих" - страница 22

 
Доброе утро, если кто-то может помочь мне, пожалуйста. Насколько я понимаю, я сделал все, что указано в статье. Но у меня не получается иметь две одновременно открытые операции, помимо того, что я понимаю, что автор хотел сделать, чтобы не ставить buy, если уже есть buy или sell, если уже есть sell. Моя стратегия, например, посылает сигнал на продажу, когда у меня открыт ордер на покупку, и вместо того, чтобы открыть продажу, код закрывает операцию покупки, не успев коснуться tp/sl. В результате я остаюсь без покупки или продажи. Продажа закрывает покупку, а покупка закрывает продажу. Я использую только одну пару, только один таймфрейм и только один размер лота в своей стратегии. Подскажите, пожалуйста, как я могу сделать так, чтобы одновременно открывались buy и sell, если это приводит к срабатыванию стратегии? То есть, чтобы ордера закрывались ТОЛЬКО по tp/sl. Заранее большое спасибо.
 
Отличная статья!
 
Sella170:
Кто-нибудь знает, можно ли использовать этот советник для мини-индексов или мини-долларов?
Да, вы можете использовать советник, перетащив мышь на график или меню > вставить > советник > {nomedoseurobo}.

Надеюсь, на ваш вопрос был дан ответ.

 
Большое спасибо за отличную статью. Где и как можно внедрить модуль Intraday Time Filter в ваш код?
 

Привет, ребята, доброе утро.

Я нахожусь в"Тестере стратегий" с этим файлом из конца Руководства, и он показывает следующую ошибку:

*Эта ошибка уже обсуждалась в этой статье, но ни одно из написанных решений не помогло мне, и мне нужна ваша помощь.


OF      0       12:44:39.040    EA_ADX (XAUUSD,H1)      2020.01.03 19:00:00   Alert: The Buy order request could not be completed -error:4756
ED      2       12:44:39.043    Trades  2020.01.03 20:00:00   failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP      0       12:44:39.043    EA_ADX (XAUUSD,H1)      2020.01.03 20:00:00   Alert: The Buy order request could not be completed -error:4756
ER      2       12:44:39.049    Trades  2020.01.03 21:00:00   failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR      0       12:44:39.049    EA_ADX (XAUUSD,H1)      2020.01.03 21:00:00   Alert: The Buy order request could not be completed -error:4756
PP      2       12:44:39.053    Trades  2020.01.03 22:00:00   failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]


Файл находится в конце Руководства.

Как я могу решить эту проблему?

 
surfdoode2:


У меня также по-прежнему возникает эта ошибка после внесения обоих предложенных исправлений:

ZeroMemory(mrequest);

а также

if(Buy_opened || Sell_opened)

Пожалуйста, может ли кто-нибудь помочь с ошибкой 4756? Кажется, что не удается разместить ордер на покупку.

Проверьте, использовали ли вы функцию SymbolInfoTick и написали ли вы эту часть кода:

//--- Получение последней ценовой котировки с помощью структуры MQL5 MqlTick
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
      return;
     }
Documentation on MQL5: Market Info / SymbolInfoTick
Documentation on MQL5: Market Info / SymbolInfoTick
  • www.mql5.com
SymbolInfoTick - Market Info - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Здесь есть ошибка в логике алгоритма:
 //--- У нас уже есть открытые вакансии?
     bool Buy_opened= false ;   // переменная для хранения результата покупки открытой позиции
     bool Sell_opened= false ; // переменная для хранения результата продажи открытой позиции
    
     if ( PositionSelect ( _Symbol ) == true )   // у нас есть открытая позиция
    {
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ;   //Купить
         }
         else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // Это продажа
         }
    }

Поскольку PositionSelect выбирает первую позицию для _Symbol, если советник открывает позицию на покупку, переменная Sell_opened всегда будет ложной, пока открыта позиция на покупку, что приводит к реализации нескольких позиций на продажу при каждом сигнале на продажу.

Чтобы исправить это и знать, открыты ли одновременно позиции на покупку и продажу, можно использовать следующую логику:

 //--- У нас уже есть открытые вакансии?
   bool Buy_opened = false ;   // переменная для хранения результата покупки открытой позиции
   bool Sell_opened = false ; // переменные для хранения результата продажи открытой позиции

   if ( PositionSelect ( _Symbol ) == true ) // у нас есть открытая позиция
   {
       for ( int i= 0 ;i< PositionsTotal ();i++){
	 
         PositionSelectByTicket ( PositionGetTicket (i));

         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // Это продажа
         } else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ; //Купить
         }
      }
   
Documentação sobre MQL5: Funções de Negociação / PositionSelect
Documentação sobre MQL5: Funções de Negociação / PositionSelect
  • www.mql5.com
PositionSelect - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Vitor Gama Barreto:

Всем привет, доброе утро.

Я нахожусь в"Тестере стратегий" с этим файлом из конца руководства и он показывает следующую ошибку:

*ошибка уже обсуждалась в этой статье, но ни одно из написанных решений не помогло мне, и мне нужна ваша помощь.



Файл находится в конце руководства.

Как я могу решить эту проблему?

Проверьте запрашиваемую цену продажи, для этого используйте точку останова для отладки переменных mrequest.price, mrequest.sl и mrequest.tp.

Попробуйте изменить

mrequest.type_filling = ORDER_FILLING_FOK;                               // Тип исполнения заказа

на:

mrequest.type_filling = ORDER_FILLING_IOC;                               // Тип исполнения заказа


В некоторых бумагах есть правила минимального стоп-лосса, подробнее здесь: https://www.mql5.com/pt/forum/319474.

ERRO 4756 - INVALID PRICE
ERRO 4756 - INVALID PRICE
  • 2019.08.06
  • www.mql5.com
Ja tentei de tudo, por favor, preciso muito da ajuda de voces!! alguem pode me dar uma luz??? E retorna o : 2019.08.05 13:42:51.236 Core 1 2019.08...
 

Здравствуйте,

Большое спасибо за статью Самуэля, вы просто молодец!

Было немного сложно заставить ее работать с моим брокером, потому что статья находится в режиме "net", и мне пришлось искать информацию, чтобы перевести ее в режим "hedging". Первая проблема, с которой я столкнулся, была связана с mrequest.type_filling .

Для брокера XM работает один из вариантов:

mrequest.type_filling = ORDER_FILLING_IOC;                                          // Вид исполнения заказа

Если вы не знаете, какой тип позволяет ваш MT5, я рекомендую использовать функцию TypeFilling() в Print(TypeFilling()) или Comment( TypeFilling()), и она возвращает тип; если она говорит вам, что это 1 (ORDER_FILLING_FOK) или 2 (ORDER_FILLING_IOC), вы знаете, какой из них вы должны поставить(https://www.mql5.com/docs/constants/tradingconstants/orderproperties#enum_order_type_filling), потому чтоORDER_FILLING_FOK (1) не работает у меня с этим брокером.


Как только это исправлено, проблема заключается в том, что PositionSelect открывает много позиций. Хотя Сэмюэль не говорит об этом в своей стратегии, я понимаю, что цель состоит в том, чтобы открыть одну позицию на покупку или продажу (в зависимости от того, что наступит раньше) с установленными критериями (4 булевых шага) и что пока эта позиция не будет закрыта, мы не сможем открыть другую.

Что я сделал, так это изменил этот код ...

//--- У нас нет ошибок, поэтому мы продолжаем.
//--- У нас уже есть свободные вакансии?
    bool Buy_opened=false;  // переменная, хранящая результат открытия позиции Purchase
    bool Sell_opened=false; // переменная, хранящая результат открытия позиции Sale
    
    if (PositionSelect(_Symbol) ==true)  // у нас открыта вакансия
    {
         if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            Buy_opened = true;  // Это покупка
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            Sell_opened = true; // Распродажа
         }
    }

Для этого...

//--- У нас нет ошибок, поэтому мы продолжаем.
//--- У нас уже есть свободные вакансии?
   bool Buy_opened = false;               // Переменная, хранящая результат открытой позиции на покупку
   bool Sell_opened = false;              // Переменная, хранящая результат открытой позиции на продажу
   
   // Давайте пройдемся по всем заказам и посмотрим, есть ли среди них открытые.
   for(int i = 0; i < PositionsTotal(); i++)   
        {
         ulong ticket = PositionGetTicket(i);
         PositionSelectByTicket(ticket);
    
    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          Buy_opened = true;       // это покупка
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          Sell_opened = true;      // распродажа
         }
   }

// если есть открытая позиция, то ждем, пока активная операция не будет закрыта (касание SL или theTP).
   if (Buy_opened || Sell_opened) return; 

Примечание: Сразу после этого идет строка...

//--- Копируем цену закрытия с предыдущего бара на текущий бар, которым является бар1.
   p_close=mrate[1].close;

Таким образом, у меня все получилось. Надеюсь, вы найдете его полезным.

С наилучшими пожеланиями.

 
surfdoode2:


У меня также по-прежнему возникает эта ошибка после внесения обоих предложенных исправлений:

ZeroMemory(mrequest);

а также

if(Buy_opened || Sell_opened)

Пожалуйста, может ли кто-нибудь помочь с ошибкой 4756? Кажется, что не удается разместить ордер на покупку.


Возможно, тип заполнения вашего брокера ORDER_FILLING_IOC, вы можете попробовать отредактировать код из:

mrequest.type_filling = ORDER_FILLING_FOK;

To:

mrequest.type_filling = ORDER_FILLING_IOC;

У меня была такая же проблема, и теперь я успешно ее решил