0
Я сам этим советником больше не буду заниматься. Просили помочь — я помог.
А стратегия совсем не интересна. Смотрите на сайте :https://cmillion.ru/
Обязательно что-то подберете.И пробуйте писать сами.
avatar

ssg

  • 2 января 2022, 12:51
0
В данном варианте не принципиально.Можно напрямую записать там где расчет тп, стоплосса MarketInfo(NULL,MODE_STOPLEVEL);
Может быть стоит логику советника изменить?
avatar

ssg

  • 2 января 2022, 10:09
0
Часть вторая.Главная функция.


//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int STOPLEVEL=MarketInfo(OrderSymbol(),MODE_STOPLEVEL);
   double OSL,OTP,OOP,StLo,SL,TP;
   double Profit=0,ProfitS=0,ProfitB=0,LB=0,LS=0,NLb=0,NLs=0,price_b=0,price_s=0,OL=0;
   int b=0,s=0,OT=0,OMN=0;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {                                               
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         OMN = OrderMagicNumber();
         if (OrderSymbol() == Symbol())
         {
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            OT = OrderType();
            OL = OrderLots();
            if (OT==OP_BUY)
            {
               price_b = price_b+OOP*OL;
               b++; LB+= OL;
               ProfitB+=OrderProfit()+OrderSwap()+OrderCommission();
            }
            if (OT==OP_SELL)
            {
               price_s = price_s+OOP*OL;
               s++;LS+= OL;
               ProfitS+=OrderProfit()+OrderSwap()+OrderCommission();
            }
         }
      }
   }
   
   Profit=ProfitB+ProfitS;
   /*
   Ниже код задачи который озвучил автор:
   - при достижении максимально допустимого убытка советника      extern double  Loss = -90.0; //Общий убыток $ (=0 откл)
   - все позиции имеющие максимально допустимый убыток на позицию extern double  loss = 10.0;  //При каком убытке в $ закроется убыточная позициия
   - закроются эти позиции
   */
   if(Loss!=0 && Profit<Loss)ClosePosBySizeLossInCurrency(Symbol(),-1,Magic,loss);// в такой записи закроются все позиции в терминале у которых убыток 
                                                                                  //в валюте депозита превысил некоторое значение но только текущего символа например EURUSD
                                                                                  //любое направление торговли,  магик = Magic и если профит позиции<=-loss без доп.условий.
                                                                                  //просто выполняется роль стоплосса.
   ObjectDelete("SLb");
   ObjectDelete("SLs");
   if (b>0) 
   {
      NLb = NormalizeDouble(price_b/LB,Digits);
      ObjectCreate("SLb",OBJ_ARROW,0,Time[0],NLb,0,0,0,0);                     
      ObjectSet   ("SLb",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLb",OBJPROP_COLOR, Blue);
   }
   if (s>0) 
   {
      NLs = NormalizeDouble(price_s/LS,Digits);
      ObjectCreate("SLs",OBJ_ARROW,0,Time[0],NLs,0,0,0,0);                     
      ObjectSet   ("SLs",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLs",OBJPROP_COLOR, Red);
   }
   int OTicket;
   for (int i=0; i<OrdersTotal(); i++)
   {   
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderSymbol()==Symbol())
         { 
            OT = OrderType(); 
            OSL = NormalizeDouble(OrderStopLoss(),Digits);
            OTP = NormalizeDouble(OrderTakeProfit(),Digits);
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            SL=OSL;TP=OTP;
            if (OT==OP_BUY)             
            {  
               b++;
               if (OSL==0 && Stoploss>=STOPLEVEL && Stoploss!=0)
               {
                   SL = NormalizeDouble(Bid - Stoploss   * Point,Digits);
               } 
               else SL=OSL;
               if (OTP==0 && Takeprofit>=STOPLEVEL && Takeprofit!=0)
               {
                   TP = NormalizeDouble(Ask + Takeprofit * Point,Digits);
               } 
               else TP=OTP;
               if (NoLoss>=STOPLEVEL && OSL<NLb && NoLoss!=0)
               {
                  if (OOP<=NLb && NLb!=0 && NLb <= NormalizeDouble(Bid-NoLoss*Point,Digits)) 
                     SL = NormalizeDouble(NLb+MinProfitNoLoss*Point,Digits);
               }
               if (TrailingStop>=STOPLEVEL && TrailingStop!=0)
               {
                  StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits); 
                  if (StLo>=NLb && NLb!=0) if (StLo > OSL) SL = StLo;
               }
               if (SL != OSL || TP != OTP)
               {  
                  OTicket=OrderTicket();
                  if (!OrderModify(OTicket,OOP,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
               }
            }                                         
            if (OT==OP_SELL)        
            {
               s++;
               if (OSL==0 && Stoploss>=STOPLEVEL && Stoploss!=0)
               {
                  SL = NormalizeDouble(Ask + Stoploss   * Point,Digits);
               }
               else SL=OSL;
               if (OTP==0 && Takeprofit>=STOPLEVEL && Takeprofit!=0)
               {
                   TP = NormalizeDouble(Bid - Takeprofit * Point,Digits);
               }
               else TP=OTP;
               if (NoLoss>=STOPLEVEL && (OSL>NLs || OSL==0) && NoLoss!=0)
               {
                  if (OOP>=NLs && NLs!=0 && NLs >= NormalizeDouble(Ask+NoLoss*Point,Digits)) 
                     SL = NormalizeDouble(NLs-MinProfitNoLoss*Point,Digits);
               }
               if (TrailingStop>=STOPLEVEL && TrailingStop!=0)
               {
                  StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits); 
                  if (StLo<=NLs && NLs!=0) if (StLo < OSL || OSL==0) SL = StLo;
               }
               if ((SL != OSL || OSL==0) || TP != OTP)
               {  
                  OTicket=OrderTicket();
                  if (!OrderModify(OTicket,OOP,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
               }
            } 
         }
      }
   }
   if (IsTesting())
   {
      if (OrdersTotal()==0) 
      {
         if (OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),3,0,0,"тест",0,0,Blue)==-1) Print("Error OrderSend ",GetLastError());
         if (OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),3,0,0,"тест",0,0,Red)==-1) Print("Error OrderSend ",GetLastError());
      }
   } 
  }
