Возможно ли ограничить Equity? - страница 2

 

Вернее так

If (NormalizeDouble((AccountMargin()/AccountEquity()),1)>0,5)

 
Удалить все отложенные ордеры можно так:
    LastOrder = OrdersTotal()-1;
    if (LastOrder >= 0) {
      for(i=LastOrder;i>=0;i--) {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
        if (OrderType() > OP_SELL) OrderDelete(OrderTicket());
      }
    }
Но это код для тестера, желательно паузы ещё предусмотреть. Нужно добавить условие по Equity и условие "ордер, который должен открыться".
 
lna01:
Удалить все отложенные ордеры можно так:
    LastOrder = OrdersTotal()-1;
    if (LastOrder >= 0) {
      for(i=LastOrder;i>=0;i--) {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
        if (OrderType() > OP_SELL) OrderDelete(OrderTicket());
      }
    }
Но это код для тестера, желательно паузы ещё предусмотреть. Нужно добавить условие по Equity и условие "ордер, который должен открыться".


if (OrderType() > OP_SELL) OrderDelete(OrderTicket());

так он мне удалит все отложенные ордера?

 
SergeyKa:
lna01:
Удалить все отложенные ордеры можно так:
    LastOrder = OrdersTotal()-1;
    if (LastOrder >= 0) {
      for(i=LastOrder;i>=0;i--) {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
        if (OrderType() > OP_SELL) OrderDelete(OrderTicket());
      }
    }
Но это код для тестера, желательно паузы ещё предусмотреть. Нужно добавить условие по Equity и условие "ордер, который должен открыться".


if (OrderType() > OP_SELL) OrderDelete(OrderTicket());

так он мне удалит все отложенные ордера?


Рекомендую проверить на демо-счёте. Пауза делается функцией sleep(...), величину нужно подобрать.
 
lna01:
SergeyKa:
lna01:
Удалить все отложенные ордеры можно так:
    LastOrder = OrdersTotal()-1;
    if (LastOrder >= 0) {
      for(i=LastOrder;i>=0;i--) {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
        if (OrderType() > OP_SELL) OrderDelete(OrderTicket());
      }
    }
Но это код для тестера, желательно паузы ещё предусмотреть. Нужно добавить условие по Equity и условие "ордер, который должен открыться".


if (OrderType() > OP_SELL) OrderDelete(OrderTicket());

так он мне удалит все отложенные ордера?


Рекомендую проверить на демо-счёте. Пауза делается функцией sleep(...), величину нужно подобрать.
нужно чтобы удалился только один - тот что должен сработать
 
SergeyKa:
нужно чтобы удалился только один - тот что должен сработать

Рассчитайте заранее, каким будет Equity если цена дойдёт до отложенника. И если она будет меньше нормы, удаляйте. Понятие заранее определите для себя сами, то ли за 10 пунктов до цены, то ли при установке ордере, одним словом по вкусу. Смотрите только, чтобы не опоздать.

P.S. для некоторых инструментов это может оказаться непростой задачей. Можно подойти к делу упрощённо. В тот цикл добавить такую логику:

- Если расстояние до цены открытия меньше n пунктов проверяем Equity

- Если Equity меньше нормы снимаем ордер.

 
Спасибо большое!
 
Ну должны же люди помогать друг другу :). Только теперь if (OrderType() > OP_SELL) будет недостаточно, придётся отдельно работать с Buy и Sell, поскольку в одном случае нужно использовать Ask а в другом Bid.
 
SergeyKa:
if (OrderType() > OP_SELL) OrderDelete(OrderTicket());

так он мне удалит все отложенные ордера?


Нет, OrderDelete удалит лишь один ордер, выбранный до того функцией OrderSelect(). Как прошагать по всем ордерам, смотрите на форуме здесь, функции Игоря Ким (KimIV). Оттуда собственно код удаления, должен быть внутри цикла по ордерам:

if (OrderType()==OP_BUYLIMIT
||  OrderType()==OP_BUYSTOP
||  OrderType()==OP_SELLLIMIT
||  OrderType()==OP_SELLSTOP)
{
  OrderDelete(OrderTicket());
}
 
chv:

Нет, OrderDelete удалит лишь один ордер, выбранный до того функцией OrderSelect()

Нет, OrderDelete() удалит ордер с тикетом, переданным ему в качестве параметра. Если, конечно, таковой имеется в списке отложенных. До того ничего такого не надо.