Помогите разобраться с проблемой закрытия ордеров (ордера не закрываются).

 

Здравствуйте. Помогите разобраться с проблемой закрытия ордеров (ордера не закрываются), данная система основана на индикаторе DeMarker. При тесте, ошибок нет, только 1 предупреждение. Прошу просто разъяснить мне про OrderClose. Просьба закрытия ордеров в виде отдельных функций пока не предлагать (это будет следующий этап).

//+------------------------------------------------------------------+
//|                                    Test advisor on iDeMarker.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                         https:/goga342@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//------------------параметры советника -------------------------------
extern double lots=0.01; //
extern int Magic=111111111;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   int ticket;

  //DeMarker
   double DM1,DM; 
   DM=iDeMarker(NULL,0,14,0);// 0 (1) бар
   DM1=iDeMarker(NULL,0,14,1);// 1 (2) бар

if(DM>0.3&&DM1<0.3&&CountBuy()<1) // открытие покупок
     {
      ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,0,0,0,NULL,Magic,0,CLR_NONE);
      
     }
 if(DM<0.7&&DM1>0.7&&CountBuy()>0) // закрытие покупок
    {
    OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
     }
 //+------------------------------------------------------------------+
/*
   if(DM<0.7&&DM1>0.7&& CountSell()<1)// открытие продаж
     {
      ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,0,0,0,NULL,Magic,0,CLR_NONE);
                  }
   if(DM<0.3&&DM1>0.3)// закрытие продаж
     {
       OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
                 }
     }*/
   return(0);
  }
 //+------------------------------------------------------------------+
int CountBuy()// проверкна открытие ордеров на покупку
  {
   int count=0;

   for(int trade=OrdersTotal()-1; trade>=0; trade--)

     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            if(OrderType()==OP_BUY)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+       
int CountSell()//проверкна открытие ордеров на продажу
  {
   int count=0;

   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            if(OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------
 
Игорь:

Здравствуйте. Помогите разобраться с проблемой закрытия ордеров (ордера не закрываются), данная система основана на индикаторе DeMarker. При тесте, ошибок нет, только 1 предупреждение. Прошу просто разъяснить мне про OrderClose. Просьба закрытия ордеров в виде отдельных функций пока не предлагать (это будет следующий этап).

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);

лонги закрываются по Bid

для тестов можете вообще использовать OrderClosePrice(), чтобы голову не ломать Ask там или Bid

 

То что не та цена указана, это пол-беды. А вот перед использованием параметров ордера, OrderTicket, OrderLots и других, надо ордер выбрать функцией OrderSelect


Maxim Kuznetsov:

лонги закрываются по Bid

для тестов можете вообще использовать OrderClosePrice(), чтобы голову не ломать Ask там или Bid

OrderClosePrice можно использовать и в рабочем советнике, только надо чётко понимать какие меры предпринять на случай ошибки исполнения. Тут RefreshRates не поможет. Надо повторно выбрать ордер.

 
Alexey Viktorov:

То что не та цена указана, это пол-беды. А вот перед использованием параметров ордера, OrderTicket, OrderLots и других, надо ордер выбрать функцией OrderSelect


OrderClosePrice можно использовать и в рабочем советнике, только надо чётко понимать какие меры предпринять на случай ошибки исполнения. Тут RefreshRates не поможет. Надо повторно выбрать ордер.

Спасибо за помощь
 
//+------------------------------------------------------------------+
//|                                    Test advisor on iDeMarker.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                         https:/goga342@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//------------------параметры советника -------------------------------
extern double lots=0.01; //
extern int Magic=111111111;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   int ticket;

  //DeMarker
   double DM1,DM; 
   DM=iDeMarker(NULL,0,14,0);// 0 (1) бар
   DM1=iDeMarker(NULL,0,14,1);// 1 (2) бар

if(DM>0.3&&DM1<0.3&&CountBuy()<1) // открытие покупок
     {
      ticket=OrderSend(Symbol(),OP_BUY,lots,Bid,0,0,0,NULL,Magic,0,CLR_NONE);
      
     }
 if(DM<0.7&&DM1>0.7&&CountBuy()>0) // закрытие покупок
    {
     for(int i=OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
           {
            if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,clrNONE))
               Print("    ");
           }
        }
        }
 //+------------------------------------------------------------------+
/*
   if(DM<0.7&&DM1>0.7&& CountSell()<1)// открытие продаж
     {
      ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,0,0,0,NULL,Magic,0,CLR_NONE);
      }
   if(DM<0.3&&DM1>0.3)// закрытие продаж
           {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
         {
         if(OrderType()==OP_SELL)
         OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
        }  
     }*/
   return(0);
  }
 //+------------------------------------------------------------------+
