Если переменная BuySell будет равной 0 советник вообще ничего не будет делать.
Можно ввести и использование BuySell = 0 тогда нужно изменить логику.
input int BuySell = 2; // 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());
}
//+------------------------------------------------------------------+
#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());
}
//+------------------------------------------------------------------+
#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);
}
//+------------------------------------------------------------------+
Если открыта позиция и появился сигнал по ходу — докупаемся (открываем позу также), но между сигналами в одну сторону должно пройти не меньше 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>
<code> extern int StopLoss = 300; // лось extern int TakeProfit = 150; // язь </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(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());
}
//+------------------------------------------------------------------+
Здравствуйте Уважаемый Андрей.
Хочу по просить вас перенести значение индикатора из «подвала», в правую, нижнюю часть графика, как это показано на рисунке.
Сам индикатор повторять в «подвале» НЕ надо.
шрифт 18-20
Цвет:
между уровнями(например) 100 и -100 — золотистый(GOLD)
выше +100 — зелёный (GREEN)
ниже -100 — красный (RED)
//+------------------------------------------------------------------+
//| 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);
}
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| 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);
}
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| 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";
ssg