!!!-mt4 x-tma channel-01 button.mq5
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «!!!-mt4 x-tma channel-01 button.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный файл является пользовательским индикатором для MetaTrader 5, написанным на языке MQL5. Индикатор отображается в окне графика и рассчитывает несколько наборов данных, включая две конфигурируемые линии TMA с полосами, а также ленту, построенную на основе этих линий. В коде присутствуют обработчики OnInit, OnCalculate (через start2) и OnChartEvent, что подтверждает работу индикатора в реальном времени и реакцию на события графика.
Индикатор предоставляет настраиваемые параметры для каждой из двух линий TMA: период, множитель ATR, цвет, а также возможность включения или отключения отображения. Дополнительно реализована кнопка на графике, которая позволяет пользователю включать и отключать отображение данных индикатора. Состояние кнопки сохраняется в глобальной переменной терминала.
В коде также присутствует расчёт ленты (ribbon), которая визуализируется в виде гистограммы и зависит от взаимного расположения полос двух линий TMA. Все вычисления производятся на основе ценовых данных и индикаторов iMA и iATR. Индикатор не содержит торговых функций и не выполняет автоматических операций.
Важно отметить, что исходный код содержит множество настроек, включая внешний вид кнопки и её расположение. Пользователь может изменять эти параметры для адаптации индикатора под свои предпочтения.
Настройки программы
| Настройка | Описание |
|---|---|
| Indicator | Текстовый параметр, задающий версию индикатора. По умолчанию содержит строку "TMA CHANNEL-01". |
| STR01 | Текстовый разделитель для группы настроек TMA1. |
| showTMA1 | Включает или отключает отображение линий TMA1. |
| TMA1per | Период для расчёта линии TMA1. |
| TMA1clr | Цвет линий и полос TMA1. |
| TMA1atrMulti | Множитель для значения ATR при расчёте полос TMA1. |
| STR02 | Текстовый разделитель для группы настроек TMA2. |
| showTMA2 | Включает или отключает отображение линий TMA2. |
| TMA2per | Период для расчёта линии TMA2. |
| TMA2price | Тип цены, применяемый для расчёта TMA2. |
| TMA2clr | Цвет линий и полос TMA2. |
| STR03 | Текстовый разделитель для группы настроек ленты. |
| button_note1 | Текстовый разделитель для группы настроек кнопки. |
| btn_corner | Угол графика для привязки кнопки. |
| btn_text | Текст, отображаемый на кнопке. |
| btn_Font | Название шрифта для текста кнопки. |
| btn_FontSize | Размер шрифта текста кнопки. |
| btn_text_ON_color | Цвет текста кнопки, когда данные отображаются. |
| btn_text_OFF_color | Цвет текста кнопки, когда данные скрыты. |
| btn_background_color | Цвет фона кнопки. |
| btn_border_color | Цвет границы кнопки. |
| button_x | Горизонтальное смещение кнопки от угла привязки. |
| button_y | Вертикальное смещение кнопки от угла привязки. |
| btn_Width | Ширина кнопки в пикселях. |
| btn_Height | Высота кнопки в пикселях. |
| button_note2 | Текстовый разделитель для группы настроек кнопки. |
Поиск по коду файла
#property description "Let light shine out of darkness and illuminate your world"
#property description "and with this freedom leave behind your cave of denial"
#property indicator_chart_window
#property indicator_buffers 15
#define Version "TMA CHANNEL-01"
string ID="Xard>",TimeFrame="Current time frame";
#include <WinUser32.mqh>
extern string Indicator = Version;
extern string STR01 = "<<<==== [01] TMA1 Settings ====>>>";
extern bool showTMA1 = false;
extern int TMA1per = 56,TMA1atr=100,TMA1width=1;
extern color TMA1clr = clrRed;
extern double TMA1atrMulti = 2.;
double TMA1[],TMA1up[],TMA1dn[],TMA1bandUp[],TMA1bandDn[];
extern string STR02 = "<<<==== [02] TMA2 Settings ====>>>";
extern bool showTMA2 = true, Extrapolate=true;
extern int TMA2per = 56,TMA2atr=100,TMA2width=3;
extern ENUM_APPLIED_PRICE TMA2price = PRICE_WEIGHTED;
extern color TMA2clr = clrDimGray;
extern double TMA2atrMulti = 2.; bool returnBars;
double TMA2[],TMA2up[],TMA2dn[],TMA2bandUp[],TMA2bandDn[]; double TMA2slope[],trend1[],trend2[];
extern string STR03 = "<<<==== [03] Ribbon Settings ====>>>";
extern bool showRIBBON = true; double MA1[],MA2[],MA3[],MA4[];
extern color RibColUP = C'80,80,180',RibColDN=C'160,60,60'; int getChartScale=WRONG_VALUE;
extern string button_note1 = "------------------------------";
extern ENUM_BASE_CORNER btn_corner = CORNER_LEFT_UPPER; // chart btn_corner for anchoring
extern string btn_text = "TMA";
extern string btn_Font = "Arial";
extern int btn_FontSize = 10; //btn__font size
extern color btn_text_ON_color = clrWhite;
extern color btn_text_OFF_color = clrRed;
extern color btn_background_color = clrDimGray;
extern color btn_border_color = clrBlack;
extern int button_x = 20; //btn__x
extern int button_y = 13; //btn__y
extern int btn_Width = 60; //btn__width
extern int btn_Height = 20; //btn__height
extern string button_note2 = "------------------------------";
bool show_data = true;
string IndicatorName, IndicatorObjPrefix;
bool calculateValue; string FontType="Arial Black",SymPair="",indicatorFileName;
double data1; int timeFrame,BarsCount=1000,Type,Type2,win,FontSize=14,FontSize2=12,pipsize;
int init2(){
int Buffers=15,Buf=-1; IndicatorBuffers(Buffers); TMA2per=MathMax(TMA2per,1);
if(TimeFrame==0 || TimeFrame<Period()) TimeFrame=Period(); timeFrame=stringToTimeFrame(TimeFrame);
win=WindowFind(ID);
if(showRIBBON) Type=DRAW_HISTOGRAM; else Type=DRAW_NONE;
Buf+=1; SetIndexBuffer(Buf,MA1);
Buf+=1; SetIndexBuffer(Buf,MA2);
Buf+=1; SetIndexBuffer(Buf,MA3);
Buf+=1; SetIndexBuffer(Buf,MA4); fSetBuffers();
if(showTMA1) Type=DRAW_LINE; else Type=DRAW_NONE; int T1w=TMA1width; color T1c=TMA1clr;
Buf+=1; SetIndexBuffer(Buf,TMA1); SetIndexStyle(Buf,DRAW_NONE); SetIndexDrawBegin(Buf,TMA1per);
Buf+=1; SetIndexBuffer(Buf,TMA1bandUp); SetIndexStyle(Buf,Type,0,T1w,T1c); SetIndexDrawBegin(Buf,TMA1per);
Buf+=1; SetIndexBuffer(Buf,TMA1bandDn); SetIndexStyle(Buf,Type,0,T1w,T1c); SetIndexDrawBegin(Buf,TMA1per);
if(showTMA2) Type=DRAW_LINE; else Type=DRAW_NONE; int T2w=TMA2width; color T2c=TMA2clr;
Buf+=1; SetIndexBuffer(Buf,TMA2); SetIndexStyle(Buf,DRAW_NONE); SetIndexDrawBegin(Buf,TMA2per);
Buf+=1; SetIndexBuffer(Buf,TMA2up); SetIndexStyle(Buf,DRAW_NONE); SetIndexDrawBegin(Buf,TMA2per);
Buf+=1; SetIndexBuffer(Buf,TMA2dn); SetIndexStyle(Buf,DRAW_NONE); SetIndexDrawBegin(Buf,TMA2per);
Buf+=1; SetIndexBuffer(Buf,TMA2bandUp); SetIndexStyle(Buf,Type,0,T2w,T2c); SetIndexDrawBegin(Buf,TMA2per);
Buf+=1; SetIndexBuffer(Buf,TMA2bandDn); SetIndexStyle(Buf,Type,0,T2w,T2c); SetIndexDrawBegin(Buf,TMA2per);
Buf+=1; SetIndexBuffer(Buf,TMA2slope); SetIndexStyle(Buf,DRAW_NONE);
Buf+=1; SetIndexBuffer(Buf,trend1); SetIndexStyle(Buf,DRAW_NONE);
Buf+=1; SetIndexBuffer(Buf,trend2); SetIndexStyle(Buf,DRAW_NONE);
if(Buffers != Buf+1) Print("*******Buffer MisMatch!!! ",Buffers," ",Buf);
for(int Bufx=0;Bufx<indicator_buffers;Bufx++){SetIndexLabel(Bufx,NULL);}
indicatorFileName = WindowExpertName();
calculateValue = (TimeFrame=="calculateValue"); if (calculateValue) return(0);
returnBars = (TimeFrame=="returnBars"); if (returnBars) return(0);
timeFrame = stringToTimeFrame(TimeFrame); return(INIT_SUCCEEDED);}//End OnInit
void deinit2(){ int reason; switch(reason){
case REASON_CHARTCHANGE :
case REASON_RECOMPILE :
case REASON_CLOSE : break;
default : {
CleanUpOnAisle1(ID); string lookFor = ID+":"; int lookForLength = StringLen(lookFor);
for(int io=ObjectsTotal()-1; io>=0; io--){string objectName=ObjectName(io);
if(StringSubstr(objectName,0,lookForLength)==lookFor) ObjectDelete(objectName);}}}}
int start2()
{
fSetBuffers();
int counted_bars=IndicatorCounted(); int i,j,k,limit; double TMA1range;
if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--;
limit=MathMin(Bars-counted_bars+TMA2per,Bars-1); if(returnBars){TMA2[0] = limit+1; return(0);}
for (i=limit; i>=0; i--){
TMA1[i] = EMPTY_VALUE;
TMA1up[i] = EMPTY_VALUE;
TMA1dn[i] = EMPTY_VALUE;
TMA1[i] = iMA(NULL,0,TMA1per,0,MODE_LWMA,PRICE_CLOSE,i);
TMA1range = iATR(NULL,0,TMA1atr,i+10);
TMA1bandUp[i] = TMA1[i+1] + (TMA1range * TMA1atrMulti);
TMA1bandDn[i] = TMA1[i+1] - (TMA1range * TMA1atrMulti);}
if(calculateValue || timeFrame==Period()){
if(TMA2slope[limit]==-1) CleanPoint(limit,TMA2up,TMA2dn);
for(i=limit;i>=0;i--){
if(Extrapolate || (!Extrapolate && i>TMA2per)){
double sum = (TMA2per+1)*iMA(NULL,0,1,0,MODE_SMA,TMA2price,i);
double sumw = (TMA2per+1);
for(j=1, k=TMA2per; j<=TMA2per; j++, k--){
sum += k*iMA(NULL,0,1,0,MODE_SMA,TMA2price,i+j); sumw += k;
if(j<=i){ sum += k*iMA(NULL,0,1,0,MODE_SMA,TMA2price,i-j); sumw += k;}}
double TMA2range = iATR(NULL,0,TMA2atr,i+10)*TMA2atrMulti;
TMA2[i] = sum/sumw;
TMA2bandUp[i] = TMA2[i]+TMA2range;
TMA2bandDn[i] = TMA2[i]-TMA2range;} else {
TMA2[i] = TMA2[i+1];
TMA2bandUp[i] = TMA2bandUp[i+1];
TMA2bandDn[i] = TMA2bandDn[i+1];}
TMA2up[i] = EMPTY_VALUE;
TMA2dn[i] = EMPTY_VALUE;
TMA2slope[i] = TMA2slope[i+1];
trend1[i] = 0;
trend2[i] = trend2[i+1];
if(TMA2[i]> TMA2[i+1]) TMA2slope[i] = 1;
if(TMA2[i]< TMA2[i+1]) TMA2slope[i] =-1;
if(Close[i] > TMA2bandUp[i]) trend2[i] = 1;
if(Close[i] < TMA2bandDn[i]) trend2[i] =-1;
if(TMA2slope[i]==-1) PlotPoint(i,TMA2up,TMA2dn,TMA2);}
for(i=0; i<limit; i++){
if(TMA1bandUp[i]>TMA2bandUp[i]){MA2[i]=TMA1bandUp[i];MA1[i]=TMA2bandUp[i];MA4[i]=EMPTY_VALUE;MA3[i]=EMPTY_VALUE;}
if(TMA1bandDn[i]<TMA2bandDn[i]){MA4[i]=TMA1bandDn[i];MA3[i]=TMA2bandDn[i];MA2[i]=EMPTY_VALUE;MA1[i]=EMPTY_VALUE;}}
} return(0);}
void CleanPoint(int i,double& first[],double& second[]){
if((second[i]!=EMPTY_VALUE) && (second[i+1]!=EMPTY_VALUE)) second[i+1]=EMPTY_VALUE;
else if((first[i]!=EMPTY_VALUE) && (first[i+1]!=EMPTY_VALUE) && (first[i+2]==EMPTY_VALUE)) first[i+1]=EMPTY_VALUE;}
voidПоказано первые 50% кода (символов: 12572)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.