int CountBuy()// проверкна открытие ордеров на покупку
  {
   int count=0;

   for(int trade=OrdersTotal()-1; trade>=0; trade--)

     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            if(OrderType()==OP_BUY)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+       
int CountSell()//проверкна открытие ордеров на продажу
  {
   int count=0;

   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            if(OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------

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

 
Игорь:

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

ticket=OrderSend(Symbol(),OP_BUY,lots,Bid,0,0,0,NULL,Magic,0,CLR_NONE);

Buy открывается по цене Ask, Sell - по цене Bid. А у вас?

 
Artyom Trishkin:

Buy открывается по цене Ask, Sell - по цене Bid. А у в

Artyom Trishkin:

Buy открывается по цене Ask, Sell - по цене Bid. А у вас?

Данный косяк подправил (но на работу кода он не повлиял). Вопрос остаётся открытым "Как закрыть позицию при определённом условии, без модификации ордера"?


 
Игорь:
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,clrNONE))

О Боже... Вам сначала нужно азы изучить. Buy закрывается по Bid, Sell закрывается по Ask

 
Artyom Trishkin:

О Боже... Вам сначала нужно азы изучить. Buy закрывается по Bid, Sell закрывается по Ask

Молодой человек. Давайте не будем указывать, что кому надо изучать. Вопрос был поставлен о закрытии позиций. Что касается открытия позиций, да открытие сделок на покупку происходит по  Ask. В тоже время если Вы откроете позицию на покупку по Bid, то программа МТ4 ошибок не выдаст и откроет позицию на покупку.Это значит, что нет чёткой привязки к открытию определённой  позиции к  Ask или Bid, это проверено инкрементальным путём. Что, касается лично Вас, я просмотрел какие вопросы Вы задаёте на форумах. Так что кому надо учится, это вопрос. И последние, если Вы такой спец, покажите это наглядно на данном примере как надо работать в MQL коде. Тогда, многие скажут, что данный человек действительно спец и к нему можно обратится за советами или платными заказами. А взять и нагадить на человека заочно, ума много не надо. Все мы были и будем учениками в какой то сфере деятельности. 

 
Игорь:

Молодой человек. Давайте не будем указывать, что кому надо изучать. Вопрос был поставлен о закрытии позиций. Что касается открытия позиций, да открытие сделок на покупку происходит по  Ask. В тоже время если Вы откроете позицию на покупку по Bid, то программа МТ4 ошибок не выдаст и откроет позицию на покупку.Это значит, что нет чёткой привязки к открытию определённой  позиции к  Ask или Bid, это проверено инкрементальным путём. Что, касается лично Вас, я просмотрел какие вопросы Вы задаёте на форумах. Так что кому надо учится, это вопрос. И последние, если Вы такой спец, покажите это наглядно на данном примере как надо работать в MQL коде. Тогда, многие скажут, что данный человек действительно спец и к нему можно обратится за советами или платными заказами. А взять и нагадить на человека заочно, ума много не надо. Все мы были и будем учениками в какой то сфере деятельности. 

Спасибо за "молодого человека" - классный комплимент. Хоть их мужчинам и не требуется. Разве плохо в 48 выглядеть на 30 - 35 ?

И знаете, всё же прислушайтесь к совету - учите азы (пока даже не программирования на mql), а то, простите, чушь говорите. Где это вы видели открытие Sell по Ask и Buy по Bid ? Покажите - озолочусь. Расскажите пожалуйста что за инкрементальный путь вы используете? Что к чему прибавляете, чтобы добиться открытия Buy по Bid и Sell по Ask, не получая при этом ошибку?

З.Ы. Я уже лет десять вопросов тут не задаю - лишь отвечаю на них. И, тем более, вы говорите о моих вопросах на форумах (да, кстати - ссылочку дайте) - во множественном числе. Так вот - я нахожусь только на этом, и нигде более.

Почитайте сначала вот это (хоть и там тоже есть некоторые недочёты).

Требования и ограничения при проведении торговых операций - Приложения - Учебник по MQL4
Требования и ограничения при проведении торговых операций - Приложения - Учебник по MQL4
  • book.mql4.com
В таблицах указаны расчётные значения, ограничивающие проведение торговых операций при открытии, закрытии, установке, удалении и модификации ордеров. Для получения значения минимальной дистанции StopLevel и дистанции заморозки FreezeLevel необходимо вызвать функцию MarketInfo(). Требования. Правильные цены, используемые при осуществлении...
 
Причина обращения: