Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
MIKHAIL KOUDRIAVTSEV
22
MIKHAIL KOUDRIAVTSEV  
Т.Е. советник торгует и bay  и sell, Но при достижении общего профита допустим +50$, закрыть всё. Как это написать, подскажите кто знает ? Спасибо.
Igor Kim
2741
Igor Kim  
//+----------------------------------------------------------------------------+
//|                                                       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);
}
//+----------------------------------------------------------------------------+
Loky
991
Loky  

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

Igor Kim
2741
Igor Kim  
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(...);
  }
}
Сергей Ковалев
2607
Сергей Ковалев  
Закрывать ордера нужно не в списочном порядке, а в соответствии с торговыми критериями в порядке приоритета.
Например, если нужно закрыть все ордера, то сначала нужно закрыть рыночные. Если есть встречные, то сначала нужно закрыть встречные.
Потом, среди однонаправленных ордеров сначала закрыть самые тяжёлые (имеющие большее количество лотов), если есть несколько орероров одинакового веса, то выбрать другой критерий, например, близость StopLoss и т.д., критериев приоритета может быть много.
Потом - отложенные, тоже в порядке приоритета.
Всё это проделывать удобнее, если реализован Учёт ордеров в большой программе.
Yuriy Zaytsev
15113
Yuriy Zaytsev  
SK. писал (а):
Закрывать ордера нужно не в списочном порядке, а в соответствии с торговыми критериями в порядке приоритета.
Например, если нужно закрыть все ордера, то сначала нужно закрыть рыночные. Если есть встречные, то сначала нужно закрыть встречные.
Потом, среди однонаправленных ордеров сначала закрыть самые тяжёлые (имеющие большее количество лотов), если есть несколько орероров одинакового веса, то выбрать другой критерий, например, близость StopLoss и т.д., критериев приоритета может быть много.
Потом - отложенные, тоже в порядке приоритета.
Всё это проделывать удобнее, если реализован Учёт ордеров в большой программе.

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

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

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

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

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

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

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

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

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

Igor Kim
2741
Igor Kim  
Paha:

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

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

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

вставьте:

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

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

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

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

PanzerNik
485
PanzerNik  
Paha:

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

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

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



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

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

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

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий