Скачать MetaTrader 5

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

Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят

Понравился скрипт?
Оцени его работу в терминале MetaTrader 5

2011.03.21 08:10
Библиотеки

Block_err_130 - библиотека для MetaTrader 4

Просмотров:
4384
Рейтинг:
голосов: 6

«Блокировка» Error 130. Стандартный метод – единое решение
Block_err_130 – проверка корректности любой торговой операции для всех типов ордеров

Источник – Учебник MQL4. Требования и ограничения при проведении торговых операций. (прим. Подразумеваются требования торгового сервера, далее читать – Требования).

Любой эксперт или скрипт (далее читать – эксперт) обязан перед проведением любой торговой операции (открытие, закрытие/удаление, модификация) с ордером, использующим «стопы», пройти проверку на Требования!

В связи с тем, что Требования носят описательный характер, возникла необходимость в создании универсальной функции:

  • Описывающей Требования на MQL4;
  • Пригодной для любой торговой операции, любого типа ордера;
  • Простой в использовании в любом эксперте;
  • Облегчающей рутинный труд экспертописателя, на ассоциативном уровне – MQL4-дипломатического посредника между экспертом и торговым сервером для проведения торговой операции.

Такая функция была создана!

Ее имя – Block_err_130 (дословный перевод – «блокировка ошибки 130»).

Несмотря на простой MQL4-код, функция Block_err_130 показала высокую эффективность, подтверждая свои основные назначения:

  • Не допускать ошибки Error 130;
  • Позволять комфортно работать трейдеру на близком расстоянии от рынка;
  • Экспертописателю сокращать программный код своего эксперта (свойства функции), «реанимировать» эксперты (стратегии), написанные некорректно относительно Требований.

Есть у Block_err_130 и другие плюсы:

  • Учтены случаи с «нулевыми стопами»;
  • Простая ассоциативная логика;
  • Малый размер MQL4-кода.
bool Block_err_130 (int M,int TypeOrder,double OP,double StopLoss,double TakeProfit, 
                    double NewOpenPrice,double NewStopLoss,double NewTakeProfit)

Таблица 1.

Операция
Значение M
Описание
Close/DEL
1
Закрытие /Удаление ордера
Open
2
Открытие ордера
Modify
3
Модификация ордера


Таблица 2 (как обычно!).

Тип ордера
Значение Type Order
Описание
OP_BUY
0
Покупка
OP_SELL
1
Продажа
OP_BUYLIMIT
2
Отлож. ордер BUY LIMIT
OP_SELLLIMIT
3
Отлож. ордер SELL LIMIT
OP_BUYSTOP
4
Отлож. ордер BUY STOP
OP_SELLSTOP
5
Отлож. ордер SELL STOP


Таблица 3.

Набор №1 OP (цена открытия ордера) StopLoss TakeProfit
Набор №2 NewOpenPrice
(новая цена открытия ордера)
NewStopLoss NewTakeProfit

Таблица 4 (запомнить!).

Операция
Действие 1
Действие 2
Close/DEL
Набор №1 заполнить
Набор №2 обнулить
Open Набор №1 обнулить
Набор №2 заполнить
Modify
Набор №1 заполнить
Старые/текущие данные
Набор №2 заполнить
Новые/будущие данные


Выводы:

  • Block_err_130- функция логическая, обязательна для исполнения перед проведением каждой торговой операции для ордера любого типа;
  • заполнение переменных (данными) просто, понятно.

Пример успешного использования Block_err_130 в составе другой функции CloseAllPos(int type), предназначенной для закрытия всех ордеров «по типу» (FT_CCI_0.4(+MA)mq4.mq4 - советник из серии FT_CCI, использующий «стопы», но «игнорирующий» Требования, т.е. заранее обрекающий свою стратегию на «провал» (поражение, нанесения убытка, потеря возможной прибыли).

//----------пример использования Block_err_130-------------                  

//FT_CCI_0.4(+MA)mq4.mq4

//---- CloseAllPos(int type) до редакции вариант А.- Было------------------ 
//Закрываем все позиции по типу
int CloseAllPos(int type)
{//Описание функции: http://fxnow.ru/blog.php?user=Yuriy&blogentry_id=72
int buy=1; int sell=1;
int i,b=0;int ordertiket;

if(type==1)
   {
   while(buy==1)
     {
        buy=0;
        for( i=0;i<OrdersTotal();i++)
         {
           if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol() )
           {buy=1; OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);}
           }else{buy=0;}
         }  
         if(buy==0){return(0);}
      } 
   }
   
   if(type==0 )
   {
      while(sell==1)
     {
        sell=0;
        for( i=0;i<OrdersTotal();i++)
         {
           if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
           if(OrderType()==OP_SELL && OrderSymbol()==Symbol() )
           {sell=1;OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); }
           }else{sell=0;}
         }  
         
        if(sell==0){return(0);}
      } 
     }
   return(0);
   }

