Нужен совет программиста по созданию советника

 

Здравствуйте. Я начал осваивать MQL4 относительно недавно, но уже пытаюсь создать советника. Я хочу, что бы он работал по одному индикатору. Индикатор представляет собой точки двух цветов, которые появляются над свечами в зависимости от ситуации на рынке. Советник должен работать очень просто: если точка цвета А - то BUY, далее советник держит сделку пока над свечой не появиться точка другого цвета, тогда советник ждет, пока эта свеча закроется, и закрывает текущую сделку. Этот алгоритм должен повторяться бесконечно. Если точка цвета В, то соответственно SELL.

Подскажите, пожалуйста, как можно осуществить это алгоритм.

 

Нужно смотреть код индикатора, когда он эти

точки разукрашивает и как.

 

В индикаторе 2 буфера отвечающие за точки. Вот к ним то и нужно обращаться из эксперта с помощью iCustom.


double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)
Расчет указанного пользовательского индикатора. Пользовательский индикатор должен быть скомпилирован (файл с расширением EX4) и находиться в директории каталог_терминала\experts\indicators.
Параметры:
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 бесконечно много.

Причина обращения: