Я добавил вторую скользящую среднюю (МА) с возможностью указать её период (maPeriod2) и сдвиг (maShift2) на n баров. Если нужно изменить или дополнить что-либо ещё, дайте знать!уважаемые программисты. прошу добавить вторую ма с шифтом. сдвинутую на n баров. тому будет счастье
//+------------------------------------------------------------------+
//| Ticks Volume |
//| Version 1.1 |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
#include <MovingAverages.mqh>
//--- input parameters
input int maPeriod1 = 14; // Период первой MA
input int maPeriod2 = 14; // Период второй MA
input int maShift2 = 5; // Сдвиг второй MA на n баров
//--- indicator buffers
double ExtVolumeBuffer[];
double ExtMABuffer1[];
double ExtMABuffer2[];
//--- handles for moving averages
int maHandle1;
int maHandle2;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- assign buffers
SetIndexBuffer(0, ExtVolumeBuffer, INDICATOR_DATA);
SetIndexBuffer(1, ExtMABuffer1, INDICATOR_DATA);
SetIndexBuffer(2, ExtMABuffer2, INDICATOR_DATA);
//--- set names for legend
IndicatorShortName("Ticks Volume with Two MAs");
//--- create moving average handles
maHandle1 = iMA(NULL, 0, maPeriod1, 0, MODE_SMA, PRICE_CLOSE);
maHandle2 = iMA(NULL, 0, maPeriod2, maShift2, MODE_SMA, PRICE_CLOSE);
if (maHandle1 == INVALID_HANDLE || maHandle2 == INVALID_HANDLE)
{
Print("Failed to create MA handles");
return(INIT_FAILED);
}
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[])
{
int begin = prev_calculated;
if (begin == 0) begin = maPeriod1 > maPeriod2 ? maPeriod1 : maPeriod2;
for (int i = begin; i < rates_total; i++)
{
ExtVolumeBuffer[i] = tick_volume[i];
ExtMABuffer1[i] = iMA(NULL, 0, maPeriod1, 0, MODE_SMA, PRICE_CLOSE, i);
ExtMABuffer2[i] = iMA(NULL, 0, maPeriod2, maShift2, MODE_SMA, PRICE_CLOSE, i);
}
return(rates_total);
}
//+------------------------------------------------------------------+
добавил функцию DrawOverlayObjects, которая создает объекты типа OBJ_TREND с параметром OBJPROP_BACK, установленным в false, чтобы они отображались поверх других индикаторов.Подскажите, задача сделать, чтоб этот индикатор отображался поверх остальных индикаторов на графике. Возможно ли добавить такое свойство OBJPROP_BACK ?
//+------------------------------------------------------------------+
//| LineBar2.mq5 |
//| Copyright 2024, MetaQuotes Software Corp.|
//| https://www.metaquotes.net|
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plot 1 settings
#property indicator_label1 "Up Bar"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 Green
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- plot 2 settings
#property indicator_label2 "Down Bar"
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_color2 Red
#property indicator_style2 STYLE_SOLID
#property indicator_width2 2
//--- indicator buffers
double UpBuffer[];
double DownBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- map buffers to plots
SetIndexBuffer(0,UpBuffer,INDICATOR_DATA);
SetIndexBuffer(1,DownBuffer,INDICATOR_DATA);
//--- name for the indicator
IndicatorSetString(INDICATOR_SHORTNAME,"LineBar2 Green");
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[])
{
//--- check if there is enough data
if (rates_total < 2)
return(0);
//--- main loop
for (int i = prev_calculated; i < rates_total; i++)
{
if (close[i] > open[i])
{
UpBuffer[i] = close[i];
DownBuffer[i] = EMPTY_VALUE;
}
else
{
DownBuffer[i] = close[i];
UpBuffer[i] = EMPTY_VALUE;
}
}
//--- draw objects on the chart
DrawOverlayObjects(rates_total);
return(rates_total);
}
//+------------------------------------------------------------------+
//| Draw overlay objects |
//+------------------------------------------------------------------+
void DrawOverlayObjects(const int rates_total)
{
for (int i = rates_total - 1; i >= rates_total - 10 && i >= 0; i--)
{
string objName = "OverlayLine_" + IntegerToString(i);
if (ObjectFind(objName) == -1)
{
ObjectCreate(0, objName, OBJ_TREND, 0, Time[i], Low[i], Time[i + 1], High[i + 1]);
ObjectSetInteger(0, objName, OBJPROP_COLOR, clrLime);
ObjectSetInteger(0, objName, OBJPROP_WIDTH, 1);
ObjectSetInteger(0, objName, OBJPROP_BACK, false); // Позиционирование поверх других индикаторов
}
}
}
//+------------------------------------------------------------------+
добавил функцию DrawOverlayObjects, которая создает объекты типа OBJ_TREND с параметром OBJPROP_BACK, установленным в false, чтобы они отображались поверх других индикаторов.
Код://+------------------------------------------------------------------+ //| LineBar2.mq5 | //| Copyright 2024, MetaQuotes Software Corp.| //| https://www.metaquotes.net| //+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 2 //--- plot 1 settings #property indicator_label1 "Up Bar" #property indicator_type1 DRAW_HISTOGRAM #property indicator_color1 Green #property indicator_style1 STYLE_SOLID #property indicator_width1 2 //--- plot 2 settings #property indicator_label2 "Down Bar" #property indicator_type2 DRAW_HISTOGRAM #property indicator_color2 Red #property indicator_style2 STYLE_SOLID #property indicator_width2 2 //--- indicator buffers double UpBuffer[]; double DownBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- map buffers to plots SetIndexBuffer(0,UpBuffer,INDICATOR_DATA); SetIndexBuffer(1,DownBuffer,INDICATOR_DATA); //--- name for the indicator IndicatorSetString(INDICATOR_SHORTNAME,"LineBar2 Green"); 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[]) { //--- check if there is enough data if (rates_total < 2) return(0); //--- main loop for (int i = prev_calculated; i < rates_total; i++) { if (close[i] > open[i]) { UpBuffer[i] = close[i]; DownBuffer[i] = EMPTY_VALUE; } else { DownBuffer[i] = close[i]; UpBuffer[i] = EMPTY_VALUE; } } //--- draw objects on the chart DrawOverlayObjects(rates_total); return(rates_total); } //+------------------------------------------------------------------+ //| Draw overlay objects | //+------------------------------------------------------------------+ void DrawOverlayObjects(const int rates_total) { for (int i = rates_total - 1; i >= rates_total - 10 && i >= 0; i--) { string objName = "OverlayLine_" + IntegerToString(i); if (ObjectFind(objName) == -1) { ObjectCreate(0, objName, OBJ_TREND, 0, Time[i], Low[i], Time[i + 1], High[i + 1]); ObjectSetInteger(0, objName, OBJPROP_COLOR, clrLime); ObjectSetInteger(0, objName, OBJPROP_WIDTH, 1); ObjectSetInteger(0, objName, OBJPROP_BACK, false); // Позиционирование поверх других индикаторов } } } //+------------------------------------------------------------------+
Добрый день, проблема в советнике, никак не могу решить
нужно чтобы после стоп лосса лот увеличивался в 2 раза, и после тэйкпрофита с увеличенным лотом, лот сбрасывался на стартовый
Индикатор работает по ТФ, какой ТФ в настройках так и уровни строит. autoRedraw - перестраивает на новом баре установленного в настройках ТФкруто работает спасибо
а можно по поводу индикатора уточнить
настройка reDraw перестраивает индикатор в зависимости от настройки TF
не могу понять как сделать чтобы индикатор перестраивался на определенное время, например на 23 30
перестраивает если перейти на график, который указан в настройке и вернуться на рабочий, вот в этом проблемаИндикатор работает по ТФ, какой ТФ в настройках так и уровни строит. autoRedraw - перестраивает на новом баре установленного в настройках ТФ