Перейти к содержанию
Форекс Форум трейдеров Академии «MasterForex-V»
Внимание: для входа на форум используйте e-mail вместо ника, пароль остаётся прежним. Если вы забыли свой e-mail пишите в техподдержку ( MFadmin@bk.ru )

minus

Пользователи
  • Постов

    1
  • Зарегистрирован

  • Посещение

Весь контент minus

  1. Здравсивуйте, в данный момент учу 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); // Выход из функции } }
×
×
  • Создать...