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

ssg

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

ssg

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

ssg

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

ssg

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

ssg

  • 29 декабря 2021, 09:32
0
Хорошо.Давайте начнем с п.№1 -ограничения пар в советнике.
avatar

ssg

  • 28 декабря 2021, 21:43
0
«Земляк, а ты чьих будешь?»
Я с вами на брудершавт не пил, и катран на заваленке не катал.
Ты себе потыкай куда ни будь сидя на очке.
avatar

ssg

  • 28 декабря 2021, 20:48
0
Может быть тогда немного измените советник отсюда:http://mql.opentraders.ru/29099.html
Изменения следующие
1.Ограничить число пар списком в настройках.
2.Открытие первой позиции по сигналу индикатора SuperTrend — индикатор для
MetaTrader 5 отсюда www.mql5.com/ru/code/22611
3.Закрытие позиций одного символа при достижении
input double рrofit = 50; // Профит в валюте для одного символа.
4.Закрытие всех позиций советника при достижении
input double Profit = 50; // Профит в валюте для всех символов
советника.
avatar

ssg

  • 28 декабря 2021, 20:42
0
Что бы не отвлекать Андрея взял на себя смелость внести исправления по Вашей просьбе.
Сделал вариант на выбор: использовать параболик или оставить прежние условия.

//+------------------------------------------------------------------+
//|     SuperTrend8  «Super Trend» c 2-x таймфреймов + Parabolic.mq4 |
//|                                              Copyright 2021, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 1;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern int TrailingStop  = 250;      // трал
extern int CloseSig      = 1;        // 1-закрытие по сигналу
extern int Slip          = 30;       // реквот
extern int Shift         = 1;        // на каком баре сигнал индикатора
extern int Magic         = 123;      // магик

extern string IndName                  = "SuperTrend nrp new mtf 2 histo";
extern int                period       = 10;
extern ENUM_APPLIED_PRICE appliedPrice = PRICE_CLOSE;
extern double             multiplier   = 3.0;
extern ENUM_TIMEFRAMES    TimeFrame    = 0; //default chart TF :: Use 5, 15, 30, 60, etc...

extern int                period2       = 10;
extern ENUM_APPLIED_PRICE appliedPrice2 = PRICE_CLOSE;
extern double             multiplier2   = 3.0;
extern ENUM_TIMEFRAMES    TimeFrame2    = 240; //default chart TF :: Use 5, 15, 30, 60, etc...

extern bool               Sar           = true;
extern double             Step          = 0.027;     
extern double             Maximum       = 0.5;
extern ENUM_TIMEFRAMES    TimeFrame3    = 240; //default chart TF :: Use 5, 15, 30, 60, etc... 

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   double sl=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)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*_Point)
                 {
                  sl=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
                  if(OrderStopLoss()<sl)
                    {
                     Print("SL: ",sl, " TP: ",OrderTakeProfit());
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()-Ask>TrailingStop*_Point)
                 {
                  sl=NormalizeDouble(Ask+TrailingStop*_Point,_Digits);
                  if(OrderStopLoss()>sl || (OrderStopLoss()==0))
                    {
                     Print("SL: ",sl, " TP: ",OrderTakeProfit());
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderProfit()>0)
            break;
         if(OrderProfit()<0)
           {
            lot=OrderLots()*KLot;
            break;
           }
        }
     }
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double blu1 = iCustom(NULL,0,IndName,period,appliedPrice,multiplier,TimeFrame,0,Shift);
   double red1 = iCustom(NULL,0,IndName,period,appliedPrice,multiplier,TimeFrame,1,Shift);
   double blu2 = iCustom(NULL,0,IndName,period,appliedPrice,multiplier,TimeFrame,0,Shift+1);
   double red2 = iCustom(NULL,0,IndName,period,appliedPrice,multiplier,TimeFrame,1,Shift+1);

   double blu3 = iCustom(NULL,0,IndName,period2,appliedPrice2,multiplier2,TimeFrame2,0,Shift);
   double red3 = iCustom(NULL,0,IndName,period2,appliedPrice2,multiplier2,TimeFrame2,1,Shift);
   
   double sar=iSAR(NULL,TimeFrame3,Step,Maximum,Shift);
   /*
   А/ Вход в длинную позицию осуществляется по следующему условию:
      Столбик гистограммы индикатора SuperTrend nrp new mtf 2 окрашен в синий цвет.
      Цена выше значения Parabolic SAR.
      
      Вход в позицию производится только при совпадении сигналов индикаторов.
   А/ Вход в коротую позицию осуществляется по следующему условию:
      Столбик гистограммы индикатора SuperTrend nrp new mtf 2 окрашен в красный цвет.
      Цена ниже значения Parabolic SAR.
      
  Вход в позицию производится только при совпадении сигналов индикаторов.
   */

   if(TrailingStop>0)
      Trailing();
      
 if(Sar){ 
  if(CountTrades()<1)
     {
   if(blu1<1000 && red2<1000 && sar<Bid){PutOrder(0,Ask);}
   if(red1<1000 && blu2<1000 && sar>Bid){PutOrder(1,Bid);}
     }
    if(CloseSig>0)
     {
      if(red1<1000 && blu2<1000 && sar>Bid){CloseAll(0);}
      if(blu1<1000 && red2<1000 && sar<Bid){CloseAll(1);}
     }
   }
   else{
   if(CountTrades()<1)
     {
      if(blu1<1000 && red2<1000 && blu3<1000){PutOrder(0,Ask);}
      if(red1<1000 && blu2<1000 && red3<1000){PutOrder(1,Bid);}
     }
   if(CloseSig>0)
     {
      if(red1<1000 && blu2<1000 && red3<1000){CloseAll(0);}
      if(blu1<1000 && red2<1000 && blu3<1000){CloseAll(1);}
     }
    }    
  }