//+----------------------------------------------------------------------------+

avatar

ssg

  • 31 декабря 2021, 16:58
0
Подчистил немного код.В логику не лез.Оставил как есть.Читайте комментарии внутри кода.Копировать обе части подряд.
Часть первая — подготовительная.

<code>
//+------------------------------------------------------------------+
//|                                                    alex30774.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
#property strict

extern double    Loss                 = -90.0; //Общий убыток $ (=0 откл)
extern double    loss                 = 10.0;  //При каком убытке в $ закроется убыточная позициия
extern int       Stoploss             = 100,   //стоплосс, если 0 то не изменяется
                 Takeprofit           = 400;   //тейкпрофит, если 0 то не изменяется
extern int       TrailingStop         = 20;    //длинна тралла, если 0 то нет тралла
extern int       StepTrall            = 1;     //шаг тралла - перемещать стоплосс не ближе чем StepTrall
extern int       NoLoss               = 10,    //перевод в безубыток при заданном кол-ве пунктов прибыли, если 0 то нет перевода в безубыток
                 MinProfitNoLoss      = 0;     //минимальная прибыль при переводе вбезубыток
               
extern int       Magic                = -1 ;   //Магик ордеров ( все ордера счетать всегда             
//------- Глобальные переменные для безошибочной компиляции -------------------+
int    Slippage     = 3;               // Проскальзывание цены
color  clCloseBuy   = Blue;            // Цвет значка закрытия покупки
color  clCloseSell  = Red;             // Цвет значка закрытия продажи*/
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectDelete("SLb");
   ObjectDelete("SLs");
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.04.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых убыток в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит/убыток                                                      |
//+----------------------------------------------------------------------------+
void ClosePosBySizeLossInCurrency(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()<-MathAbs(pr)) ClosePosBySelect();
          }
        }
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  double pp;
  int    dg=(int)SymbolInfoInteger(OrderSymbol(), SYMBOL_DIGITS);
  bool rez=0;
  if (OrderType()==OP_BUY) {
    pp=NormalizeDouble(MarketInfo(OrderSymbol(), MODE_BID), dg);
    rez=OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
  }
  if (OrderType()==OP_SELL) {
    pp=NormalizeDouble(MarketInfo(OrderSymbol(), MODE_ASK), dg);
    rez=OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
  }
 }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
