Источник – Учебник MQL4. Требования и ограничения при проведении торговых операций. (прим. Подразумеваются требования торгового сервера, далее читать – Требования).
Любой эксперт или скрипт (далее читать – эксперт) обязан перед проведением любой торговой операции (открытие, закрытие/удаление, модификация) с ордером, использующим «стопы», пройти проверку на Требования!
В связи с тем, что Требования носят описательный характер, возникла необходимость в создании универсальной функции:
Такая функция была создана!
Ее имя – Block_err_130 (дословный перевод – «блокировка ошибки 130»).
Несмотря на простой MQL4-код, функция Block_err_130 показала высокую эффективность, подтверждая свои основные назначения:
Есть у Block_err_130 и другие плюсы:
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 в составе другой функции 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)) в редактированном варианте, т.е. с использованием в CloseAllPos(int type) функции Block_err_130:
Допустим, что стратегия, советника верна, и в нужный момент он отдает приказ функции CloseAllPos(int type) закрыть ордер (а) определенного типа, но среди них оказался ордер с «близким стопом».
2.1 Функция (CloseAllPos(int type)) в редактированном варианте:
Выводы:
Это означает, что достаточно использовать хотя бы один советник/скрипт, работающий некорректно относительно метода «Блокировка Error 130», чтобы терминал мог получить «красную карточку» - блокировку сервером всех (не только неправомерных) активных действий со стороны клиентского терминала!
Бархатный путь трейдера.
2. Основная задача функции Block_err_130 – не допустить активных действий со стороны терминала, производимых экспертом/скриптом («блокировка»), для создания конфликтной ситуации с
торговым сервером – Error 130, при условии прописки (внедрении) Block_err_130 (соблюдение исполнения Требований) в данном эксперте/скрипте.
3. Метод «Блокировка Error 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 в составе эксперта/скрипта стало требованием действительности!
iK_candle
Советник основан на одной из разворотных моделей - МОДЕЛИ ПОГЛОЩЕНИЯ
Монитор для МТ4
Открытие ордеров, контроль ММ, удобное ручное тестирование на исторических данных.
MACD++
Немного модифицированный MACD и Эксперт по нему.
tral_to_close
Советник подхватывает открытые ордера и тралит их (без модификации стоп лосса) после достижения заданной прибыльности. Будет полезен при расширении отступа установки стоп лосса (stoplevel) в период выхода новостей у некоторых брокеров.