- Как закрыть все ордера по общему профиту в пунктах?
- Интересная техника торговли.
- Советник для закрытия ордеров по профиту
//+----------------------------------------------------------------------------+ //| 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, интересно почему вы при закрытии по рыночной цене делаете обратный проход а по профиту прямой?
Kim4, интересно почему вы при закрытии по рыночной цене делаете обратный проход а по профиту прямой?
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 и т.д., критериев приоритета может быть много.
Потом - отложенные, тоже в порядке приоритета.
Всё это проделывать удобнее, если реализован Учёт ордеров в большой программе.
Закрывать ордера нужно не в списочном порядке, а в соответствии с торговыми критериями в порядке приоритета.
Например, если нужно закрыть все ордера, то сначала нужно закрыть рыночные. Если есть встречные, то сначала нужно закрыть встречные.
Потом, среди однонаправленных ордеров сначала закрыть самые тяжёлые (имеющие большее количество лотов), если есть несколько орероров одинакового веса, то выбрать другой критерий, например, близость StopLoss и т.д., критериев приоритета может быть много.
Потом - отложенные, тоже в порядке приоритета.
Всё это проделывать удобнее, если реализован Учёт ордеров в большой программе.
Когда трейдер торгует руками именно так он и делает
кроет КРУПНЫЕ лоты потом мелкие
и чаще если кроет группу начинает с тех которые ближе к цене
потому и программно логично именно в этом порядке формировать закрытие группы ордеров
Добрый вечер!
Уважаемый KimIV? ,
Если не сложно: Как можно, сделать так, что-бы ваш советник закрывал, именно, все ордера. В том числе и отложенные.
Если услуга платная, то как, куда, и сколько?
Если возможно в качестве взаимопомощи, скажу огромное спасибо!
Ваш Советник замечательный, но в силу особенностей моей системы, нужно именно закрытие ВСЕХ ордеров. Т.е. полное. Что-бы мой советник начал торговлю с 0.
Заранее Огромное спасибо.!
Как можно, сделать так, что-бы ваш советник закрывал, именно, все ордера. В том числе и отложенные.
После блока условия:
if (OrderType()==OP_SELL) { ... }
вставьте:
if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP) { OrderDelete(OrderTicket()); }
Спасибо огромное.
Просто очень ВЫРУЧИЛИ.
Еще раз спасибо!

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования