Здравсивуйте, в данный момент учу mql, сначала написал простенький советник на основе WPR, теперь пытаюсь прилепит к нему лок - не порлучается, вроде бы все делаю правильно, но советник не хочет работать как надо. Помогите реализовать советник. И объясните пожалуйста в чем моя ошибка. Основная ошибка мне кажется содержится в пятом блоке. Принцип работы таков: основной сигнал - это пробитие уровня -50, противоположную позицию (лок) открываем только в том случае, если до нынешнего сигнала,(начало отсчета прошлое пробитие wprом уровня -50) wpr не входил в одну из зон - >-20 или <-80. Раскрываяется лок соответственно и вхождением wpr в одну из этих зон и при этом закрываем соответсвующию позицию и соответсвующую оставляем. Заранее благодарен. Код: //+------------------------------------------------------------------+
//| WPR.mq4 |
//| Copyright © 2008, aftar Minus . |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Minus."
#property link "http://www.metaquotes.net"
//+------------------------------------------------------------------1a--
extern int Period_WPR=34; // период WPR
extern double Lots=0.1; // используемый лот
extern double Prots=0.01; // Процент свободных средств
//-------------------------------------------------------------------1b--
bool Work=true; // Эксперт будет работать.
string Symb; // Название финанс. инструмента
//-------------------------------------------------------------------2---
int start()
{
int Total; //количество ордеров в окне
int Tip=-1; // Тип выбран. ордера (B=0,S=1)
int Ticket; // Номер ордера
double Wpr_t; //текущее значение WPR
double Lot; // Колич. лотов в выбран.ордере
double Lts; // Колич. лотов в открыв.ордере
double Min_Lot; // Минимальное количество лотов
double Step; // Шаг изменения размера лота
double Free; // Текущие свободные средства
double One_Lot; // Стоимость одного лота
double Price; // Цена выбранного ордера
bool Ans=false; // Ответ сервера после закрытия
bool Cls_B=false; // Критерий для закрытия Buy
bool Cls_S=false; // Критерий для закрытия Sell
bool Opn_B=false; // Критерий для открытия Buy
bool Opn_S=false; // Критерий для открытия Sell
bool zone1=true;
bool zone2=true;
//--------------------------------------------------------------- 3 --
// Предварит.обработка
if(Bars<Period_WPR) // Недостаточно баров
{
Alert("Недостаточно баров в окне. Эксперт не работает.");
return; // Выход из start()
}
if(Work==false) // Критическая ошибка
{
Alert("Критическая ошибка. Эксперт не работает.");
return; // Выход из start()
}
//--------------------------------------------------------------- 4 --
// Учёт ордеров
Symb=Symbol(); // Название фин.инстр.
Total=0; // Количество ордеров
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
if (OrderSymbol()!=Symb)continue; // Не наш фин. инструм
if (OrderType()>1) // Попался отложенный
{
Alert("Обнаружен отложенный ордер. Эксперт не работает.");
return; // Выход из start()
}
Total++; // Счётчик рыночн. орд
if (Total>3) // Не более одного орд
{
Alert("Несколько рыночных ордеров. Эксперт не работает.");
return; // Выход из start()
}
Ticket=OrderTicket(); // Номер выбранн. орд.
Tip=OrderType(); // Тип выбранного орд.
Price=OrderOpenPrice(); // Цена выбранн. орд.
Lot=OrderLots(); // Количество лотов
}
}
//--------------------------------------------------------------- 5 --
// Торговые критерии
int H=1000; // Колич.баров в расчётной истории
int P=Period_WPR; // Период расчётной МА
double WPR=iCustom(NULL,0,"WPR",P,H,0,0,1);
//-------------------------//
if (WPR>-50 && zone1==true)
{
Opn_B=true;
Cls_S=true;
zone1=false;
zone2=false;
}
else
{
if (WPR>-50 && zone1==false && zone2==false)
{
Opn_B=true;
{
if (WPR>-20)
{
zone1=true;
zone2=false;
Cls_S=true;
zone1=false;
}
else
{
if (WPR<-80)
{
zone2=true;
zone1=false;
Cls_B=true;
zone2=false;
}
}
}
}
}
if (WPR<-50 && zone2==true)
{
Opn_S=true;
Cls_B=true;
zone2=false;
zone1=false;
}
else
{
if (WPR<-50 && zone2==false && zone1==false)
{ Opn_S=true;
{
if (WPR<-80)
{
zone2=true;
zone1=false;
Cls_B=true;
zone2=false;
}
else
{
if (WPR>-20)
{
zone1=true;
zone2=false;
Cls_S=true;
zone1=false;
}
}
}
}
}
//--------------------------------------------------------------- 6 --
// Закрытие ордеров
while(true) // Цикл закрытия орд.
{
if (Tip==0 && Cls_B==true) // Открыт ордер Buy..
{ //и есть критерий закр
RefreshRates(); // Обновление данных
Ans=OrderClose(Ticket,Lot,Bid,5); // Закрытие Buy
if (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Buy ",Ticket);
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
if (Tip==1 && Cls_S==true) // Открыт ордер Sell..
{ // и есть критерий закр
RefreshRates(); // Обновление данных
Ans=OrderClose(Ticket,Lot,Ask,5); // Закрытие Sell
if (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Sell ",Ticket);
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
break; // Выход из while
}
//--------------------------------------------------------------- 7 --
// Стоимость ордеров
RefreshRates(); // Обновление данных
Min_Lot=MarketInfo(Symb,MODE_MINLOT); // Миним. колич. лотов
Free=AccountFreeMargin(); // Свободн средства
One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
Step=MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размера
if (Lots>0) // Если заданы лоты,то
Lts=Lots; // с ними и работаем
else // % свободных средств
Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия
if (Lts<Min_Lot) Lts=Min_Lot; // Не меньше минимальн
if (Lts*One_Lot>Free) // Лот дороже свободн.
{
Alert(" Не хватает денег на ", Lts," лотов");
return; // Выход из start()
}
//--------------------------------------------------------------- 8 --
// Открытие ордеров
while(true) // Цикл закрытия орд.
{
if (Total==0 && Opn_B==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данных
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,0,0);//Открытие Buy
if (Ticket>0) // Получилось :)
{
zone1=true;
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
if (Total==0 && Opn_S==true) // Открытых орд. нет +
{ // критерий откр. Sell
RefreshRates(); // Обновление данных
Alert("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,0,0);//Открытие Sel
if (Ticket>0) // Получилось :)
{
zone1=true;
Alert ("Открыт ордер Sell ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
break; // Выход из while
}
//--------------------------------------------------------------- 9 --
return; // Выход из start()
}
//-------------------------------------------------------------- 10 --
int Fun_Error(int Error) // Ф-ия обработ ошибок
{
switch(Error)
{ // Преодолимые ошибки
case 4: Alert("Торговый сервер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решение
return(1); // Выход из функции
case 135:Alert("Цена изменилась. Пробуем ещё раз..");
RefreshRates(); // Обновим данные
return(1); // Выход из функции
case 136:Alert("Нет цен. Ждём новый тик..");
while(RefreshRates()==false) // До нового тика
Sleep(1); // Задержка в цикле
return(1); // Выход из функции
case 137:Alert("Брокер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решение
return(1); // Выход из функции
case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
Sleep(500); // Простое решение
return(1); // Выход из функции
// Критические ошибки
case 2: Alert("Общая ошибка.");
return(0); // Выход из функции
case 5: Alert("Старая версия терминала.");
Work=false; // Больше не работать
return(0); // Выход из функции
case 64: Alert("Счет заблокирован.");
Work=false; // Больше не работать
return(0); // Выход из функции
case 133:Alert("Торговля запрещена.");
return(0); // Выход из функции
case 134:Alert("Недостаточно денег для совершения операции.");
return(0); // Выход из функции
default: Alert("Возникла ошибка ",Error); // Другие варианты
return(0); // Выход из функции
}
}