Группа "Напишу исправлю советник индикатор MQL4"

Рейтинг 27



можно добавить или исправить функцию - Закрытие определенных позиций, у которых убыток в валюте депозита на данный момент больше чем некоторое значение

собрал советник который при открытии в ручную ордеров выставляет теик и стопы и сопровождает трелингом. все работает хорошо

решил добавить функцию общего убытка на случай если вдруг буду жадничать и выставлять больше одного ордера. но что то делаю не так


//+------------------------------------------------------------------+
//| мы решаем СТОПЫ ЭТО ОБЯЗАТЕЛЬНО.И ВОТ ЧТОБЫ НЕ ЗАБЫТЬ .Я ВАШ ПОМОШНИК.mq4
//| Copyright Copyright 2021, MetaQuotes Software Corp.
//| https://www.mql5.com
//+------------------------------------------------------------------+

//--------------------------------------------------------------------


extern double        Loss             = -90.0;              //Общий убыток $ (=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  STOPLEVEL;
//--------------------------------------------------------------------
int init()
{
   return(0);
}
//--------------------------------------------------------------------
int deinit()
{
   ObjectDelete("SLb");
   ObjectDelete("SLs");
   return(0);
}
//--------------------------------------------------------------------
int start()                                  
{
   STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   double OSL,OTP,OOP,StLo,SL,TP;
   double ProfitS,ProfitB,LB,LS,NLb,NLs,price_b,price_s,OL;
   int b,s,OT,OMN;
   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();
            }
         }
      }
   }
   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 (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());
      }
   } 
   return(0);
}


//+----------------------------------------------------------------------------+
//|  Закрытие всех позиций по общему убытку таблетка от жадности               |
//+----------------------------------------------------------------------------+




//+----------------------------------------------------------------------------+
//| Функция определения количества пунктов в идущих подряд убыточных ордерах   |
//|     Параметры:                                                             |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
int NumberOfLastLossPosFromDateInPoint(string sy="", int op=-1, int mn=-1, datetime dt=0) {
  int i, k=OrdersHistoryTotal();
  int kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              if (OrderProfit()<0) 
              {
                  kp += (MathAbs(OrderOpenPrice()-OrderClosePrice())) / Point;
              }            
              else kp=0;
            }
          }
        }
      }
    }
  }
  return(kp);
}




//+----------------------------------------------------------------------------+
//|   Закрытие определенных позиций, у которых убыток в валюте депозита        | 
//|              на данный момент больше чем некоторое значение                | 
//+----------------------------------------------------------------------------+

//Описание : Закрытие тех позиций, у которых убыток в валюте депозита
//превысил некоторое значение

//Параметры:
//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)) ClosePosBySizeLossInCurrency();
          }
        }
      }
    }
  }
}

//+----------------------------------------------------------------------------+
//|  вот вроде и собрал чудо                                                   |
//+----------------------------------------------------------------------------+
  • +10
  • Просмотров: 2308
  • 29 декабря 2021, 08:01
  • eduard9898
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Напишу исправлю советник индикатор MQL4", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
03 декабря 2021
27 января 2022

Комментарии (39)

+
0
вот второй вариант но тоже общий минус не срабатывает


добавил

//+----------------------------------------------------------------------------+
//|  Закрытие всех позиций по общему убытку таблетка от жадности               |
//+----------------------------------------------------------------------------+

//+----------------------------------------------------------------------------+
//|       Функция возвращает тип операции в виде текста (string)               |
//+----------------------------------------------------------------------------+



string NameOrd(
               int type) // тип ордера
  {
   string tx="Unknown Order Type";
   switch(type)
     {
      case 0 : tx="Buy";break;
      case 1 : tx="Sell";break;
      case 2 : tx="Buy Limit";break;
      case 3 : tx="Sell Limit";break;
      case 4 : tx="Buy Stop";break;
      case 5 : tx="Sell Stop";
     }
   return(tx);
  }

//+----------------------------------------------------------------------------------------+
//|  Функция обрабатывает торговые ошибки, возникающие при открытии и закрытии ордеров.    |
//+----------------------------------------------------------------------------------------+

bool ErrorChecking(
                   int error) // код ошибки
  {
   switch(error)
     {
      case 2:return(false);
      case 3:return(false);
      case 131:return(false);
      case 132:return(false);
      case 133:return(false);
      case 134:return(false);
      case 139:return(false);
      case 140:return(false);
      case 147:return(false);
      case 148:return(false);
      case 149:return(false);
      case 150:return(false);
      case 4110:return(false);
      case 4111:return(false);
      case 4108:return(false);
     }
   return (true);
  }
  
  
//+----------------------------------------------------------------------------------------+
//|    Функция закрывает предварительно выбранный рыночный ордер (позицию)                 |
//+----------------------------------------------------------------------------------------+
// Включаемый файл 
 #include <stdlib.mqh>
// Входные параметры
input int   NumOfTry=10;               // Количество попыток закрыть ордер
input color clrCloseBuy=clrRed;        // Цвет стрелки закрытия Buy
input color clrCloseSell=clrBlue;      // Цвет стрелки закрытия Sell
input int   Slippage=40;               // Максимально допустимое отклонение цены
//---

void ClosePosBySelect()
  {
   bool   res;
   color  clrClose;
   double lo,opPr;
   int    err;
   if(OrderType()<2)
     {
      for(int nm=1; nm<=NumOfTry; nm++)
        {
         // Выходим с цикла если принудительно завершили работу советника
         if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
            break;
         // Если поток для совершения операций занят, ждем 4 секунды
         while(!IsTradeAllowed())
            Sleep(4000);
         // Обновляем данные
         RefreshRates();
         if(OrderType()==OP_BUY)
           {
            opPr=MarketInfo(OrderSymbol(),MODE_BID);
            clrClose=clrCloseBuy;
           }
         else
           {
            opPr=MarketInfo(OrderSymbol(),MODE_ASK);
            clrClose=clrCloseSell;
           }
         lo=OrderLots();
         res=OrderClose(OrderTicket(),lo,opPr,Slippage,clrClose);
         // Если удалось закрыть ордер, выходим с цикла
         if(res)
           {
            Print("Order: "+(string)OrderTicket()+" has been closed successfully");
            break;
           }
         // Если не удалось закрыть ордер...
         else
           {
            err=GetLastError();
            Print("Error("+(string)err+") Order close error: "+ErrorDescription(err));
            // Если ошибка не критичная, ждем 2 секунду и пытаемся закрыть ордер повторно
            if(ErrorChecking(err))
              {
               Sleep(2000);
              }
            // Если ошибка критичная, выходим с цикла
            else
              {
               Print("?losing stopped!");
               return;
              }
           }
        }
     }
   else Print("Incorrect trading operation. Close "+NameOrd(OrderType()));
  }


//+----------------------------------------------------------------------------+
//|   Закрытие определенных позиций, у которых убыток в валюте депозита        | 
//|              на данный момент больше чем некоторое значение                | 
//+----------------------------------------------------------------------------+

//Параметры:
//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)) ClosePosBySizeLossInCurrency();
          }
        }
      }
    }
  }
}

//+----------------------------------------------------------------------------+
//|  вот вроде и собрал чудо                                                   |
//+----------------------------------------------------------------------------+

Редактирован: 29 декабря 2021, 09:13
avatar

  5  eduard9898 Автор Сообщений: 77

  • 29 декабря 2021, 09:01
+
0
Вы в функции вызываете саму эту функцию:


//Параметры:
//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)) ClosePosBySizeLossInCurrency();
          }
        }
      }
    }
  }
}

avatar

  16  ssg Сообщений: 817

  • 29 декабря 2021, 09:42
+
0
А если так (логику не смотрел и не менял):


extern double        Loss             = -90.0; //Общий убыток $ (=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 ;   //Магик ордеров ( все ордера счетать всегда             
//------- Глобальные переменные для безошибочной компиляции -------------------+
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>             // Стандартная библиотека
//--------------------------------------------------------------------
int init()
{
   return(0);
}
//--------------------------------------------------------------------
int deinit()
{
   ObjectDelete("SLb");
   ObjectDelete("SLs");
   return(0);
}
avatar

  16  ssg Сообщений: 817

  • 29 декабря 2021, 09:56
+
0
Продолжение

//--------------------------------------------------------------------
int start()                                  
{
   int STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   double OSL,OTP,OOP,StLo,SL,TP;
   double ProfitS,ProfitB,LB,LS,NLb,NLs,price_b,price_s,OL;
   int b,s,OT,OMN;
   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();
            }
         }
      }
   }
   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());
      }
   } 
   return(0);
}
avatar

  16  ssg Сообщений: 817

  • 29 декабря 2021, 09:59
+
0
Окончание


//+----------------------------------------------------------------------------+
//| Функция определения количества пунктов в идущих подряд убыточных ордерах   |
//|     Параметры:                                                             |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
int NumberOfLastLossPosFromDateInPoint(string sy="", int op=-1, int mn=-1, datetime dt=0) {
  int i, k=OrdersHistoryTotal();
  int kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              if (OrderProfit()<0) 
              {
                  kp += (MathAbs(OrderOpenPrice()-OrderClosePrice())) / Point;
              }            
              else kp=0;
            }
          }
        }
      }
    }
  }
  return(kp);
}
//+----------------------------------------------------------------------------+
//|   Закрытие определенных позиций, у которых убыток в валюте депозита        | 
//|              на данный момент больше чем некоторое значение                | 
//+----------------------------------------------------------------------------+

//Описание : Закрытие тех позиций, у которых убыток в валюте депозита
//превысил некоторое значение

//Параметры:
//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                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование торговой операции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("BuyLimit");
    case OP_SELLLIMIT: return("SellLimit");
    case OP_BUYSTOP  : return("BuyStop");
    case OP_SELLSTOP : return("SellStop");
    default          : return("Unknown Operation");
  }
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 19.02.2008                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, pa, pb, pp;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), err, it;

  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
        Print("ClosePosBySelect(): Остановка работы функции");
        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();
      pp=NormalizeDouble(pp, dg);
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        if (UseSound) PlaySound(SoundSuccess); break;
      } else {
        err=GetLastError();
        if (UseSound) PlaySound(SoundError);
        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()));
 }
//--------------------------------------------------------------------------------+
avatar

  16  ssg Сообщений: 817

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


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


avatar

  16  ssg Сообщений: 817

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

  16  ssg Сообщений: 817

  • 29 декабря 2021, 10:11
+
0
Посмотрите:


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 19.02.2008                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, pa, pb, pp;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), err, it;

  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
        Print("ClosePosBySelect(): Остановка работы функции");
        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();
      pp=NormalizeDouble(pp, dg);
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        if (UseSound) PlaySound(SoundSuccess); break;
      } else {
        err=GetLastError();
        if (UseSound) PlaySound(SoundError);
        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                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 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                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 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();
          }
        }
      }
    }
  }
}

avatar

  16  ssg Сообщений: 817

  • 29 декабря 2021, 09:32
+
0
спасибочки. но я в програмировании ноль. ( просто собираю кубики ну или подчти)
я добовлял от кима функции но не понимаю главной ошибки что раньше и как сложить

буду дальше пробывать.я так понимаю что сейчас надо все это вместе соединить.

да я поменял слова ( я понимаю что должны быть условия и должно быть выполнение их и это разные вещи) т.к вылетала ошибка — зато ошибок не стало
Редактирован: 29 декабря 2021, 13:42
avatar

  5  eduard9898 Автор Сообщений: 77

  • 29 декабря 2021, 13:19
+
0
ssg если не трудно собрать все это. что то я совсем запутался.
avatar

  5  eduard9898 Автор Сообщений: 77

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

  16  ssg Сообщений: 817

  • 29 декабря 2021, 16:17
+
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

  16  ssg Сообщений: 817

  • 29 декабря 2021, 16:19
+
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

  16  ssg Сообщений: 817

  • 29 декабря 2021, 16:20
+
0
ок пробую еще раз просто сделал все по порядку и в конце высыпало ошибок штук 10

еще раз спасибо за понимание. все сделал. сейчас надо добавлять стопы и тейки и т.д
Редактирован: 29 декабря 2021, 18:23
avatar

  5  eduard9898 Автор Сообщений: 77

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

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

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

  16  ssg Сообщений: 817

  • 29 декабря 2021, 18:22
+
0
ок понял буду стараться
avatar

  5  eduard9898 Автор Сообщений: 77

  • 29 декабря 2021, 18:25
+
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

  16  ssg Сообщений: 817

  • 29 декабря 2021, 18:35
+
0
вроде сначала было все просто (и даже работало)сейчас решил установить общий убыток и уже не все так легко.

а началось все с того что старался зайти в минус — добился что слил все что за день натыркал и пришло понимание

думаю что попробую взять все что можно от кима тогда манера написания будет одна и проще будет найти ошибки
Редактирован: 29 декабря 2021, 18:48
avatar

  5  eduard9898 Автор Сообщений: 77

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

  16  ssg Сообщений: 817

  • 29 декабря 2021, 19:43
+
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

  16  ssg Сообщений: 817

  • 29 декабря 2021, 19:44
+
0
ок. сегодня мне наверное хватит — голова что совсем не варит. но с тем что вы сделали думаю будет проще разобраться.

хотел добавить что я торгую в ручную поэтому сам советник только нужен для
1.выстовляет стопы и тейк
2. трал
3. закрытие по общему минусу (на случай что зашел не одним ордером)
Редактирован: 29 декабря 2021, 20:38
avatar

  5  eduard9898 Автор Сообщений: 77

  • 29 декабря 2021, 20:34
+
0
РЕШИЛ все это намного проще поставил 2 советника
один от Кима на один граф следит за общим счетом. другой от Владимира на второй ставит стопы тейки и трелинг. все работает и все хорошо.

спасибо за помощь. если кого интересует — советник от Ким Игорь e-CloseByLossOrProfit

Советник закрывает все позиции при достижении заданного уровня убытка или профита в валюте депозита.

советник от Владимира cmillion TrailingStopLight

выставляет автоматом стопы и тейк. переводит в безубыток и тралит позиции
avatar

  5  eduard9898 Автор Сообщений: 77

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

  16  ssg Сообщений: 817

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

  19  alex30774 Сообщений: 715

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

  16  ssg Сообщений: 817

  • 31 декабря 2021, 14:02
+
0
А оно ему надо: он и не собирается быть програмистом.Ему нужно было чтоб кто-то исправил ошибки в его коде.

4.Посмотрите название темы. Там просьба помочь с решением, а не просьба
написать советник стороннему автору.«Почувствуйте разницу».


Зато ветка называется:«Напишу исправлю советник индикатор» именно с просьбой об исправлении своего советника он и обратился и тему назвал соответствующе.

можно добавить или исправить функцию — Закрытие определенных позиций, у которых убыток в валюте депозита на данный момент больше чем некоторое значение


Он просил добавить или исправить, а не нравоучения на тему(иди учи програмирование).
Редактирован: 31 декабря 2021, 14:28
avatar

  19  alex30774 Сообщений: 715

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

  16  ssg Сообщений: 817

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

  16  ssg Сообщений: 817

  • 31 декабря 2021, 14:52
+
0
И вас с Новым Годом! Я просто надеялся, что вы его вариант исправите, в котором несколько предупреждений.
avatar

  19  alex30774 Сообщений: 715

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

  16  ssg Сообщений: 817

  • 31 декабря 2021, 16:07
+
0
с наступающим! в следующем году буду пробывать. всем удачи и здоровья.
avatar

  5  eduard9898 Автор Сообщений: 77

  • 31 декабря 2021, 16:19
+
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>

Редактирован: 31 декабря 2021, 16:59
avatar

  16  ssg Сообщений: 817

  • 31 декабря 2021, 16:57
+
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

  16  ssg Сообщений: 817

  • 31 декабря 2021, 16:58
+
0
спасибо еще раз !*drinks* 
avatar

  5  eduard9898 Автор Сообщений: 77

  • 1 января 2022, 20:59
+
0
int STOPLEVEL=MarketInfo(OrderSymbol(),MODE_STOPLEVEL);

пишет предупреждение сделал так исходя из того части с знаком равно перестало — вопрос или так можно

int STOPLEVEL =( int ) MarketInfo(OrderSymbol(),MODE_STOPLEVEL);

avatar

  5  eduard9898 Автор Сообщений: 77

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

  16  ssg Сообщений: 817

  • 2 января 2022, 10:09
+
0
если можно.

еще раз советник должен:
1.подхватывать все ордера открытые в ручную и выставлять
а. стопы (регулировать в пунктах )
б. тейки (регулировать в пунктах )
2.трелинг стоп с сразу по 1 пункту ( т.е сразу передвигать стопы в сторону безубытка)

3. считать общий убыток и по возможности его тоже переносить в безубыток (тралить)
вроде все. если есть что то что может помочь чтобы выходить с мин. потерями то тоже прописать.
avatar

  5  eduard9898 Автор Сообщений: 77

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

  16  ssg Сообщений: 817

  • 2 января 2022, 12:51
+
0
*good* 
avatar

  5  eduard9898 Автор Сообщений: 77

  • 2 января 2022, 13:10

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари