Подскажите пожалуйста как написать закрытие всех ордеров при достижении определённого профита ?

 
Т.Е. советник торгует и bay  и sell, Но при достижении общего профита допустим +50$, закрыть всё. Как это написать, подскажите кто знает ? Спасибо.
 
//+----------------------------------------------------------------------------+
//|                                                       e-CloseByProfit.mq4  |
//|                                                    Ким Игорь В. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//|  22.10.2006  Советник закрывает все позиции при достижении заданного       |
//|              уровня профита пунктах.                                       |
//+----------------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"
#define   MAGIC     20061022
 
//------- Внешние параметры советника ------------------------------------------
extern string _P_Expert = "---------- Параметры со�етника";
extern bool   CurSymbolOnly   = True;            // Только текущий символ
extern int    TakeProfit      = 60;              // Тейк
extern bool   ShowComment     = True;            // Показывать комментарий
extern int    NumberAccount   = 0;               // Номер торгового счёта
extern bool   UseSound        = False;           // Использовать звуковой сигнал
extern string NameFileSound   = "expert.wav";    // Наименование звукового файла
extern int    Slippage        = 3;               // Проскальзывание цены
extern int    NumberOfTry     = 5;               // Количество попыток
extern int    PauseAfterError = 75;              // Пауза после ошибки в секундах
 
//------- Глобальные переменные советника --------------------------------------
color clCloseBuy  = Blue;         // Цвет значка закрытия покупки
color clCloseSell = Red;          // Цвет значка закрытия продажи
int   CurProfit;
 
//------- Поключение внешних модулей -------------------------------------------
#include <stdlib.mqh>
 
 
//+----------------------------------------------------------------------------+
//|  expert initialization function                                            |
//+----------------------------------------------------------------------------+
void init() { if (!IsTesting()) Comment(""); }
 
//+----------------------------------------------------------------------------+
//|  expert deinitialization function                                          |
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting()) Comment(""); }
 
//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void start() {
  if (!IsTesting()) {
    if (NumberAccount>0 && NumberAccount!=AccountNumber()) {
      Message("ЗАПРЕЩЕНА торговля на счёте "+AccountNumber());
      return;
    } else Comment("");
  }
 
  if (TakeProfit>0) CloseByProfit();
  if (ShowComment) {
    Comment("Текущий профит=",CurProfit," п.",
            "  Профит закрытия=",TakeProfit," п."
            );
  }
}
 
 
//+----------------------------------------------------------------------------+
//|  Закрытие всех позиций по рыночной цене                                    |
//+----------------------------------------------------------------------------+
void CloseAllPositions() {
  bool   fc;
  double pp;
  int    err, i, it, k=OrdersTotal();
 
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (!CurSymbolOnly || OrderSymbol()==Symbol()) {
        fc=False;
        for (it=1; it<=NumberOfTry; it++) {
          while (!IsTradeAllowed()) Sleep(5000);
          RefreshRates();
          if (OrderType()==OP_BUY) {
            pp=MarketInfo(OrderSymbol(), MODE_BID);
            fc=OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
            if (fc) {
              if (UseSound) PlaySound(NameFileSound); break;
            } else {
              err=GetLastError();
              Print("Error(",err,") closing buy: ",ErrorDescription(err),", try ",it);
              Sleep(1000*PauseAfterError);
            }
          }
          if (OrderType()==OP_SELL) {
            pp=MarketInfo(OrderSymbol(), MODE_ASK);
            fc=OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
            if (fc) {
              if (UseSound) PlaySound(NameFileSound); break;
            } else {
              err=GetLastError();
              Print("Error(",err,") closing sell: ",ErrorDescription(err),", try ",it);
              Sleep(1000*PauseAfterError);
            }
          }
        }
      }
    }
  }
}
 
//+----------------------------------------------------------------------------+
//|  Закрытие всех позиций по профиту.                                         |
//+----------------------------------------------------------------------------+
void CloseByProfit() {
  double p;
  int    i, k=OrdersTotal(), pr=0;
 
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (!CurSymbolOnly || OrderSymbol()==Symbol()) {
        p=MarketInfo(OrderSymbol(), MODE_POINT);
        if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
        if (OrderType()==OP_BUY) {
          pr+=NormalizeDouble((OrderClosePrice()-OrderOpenPrice())/p, 0);
        }
        if (OrderType()==OP_SELL) {
          pr+=NormalizeDouble((OrderOpenPrice()-OrderClosePrice())/p, 0);
        }
      }
    }
  }
  CurProfit=pr;
  if (CurProfit>=TakeProfit) CloseAllPositions();
}
 
