Опросы | Регистрация |  | Чат | Поиск | Статистика | 1.0 | Сайт ТВ
Радио Бингуру
🔊
Выбрать
Готово
Форекс BINGURU FORUM / Форекс /  
 

Советник по закрытию отложенных ордеров

 
Автор | Дата:   
Подскажите советник (или хотя бы как его создать, попробую через GPT создать), чтобы автоматически убирались отложенные ордера при активации одного из ордеров.
Например у меня три отложенных ордера: Eurjpy, gbpjpy, audjpy, и когда один из них активируется, все остальные удаляются, например активируется eurjpy, то gbpjpy, audjpy автоматически удаляться.

Автор | Дата:   
#include <Trade\Trade.mqh>
CTrade trade;

void OnTick()
{

double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);

if (balance != equity) {

DeLeteAllPendingOrders();
}
}

void DeLeteAllPendingOrders()
{

for (int i=OrdersTotal()-1; i>=0; i--) {

ulong ticket = OrderGetTicket(i);

trade.OrderDelete(ticket);
}
}


Фигурные скобки экранирует выше, вот чистый код, но без отступов:


#include <Trade\Trade.mqh>
CTrade trade;

void OnTick()
{

double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);

if (balance != equity) {

DeLeteAllPendingOrders();
}
}

void DeLeteAllPendingOrders()
{

for (int i=OrdersTotal()-1; i>=0; i--) {

ulong ticket = OrderGetTicket(i);

trade.OrderDelete(ticket);
}
}


@ndr
Там выше экранирует фигурные скобки, баг тега [code]...

Автор | Дата:   
Попробуй код выше.

Там все просто в плане закрытия отложек.

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

Автор | Дата:   
Risky:
есть простой вариант, который видел у другого человека. Он просто сравнивает баланс и эквити
Оригинал
Мне кажется, есть вариант получше, можно через PositionsTotal() отслеживать изменение количества открытых позиций

Ещё можно для оптимизации вместо OnTick() использовать обработчик, который активируется при любом изменении в позициях, это скорее всего OnTrade(), либо же OnTradeTransaction(), точно не помню

К тому же OnTick() вроде срабатывает только при наступлении нового тика на том графике, к которому привязан советник, поэтому лучше OnTrade()

Автор | Дата:   
LegendaryNoname:
PositionsTotal()
Оригинал
Кстати, да. Чет я тупанул. Тогда проще:

#include <Trade\Trade.mqh>
CTrade trade;

void OnTick()
{

if (PositionsTotal() > 0) {

DeLeteAllPendingOrders();
}
}

void DeLeteAllPendingOrders()
{

for (int i=OrdersTotal()-1; i>=0; i--) {

ulong ticket = OrderGetTicket(i);

trade.OrderDelete(ticket);
}
}

Автор | Дата:   
Risky

А зачем удалять лимитки, если количество позиций больше 0? Давай флаг сделаем, чтобы делать это только при изменении количества позиций. Проверь плиз, правильно ли я добавил пару строк:

#include &lt;Trade&#92;Trade.mqh&gt;
CTrade trade;

int PositionsCurrent = -1;

void OnTick()
{

if (PositionsTotal() != PositionsCurrent) {

DeLeteAllPendingOrders();
PositionsCurrent = PositionsTotal();
}
}

void DeLeteAllPendingOrders()
{

for (int i=OrdersTotal()-1; i&gt;=0; i--) {

ulong ticket = OrderGetTicket(i);

trade.OrderDelete(ticket);
}
}

Автор | Дата:   
LegendaryNoname:
OnTrade()
Оригинал
Да, я тоже через это хотел сначала. Но просто скинул по-быстрому самый простой вариант, который тоже работает. Но надо через OnTrade переделать...

Автор | Дата:   
LegendaryNoname:
А зачем удалять лимитки, если количество позиций больше 0?
Оригинал
Верно. Надо все через OnTrade сделать, чуть позже скину...

Автор | Дата:   
Risky:
Надо все через OnTrade сделать, чуть позже скину...
Оригинал
Ну вот, сделал, как-то так. В целом работает, завтра проверю еще один нюанс:



#include <Trade\Trade.mqh>
CTrade trade;

datetime lastTradeTime = 0;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OnInit()
{

lastTradeTime = TimeCurrent();

return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTrade()
{

if(!HistorySelect(0, TimeCurrent()))
{
Print(«HistorySelect() failed. Error », GetLastError());
return;
}

int historyTotal = HistoryOrdersTotal();

if(historyTotal > 0)
{

for(int i=historyTotal-1; i>=0; i--)
{

ulong ticket = HistoryOrderGetTicket(i);

if(HistoryOrderSelect(ticket))
{
ENUM_ORDER_TYPE order_type = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(ticket, ORDER_TYPE);
ENUM_ORDER_STATE state = (ENUM_ORDER_STATE)HistoryOrderGetInteger(ticket, ORDER_STATE);
datetime timeDone = (datetime)HistoryOrderGetInteger(ticket, ORDER_TIME_DONE);

if(state == ORDER_STATE_FILLED)
{
if(order_type == ORDER_TYPE_BUY_STOP ||
order_type == ORDER_TYPE_SELL_STOP ||
order_type == ORDER_TYPE_BUY_LIMIT ||
order_type == ORDER_TYPE_SELL_LIMIT)
{

if(timeDone > lastTradeTime)
{

lastTradeTime = timeDone;
DeLeteAllPendingOrders();

return;
}
}
}
}

}
}
}

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DeLeteAllPendingOrders()
{

for(int i=OrdersTotal()-1; i>=0; i--)
{

ulong ticket = OrderGetTicket(i);

trade.OrderDelete(ticket);
}
}
//+------------------------------------------------------------------+



P.S. Ну и еще надо учитывать, что тут двойные ковычки ('') заменяются на фигурные скобки («)...

Форекс BINGURU FORUM / Форекс /
 Советник по закрытию отложенных ордеров

Ваш ответ Нажмите эту иконку для возврата на цитируемое сообщение

 

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

 

Майоры: У терминала - 2
Трейдят - 3 [ q2538, MrCvokka, DrJam_008 ]
В окопе: 48 []
У терминала - 42 / Трейдят - 6
© 2025 Binguru Forum Engine. All rights reserved.
 


  ⇑