Доработка советника e-CloseByProfitPosInCurrency

 
Коллеги, привет. Помогите доработать советника e-CloseByProfitPosInCurrency. Советник не учитывает комиссию по каждому отдельному ордеру, поэтому закрывает ордер в минус
Файлы:
 

взгянул беглым взгядом, правильно что функции КИМа используете, но вот в строчке

   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);
  }
//+----------------------------------------------------------------------------+

//+------------------------------------------------------------------+
 
Evgenii Kasimov:
Коллеги, привет. Помогите доработать советника e-CloseByProfitPosInCurrency. Советник не учитывает комиссию по каждому отдельному ордеру, поэтому закрывает ордер в минус

По памяти с телефона добавьте в это условие
 if(OrderProfit()+ OrderCommission() + OrderSwap()>pr)

 
Roman Shiredchenko #:

По памяти с телефона добавьте в это условие

только в большинстве случаев +OrderCommission()*2 

комиссия начисляется дважды - при открытии и при закрытии, и если полагать что при закрытии примерно равна открытию то всё Ok 

 
Maxim Kuznetsov #:

только в большинстве случаев +OrderCommission()*2 

комиссия начисляется дважды - при открытии и при закрытии, и если полагать что при закрытии примерно равна открытию то всё Ok 

да - проверил - спс. там две s:

OrderCommission();

 
Roman Shiredchenko #:

По памяти с телефона добавьте в это условие

А подскажите пожалйуста, в какую строчку нужно то вставить? Я еще тот проограммист

 
Evgenii Kasimov #:

А подскажите пожалйуста, в какую строчку нужно то вставить? Я еще тот проограммист

сейчас вставлю и выложу сюда.

добавил сюда - смотрите, если также порой минуса будут проскакивать - то надо домножить на 2.

т.е. добавить (заменить) в строку подсвечено синим не одну - но две комиссии - хотя вроде раньше на форексе у брокеров - считаласьт одна комиссия - смотреть торговые условия и спецификацию

контрактов и торгуемых символов на Вашем типе счета у вашего брокера:

+OrderCommission()*2 - в центре условия


Файлы:
 
Roman Shiredchenko #:

сейчас вставлю и выложу сюда.

добавил сюда - смотрите, если также порой минуса будут проскакивать - то надо домножить на 2.

т.е. добавить (заменить) в строку подсвечено синим не одну - но две комиссии - хотя вроде раньше на форексе у брокеров - считаласьт одна комиссия - смотреть торговые условия и спецификацию

контрактов и торгуемых символов на Вашем типе счета у вашего брокера:

+OrderCommission()*2 - в центре условия


Роман, огромное спасибо. Все работает. Проверил у брокера Gerchik&Co. Жму руку!!!!

 
Не пришлось дописывать   +OrderCommission()*2
 
Evgenii Kasimov #:
Не пришлось дописывать   +OrderCommission()*2

Всё правильно, комиссия*2 это для МТ5. у вас код МТ4 там комиссия один раз берется при открытии.

Причина обращения: