Нужно смотреть код индикатора, когда он эти
точки разукрашивает и как.
В индикаторе 2 буфера отвечающие за точки. Вот к ним то и нужно обращаться из эксперта с помощью iCustom.
double iCustom( | string symbol, int timeframe, string name, ..., int mode, int shift) |
symbol | - | Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ. |
timeframe | - | Период. Может быть одним из периодов графика. 0 означает период текущего графика. |
name | - | Имя пользовательского индикатора. |
... | - | Список параметров (при необходимости). Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора. |
mode | - | Индекс линии индикатора. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer. |
shift | - | Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). |
double val=iCustom(NULL, 0, "SampleInd",13,1,0);
Уважаемые ПРОФИ помогите. По идее советник должен создать ордер и снова создать такой-же, если этого ордера не станет.
Но так не происходит? Он создаёт ордера постоянно - бесконечно.
//--------------------------------------------------------------- 0 ----------------
int start() // Спец.функция start
{
int H=100; // Заданное время - секунда
int Dist=10; // Заданный TP и SL
double Lot =1; // Заданный лот
//--------------------------------------------------------------- 1 ----------------
double i=0.001;
double Cena=NormalizeDouble(Ask,3); // Нормализуем цену
double Price=NormalizeDouble(Cena+i,5); // Находим цену
double TP=Price+Dist*Point; // Находим ТР
double SL=Price-Dist*Point; // Находим SL
int x=1; // Первое условие
int y=1; // Второе условие
//--------------------------------------------------------------- 2 ----------------
for (int pos=1; pos<=OrdersTotal(); pos++) // цикл перебора всех ордеров
{ if (OrderSelect(pos-1,SELECT_BY_POS)==true) // выделим ордер
{ if (OrderTakeProfit()==TP)
{ Alert("Сработал х");
x=2;
break;
}
}
else Print("Ошибка ", GetLastError(), " при выборе ордера номер ", pos);
}
//--------------------------------------------------------------- 3 ----------------
for (pos=1; pos<=OrdersTotal(); pos++) // цикл перебора всех ордеров
{ if (OrderSelect(pos-1,SELECT_BY_POS)==true) // выделим ордер
{ if (OrderOpenPrice()==Price)
{ Alert("Сработал y");
y=2;
break;
}
}
else Print("Ошибка ", GetLastError(), " при выборе ордера номер ", pos);
}
//--------------------------------------------------------------- 4 ----------------
if (x==2&&y==2)
{ Alert("Такой ордер уже есть!!!");}
else { Alert("отправлен ордер ",Symbol()," BUYSTOP ", Price," Ожидание ответа...");
OrderSend(Symbol(), OP_BUYSTOP, Lot, Price, 0, SL, TP);
}
Sleep(H*60); // Ждём 60 секунд
RefreshRates();
//--------------------------------------------------------------- 5 -------------------
Alert ("Скрипт закончил работу -----------------------------");
return; // Выход из start()
}
Извините, но тут все неправильно
//--------------------------------------------------------------- 0 ---------------- int start() // Спец.функция start { int H=100; // Заданное время - секунда int Dist=10; // Заданный TP и SL double Lot =1; // Заданный лот //--------------------------------------------------------------- 1 ---------------- double i=0.001; double Cena=NormalizeDouble(Ask,3); // Нормализуем цену double Price=NormalizeDouble(Cena+i,5); // Находим цену double TP=Price+Dist*Point; // Находим ТР double SL=Price-Dist*Point; // Находим SL int x=1; // Первое условие int y=1; // Второе условие //--------------------------------------------------------------- 2 ---------------- for (int pos=1; pos<=OrdersTotal(); pos++) // цикл перебора всех ордеров неправильно задан цикл { if (OrderSelect(pos-1,SELECT_BY_POS)==true) // выделим ордер { if (OrderTakeProfit()==TP) //у вас ТР уже новый { Alert("Сработал х"); x=2; практически никогда не наступит break; } } else Print("Ошибка ", GetLastError(), " при выборе ордера номер ", pos); } //--------------------------------------------------------------- 3 ---------------- for (pos=1; pos<=OrdersTotal(); pos++) // цикл перебора всех ордеров то же { if (OrderSelect(pos-1,SELECT_BY_POS)==true) // выделим ордер { if (OrderOpenPrice()==Price) { Alert("Сработал y"); y=2; break; } } else Print("Ошибка ", GetLastError(), " при выборе ордера номер ", pos); } //--------------------------------------------------------------- 4 ---------------- if (x==2&&y==2) соответственно это условие никогда не наступит { Alert("Такой ордер уже есть!!!");} else { Alert("отправлен ордер ",Symbol()," BUYSTOP ", Price," Ожидание ответа..."); OrderSend(Symbol(), OP_BUYSTOP, Lot, Price, 0, SL, TP); и всегда будет открываться новый ордер } Sleep(H*60); // Ждём 60 секунд RefreshRates(); //--------------------------------------------------------------- 5 ------------------- Alert ("Скрипт закончил работу -----------------------------"); return; // Выход из start() }
Спасибо Roger за подсказки. Буду думать как исправить.
Плииз... Поясните в чём ошибки. Заранее благодарен.
неправильно задан цикл
у вас ТР уже новый
Если не сложно напишите как исправить прогу. Я хотел чтобы ордер создавался на расстоянии от горизонтальной линии.
Например так:
Ask=1.35684 Открылся ордер с ценой 1,35700, TP=1.35800, SL=1.35600
Ask=1.35681 Ничего не происходит с ордерами
Ask=1.35692 Ничего не происходит с ордерами
Ask=1.35699 Ничего не происходит с ордерами
Ask=1.35715 Открылся ордер с ценой 1,35800, TP=1.35900, SL=1.35700
Ask=1.35757 Ничего не происходит с ордерами
Ask=1.35791 Ничего не происходит с ордерами
Ask=1.35802 Открылся ордер с ценой 1,35900, TP=1.36000, SL=1.35800А прога создаёт ордера с ценой 1,35700, TP=1.35800, SL=1.35600 бесконечно много.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте. Я начал осваивать MQL4 относительно недавно, но уже пытаюсь создать советника. Я хочу, что бы он работал по одному индикатору. Индикатор представляет собой точки двух цветов, которые появляются над свечами в зависимости от ситуации на рынке. Советник должен работать очень просто: если точка цвета А - то BUY, далее советник держит сделку пока над свечой не появиться точка другого цвета, тогда советник ждет, пока эта свеча закроется, и закрывает текущую сделку. Этот алгоритм должен повторяться бесконечно. Если точка цвета В, то соответственно SELL.
Подскажите, пожалуйста, как можно осуществить это алгоритм.