взгянул беглым взгядом, правильно что функции КИМа используете, но вот в строчке
ClosePosBySizeProfitInCurrency(StringUpper(symbol), Operation, MagicNumber, Profit);
может я и не разобрался, но где условие что это профит ?
Может кто наблюдательнее, код автора ветки
//+----------------------------------------------------------------------------+ //| e-CloseByProfitPosInCurrency.mq4 | //| | //| Ким Игорь В. aka KimIV | //| http://www.kimiv.ru | //| | //| 22.04.2008 Советник закрывает только те позиции, у которых профит | //| в валюте депозита превысил некоторое заданное значение. | //+----------------------------------------------------------------------------+ #property copyright "Ким Игорь В. aka KimIV" #property link "http://www.kimiv.ru" //------- Внешние параметры советника -----------------------------------------+ string _P_Expert = "---------- Параметры советника"; extern int NumberAccount = 0; // Номер торгового счёта extern string symbol = ""; // Торговый инструмент // "" - любой // "0" - текущий extern int Operation = -1; // Торговая операция: // -1 - любая // 0 - OP_BUY // 1 - OP_SELL extern double Profit = 50; // Профит в валюте депозита extern int MagicNumber = 0; // MagicNumber extern bool ShowComment = True; // Показывать комментарий //------- Глобальные переменные советника -------------------------------------+ bool gbNoInit = False; // Флаг неудачной инициализации int Slippage = 3; // Проскальзывание цены int NumberOfTry = 5; // Количество торговых попыток bool UseSound = True; // Использовать звуковой сигнал string NameFileSound = "expert.wav"; // Наименование звукового файла color clCloseBuy = Blue; // Цвет значка закрытия покупки color clCloseSell = Red; // Цвет значка закрытия продажи //------- Подключение внешних модулей -----------------------------------------+ #include <stdlib.mqh> // Стандартная библиотека //+----------------------------------------------------------------------------+ //| | //| ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ | //| | //+----------------------------------------------------------------------------+ //| expert initialization function | //+----------------------------------------------------------------------------+ void init() { gbNoInit = False; if(!IsTradeAllowed()) { Message("Для нормальной работы советника необходимо\n"+ "Разрешить советнику торговать"); gbNoInit=True; return; } if(!IsLibrariesAllowed()) { Message("Для нормальной работы советника необходимо\n"+ "Разрешить импорт из внешних экспертов"); gbNoInit=True; return; } if(Operation<-1 || Operation>1) { Message("Недопустимое значение внешнего параметра Operation"); gbNoInit=True; return; } if(symbol!="0" && symbol!="") { if(MarketInfo(StringUpper(symbol), MODE_BID)==0) { Message("В обзоре рынка отсутствует символ "+symbol); gbNoInit=True; return; } } if(!IsTesting()) { if(IsExpertEnabled()) Message("Советник будет запущен следующим тиком"); else Message("Отжата кнопка \"Разрешить запуск советников\""); } } //+----------------------------------------------------------------------------+ //| expert deinitialization function | //+----------------------------------------------------------------------------+ void deinit() { if(!IsTesting()) Comment(""); } //+----------------------------------------------------------------------------+ //| expert start function | //+----------------------------------------------------------------------------+ void start() { if(gbNoInit) { Comment("Не удалось инициализировать советник!"); return; } if(!IsTesting()) { if(NumberAccount>0 && NumberAccount!=AccountNumber()) { Comment("Работа на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!"); return; } else Comment(""); if(ShowComment) { string st="NumberAccount="+DoubleToStr(NumberAccount, 0) +" Symbol="+IIFs(symbol=="0", "All", IIFs(symbol=="", Symbol(), StringUpper(symbol))) +" Operation="+IIFs(Operation<0, "All", GetNameOP(Operation)) +" Profit="+DoubleToStr(Profit, 2)+" "+AccountCurrency() +" MagicNumber="+DoubleToStr(MagicNumber, 0) +IIFs(ShowComment, " ShowComment", "") ; Comment(st); } else Comment(""); } ClosePosBySizeProfitInCurrency(StringUpper(symbol), Operation, MagicNumber, Profit); } //+----------------------------------------------------------------------------+ //| | //| ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ | //| | //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание: Закрытие одной предварительно выбранной позиции | //+----------------------------------------------------------------------------+ void ClosePosBySelect() { bool fc; color clClose; double ll, pa, pb, pp; int err, it; if(OrderType()==OP_BUY || OrderType()==OP_SELL) { for(it=1; it<=NumberOfTry; it++) { if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; while(!IsTradeAllowed()) Sleep(5000); RefreshRates(); pa=MarketInfo(OrderSymbol(), MODE_ASK); pb=MarketInfo(OrderSymbol(), MODE_BID); if(OrderType()==OP_BUY) { pp=pb; clClose=clCloseBuy; } else { pp=pa; clClose=clCloseSell; } ll=OrderLots(); fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose); if(fc) { if(UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); if(err==146) while(IsTradeContextBusy()) Sleep(1000*11); Print("Error(",err,") Close ",GetNameOP(OrderType())," ", ErrorDescription(err),", try ",it); Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp); Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(), " tp=",OrderTakeProfit()," mn=",OrderMagicNumber()); Sleep(1000*5); } } } else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType())); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Закрытие тех позиций, у которых профит в валюте депозита | //| превысил некоторое значение | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //| pr - профит | //+----------------------------------------------------------------------------+ void ClosePosBySizeProfitInCurrency(string sy="", int op=-1, int mn=-1, double pr=0) { int i, k=OrdersTotal(); if(sy=="0") sy=Symbol(); for(i=k-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(mn<0 || OrderMagicNumber()==mn) { if(OrderProfit()+OrderSwap()>pr) ClosePosBySelect(); } } } } } } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 01.09.2005 | //| Описание : Возвращает наименование торговой операции | //+----------------------------------------------------------------------------+ //| Параметры: | //| op - идентификатор торговой операции | //+----------------------------------------------------------------------------+ string GetNameOP(int op) { switch(op) { case OP_BUY : return("Buy"); case OP_SELL : return("Sell"); case OP_BUYLIMIT : return("Buy Limit"); case OP_SELLLIMIT: return("Sell Limit"); case OP_BUYSTOP : return("Buy Stop"); case OP_SELLSTOP : return("Sell Stop"); default : return("Unknown Operation"); } } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 01.02.2008 | //| Описание : Возвращает одно из двух значений взависимости от условия. | //+----------------------------------------------------------------------------+ string IIFs(bool condition, string ifTrue, string ifFalse) { if(condition) return(ifTrue); else return(ifFalse); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 01.09.2005 | //| Описание : Вывод сообщения в коммент и в журнал | //+----------------------------------------------------------------------------+ //| Параметры: | //| m - текст сообщения | //+----------------------------------------------------------------------------+ void Message(string m) { Comment(m); if(StringLen(m)>0) Print(m); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 01.09.2005 | //| Описание : Возвращает строку в ВЕРХНЕМ регистре | //+----------------------------------------------------------------------------+ string StringUpper(string s) { int c, i, k=StringLen(s), n; for(i=0; i<k; i++) { n=0; c=StringGetChar(s, i); if(c>96 && c<123) n=c-32; // a-z -> A-Z if(c>223 && c<256) n=c-32; // а-я -> А-Я if(c==184) n=168; // ё -> Ё if(n>0) s=StringSetChar(s, i, n); } return(s); } //+----------------------------------------------------------------------------+ //+------------------------------------------------------------------+
Коллеги, привет. Помогите доработать советника e-CloseByProfitPosInCurrency. Советник не учитывает комиссию по каждому отдельному ордеру, поэтому закрывает ордер в минус
if(OrderProfit()+ OrderCommission() + OrderSwap()>pr)
А подскажите пожалйуста, в какую строчку нужно то вставить? Я еще тот проограммист
сейчас вставлю и выложу сюда.
добавил сюда - смотрите, если также порой минуса будут проскакивать - то надо домножить на 2.
т.е. добавить (заменить) в строку подсвечено синим не одну - но две комиссии - хотя вроде раньше на форексе у брокеров - считаласьт одна комиссия - смотреть торговые условия и спецификацию
контрактов и торгуемых символов на Вашем типе счета у вашего брокера:
+OrderCommission()*2 - в центре условия
сейчас вставлю и выложу сюда.
добавил сюда - смотрите, если также порой минуса будут проскакивать - то надо домножить на 2.
т.е. добавить (заменить) в строку подсвечено синим не одну - но две комиссии - хотя вроде раньше на форексе у брокеров - считаласьт одна комиссия - смотреть торговые условия и спецификацию
контрактов и торгуемых символов на Вашем типе счета у вашего брокера:
+OrderCommission()*2 - в центре условия
Роман, огромное спасибо. Все работает. Проверил у брокера Gerchik&Co. Жму руку!!!!

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