Muchas gracias por su ayuda. Creo que he entendido cómo funciona esta condición. Desafortunadamente, tengo muy poca información sobre el manejo de la función OnTimer(), pero encontré un consejo y la condición funciona. ¿Pero no se gastará toda la memoria si la función funciona en milisegundos?
Esto es lo que tengo:
extern ENUM_LINE_STYLE line_st = STYLE_SOLID; // 9. Стиль линий
extern int line_wd = 2; // 10. Толщина линий
// Координаты
extern int x_coor = 7; // Сдвиг по оси X
extern int y_coor = 10; // Сдвиг по оси Y
string nameline;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
EventSetMillisecondTimer(500);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Timer function |//+------------------------------------------------------------------+voidOnTimer()
{
//RefreshRates();double a=ObjectGetDouble(ChartID(),nameline,OBJPROP_PRICE1);
double b=ObjectGetDouble(ChartID(),nameline,OBJPROP_PRICE2);
if(b!=a)
{
ObjectSetDouble(ChartID(),nameline,OBJPROP_PRICE2,a);
Print("Работает - функция");
}
else
{
Print("Не работает - функция");
}
}
//+------------------------------------------------------------------+//| ChartEvent function |//+------------------------------------------------------------------+voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &sparam)
{
datetime dt1 = 0;
double price1 = 0;
datetime dt2 = 0;
double price2 = 0;
int window = 0;
int x = 0;
int y = 0;
//+------------------------------------------------------------------+ //--- Клик по 1 линииif(id==CHARTEVENT_OBJECT_CLICK)
{
string clickObject=sparam;
if(clickObject==line[0])
{
nameline="line_"+IntegerToString(MathRand()+100,0,' ');
y=200;
ChartXYToTimePrice(0,25,y,window,dt1,price1);
ChartXYToTimePrice(0,147,y,window,dt2,price2);
TrendCreate(0,nameline,0,dt1,price1,dt2,price2,color1,line_st,line_wd,false,true,false,false,false,0);
}
}
}
void OnDeinit(const int reason)
{
Comment("");
EventKillTimer();
}
Muchas gracias por su ayuda. Creo que entiendo cómo funciona esta condición. Desafortunadamente, hay muy poca información sobre cómo trabajar con la función OnTimer(), pero encontré una pista y la condición funciona. ¿Pero esta función no sobrecargará la memoria si se activa en milisegundos?
Hola a todos. he encontrado un artículo y he decidido rehacerlo a mi manera. pero como tengo las manos mal puestas, me gustaría que me aconsejarais sobre lo que he hecho mal.
Quería hacer mi propio indicador basado en las lecturas de rsi.
No tengo mucha experiencia en este campo pero parece que estoy haciendo algo mal )))))))))
No necesito hacerlo por mí, ¡sólo dime dónde y qué añadir y sustituir!
#property copyright"Copyright 2021, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"#property strict#property indicator_chart_window//#property indicator_separate_window // Индик. рисуется в основном окне//////////////////////////////////////////#property indicator_buffers2// Сообщаем о том, что у нас будет два буфера#property indicator_color1 Lime // Цвет стрелки для покупок#property indicator_color2 Red // Цвет стрелки для продажdouble Buy[]; // Буфер для покупокdouble Sell[]; // Буфер для продаж#define BUY 0#define SELL 1inputint per = 14;
inputint verx = 70;
inputint niz = 30;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- indicator buffers mapping// Установим связь наших массивов с буферами индикатораSetIndexBuffer (0, Buy);
SetIndexBuffer (1, Sell);
// Устанавливаем нулевые значения для индикатора, при которых не будет сигнальных стрелок
SetIndexEmptyValue (0, 0);
SetIndexEmptyValue (1, 0);
//Определяем стиль отображения индикаторных линий - стрелка
SetIndexStyle (0, DRAW_ARROW);
SetIndexStyle (1, DRAW_ARROW);
// Установим значки "стрелки" для буферов
SetIndexArrow(0, 233); // Стрелка "вверх" для покупок
SetIndexArrow(1, 234); // Стрелка "вниз" для продаж//Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
IndicatorDigits (Digits);
//Строка с кратким названием индикатора выводится в сплывающей подсказке при наведении указателя мыши на стрелку
IndicatorShortName ("Мой первый индикатор");
//Устанавливаем текст описания стрелок индикатора для отображения информации в всплывающей подсказке.
SetIndexLabel(0, "Покупаем");
SetIndexLabel(1, "Продаём");
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---// Вычислим кол-во не измененных баров с последнего вызова индикатораint counted_bars = IndicatorCounted();
int limit, signal;
//Пересчитаем последний посчитанный барif (counted_bars>0)
counted_bars-- ;
//Определяем число баров, которые следует пересчитать
limit=Bars-counted_bars;
// Чтобы индикатор "не перерисовывался" расчет ведем с последнего закрытого бара(он имеет индекс равный 1)// нулевой бар является текущим, т.е. он изменяется с каждым новым тиком до тех пор пока не будет закрытfor(int i = 2; i < limit; i++)
{
//Проверяем сигнал на вход для текущего бара
signal = Signal(i-1);
if (signal == BUY)
{
Buy[i-1] = low[i-1];
}
elseif (signal == SELL)
{
Sell[i-1] = high[i-1];
}
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+int Signal(int i)
{
// Снимем показания индикатораdouble Current = iRSI(NULL, 0, per, PRICE_CLOSE, i);
double Previous = iRSI(NULL, 0, per, PRICE_CLOSE, i+1);
double SCurrent = iRSI(NULL, 0, per, PRICE_CLOSE, i);
// Для предыдущего бараdouble SPrevious = iRSI(NULL, 0, per, PRICE_CLOSE, i+1);
// А теперь проверим всловия для наличия сигналов// есть сигнал на покупку?if(per >= verx && Close[1]<Open[1])
return(BUY);
if(per <= verx && Close[1]>Open[1])
return(SELL);
// Сигнала нет return(-1);
}
На этом уроке мы напишем простой индикатор, который в дальнейшем будем использовать при разработке советника. А использовать для получения сигнала мы будем уже существующие — Moving Average и MACD. Алгоритм следующий: Определять направление сделки (покупка или продажа) мы будем по индикатору Moving Average с периодом 100 на дневном...
Hola a todos. he encontrado un artículo y he decidido rehacerlo para mi uso. pero como tengo las manos mal puestas, me gustaría que me aconsejarais sobre lo que he hecho mal.
Estoy teniendo problemas con esto, entiendo el punto de anclaje precio1, pero no puedo averiguar cómo hacer la condición. Mi variante no funciona.
Esta sección
debe ponerse en OnTimer()
¿alguien sabe si se pueden desactivar las advertencias individuales del compilador?
o bien
"La declaración de 'XXxx' oculta la variable global"
me molesta...
¿alguien sabe si se pueden desactivar las advertencias individuales del compilador?
o bien
"La declaración de 'XXxx' oculta la variable global"
son molestos...
No puedo
Esta sección
debe ponerse en OnTimer()
Muchas gracias por su ayuda. Creo que he entendido cómo funciona esta condición. Desafortunadamente, tengo muy poca información sobre el manejo de la función OnTimer(), pero encontré un consejo y la condición funciona. ¿Pero no se gastará toda la memoria si la función funciona en milisegundos?
Esto es lo que tengo:
Muchas gracias por su ayuda. Creo que entiendo cómo funciona esta condición. Desafortunadamente, hay muy poca información sobre cómo trabajar con la función OnTimer(), pero encontré una pista y la condición funciona. ¿Pero esta función no sobrecargará la memoria si se activa en milisegundos?
Esto es lo que tengo:
No lo hará... y es mejor hacer esto.
no marcará... y es mejor hacerlo.
¡Muchas gracias!
no marcará... y es mejor hacerlo
Y es mejor hacerlo así:
O mejor aún:
Hola a todos. he encontrado un artículo y he decidido rehacerlo a mi manera. pero como tengo las manos mal puestas, me gustaría que me aconsejarais sobre lo que he hecho mal.
Aquí está el artículo al que me refiero -http://mql.su/2017/11/lesson11-first-indicator/
Quería hacer mi propio indicador basado en las lecturas de rsi.
No tengo mucha experiencia en este campo pero parece que estoy haciendo algo mal )))))))))
No necesito hacerlo por mí, ¡sólo dime dónde y qué añadir y sustituir!
Hola a todos. he encontrado un artículo y he decidido rehacerlo para mi uso. pero como tengo las manos mal puestas, me gustaría que me aconsejarais sobre lo que he hecho mal.
Aquí está el artículo al que me refiero -http://mql.su/2017/11/lesson11-first-indicator/
Quería hacer mi propio indicador basado en las lecturas de rsi.
No tengo mucha experiencia en este campo pero parece que estoy haciendo algo mal )))))))))
No tienes que hacerlo por mí, ¡sólo dime dónde y qué añadir y sustituir!
if(per >= verx && Close[1]<Open[1]) return(BUY); if(per <= verx && Close[1]> Open[1]) return(SELL);Estás comparando el rsi equivocado en lugar de "por".