J'ai des problèmes avec ça, je comprends que le point d'ancrage est price1, mais je ne suis pas assez intelligent pour faire une condition. Ma variante ne fonctionne pas.
Merci beaucoup pour votre aide. Je pense avoir compris comment cette condition fonctionne. Malheureusement, je dispose de très peu d'informations sur la manipulation de la fonction OnTimer(), mais j'ai trouvé une astuce et la condition fonctionne. Mais ne va-t-il pas gaspiller toute la mémoire si la fonction fonctionne en millisecondes ?
C'est ce que j'ai obtenu :
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();
}
Merci beaucoup pour votre aide. Je pense que je comprends comment cette condition fonctionne. Malheureusement, il existe très peu d'informations sur la façon de travailler avec la fonction OnTimer(), mais j'ai trouvé une astuce et la condition fonctionne. Mais cette fonction ne va-t-elle pas surcharger la mémoire si elle est déclenchée en millisecondes ?
Bonjour à tous. J'ai trouvé un article et j'ai décidé de le refaire à ma façon. Mais comme j'ai les mains au mauvais endroit, j'aimerais avoir vos conseils sur ce que j'ai mal fait.
Je voulais créer mon propre indicateur basé sur les lectures rsi.
Je ne suis pas très expérimenté dans ce domaine, mais il semble que je fasse quelque chose de mal ))))))))).
Je n'ai pas besoin que vous le fassiez pour moi, dites-moi simplement où et quoi ajouter et remplacer !
#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 на дневном...
Bonjour à tous. J'ai trouvé un article et j'ai décidé de le refaire pour mon propre usage. Mais comme j'ai les mains au mauvais endroit, j'aimerais avoir vos conseils sur ce que j'ai mal fait.
J'ai des problèmes avec ça, je comprends que le point d'ancrage est price1, mais je ne suis pas assez intelligent pour faire une condition. Ma variante ne fonctionne pas.
Cette section
devrait être placé dans OnTimer()
Quelqu'un sait-il si les avertissements individuels du compilateur peuvent être désactivés ?
ou bien
"La déclaration de 'XXxx' cache une variable globale"
me dérange...
Quelqu'un sait-il si les avertissements individuels du compilateur peuvent être désactivés ?
ou bien
"La déclaration de 'XXxx' cache une variable globale"
sont ennuyeux...
Je ne peux pas.
Cette section
devrait être placé dans OnTimer()
Merci beaucoup pour votre aide. Je pense avoir compris comment cette condition fonctionne. Malheureusement, je dispose de très peu d'informations sur la manipulation de la fonction OnTimer(), mais j'ai trouvé une astuce et la condition fonctionne. Mais ne va-t-il pas gaspiller toute la mémoire si la fonction fonctionne en millisecondes ?
C'est ce que j'ai obtenu :
Merci beaucoup pour votre aide. Je pense que je comprends comment cette condition fonctionne. Malheureusement, il existe très peu d'informations sur la façon de travailler avec la fonction OnTimer(), mais j'ai trouvé une astuce et la condition fonctionne. Mais cette fonction ne va-t-elle pas surcharger la mémoire si elle est déclenchée en millisecondes ?
Voilà ce que j'ai obtenu :
Ce ne sera pas... et c'est mieux de le faire.
ne marqueront pas... et c'est mieux de le faire.
Merci beaucoup !
ne marqueront pas... et c'est mieux de le faire
Et c'est mieux de le faire de cette façon :
Ou mieux encore :
Bonjour à tous. J'ai trouvé un article et j'ai décidé de le refaire à ma façon. Mais comme j'ai les mains au mauvais endroit, j'aimerais avoir vos conseils sur ce que j'ai mal fait.
Voici l'article auquel je fais référence -http://mql.su/2017/11/lesson11-first-indicator/
Je voulais créer mon propre indicateur basé sur les lectures rsi.
Je ne suis pas très expérimenté dans ce domaine, mais il semble que je fasse quelque chose de mal ))))))))).
Je n'ai pas besoin que vous le fassiez pour moi, dites-moi simplement où et quoi ajouter et remplacer !
Bonjour à tous. J'ai trouvé un article et j'ai décidé de le refaire pour mon propre usage. Mais comme j'ai les mains au mauvais endroit, j'aimerais avoir vos conseils sur ce que j'ai mal fait.
Voici l'article auquel je fais référence -http://mql.su/2017/11/lesson11-first-indicator/
Je voulais créer mon propre indicateur basé sur les lectures rsi.
Je ne suis pas très expérimenté dans ce domaine, mais il semble que je fasse quelque chose de mal ))))))))).
Vous n'avez pas à le faire pour moi, dites-moi simplement où et quoi ajouter et remplacer !
if(per >= verx && Close[1]<Open[1]) return(BUY); if(per <= verx && Close[1]> Open[1]) return(SELL);Vous comparez le mauvais rsi au lieu du "per".