</code>
avatar

ssg

  • 31 декабря 2021, 16:57
0
Есть же выше мой вариант советника на функциях Игоря Кима. Там та же логика что и автора топика, но нет ошибок и предупреждений.
avatar

ssg

  • 31 декабря 2021, 16:07
0
Полагаю, что вопрос исчерпан.Мы оба понимаем друг друга. Тема и вопрос нашей «вялой» перепалки «не стоит выеденного яйца».
С наступающим Новым Годом!
avatar

ssg

  • 31 декабря 2021, 14:52
0
Ну я ему все это и разжевал и даже написал новый советник.(посмотрите ветку с начала).
Так что какие могут быть претензии?
Выше я написал-было бы желание изучать.А если человек это делать не хочет — в данной ситуации это его законное право.
5.Все вышеизложенное имеет смысл только тогда, когда есть желание научиться
программировать.
Ну а если нет желания, то ничего страшного и криминального.Наверное есть другие резоны и интересы.
avatar

ssg

  • 31 декабря 2021, 14:48
0
1.Ну для начала нужно желание и попытки написать что то, хоть самое простое.
2.Есть куча сайтов где обучают азам написания, например book.mql4.com/ru/appendix/examples
3.В процессе обучения надо программировать самому, исправлять ошибки, а если не
получается можно и спросить совета или помочь в решении.Пока автор задавал
вопросы ему подсказывали где могут быть ошибки.
4.Посмотрите название темы. Там просьба помочь с решением, а не просьба
написать советник стороннему автору.«Почувствуйте разницу».*hi* 
5.Все вышеизложенное имеет смысл только тогда, когда есть желание научиться
программировать.
Ну а если нет желания, то ничего страшного и криминального.Наверное есть другие резоны и интересы.
avatar

ssg

  • 31 декабря 2021, 14:02
0
Решили — ну и хорошо.
Только у этого решения есть две загвоздки:
1.Не возможно такую комбинацию и стратегию протестировать на истории.
2.Такое решение не приближает к умению самостоятельного написания программных
кодов.
Ну это ваше решение.
avatar

ssg

  • 31 декабря 2021, 13:07
0
Андрей, еще большое спасибо. Усреднение попробую сам добавить.Ну не лежит у меня душа к пятерке.Наверное годы.А изучать наверное придется.
avatar

ssg

  • 29 декабря 2021, 21:04
0
Андрей, большое спасибо.
Буду изучать.
avatar

ssg

  • 29 декабря 2021, 20:51
0


#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
//------- Внешние параметры советника ------------------------------------------
extern string _P_Trade = "---------- Параметры торговли";
extern double Lots    = 0.1;                // Лот
extern double loss    = 10.0;               //При каком убытке в $ закроется убаточная позициия
extern int StopLoss   = 0;                  // Стоп
extern int TakeProfit = 0;                  // Тейк
extern int Starthour  = 8;
extern int Endhour    = 23;
extern int Magic      = -1;
//------- Глобальные переменные советника --------------------------------------
int    Slippage     = 3;                    // Проскальзывание
color  clOpenBuy    = LightBlue;            // Цвет открытия покупки
color  clOpenSell   = LightCoral;           // Цвет открытия продажи
color  clModifyBuy  = Aqua;                 // Цвет модификации покупки
color  clModifySell = Tomato;               // Цвет модификации продажи
color  clCloseBuy   = Blue;                 // Цвет закрытия покупки
color  clCloseSell  = Red;                  // Цвет закрытия продажи