//----с использованием Block_err_130  вариант B.- Стало--------------------------------
//+---------Закрываем все позиции по типу-------------+ 
int CloseAllPos(int type)
{//Описание функции: http://fxnow.ru/blog.php?user=Yuriy&blogentry_id=72
int buy=1; int sell=1;
int i,b=0; 
if(type==0)
  {while(buy==1)
     {buy=0;
      for(i=0;i<OrdersTotal();i++)
       {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {if(OrderType()==OP_BUY&&OrderSymbol()==Symbol())
          {buy=1;
           int Tip=OrderType(); 
           int iTicket=OrderTicket();
           double OPos=OrderOpenPrice();
           double SLpos=ND(OrderStopLoss());//нормализация
           double TPpos=ND(OrderTakeProfit());
           double Closepos=ND(OrderClosePrice());
           if(Block_err_130(1,Tip,OPos,SLpos,TPpos,0,0,0))
            {if(!OrderClose(iTicket,OrderLots(),Closepos,3,White))
             {Alert("Ошибка закрытия  № ",GetLastError());
              Print("Ошибка закрытия ордера №",
              OrderTicket(),". Ошибка: ",GetLastError());Sleep(1000);
             }else PlaySound("expert.wav");
            } 
          }
           else{buy=0;}
        }
         if(buy==0)return(0);
       }
     }
    }
   if(type==1 )
   {while(sell==1)
     {sell=0;
      for(i=0;i<OrdersTotal();i++)
        {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          {if(OrderType()==OP_SELL&&OrderSymbol()==Symbol())
           {sell=1;
            Tip=OrderType(); 
            iTicket=OrderTicket();
            OPos=OrderOpenPrice();
            SLpos=ND(OrderStopLoss());
            TPpos=ND(OrderTakeProfit());
            Closepos=ND(OrderClosePrice());
          if(Block_err_130(1,Tip,OPos,SLpos,TPpos,0,0,0))
            {if(!OrderClose(iTicket,OrderLots(),Closepos,3,White))
             {Alert("Ошибка закрытия  № ",GetLastError());
              Print("Ошибка закрытия ордера №",
              OrderTicket(),". Ошибка: ",GetLastError());Sleep(1000);
             }else PlaySound("expert.wav");
            } 
          }
         }else{sell=0;}
        }  
        if(sell==0)return(0);
      } 
     }
   return(0);
   }
//+------------------------------------------------------------------+

А. Объяснение утверждения «провала» любого советника, имеющего «стопы» и использующего данную функцию (CloseAllPos(int type)) в первоначальном варианте:

Допустим, что стратегия, советника верна, и в нужный момент он отдает приказ фукции CloseAllPos(int type) закрыть ордер (-а) определенного типа, но среди них оказался ордер с «близким стопом».

1.1. функция (CloseAllPos(int type)) в первоначальном варианте:

  • «ничего не знает» ни о значении «стопов», ни об исполнении Требований;
  • «упрямо требует» от торгового сервера исполнения приказа своего непосредственного начальника (советника, руководимого стратегией).

1.2. Торговый сервер отвечает неправомерным действиям функции (CloseAllPos(int type)) предупреждением советнику («желтой карточкой») - Error 130 («близкие стопы»)

1.3. В зависимости от своей стратегии по обработке Error 130 советник (и), использующий функцию (CloseAllPos(int type)), может принимать следующие действия:

  • Прекратить отдачу приказов функции (CloseAllPos(int type)) и выйти (например, с Alert()), возложив дальнейшие действия с позицией на трейдера;
  • Прекратить отдачу приказов функции (CloseAllPos(int type)) и «заснуть», руководствуясь принципом о движении Рынка во времени (народная мудрость: «ляг, поспи и все пройдет!») с последующим продолжением своей стратегии;
  • Продолжать отдачу приказов функции (CloseAllPos(int type)). За что получает еще «желтые карточки» (Error 130) до получения «красной карточки» - блокировки сервером всех (не только неправомерных) активных действий со стороны клиентского терминала со всеми вытекающими последствиями …!

В. Объяснение утверждения, что такой «провал» можно «заблокировать» для любого советника, имеющего «стопы» и использующего данную функцию (CloseAllPos(int type)) в редактированном варианте, т.е. с использованием в CloseAllPos(int type) функции Block_err_130:

Допустим, что стратегия, советника верна, и в нужный момент он отдает приказ функции CloseAllPos(int type) закрыть ордер (а) определенного типа, но среди них оказался ордер с «близким стопом».