//+------------------------------------------------------------------+

avatar

ssg

  • 24 декабря 2021, 05:54
0
Или так, когда линии расположены в порядке возрастания или убывания:


//+------------------------------------------------------------------+
//|                                                          SSL.mq4 |
//|                                              Copyright 2021, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот

extern int StopLoss      = 0;        // лось
extern int TakeProfit    = 0;        // язь
extern int TrailingStop  = 0;        // трал
extern int Delta         = 300;      // дельта

extern int Slip          = 30;       // реквот
extern int Shift         = 1;        // бар индикатора
extern int CloseSig      = 1;        // 1-закрытие по сигналу
extern int Magic         = 123;      // магик

extern int MAControl     = 300;
extern int MAPeriod      = 40;
extern int MAMethod      = 0;
extern int MAPrice       = 0;

extern int TimeFrame1   =  240;
extern int TimeFrame2   =  1440;

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   double sl=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)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*_Point)
                 {
                  sl=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
                  if(OrderStopLoss()<sl)
                    {
                     Print("SL: ",sl, " TP: ",OrderTakeProfit());
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()-Ask>TrailingStop*_Point)
                 {
                  sl=NormalizeDouble(Ask+TrailingStop*_Point,_Digits);
                  if(OrderStopLoss()>sl || (OrderStopLoss()==0))
                    {
                     Print("SL: ",sl, " TP: ",OrderTakeProfit());
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double ma = iMA(NULL,0,MAPeriod,0,MAMethod,MAPrice,Shift);
   double mac = iMA(NULL,0,MAControl,0,MAMethod,MAPrice,Shift);
   double h4ma = iMA(NULL,TimeFrame1,MAPeriod,0,MAMethod,MAPrice,Shift);
   double d1ma = iMA(NULL,TimeFrame2,MAPeriod,0,MAMethod,MAPrice,Shift);

   bool buy = Bid>ma && Bid>h4ma && Bid>d1ma && h4ma>d1ma;
   bool sell = Bid<ma && Bid<h4ma && Bid<d1ma && h4ma<d1ma;
   
   double delta = MathAbs(mac-Bid)/_Point;

   if(TrailingStop>0)
      Trailing();

   if(CountTrades()<1 && delta>Delta)
     {
      if(buy && (mac-Bid)/_Point>Delta)
        {
         PutOrder(0,Ask);
        }
      if(sell && (Bid-mac)/_Point>Delta)
        {
         PutOrder(1,Bid);
        }
     }

   if(CloseSig>0)
     {
      if(sell)
        {
         CloseAll(0);
        }
      if(buy)
        {
         CloseAll(1);
        }
     }

   Comment("\n Lot: ",Lots);
  }
//+------------------------------------------------------------------+

avatar

ssg

  • 13 декабря 2021, 13:01
0
Попробуйте:

//+------------------------------------------------------------------+
//|                                                          SSL.mq4 |
//|                                              Copyright 2021, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот

extern int StopLoss      = 0;        // лось
extern int TakeProfit    = 0;        // язь
extern int TrailingStop  = 0;        // трал
extern int Delta         = 300;      // дельта

extern int Slip          = 30;       // реквот
extern int Shift         = 1;        // бар индикатора
extern int CloseSig      = 1;        // 1-закрытие по сигналу
extern int Magic         = 123;      // магик

extern int MAControl     = 300;
extern int MAPeriod      = 40;
extern int MAMethod      = 0;
extern int MAPrice       = 0;

extern int TimeFrame1   =  240;
extern int TimeFrame2   =  1440;

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   double sl=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)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*_Point)
                 {
                  sl=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
                  if(OrderStopLoss()<sl)
                    {
                     Print("SL: ",sl, " TP: ",OrderTakeProfit());
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()-Ask>TrailingStop*_Point)
                 {
                  sl=NormalizeDouble(Ask+TrailingStop*_Point,_Digits);
                  if(OrderStopLoss()>sl || (OrderStopLoss()==0))
                    {
                     Print("SL: ",sl, " TP: ",OrderTakeProfit());
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double ma = iMA(NULL,0,MAPeriod,0,MAMethod,MAPrice,Shift);
   double mac = iMA(NULL,0,MAControl,0,MAMethod,MAPrice,Shift);
   double h4ma = iMA(NULL,TimeFrame1,MAPeriod,0,MAMethod,MAPrice,Shift);
   double d1ma = iMA(NULL,TimeFrame2,MAPeriod,0,MAMethod,MAPrice,Shift);

   bool buy = Bid>ma && Bid>h4ma && Bid>d1ma;
   bool sell = Bid<ma && Bid<h4ma && Bid<d1ma;
   
   double delta = MathAbs(mac-Bid)/_Point;

   if(TrailingStop>0)
      Trailing();

   if(CountTrades()<1 && delta>Delta)
     {
      if(buy && (mac-Bid)/_Point>Delta)
        {
         PutOrder(0,Ask);
        }
      if(sell && (Bid-mac)/_Point>Delta)
        {
         PutOrder(1,Bid);
        }
     }

   if(CloseSig>0)
     {
      if(sell)
        {
         CloseAll(0);
        }
      if(buy)
        {
         CloseAll(1);
        }
     }

   Comment("\n Lot: ",Lots);
  }
//+------------------------------------------------------------------+

avatar

ssg

  • 13 декабря 2021, 12:51
0
Вам необходимо хоть немного изучить основы мкл.
#property indicator_chart_window // Индик. рисуется в основном окне
В MQL4 и MQL5 предусмотрено всего два варианта для отображения индикаторных линий: в основном окне финансового инструмента и в отдельном окне. Основное окно — это то окно, в котором отображается привычный график цены по финансовому инструменту. В данном примере параметр indicator_chart_window в директиве #property предписывает клиентскому терминалу отображать индикаторные линии в основном окне.
avatar

ssg

  • 3 декабря 2021, 16:09
0
или
#property indicator_chart_window
или
#property indicator_separate_window
avatar

ssg

  • 2 декабря 2021, 17:46
0
«А ларчик просто открывался.» Хочу ещё предупредить — значения профита и баланса величины не постоянные. Значит при равных процентах в разное время в валюте депозита цифры будут разные. Проверьте на бумаге с карандашом или в экселе постройте таблицу.:) 
avatar

ssg

  • 1 декабря 2021, 19:59
0
Надо посмотреть для начала как открываются позиции и сколько их открывается. Может нужно ограничить только открывать или продажу или покупку.И тогда возможно решение задачи.
Вот об этом я и писал выше.Человек видно не понял.Мне кажется он сам внятно не может пояснить что хочет, возможно по коду советника это можно было бы понять.
Кода — нет, пояснений — нет, а значит и решения нет.
avatar

ssg

  • 1 декабря 2021, 15:49
0
В обоих функциях идет перебор всех позиций — значит она не одна. Вопрос-какую позицию надо закрыть?
Этого в коде нет.Дело ваше, шифроваться или ожидать возможной помощи.
avatar

ssg

  • 1 декабря 2021, 11:15
0
Надо смотреть весь код.
avatar

ssg

  • 30 ноября 2021, 18:18