//------- Подключение внешних модулей ------------------------------------------

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void OnTick() {
    double sl=0, tp=0;
    
    if(Hour()==Endhour)ClosePosBySizeLossInCurrency(Symbol(),-1,Magic,loss);//можно записать просто так, тогда в такой записи закроются все позиции в терминале у которых убыток 
                                              //в валюте депозита превысил некоторое значение но только текущего символа например EURUSD
                                                //любое направление торговли,  магик = Magic и если профит позиции<=-loss без доп.условий.
                                                //просто выполняется роль стоплосса.
      
  if (!ExistPositions() && Hour()==Starthour) {
      if (StopLoss!=0) sl=Ask-StopLoss*Point;
      if (TakeProfit!=0) tp=Ask+TakeProfit*Point;
      OpenPosition("", OP_BUY, sl, tp);
   
      if (StopLoss!=0) sl=Bid+StopLoss*Point;
      if (TakeProfit!=0) tp=Bid-TakeProfit*Point;
      OpenPosition("", OP_SELL, sl, tp);
    }
  }
//+----------------------------------------------------------------------------+
//|  Закрытие позиций по рыночной цене                                         |
//|  Параметры:                                                                |
//|    sym - наименование инструмента ("" - текущий символ)                    |
//|    op  - операция                 (-1 - любая позиция)                     |
//|    mn  - MagicNumber              (-1 - любой магик)                       |
//+----------------------------------------------------------------------------+
void ClosePositions(string sym="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  bool rez=0;
  if (sym=="") sym=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sym && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            rez = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
          }
          if (OrderType()==OP_SELL) {
           rez = OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
          }
        }
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Возвращает флаг существования позиций                                     |
//|  Параметры:                                                                |
//|    sym - наименование инструмента ("" - текущий символ)                    |
//|    op  - операция                 (-1 - любая позиция)                     |
//|    mn  - MagicNumber              (-1 - любой магик)                       |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sym="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) return(True);
          }
        }
      }
    }
  }
  return(False);
}
//+----------------------------------------------------------------------------+
//|  Открытие позиции                                                          |
//|  Параметры:                                                                |
//|    sym - наименование инструмента ("" - текущий символ)                    |
//|    op  - операция                                                          |
//|    sl  - стоп                                                              |
//|    tp  - тейк                                                              |
//+----------------------------------------------------------------------------+
void OpenPosition(string sym, int op, double sl=0, double tp=0, int mn=-1) {
  color  clOpen;
  double pp;
  bool rez=0;
  if (sym=="") sym=Symbol();
  if (op==OP_BUY) {
    clOpen=clOpenBuy; pp=Ask;
  } else {
    clOpen=clOpenSell; pp=Bid;
  }
  rez = OrderSend(sym, op, Lots, pp, Slippage, sl, tp, "", mn, 0, clOpen);
}
//+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  double pp;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS);
  bool rez=0;
  if (OrderType()==OP_BUY) {
    pp=NormalizeDouble(MarketInfo(OrderSymbol(), MODE_BID), dg);
    rez=OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
  }
  if (OrderType()==OP_SELL) {
    pp=NormalizeDouble(MarketInfo(OrderSymbol(), MODE_ASK), dg);
    rez=OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
  }
}
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.04.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых убыток в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит/убыток                                                      |
//+----------------------------------------------------------------------------+
void ClosePosBySizeLossInCurrency(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()<-MathAbs(pr)) ClosePosBySelect();
          }
        }
      }
    }
  }
}                                                                      
//+----------------------------------------------------------------------------+

avatar

ssg

  • 29 декабря 2021, 19:44
0
Сейчас взял несколько функций Кима и написал советник по вашей логике.
Правда немного разнообразил условия торговли.
Добавил следующие:
1.Позиции открываются только раз в сутки по времени extern int Starthour = 8;
при условии что ни одной открытой позиции нет.
2.При открытии позиций (и бай и селл) у них сразу выставляется тейпрофит.По
желанию можете выставить и стоплосс.
3.В моем варианте закрытие происходит:
либо по тейкпрофиту;
либо при наступлении времени extern int Endhour = 23; закрываются все
позиции у которых есть убыток не менее extern double loss = 10.0;
Разбирайтесь.Дописывайте свои варианты входов и выходов
В плане написания оба и Ким и cmillion пишут грамотные коды.Просто стиль разный.
avatar

ssg

  • 29 декабря 2021, 19:43
0
Вот сейчас опять собрал все три куска кода друг за другом.
Все работает.При компиляции выдает:

0 errors, 19 warnings, 679 msec elapsed		1	20


Ошибок нет, но 19 предупреждений.
Все они в куске кода от cmillion(а).
Но это не значит, что он не правильно написал.Там я уверен все в порядке.
Это вы что то не так или не все правильно перенесли в свой советник.
Если за комментировать и не использовать

//#include <stdlib.mqh>             // Стандартная библиотека

тогда при компеляции выдается одна ошибка

'ErrorDescription' - function not defined	PirMA.mq4	604	15
1 errors, 19 warnings		2	20

avatar

ssg

  • 29 декабря 2021, 18:35
0
Или что то не так сделали, или путаете ошибки с предупреждениями.
Предупреждения — это не очень хорошо, но не критично.
К стати в упрощенном варианте нет даже предупреждений, а в вашем авторском уже изначально было куча предупреждения, но править я их не стал.Сами подумайте что не так прописано.С ними советник работает, но на реал он такого может наворотить… У вас в советнике и функции Игоря Кима, а главная функция от cmillion(а). У них совершенно разный подход построения алгоритма.По этому примитивно их срастить без предупреждений нельзя.
И еще, обратите внимание на строку в начале

#include <stdlib.mqh>             // Стандартная библиотека

она обязательно должна быть у вас скачена.Если нету то скачайте через поисковик.
У Кима все функции построены через эту библиотеку.
avatar

ssg

  • 29 декабря 2021, 18:22
0


//+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  double pp;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS);
  bool rez=0;
  if (OrderType()==OP_BUY) {
    pp=NormalizeDouble(MarketInfo(OrderSymbol(), MODE_BID), dg);
    rez=OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
  }
  if (OrderType()==OP_SELL) {
    pp=NormalizeDouble(MarketInfo(OrderSymbol(), MODE_ASK), dg);
    rez=OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
  }
}
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.04.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых убыток в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит/убыток                                                      |
//+----------------------------------------------------------------------------+
void ClosePosBySizeLossInCurrency(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()<-MathAbs(pr)) ClosePosBySelect();
          }
        }
      }
    }
  }
}                                                                      
//+----------------------------------------------------------------------------+
avatar

ssg

  • 29 декабря 2021, 16:20
0


extern double    Lot                  = 0.01;
extern double    Loss                 = -90.0; //Общий убыток $ (=0 откл)
extern double    loss                 = 10.0;   //При каком убытке в $ закроется убаточная позициия
extern int       Stoploss             = 100,   //стоплосс, если 0 то не изменяется
                 Takeprofit           = 400;   //тейкпрофит, если 0 то не изменяется
extern int       TrailingStop         = 0;    //длинна тралла, если 0 то нет тралла
extern int       StepTrall            = 0;     //шаг тралла - перемещать стоплосс не ближе чем StepTrall
extern int       NoLoss               = 0,    //перевод в безубыток при заданном кол-ве пунктов прибыли, если 0 то нет перевода в безубыток
                 MinProfitNoLoss      = 0;     //минимальная прибыль при переводе вбезубыток              
extern int       Magic                = 12 ;   //Магик ордеров ( все ордера счетать всегда             
//------- Глобальные переменные для безошибочной компиляции -------------------+
bool   gbDisabled   = False;           // Флаг блокировки советника
bool   MarketWatch  = True;            // Запросы под исполнение "Market Watch".
int    Slippage     = 3;               // Проскальзывание цены
int    NumberOfTry  = 5;               // Количество торговых попыток
bool   UseSound     = True;            // Использовать звуковой сигнал
string SoundSuccess = "ok.wav";        // Звук успеха
string SoundError   = "timeout.wav";   // Звук ошибки
color  clOpenBuy    = LightBlue;       // Цвет значка открытия покупки
color  clOpenSell   = LightCoral;      // Цвет значка открытия продажи
color  clCloseBuy   = Blue;            // Цвет значка закрытия покупки
color  clCloseSell  = Red;             // Цвет значка закрытия продажи