//+----------------------------------------------------------------------------+
//|  Вывод сообщения в коммент и в журнал                                      |
//+----------------------------------------------------------------------------+
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+
 

Kim4, интересно почему вы при закрытии по рыночной цене делаете обратный проход а по профиту прямой?

 
Loky:

Kim4, интересно почему вы при закрытии по рыночной цене делаете обратный проход а по профиту прямой?

Потому что процесс закрытия изменяет значение, возвращаемое функцией OrdersTotal(). Каждое удавшееся закрытие уменьшает значение функции OrdersTotal() на единицу. Поэтому обычное закрытие прямым проходом закроет позы через одну. Но это не значит, что нельзя закрывать прямым проходом. Можно. Но вот так:
int i, k=OrdersTotal();
 
for (i=0; i<k; i++) {
  if (OrderSelect(0, SELECT_BY_POS, MODE_TRADES)) {
    ...
    OrderClose(...);
  }
}
В принципе закрывать все позы можно и так:
while (OrdersTotal()>0) {
  if (OrderSelect(0, SELECT_BY_POS, MODE_TRADES)) {
    ...
    OrderClose(...);
  }
}
 
Закрывать ордера нужно не в списочном порядке, а в соответствии с торговыми критериями в порядке приоритета.
Например, если нужно закрыть все ордера, то сначала нужно закрыть рыночные. Если есть встречные, то сначала нужно закрыть встречные.
Потом, среди однонаправленных ордеров сначала закрыть самые тяжёлые (имеющие большее количество лотов), если есть несколько орероров одинакового веса, то выбрать другой критерий, например, близость StopLoss и т.д., критериев приоритета может быть много.
Потом - отложенные, тоже в порядке приоритета.
Всё это проделывать удобнее, если реализован Учёт ордеров в большой программе.
 
SK. писал (а):
Закрывать ордера нужно не в списочном порядке, а в соответствии с торговыми критериями в порядке приоритета.
Например, если нужно закрыть все ордера, то сначала нужно закрыть рыночные. Если есть встречные, то сначала нужно закрыть встречные.
Потом, среди однонаправленных ордеров сначала закрыть самые тяжёлые (имеющие большее количество лотов), если есть несколько орероров одинакового веса, то выбрать другой критерий, например, близость StopLoss и т.д., критериев приоритета может быть много.
Потом - отложенные, тоже в порядке приоритета.
Всё это проделывать удобнее, если реализован Учёт ордеров в большой программе.

Когда трейдер торгует руками именно так он и делает
кроет КРУПНЫЕ лоты потом мелкие
и чаще если кроет группу начинает с тех которые ближе к цене

потому и программно логично именно в этом порядке формировать закрытие группы ордеров
 

Добрый вечер!

Уважаемый KimIV? ,

Если не сложно: Как можно, сделать так, что-бы ваш советник закрывал, именно, все ордера. В том числе и отложенные.

Если услуга платная, то как, куда, и сколько?

Если возможно в качестве взаимопомощи, скажу огромное спасибо!

Ваш Советник замечательный, но в силу особенностей моей системы, нужно именно закрытие ВСЕХ ордеров. Т.е. полное. Что-бы мой советник начал торговлю с 0.

Заранее Огромное спасибо.!

 
Paha:

Как можно, сделать так, что-бы ваш советник закрывал, именно, все ордера. В том числе и отложенные.

После блока условия:

if (OrderType()==OP_SELL) {
  ...
}

вставьте:

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

Спасибо огромное.

Просто очень ВЫРУЧИЛИ.

Еще раз спасибо!

 
Paha:

Спасибо огромное.

Просто очень ВЫРУЧИЛИ.

Еще раз спасибо!



Добавьте, пожалуйска, в этот советник условие открытия позиции по пересечению средней

Цена пересекла вверх среднюю на графике EURUSD

Открываем BUY EURUSD и сразу же BUY USDCHF

при общем профите в N пунктов выходим

 
А если нужно закрыть не все. допустим 4 ордера пара бай и пара селл. Допустим пара бай вышла в профит на заданную мной прибыли.И нужно закрыть Все бай и оставить. Селл ордера как выразить в коде плиз помогите голову уже сломал. 
Причина обращения: