0
Если переменная BuySell будет равной 0 советник вообще ничего не будет делать.
Можно ввести и использование BuySell = 0 тогда нужно изменить логику.
avatar

ssg

  • 7 июня 2022, 16:58
0
Вы не разобрались в коде советника.
В главной функции советника нет переменной BuySell равной 0.
Сама переменная

input int BuySell     = 2;    // 1-Only Buy 2-Only Sell

отвечает за направление торговли:
1-Only Buy = только покупки.
2-Only Sell = только продажи.
Попробуйте проанализировать код по приведенному примеру:


//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double Ask=SymbolInfoDouble(NULL,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(NULL,SYMBOL_BID);

   if(bars!=Bars(NULL,0))
     { //если разрешены покупки и (нет открытых позиций или есть позиции и разница между растояние старой цены позиции - текущая цена больше или равно шагу)
      if(BuySell==1 && (CountTrades()<1 || (CountTrades()>0 && FindLastBuyPrice()-Ask>=Step*_Point)))
        {//открываем позицию на покупку.
         trade.Buy(lot,NULL,Ask,0,0,"");   //buy
        }
      if(BuySell==2 && (CountTrades()<1 || (CountTrades()>0 && Bid-FindLastSellPrice()>=Step*_Point)))
        {
         trade.Sell(lot,NULL,Bid,0,0,"");   //sell
        }

      if(Lots()>=BigLot) lot=lot*Mnogitel;
      if(lot>MaxLots) lot=Lot;

      if(AllProfit()>Profit || AllProfit()<-Loss) {CloseAll(); lot=Lot;}
      bars=Bars(NULL,0);
     }

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

avatar

ssg

  • 7 июня 2022, 16:53
0
Прошу прощения, открыл код стартового советника. Смотрите:


#property copyright "Copyright 2022, AM2"
#property link "https://www.forexsystems.biz"
#property version "1.01"

#include <Trade\Trade.mqh>

CTrade trade;

input int BuySell     = 2;    // 1-Only Buy 2-Only Sell
input int Step        = 100;  // Step
input int Slip        = 100;  // Requote

input double Lot      = 0.1;  // Volume
input double BigLot   = 1;    // Big Lot
input double MaxLots  = 5;    // Maximum lot

input double Profit   = 160;  // Dollars Profit
input double Loss     = 5000; // Dollars Loss
input double Mnogitel = 11;   // Lots Mnogitel

input ulong Magic     = 123;  // Magic number

int bars=0;
double lot=Lot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   trade.SetExpertMagicNumber(Magic);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|  Positions Profit                                                |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double p=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            p+=PositionGetDouble(POSITION_PROFIT);
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|  Position Volume                                                 |
//+------------------------------------------------------------------+
double Lots()
  {
   double lots=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            lots+=PositionGetDouble(POSITION_VOLUME);
           }
        }
     }
   return(lots);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll()
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            trade.PositionClose(PositionGetTicket(i),Slip);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            if(PositionGetInteger(POSITION_TYPE)<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastBuyPrice()
  {
   double p=0;
   
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetInteger(POSITION_TYPE)==0)
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            p=PositionGetDouble(POSITION_PRICE_OPEN);
            break;
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastSellPrice()
  {
   double p=0;
   
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetInteger(POSITION_TYPE)==1)
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            p=PositionGetDouble(POSITION_PRICE_OPEN);
            break;
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|  Position Profit                                                 |
//+------------------------------------------------------------------+
int PositionType()
  {
   int type=8;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            type=(int)PositionGetInteger(POSITION_TYPE);
            break;
           }
        }
     }
   return(type);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double Ask=SymbolInfoDouble(NULL,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(NULL,SYMBOL_BID);

   if(bars!=Bars(NULL,0))
     {
      if(BuySell==1 && (/*CountTrades()<1 ||*/ (CountTrades()>0 && FindLastBuyPrice()-Ask>=Step*_Point)))
        {
         trade.Buy(lot,NULL,Ask,0,0,"");   //buy
        }
      if(BuySell==2 && (/*CountTrades()<1 ||*/ (CountTrades()>0 && Bid-FindLastSellPrice()>=Step*_Point)))
        {
         trade.Sell(lot,NULL,Bid,0,0,"");   //sell
        }

      if(Lots()>=BigLot) lot=lot*Mnogitel;
      if(lot>MaxLots) lot=Lot;

      if(AllProfit()>Profit || AllProfit()<-Loss) {CloseAll(); lot=Lot;}
      bars=Bars(NULL,0);
     }

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

avatar

ssg

  • 7 июня 2022, 16:38
0
Попробуйте так:


#property copyright "Copyright 2016, AM2" 
#property link "https://www.forexsystems.biz" 
#property version "1.00" 

#include <Trade\Trade.mqh> 
#include <Trade\PositionInfo.mqh>   

CTrade trade;
CPositionInfo pos;

input int BuySell     = 2;    // 1-Only Buy 2-Only Sell
input int Step        = 1000; // Step

input double Lot      = 0.1;  // Volume
input double BigLot   = 0.5;  // Big Lot
input double MaxLots  = 5;    // Maximum lot

input double Profit   = 60;   // Dollars Profit 
input double Loss     = 5100; // Dollars Loss
input double Mnogitel = 10;   // Lots Mnogitel 

int bars=0;
double lot=Lot,pr=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|  Position Profit                                                 |
//+------------------------------------------------------------------+
double SymbProfit(string Symb){
   double p=0;
   for(int i=PositionsTotal()-1;i>=0;i--){
      if(pos.Select(Symb))
        {
         p+=pos.Profit();
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|  Position Volume                                                 |
//+------------------------------------------------------------------+
double Lots(string Symb){
   double lots=0;
   for(int i=PositionsTotal()-1;i>=0;i--){
      if(pos.Select(Symb))
        {
         lots+=pos.Volume();
        }
     }
   return(lots);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(string symb){
   for(int i=PositionsTotal()-1;i>=0;i--){
      if(pos.Select(symb))
        {
         trade.PositionClose(symb);
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   string symb=Symbol();
   double Ask=SymbolInfoDouble(symb,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(symb,SYMBOL_BID);

   if(bars!=Bars(symb,0))
     {
      if(BuySell==1 && (/*PositionsTotal()<1 ||*/ (PositionsTotal()>0 && (pr-Ask)/_Point>=Step))) {trade.PositionOpen(symb,0,lot,Ask,0,0); pr=Bid;}//buy
      if(BuySell==2 && (/*PositionsTotal()<1 ||*/ (PositionsTotal()>0 && (Bid-pr)/_Point>=Step))) {trade.PositionOpen(symb,1,lot,Bid,0,0); pr=Bid;}//sell

      if(Lots(symb)>=BigLot) lot=lot*Mnogitel;
      if(lot>MaxLots) lot=Lot;

      if(SymbProfit(symb)>Profit || SymbProfit(symb)<-Loss) {CloseAll(symb); lot=Lot;}
      bars=Bars(symb,0);
     }

   Comment("\n Lots: ",Lots(symb),
           "\n Profit: ",SymbProfit(symb),
           "\n Price: ",pr);
  }
//+------------------------------------------------------------------+

avatar

ssg

  • 7 июня 2022, 15:40
+1
Единственное спорное место можно увидеть здесь:
Если открыта позиция и появился сигнал по ходу — докупаемся (открываем позу также), но между сигналами в одну сторону должно пройти не меньше 45 минут (3 свечи)!!!

Для проверки вынес условие:
<code>TimeClose()>MinOpen</code>
из:
<code>
 if(prevBar!=Bars && TimeClose()>MinOpen && TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()))
</code>

и перенес это условия ниже как необходимое условие для открытие дополнительных позиций одного направления:
<code>
  if(TimeClose()>MinOpen && buy)
           PutOrder(0,Ask);
        if(TimeClose()>MinOpen && sell)
          PutOrder(1,Bid);
</code>

Получилось:
<code>
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double delta_b=Close[1]-Open[1];
   double delta_s=Open[1]-Close[1];
   
   bool buy = delta_b>Delta1*_Point && delta_b<Delta2*_Point;
   bool sell = delta_s>Delta1*_Point && delta_s<Delta2*_Point;
   
   if(CloseSig>0)
       {
         if(buy) CloseAll(1);
         if(sell) CloseAll(0);
        }

   if(prevBar!=Bars && TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()))
       {
        if(TimeClose()>MinOpen && buy)
           PutOrder(0,Ask);
        if(TimeClose()>MinOpen && sell)
          PutOrder(1,Bid);
       }
    prevBar=Bars;
   Comment("\n Time Close: ",TimeClose());
  }
//+------------------------------------------------------------------+
</code>

Тестировал на М15 опримизирую только стоплосс и профит:
<code>
extern int StopLoss      = 300;      // лось
extern int TakeProfit    = 150;      // язь
</code>

Остальное не трогал.
Тестируйте.
avatar

ssg

  • 5 июня 2022, 14:38
+1
Советник написан строго по ТЗ:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
/*
void OnTick()
  {
   double delta_b=Close[1]-Open[1];                              //размер тела бычьей свечи
   double delta_s=Open[1]-Close[1];                              //размер тела бычьей свечи
   
   bool buy = delta_b>Delta1*_Point && delta_b<Delta2*_Point;     //сигнал для покупки = если свеча бычья и тело свечи больше минимума и меньше максимума
   bool sell = delta_s>Delta1*_Point && delta_s<Delta2*_Point;    //сигнал для продажи = если свеча медвежья и тело свечи больше минимума и меньше максимума

   if(t!=Time[0] &&                                                //  если  открылся новый бар и 
      TimeClose()>MinOpen &&                                       //  после открытия последней позиции промло не менее MinOpen минут и
      TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()))// текущее время находится в интервале разрешённого для торговли 
       {
         // блок закрытия позиций по сигналу
         if(CloseSig>0)                                            // если разрешено закрытие позиций по обратному сигналу
         {
           if(buy)CloseAll(1);                                      // если получили сигнал на покупку - закрыли продажу
                                                      
           if(sell)CloseAll(0);                                     // если получили сигнал на продажу - закрыли покупку
        }
         // блок открытия позиций по сигналу       
        if(buy)                                                      // если получили сигнал на покупку 
           PutOrder(0,Ask);                                          // покупаем
           
        if(sell)                                                      // если получили сигнал на продажу 
          PutOrder(1,Bid);                                            // продаем

       t=Time[0];
     }

   Comment("\n Time Close: ",TimeClose());
  }
//+------------------------------------------------------------------+

Единственное, я бы вынес блок закрытия позиций по обратному сигналу из рабочего интервала (у автора этот момент прописан не четко):

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double delta_b=Close[1]-Open[1];                              //размер тела бычьей свечи
   double delta_s=Open[1]-Close[1];                              //размер тела бычьей свечи
   
   bool buy = delta_b>Delta1*_Point && delta_b<Delta2*_Point;     //сигнал для покупки = если свеча бычья и тело свечи больше минимума и меньше максимума
   bool sell = delta_s>Delta1*_Point && delta_s<Delta2*_Point;    //сигнал для продажи = если свеча медвежья и тело свечи больше минимума и меньше максимума

    // блок закрытия позиций по сигналу
      if(CloseSig>0)                                              // если разрешено закрытие позиций по обратному сигналу
         {
           if(buy)CloseAll(1);                                     // если получили сигнал на покупку - закрыли продажу
                                                      
           if(sell)CloseAll(0);                                    // если получили сигнал на продажу - закрыли покупку
        }
        
   if(t!=Time[0] &&                                                 //  если  открылся новый бар и 
      TimeClose()>MinOpen &&                                        //  после открытия последней позиции промло не менее MinOpen минут и
      TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent())) // текущее время находится в интервале разрешённого для торговли 
       {       
         // блок открытия позиций по сигналу       
        if(buy)                                                      // если получили сигнал на покупку 
           PutOrder(0,Ask);                                          // покупаем
           
        if(sell)                                                      // если получили сигнал на продажу 
          PutOrder(1,Bid);                                            // продаем

       t=Time[0];
     }

   Comment("\n Time Close: ",TimeClose());
  }
//+------------------------------------------------------------------+

Или такой вариант:
в настройки добавить
int prevBar;

и дальше


//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double delta_b=Close[1]-Open[1];
   double delta_s=Open[1]-Close[1];
   
   bool buy = delta_b>Delta1*_Point && delta_b<Delta2*_Point;
   bool sell = delta_s>Delta1*_Point && delta_s<Delta2*_Point;
   
   if(CloseSig>0)
       {
         if(buy) CloseAll(1);
         if(sell) CloseAll(0);
        }

   if(prevBar!=Bars && 
      TimeClose()>MinOpen && 
      TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()))
       {
        if(buy)
           PutOrder(0,Ask);
        if(sell)
          PutOrder(1,Bid);
       }
    prevBar=Bars;
   Comment("\n Time Close: ",TimeClose());
  }
//+------------------------------------------------------------------+

что в принципе почти одно и тоже.За исключением небольшой разницы…
avatar

ssg

  • 5 июня 2022, 06:14
0
Здравствуйте Уважаемый Андрей.
Хочу по просить вас перенести значение индикатора из «подвала», в правую, нижнюю часть графика, как это показано на рисунке.
Сам индикатор повторять в «подвале» НЕ надо.
шрифт 18-20
Цвет:
между уровнями(например) 100 и -100 — золотистый(GOLD)
выше +100 — зелёный (GREEN)
ниже -100 — красный (RED)


Дальше сами.Добейтесь что бы самые верхние коды советников у Вас тоже заработали.
avatar

ssg

  • 4 июня 2022, 17:35
0
Да, в этом варианте нет функции удаления графики с экрана.
Задача стояла проверить: выводится информация на экран или нет.
Ведь очевидно и понятно, что если выводится надпись, а нет данных, значит название индикатора к которому идет обращение иное. Ну по другому называется у вас индикатор в папке с индикаторами.
avatar

ssg

  • 3 июня 2022, 19:28
0
Сейчас просто добавил в ваш индикатор возможность выводить информацию на график. Сам индикатор не трогал.
Пробуйте. Если и это не получиться, тогда…

//+------------------------------------------------------------------+
//|                                                   Andrey1979.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                   Filter CCI.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
//http://zakaz.opentraders.ru/79759.html#comment163072
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
//#property strict

#property copyright ""
#property link ""

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Silver
#property indicator_width1 3
#property indicator_level1 100
#property indicator_level2 0
#property indicator_level3 -100
#property  indicator_levelcolor Gray

extern double CCI=14;
extern double c1= 1;
extern double c2= 1;
extern double c3= 1;

extern color    ClrUp          = Lime;       //Выше уровня
extern color    ClrDn          = Red;        // Ниже уровня  
extern color    ClrNeUp        = RoyalBlue; //Нейтральный выше нуля
extern color    ClrNeDn        = Gold;      //Нейтральный ниже нуля
extern int      HistWidth=2; // Толщина гистограммы
extern double   Level=100;
int    p=6;
double BufNe[];
double CCI1,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,max,min;
double BufUp[];
double BufDn[];
double BufNeUp[];
double BufNeDn[];
datetime bt=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
   IndicatorBuffers(5);

   SetIndexBuffer(0,BufNe);
   SetIndexStyle(0,DRAW_HISTOGRAM);

   SetIndexBuffer(1,BufUp);
   SetIndexBuffer(2,BufDn);
   SetIndexBuffer(3,BufNeUp);
   SetIndexBuffer(4,BufNeDn);

   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,HistWidth,ClrUp);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,HistWidth,ClrDn);
   SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,HistWidth,ClrNeUp);
   SetIndexStyle(4,DRAW_HISTOGRAM,STYLE_SOLID,HistWidth,ClrNeDn);

   string short_name="Filter CCI реал"+"("+CCI+") ";

   IndicatorShortName(short_name);
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;

   int pos=Bars-counted_bars;

   int limit=Bars;
   if(pos>limit) 
     {
      pos=limit;
     }

   double  dResult1;
   double filtr_CCI;
   string name=StringConcatenate("filtr CCI");
   
   int i;
   double a[1];
   while(pos>=0)
     {
      ArrayInitialize(a,EMPTY_VALUE);
      ArrayResize(a,0);
      for(i=5; i<p+5; i++)
        {
         int size_a=ArraySize(a);
         ArrayResize(a,size_a+1);

         a[size_a]=iCCI(NULL,0,CCI,PRICE_TYPICAL,pos+i)*c1
                   +iCCI(NULL,0,CCI,PRICE_TYPICAL,pos+(i-1))*c2-iCCI(NULL,0,CCI,PRICE_TYPICAL,pos+i)*c3
                   +iCCI(NULL,0,CCI,PRICE_TYPICAL,pos+(i-2))*c2-iCCI(NULL,0,CCI,PRICE_TYPICAL,pos+(i-1))*c3
                   +iCCI(NULL,0,CCI,PRICE_TYPICAL,pos+(i-3))*c2-iCCI(NULL,0,CCI,PRICE_TYPICAL,pos+(i-2))*c3
                   +iCCI(NULL,0,CCI,PRICE_TYPICAL,pos+(i-4))*c2-iCCI(NULL,0,CCI,PRICE_TYPICAL,pos+(i-3))*c3
                   +iCCI(NULL,0,CCI,PRICE_TYPICAL,pos+(i-5))*c2-iCCI(NULL,0,CCI,PRICE_TYPICAL,pos+(i-4))*c3;
        }
      double a_max = a[ArrayMaximum(a)];
      double a_min = a[ArrayMinimum(a)];
      max = a_max;
      min = a_min;
      dResult1=(max+min);
      BufNe[pos]=dResult1;
      filtr_CCI=BufNe[pos];
      if(BufNe[pos]<-Level)
        {
         BufDn[pos]=BufNe[pos];
         BufNeDn[pos]=-Level;
        }
      if(BufNe[pos]>=-Level && BufNe[pos]<0)
         BufNeDn[pos]=BufNe[pos];

      if(BufNe[pos]>Level)
        {
         BufUp[pos]=BufNe[pos];
         BufNeUp[pos]=Level;
        }
      if(BufNe[pos]<=Level && BufNe[pos]>0)
         BufNeUp[pos]=BufNe[pos];

      pos--;
     }
     if (bt==Time[0]) return(0);
     if (BufNe[1]>Level && BufNe[2]<=Level) {Alert(Symbol()," Выход из зоны ",Level);bt=Time[0];}
     if (BufNe[1]<-Level && BufNe[2]>=-Level) {Alert(Symbol()," Выход из зоны -",Level);bt=Time[0];}
//----------------------------------------------------------------------
  if(filtr_CCI>Level || filtr_CCI<-Level)
      {
       ObjectDelete(0,name);
       DrawLABEL("filtr CCI",StringConcatenate("filtr CCI = ",DoubleToString(filtr_CCI,2)),5,35,Color(filtr_CCI<0,clrRed,clrLime),ANCHOR_RIGHT);
      }
  else// if(filtr_CCI<Level && filtr_CCI>-Level)
       { 
          ObjectDelete(0,name);    
          DrawLABEL("filtr CCI",StringConcatenate("Индикатор находится в зоне. filtr CCI = ",DoubleToString(filtr_CCI,2)),5,35,clrYellow);
       } 
//----------------------------------------------------------------------
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+-------------------------------------------------------------------+
//|                                                                   |
//+-------------------------------------------------------------------+
color Color(bool P,color a,color b)
{
   if (P) return(a);
   else return(b);
}
//+-------------------------------------------------------------------+
//|                                                                   |
//+-------------------------------------------------------------------+
void DrawLABEL(string name, string Name, int X, int Y, color clr,ENUM_ANCHOR_POINT align=ANCHOR_RIGHT)
{
   if (ObjectFind(name)==-1)
   {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
      ObjectSet(name, OBJPROP_CORNER, 1);
      ObjectSet(name, OBJPROP_XDISTANCE, X);
      ObjectSet(name, OBJPROP_YDISTANCE, Y);
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,align); 
   }
   ObjectSetText(name,Name,12,"Arial",clr);
}
//--------------------------------------------------------------------

avatar

ssg

  • 3 июня 2022, 19:19
0
Не знаю… Единственное что заметил:
в моем индикаторе указан extern string ind_name = «Filter CCI real alert»;
а на скриншоте Filter CCI real.
Проверьте.
Если есть разногласия в написании, тогда и в советнике и индикаторе названия должны совпадать. Вплоть до пробелов.
Попробуйте еще менять таймфреймы окна.
avatar

ssg

  • 3 июня 2022, 14:11
0
Попробуйте как индикатор:

//+------------------------------------------------------------------+
//|                                                   Andrey1979.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
#property indicator_chart_window

//extern string ind_name = "Filter CCI";
extern string ind_name =  "Filter CCI real alert";
extern double CCI=14;
extern double c1= 1;
extern double c2= 1;
extern double c3= 1;
extern ENUM_TIMEFRAMES TF = PERIOD_CURRENT;
extern int Shift         = 0;        // бар индикатора
extern double   Level=100;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   string name=StringConcatenate("filtr CCI");
   double filtr_CCI = iCustom(NULL,TF,ind_name,CCI,c1,c2,c3,0,Shift);
   if(filtr_CCI>Level || filtr_CCI<-Level)
      {
       ObjectDelete(0,name);
       DrawLABEL("filtr CCI",StringConcatenate("filtr CCI = ",DoubleToString(filtr_CCI,2)),5,35,Color(filtr_CCI<0,clrRed,clrLime),ANCHOR_RIGHT);
      }
  else// if(filtr_CCI<Level && filtr_CCI>-Level)
       { 
          ObjectDelete(0,name);    
          DrawLABEL("filtr CCI",StringConcatenate("Индикатор находится в зоне. filtr CCI = ",DoubleToString(filtr_CCI,2)),5,35,clrYellow);
       } 
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+-------------------------------------------------------------------+
//|                                                                   |
//+-------------------------------------------------------------------+
color Color(bool P,color a,color b)
{
   if (P) return(a);
   else return(b);
}
//+-------------------------------------------------------------------+
//|                                                                   |
//+-------------------------------------------------------------------+
void DrawLABEL(string name, string Name, int X, int Y, color clr,ENUM_ANCHOR_POINT align=ANCHOR_RIGHT)
{
   if (ObjectFind(name)==-1)
   {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
      ObjectSet(name, OBJPROP_CORNER, 1);
      ObjectSet(name, OBJPROP_XDISTANCE, X);
      ObjectSet(name, OBJPROP_YDISTANCE, Y);
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,align); 
   }
   ObjectSetText(name,Name,12,"Arial",clr);
}
//--------------------------------------------------------------------


avatar

ssg

  • 3 июня 2022, 10:06
0
Дело не в том что Вы врете, а в том что что-то не правильно делаете.
Что пишется в журнале при нажатии кнопки — Компилировать?
Что пишется в логах при установке данного советника на график?
Одной фразы: Кидаю на график… тишина. «Маловато будет» для решения задачи.
avatar

ssg

  • 3 июня 2022, 09:44
0
Я не телепат и не знаю что вы и как делаете.У меня все работает.
Что мешает в советник добавить тот код который я написал? Об этом нельзя было подумать?
avatar

ssg

  • 2 июня 2022, 19:26
0
Смотрите сами:
Используете индикатор Filter CCI real alert а изначально он имел название
//+------------------------------------------------------------------+
//|                                                   Filter CCI.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+

Дальше: именно поэтому я в настройках включил оба названия:


extern string ind_name = "Filter CCI";
extern double CCI=14;
extern double c1= 1;
extern double c2= 1;
extern double c3= 1;
extern ENUM_TIMEFRAMES TF = PERIOD_CURRENT;
extern int Shift         = 1;        // бар индикатора
//extern string ind_name =  "Filter CCI real alert";

Замените:


//extern string ind_name = "Filter CCI";
extern double CCI=14;
extern double c1= 1;
extern double c2= 1;
extern double c3= 1;
extern ENUM_TIMEFRAMES TF = PERIOD_CURRENT;
extern int Shift         = 1;        // бар индикатора
extern string ind_name =  "Filter CCI real alert";

avatar

ssg

  • 2 июня 2022, 18:28
0
И проверьте как называется индикатор который используете
-Filter CCI real alert.mq4 или Filter CCI.mq4
avatar

ssg

  • 2 июня 2022, 17:55
0
Вставьте код как я используя функцию :code
avatar

ssg

  • 2 июня 2022, 17:50
0
*???* Выложите сюда код советника как сделал я.Посмотрю.
avatar

ssg

  • 2 июня 2022, 16:28
0
Откройте MetaEditor. Нажмите кнопку — Создать. Выберите -Советник(шаблон).
Откроется окно — заготовка (болванка)советника. Скопируйте туда приведенный мною код. Затем нажмите кнопку — Компилировать. В каталоге окна Навигатор появиться новый советник Andrey1979.mq4
avatar

ssg

  • 2 июня 2022, 14:00