#include <stdlib.mqh>             // Стандартная библиотека

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() //главная функция                                
{
   double SL=0,TP=0;//в начале работы функции обнуляем некоторые переменные
   double ProfitS=0,ProfitB=0,profit=0;//в начале работы функции обнуляем некоторые переменные
   int b=0,s=0;//в начале работы функции обнуляем некоторые переменные
   int bs=0;//в начале работы функции обнуляем некоторые переменные
   
   for (int i=OrdersTotal()-1; i>=0; i--)//далее смотрим на наличие ордеров и позиций
   {                                               
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))//если они есть, тогда начинаем их сортировать по разным признакам
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic)//в данном примере сортируем по торгуемому символу и магическому ордеру
           {
            if (OrderType()==OP_BUY)//если это наши позиции, тогда сортирем их дальше по направлению торговли - эти позиции на покупку
             {
               b++; // считаем сколько всего позиций на покупку
               ProfitB+=OrderProfit()+OrderSwap()+OrderCommission();//считаем какой суммарный профит по этим позициям на покупку
             }
            if (OrderType()==OP_SELL)//если это наши позиции, тогда сортирем их дальше по направлению торговли - эти позиции на продажу
             {
               s++; // считаем сколько всего позиций на продажу
               ProfitS+=OrderProfit()+OrderSwap()+OrderCommission();//считаем какой суммарный профит по этим позициям на продажу
             }
         }
      }
   }
   profit =  ProfitB+ProfitS;//сложив оба профита получаем суммарный профит (или убыток) по советнику в целом
   bs = b+s;//сложив все позиции получаем суммарное кол-во позиций по советнику в целом
   /*
 //пример использования нужной вам функции.условия могут быть самые различные - например можно привязать к
 //кол-ву открытых позиций как по направлению торговли так и в целом по советнику.или закрытие по времени или ... 
   if(Loss!=0 && profit<-Loss)//в данном примере смотрив : если суммарный убыток по советнику больше чем допустимо, тогда:
      {
       ClosePosBySizeLossInCurrency("",-1,-1,loss);//в такой записи закроются все позиции в терминале у которых убыток 
                                                   //в валюте депозита превысил некоторое значение
                                                   //любой символ, любое направление торговли, любой магик и если профит позиции<=-loss
       ClosePosBySizeLossInCurrency(Symbol(),-1,-1,loss);//в такой записи закроются все позиции в терминале у которых убыток 
                                              //в валюте депозита превысил некоторое значение но только текущего символа например EURUSD
                                                //любое направление торговли, любой магик и если профит позиции<=-loss
       ClosePosBySizeLossInCurrency(Symbol(),-1,Magic,loss);//в такой записи закроются все позиции в терминале у которых убыток 
                                              //в валюте депозита превысил некоторое значение но только текущего символа например EURUSD
                                                //любое направление торговли,  магик = Magic и если профит позиции<=-loss
       ClosePosBySizeLossInCurrency(Symbol(),OP_BUY,-1,loss);//в такой записи закроются все позиции в терминале у которых убыток в 
                                                     //валюте депозита превысил некоторое значение но только текущего символа например EURUSD 
                                                     //только покупки, любой магик и если профит позиции<=-loss
       ClosePosBySizeLossInCurrency(Symbol(),OP_SELL,-1,loss);//в такой записи закроются все позиции в терминале у которых убыток в 
                                                      //валюте депозита превысил некоторое значение но только текущего символа например EURUSD 
                                                     //только продажи, любой магик и если профит позиции<=-loss
       ClosePosBySizeLossInCurrency(Symbol(),OP_BUY,Magic,loss);//в такой записи закроются все позиции в терминале у которых убыток в 
                                                     //валюте депозита превысил некоторое значение но только текущего символа например EURUSD 
                                                     //только покупки, магик = Magic  и если профит позиции<=-loss
       ClosePosBySizeLossInCurrency(Symbol(),OP_SELL,Magic,loss);//в такой записи закроются все позиции в терминале у которых убыток в 
                                                      //валюте депозита превысил некоторое значение но только текущего символа например EURUSD 
                                                     //только продажи,  магик = Magic и если профит позиции<=-loss
      
    
       Comment("УБЫТОК СОВЕТНИКА ПРЕВЫСИЛ ДОПУСТИМЫЙ ПРЕДЕЛ =  ",-Loss);//выводим в комментарии что превысили допустимый убыток по советнику
       Print("УБЫТОК СОВЕТНИКА ПРЕВЫСИЛ ДОПУСТИМЫЙ ПРЕДЕЛ =  ",-Loss);//выводим в печать в журнале что превысили допустимый убыток по советнику
      }*/
      
   ClosePosBySizeLossInCurrency(Symbol(),-1,Magic,loss);//можно записать просто так, тогда в такой записи закроются все позиции в терминале у которых убыток 
                                              //в валюте депозита превысил некоторое значение но только текущего символа например EURUSD
                                                //любое направление торговли,  магик = Magic и если профит позиции<=-loss без доп.условий.
                                                //просто выполняется роль стоплосса.
      
   if (IsTesting())//для тестирования
   {
     if(bs==0)//если нет открытых позиций у советника
      {
       if (b==0) //если нет открытых  позиций у советника на покупку
         { 
         if (Takeprofit!=0)TP = NormalizeDouble(Ask + Takeprofit * Point,Digits);//вычисляем значение тейкпрофита на покупку
         if (Stoploss!=0)SL = NormalizeDouble(Bid - Stoploss*Point,Digits);//вычисляем значение стоплосса на покупку 
         if (OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),3, SL,TP,"тест",Magic,0,Blue)==-1) Print("Error OrderSend ",GetLastError());//открываем позицию на покупку
         }
       if (s==0) //если нет открытых позиций у советника на продажу 
         {  
         if (Takeprofit!=0)TP = NormalizeDouble(Bid - Takeprofit * Point,Digits);//вычисляем значение тейкпрофита на продажу
         if (Stoploss!=0)SL = NormalizeDouble(Ask + Stoploss*Point,Digits); //вычисляем значение стоплосса на продажу         
         if (OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),3,SL,TP,"тест",Magic,0,Red)==-1) Print("Error OrderSend ",GetLastError());//открываем позицию на продажу
         }
   } 
 }
}
avatar

ssg

  • 29 декабря 2021, 16:19
0
1.Просто копируете эти три куска друг за другом.Потом нажмите команду — компилировать.Просто весь код сразу не помещается в размер.Я специально так размещаю коды, что бы человек сначала посмотрел код, а уже потом решал скачивать или нет.Наверное знаете сколько мусора приходится удалять после скачивания того или иного файла.
2.«да я поменял слова »!!! Понимаете в чем проблема: машина не человек и она понимает только машинный язык.Для неё «желтый лист» и «лист желтый» это две разные переменные (или команды).
3.Советник (его логика) выбран не очень удачно ИМХО.
4.Для вас я переписал ваш советник (логику оставил прежнюю) максимально упростив код и снабдив комментариями.
5.Разберитесь с кодом, а потом будете добавлять нужные функции.Например трал, бу и другие.Посмотрите в базе примеры. У Андрея почти все советники собраны из отдельных функций поэтому можно достаточно легко будет разобраться.Да они очень простые, но для самообразования самое то.
6.Мы все учимся чему то до самой смерти.Так что ничего страшного нет в ошибках.
avatar

ssg

  • 29 декабря 2021, 16:17
0
Вы можете написать бесконечное кол-во функций, но пока они не входят в главную функцию void OnTick() или функцию void OnTimer() советник их не будет использовать.Они будут словно запчасти в багажнике лежать до поры.
avatar

ssg

  • 29 декабря 2021, 10:11
0
Но это полдела.
Теперь в функции int start() (лучше заменить ее на void OnTick()) надо прописать условия вызова этой функции:


if( если быдут выполнены эти прописанные условтя, тогда вызываем функцию)ClosePosBySizeLossInCurrency();


avatar

ssg

  • 29 декабря 2021, 10:06