Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Посмотри на Топ сигналов MetaTrader 5. Выбери лучший и подпишись!
MIKHAIL KOUDRIAVTSEV
22
MIKHAIL KOUDRIAVTSEV 2007.05.06 22:24 
Т.Е. советник торгует и bay  и sell, Но при достижении общего профита допустим +50$, закрыть всё. Как это написать, подскажите кто знает ? Спасибо.
Igor Kim
2758
Igor Kim 2007.05.07 04:01  
//+----------------------------------------------------------------------------+
//|                                                       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 2007.05.07 07:20  

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

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

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

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

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

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

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

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

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

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

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

Igor Kim
2758
Igor Kim 2007.06.27 04:47  
Paha:

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

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

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

вставьте:

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

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

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

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

PanzerNik
485
PanzerNik 2008.04.09 11:38  
Paha:

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

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

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



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

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

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

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

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