2.1 Функция (CloseAllPos(int type)) в редактированном варианте:

  • «знает все» о значениях «стопов», и об исполнении Требований;
  • «не требует» от торгового сервера исполнения неправомерного исполнения приказа своего непосредственного начальника (советника, руководимого стратегией), а терпеливо ждет момента, руководствуясь уже своей тактикой, когда исполнение Требований (Block_err_130), приказ советника и движение Рынка совпадут («во времени и ценовом пространстве»). Тогда и будет требовать от сервера правомерного исполнения приказа своего непосредственного начальника (советника, руководимого стратегией). Советник и клиентский терминал «красной карточки» не получат, а стратегия советника заработает еще одну звезду.

Выводы:

  • Block_err_130 с успехом можно применять при близком расстоянии «стопов» от Рынка (например: включать в «тралы» с различным целевым назначением и стратегиями);
  • Применение Block_err_130 (соблюдение исполнения Требований) обязательно в советниках, использующих «стопы» (которые в нужный момент могут стать «близкими»).
  • Советники, использующие «стопы» (которые в нужный момент могут стать «близкими»), но не соблюдающие исполнения Требований, обречены в действительности на «провал», дискредитируют свою, даже самую лучшую торговую стратегию, не рекомендуются к использованию на Рынке, по сути, носят демонстрационный характер своей стратегии.
  • Применение Block_err_130 (соблюдение исполнения Требований) в «демонстрационных» советниках, использующих «стопы» (которые в нужный момент могут стать «близкими»), может привести советники в «рабочее» состояние с точки зрения цивилизованной работы с торговым сервером (в противоположность предыдущему утверждению).
  • Использование советников/скриптов, неправильно исполняющих или не исполняющих Требования – это залог «провала» не только стратегии для данного советника/скрипта, но и залог «провала» стратегий советников/скриптов, правильно исполняющих Требования, параллельно работающих на счете.

Это означает, что достаточно использовать хотя бы один советник/скрипт, работающий некорректно относительно метода «Блокировка Error 130», чтобы терминал мог получить «красную карточку» - блокировку сервером всех (не только неправомерных) активных действий со стороны клиентского терминала!

Бархатный путь трейдера.


  1. Разъяснение ситуации Error 130 («близкие стопы»):
  • Пройдите по ссылке - Учебник MQL4. Требования и ограничения при проведении торговых операций (Требования);
  • Нарушение Требований (Рынком или заданием параметров ордера) при активных действиях со стороны терминала (открытие, закрытие/удаление, модификация этого ордера), произведенные экспертом/скриптом или трейдером вызывает конфликтную ситуацию с торговым сервером Error 130 («близкие стопы»):

2. Основная задача функции Block_err_130 – не допустить активных действий со стороны терминала, производимых экспертом/скриптом («блокировка»), для создания конфликтной ситуации с

торговым сервером – Error 130, при условии прописки (внедрении) Block_err_130 (соблюдение исполнения Требований) в данном эксперте/скрипте.

3. Метод «Блокировка Error 130 » логически состоит:

  1. Из внедрения (включения) Block_err_130 (Требований) в программный (MQL4)– код советника/скрипта;
  2. Ииз использования Block_err_130 (Требований) перед любой торговой операцией любого ордера внутри советника
  3. Из запрещения использования советников/скриптов, неправильно (некорректно) исполняющих Требования, т.е. не исполняющие п.1, п.2 данного метода.

Примечания:

  1. Block_err_130 - функция «молчаливая», результатом ее действий будет исполнение торговой операции со стороны сервера. Однако, учитывая, что Block_err_130 - функция логическая, то она может «просигналить» о нарушении Требований в составе эксперта (например, введениемфункций Alert(), PlaySound() или Print() совместно со Sleep() (для организации паузы между сигналами)).
  2. Испытание советников с использованием Block_err_130 проходило на демо-счете GBPUSD. Учитывая, что источник Block_err_130 (Учебник MQL4. Требования и ограничения при проведении торговых операций. (http://book.mql4.com/ru/appendix/limits)) не ограничивается какими-либо инструментами или таймфреймами, то испытания советников с использованием Block_err_130 рекомендовано проводить на любых инструментах, любых таймфреймах.

Объявление функции в эксперте/скрипте:

#include <Block_err_130.mqh>

Block_err_130.mqh находится в папке “include” терминала (например, C:\Program Files\ FX Trader\experts\include) .

Block_err_130 mq4находится в папке “libraries” терминала (например, C:\Program Files\FX Trader\experts\libraries).

Исходя из того, что создание Block_err_130 было вынужденной мерой для соблюдения Требований, то применение Block_err_130 в составе эксперта/скрипта стало требованием действительности!

YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя

Скрипт рисует уровни Рудолфа Акселя

YURAZ_CLOSEPRC_V1 YURAZ_CLOSEPRC_V1

Закрытие всех открытых позиций одним кликом либо закрытие всех позиций при достижении указанного профита в процентах от депозита

EA Deviation Price EA Deviation Price

Простой советник, основанный на индикаторе Moving Average.

EA Simple BB EA Simple BB

Советник основан на индикаторе Bollinger Bands.