Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поиск в документации доступен через MetaTrader 5. Ищи и изучай!
vitali-attila
27
vitali-attila 2013.11.25 17:25 

Здравствуйте, уважаемые трейдеры. Надеюсь, что пишу в правильной ветке. Так, вот требуется написать функцию, которая бы при определенном условии закрывала ордера на покупку либо продажу, в зависимости от условия. Причем закрывать надо ордера только по ОДНОЙ валютной паре, т.е. по той, на которой работает данный советник.  Не важно, будет ли функция закрывать все ордера, или только открытые. Главное, чтобы это происходило только с одной данной валютой.
Надеюсь, вы поняли, что мне надо. Если что-то следует уточнить, пишите. Жду вашего отклика, коллеги.

Maxim Bondarchuk
9726
Maxim Bondarchuk 2013.11.25 18:10  
void OrdersClose(int type=-1)
{
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol() && (type==-1 || type==OrderType())
      {
         OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),100,CLR_NONE);
      }
   }  
}

Что-то наподобие этого.

Вызов OrdersClose(OP_BUY) - закроет ордера на покупку, OrdersClose(OP_SELL) - закроет ордера на продажу, OrdersClose() - закроет ордера любого типа.

100 - размер проскальзывания, можно уменьшить в случае необходимости 

Естественно если у Вас в советнике есть отложенные ордера или же требуется проверка закрытия, то алгоритм требует модификации...

vitali-attila
27
vitali-attila 2013.11.26 17:24  
belkamax05:

Что-то наподобие этого.

Вызов OrdersClose(OP_BUY) - закроет ордера на покупку, OrdersClose(OP_SELL) - закроет ордера на продажу, OrdersClose() - закроет ордера любого типа.

100 - размер проскальзывания, можно уменьшить в случае необходимости 

Естественно если у Вас в советнике есть отложенные ордера или же требуется проверка закрытия, то алгоритм требует модификации...

Спасибо за помощь.  А упоминая OrdersClose(OP_BUY) и OrdersClose(OP_SELL) вы говорили и про эту функцию или про отдельное их использование?
Maxim Bondarchuk
9726
Maxim Bondarchuk 2013.11.27 00:32  

OrdersClose(OP_BUY) и OrdersClose(OP_SELL) 

это вызов определенной выше функции. То есть там где Вам нужно вызывать в коде, вы вызываете OrdersClose с нужным вам аргументом. Либо на бай, либо на селл. 

vitali-attila
27
vitali-attila 2013.11.27 16:32  
belkamax05:

OrdersClose(OP_BUY) и OrdersClose(OP_SELL) 

это вызов определенной выше функции. То есть там где Вам нужно вызывать в коде, вы вызываете OrdersClose с нужным вам аргументом. Либо на бай, либо на селл. 

Не совсем понял. Вы имеете ввиду замену описания функции void OrdersClose(int type=-1) на void OrdersClose(OP_BUY)void или OrdersClose(OP_SELL)? И что обозначает type? Зачем писать его значение равным -1 ? 

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

int start()

{

bool   Result;

int    i,Pos,Error,Total;

//----

  Total=OrdersTotal();

  if(Total>0)

  {

     for(i=Total-1; i>=0; i--) 

     {

        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true &&

           OrderSymbol()==Symbol() && 

           OrderType()==OP_BUY)  // Только Buy

        {

           Result=OrderClose(OrderTicket(),

                             OrderLots(),

                             MarketInfo(Symbol(),MODE_BID),

                             Slippage,

                             CLR_NONE);

           if(Result!=true) 

           { 

              Error=GetLastError(); 

              Alert("CloseBuy LastError = ",Error); 

           }

           else Error=0;

        }

     }

  }

  return(0);

}

 Надо добавить туда возможность закрытия только своих ордеров и ещё чтобы, при достижении профита скажем в 30 пунктов, тейкрофит/трейлинг стоп передвигался. Кстати, вы не знаете есть ли код для трейлинг стопа в языке MQL 4?

Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
Операции с графиками / ChartOpen - Документация по MQL5
Maxim Bondarchuk
9726
Maxim Bondarchuk 2013.11.28 07:32  

Не совсем понял. Вы имеете ввиду замену описания функции void OrdersClose(int type=-1) на void OrdersClose(OP_BUY)void или OrdersClose(OP_SELL)? И что обозначает type? Зачем писать его значение равным -1 ? 

Вопрос, зачем Вы беретесь за программирование, если ничего в этом не смыслите?

void OrdersClose(int type=-1) - это определение функции, и текст ниже (внутри фигурных скобок), это само описание того что функция будет делать.

OrdersClose(OP_BUY)void или OrdersClose(OP_SELL) уже пишется без void, void служит именно для определения, во время вызова Вам не нужно этого писать. OP_BUY и OP_SELL это то, какие ордера будут закрываться, на покупку либо продажу. А "-1" – это параметр по умолчанию, OP_BUY (константа) = 0, OP_SELL (константа) = 1, и вызывая функцию с тем или иным параметром, мы указываем, что она должна закрыть ТОЛЬКО ПОКУПКУ или ТОЛЬКО ПРОДАЖУ, когда же Вы вызовите без параметра (по умолчанию будет передано -1), то функция закроет все ордера

 

Кстати, вы не знаете есть ли код для трейлинг стопа в языке MQL 4?

Есть, но это такие же функции, как и написанный выше OrdersClose, который написан людьми и его написание может отличаться.

 

Если Вам этот код нужен для работы, то напишите в сервисе работа задание. Некоторые программисты сделают работу за Вас с не очень высокой стоимостью, а так Вы только потратите время, и топик будет сводиться к виду "Народ, помогите исправить код советника, в целом работает правильно, но есть некоторые недоработки." Лучше пускай уже кто-то проделает сразу всю работу от начала до конца.

Документация по MQL5: Основы языка / Функции
Документация по MQL5: Основы языка / Функции
  • www.mql5.com
Основы языка / Функции - Документация по MQL5
vitali-attila
27
vitali-attila 2013.11.28 15:04  
Я понял вашу идею. :) Но в программировании я все таки что-то понимаю. Я спросил, для чего нужна переменная int type. Спасибо за помощь.
Maxim Bondarchuk
9726
Maxim Bondarchuk 2013.11.28 23:29  
Не за что. 
Dmytro Zelenskyy
3861
Dmytro Zelenskyy 2013.12.12 17:25  
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),100,CLR_NONE);

Добрый день!
Не смог найти в инете или плохо искал. Часто вижу такую форму, когда вместо Ask или Bid используется OrderClosePrice(). Насколько это корректно?
Maxim Bondarchuk
9726
Maxim Bondarchuk 2014.09.08 11:14  
progman:
Для выбранного ордера OrderClosePrice() равно цене закрытия самого ордера (цена закрытия покупки = Bid, цена закрытия продажи = Ask). Т.е. на столько же корректно, на сколько и Ask, Bid. Главное что бы ордер был выбран заранее при помощи OrderSelect.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий