Скачать MetaTrader 5

Проблемы с time и расчетом цены.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Появилась идея? Обсуди ее на форуме трейдеров!
coolon
13
coolon 2011.05.10 23:31 

Ребята если не трудно помогите разобраться с кодом.

1-я проблема советник ставит отложены ордер не там где надо.

2-я пишет в сообщениях Ошибка 4107

invalid Price for SendOrder

Если не сложно помогите. Заранее благодарен.

extern double StopLoss   =300;     // SL для открываемого ордера
extern double TakeProfit =900;      // ТР для открываемого ордера
extern int    P_Atr =27;           // Период ATR дневного
extern double Lots       =0.01;    // Жестко заданное колич. лотов
extern double Prots      =0.07;    // Процент свободных средств
extern double Or_Time    =18.00;
extern double Sq_c_Time    =8.00;

bool Work=true;                    // Эксперт будет работать.
string Symb;                       // Название финанс. инструмента
double Or_Day=0;
int start()
  {
  int
   Total,                           // Количество ордеров в окне 
   Tip=-1,                          // Тип выбран. ордера (B=0,S=1)
   Ticket;                          // Номер ордера
     
  double
   Atr,
   Cur_Hour,                        //текущий день
   Cur_Day,                         // текущий час
   Cur_Min,
   Cur_time,
   Hit=0,
   Lo=0,
   Lot,                           // Колич. лотов в выбран.ордере
   Lts,                             // Колич. лотов в открыв.ордере
   Min_Lot,                         // Минимальное количество лотов
   Step,                            // Шаг изменения размера лота
   Free,                            // Текущие свободные средства
   One_Lot,                         // Стоимость одного лота
   Price,                           // Цена выбранного ордера
   SL,                              // SL выбранного ордера 
   TP,                              // TP выбранного ордера
   TS,
   Or_b,
   Or_s;
  bool
   Ans  =false,                     // Ответ сервера после закрытия
   Cls_B=false,                     // Критерий для закрытия  Buy
   Cls_S=false,                     // Критерий для закрытия  Sell
   Opn_B=false,                     // Критерий для открытия  Buy
   Opn_S=false;                     // Критерий для открытия  Sell
 //--------------------------------------------------------------- 3 --
   // Предварит.обработка
   //if (Hour>8)
     // {Alert("Время начала работы закончено!Работа начнется на следующий день");
      //}
   if(Work==false)                              // Критическая ошибка
     {
      Alert("Критическая ошибка. Эксперт не работает.");
      return;                                   // Выход из start()
     }
Atr=iATR(NULL,PERIOD_D1,P_Atr,0);
   if(Atr>0.0580)
   {
      Work=false;
   }
//+------------------------------------------------------------------+
Cur_Day=Day();
Cur_Hour=Hour();
Cur_Min=Minute();
Cur_time=Cur_Hour + Cur_Min/100;
// Учёт ордеров-------------------------------------------------------+
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         Total++; 
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            if (Cur_Day>Or_Day && Or_Time>=Cur_time)
            {
               Cls_B=true;                     
               Cls_S=true;
            }
           }
                                       // Счётчик рыночн. орд
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
//--------------------------------------------------------------- 4 --

 // Определяем часовой квадрат--------------------------------------------------------------
 if (Hit==0 || Lo==0) 
  {
  if (Cur_time>Sq_c_Time) 
   {
     
    Hit=iHigh(NULL,PERIOD_H1,1);
    Lo=iLow(NULL,PERIOD_H1,1);
   
   }
  }
// Ждем ложного пробоя--------------------------------------------------------------------
   if (Ask+250*Point>Hit)
   {
      Opn_S=true;
      Price=Lo-200*Point;
   
   }                     // Критерий для открытия  Buy
  if (Bid-250*Point<Lo)                      // Критерий для открытия  Sell
   {
     Opn_B=true;
     Price=Hit+200*Point; 
   
   }

 //Расчет SL и TP из расчета ATR

if (Atr<0.0180)
   {
      TS=400;
   }
if (Atr<0.0150)
   {  
      TS=200;
   }
 
//Удаление отложеных ордеров--------------------------------------------
while(true)
  { 
   if (Cls_B==true)
   {
      Hit=0;
      Alert("Попытка закрыть отложенный Buy ",Ticket,". Ожидание ответа..");
      RefreshRates();
      Ans=OrderDelete(Ticket);
      if (Ans==true)                         // Получилось :)
           {
            Alert ("Закрыт отложенный ордер Buy ",Ticket);
            break;                              // Выход из цикла закр
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
    if (Cls_S==true)
         {
           Lo=0;
            Alert("Попытка закрыть отложенный Sell ",Ticket,". Ожидание ответа..");
            RefreshRates();
            Ans=OrderDelete(Ticket);
                if (Ans==true)                         // Получилось :)
                      {
                         Alert ("Закрыт отложенный ордер Sell ",Ticket);
                         break;                              // Выход из цикла закр
                        }
               if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                  continue;                           // Повторная попытка
               return;                                // Выход из start()
            }
   break;
   } 
 
 //--------------------------------------------------------------- 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();                        // Обновление данных
         SL=Price - New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Price + New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUYSTOP,Lts,Price,0,SL,TP);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            Or_Day=Day();
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      if (Total==0 && Opn_S==true)              // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();                        // Обновление данных
         SL=Price + New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Price - New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELLSTOP,Lts,Price,0,SL,TP);//Открытие Sel
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Sell ",Ticket);
            Or_Day=Day();
            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);                             // Выход из функции
     }
  }
//-------------------------------------------------------------- 11 --
int New_Stop(int Parametr)                      // Проверка стоп-прик.
  {
   int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if (Parametr < Min_Dist)                     // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Увеличена дистанция стоп-приказа.");
     }
   return(Parametr);                            // Возврат значения
  }
//-------------------------------------------------------------- 12 --//+ 
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
Nikolay Demko
12464
Nikolay Demko 2011.05.10 23:56  
coolon:

Ребята если не трудно помогите разобраться с кодом.

1-я проблема советник ставит отложены ордер не там где надо.

2-я пишет в сообщениях Ошибка 4107

invalid Price for SendOrder

Если не сложно помогите. Заранее благодарен.

Судя по коду это mql4, спросите на четвёртом форуме  быстрее ответа дождётесь.

Народ тут конечно mql4 знает, но активнее пользует mql5.

MQL4: форум по механическим торговым системам и тестированию стратегий
  • www.mql5.com
MQL4: форум по механическим торговым системам и тестированию стратегий
Sergey Molotkov
394
Sergey Molotkov 2011.05.10 23:56  
coolon:

Ребята если не трудно помогите разобраться с кодом.

1-я проблема советник ставит отложены ордер не там где надо.

2-я пишет в сообщениях Ошибка 4107

invalid Price for SendOrder

Если не сложно помогите. Заранее благодарен.

Цены, обьемы, sl и tp нужно нормализовывать.
coolon
13
coolon 2011.05.10 23:59  
molotkovsm:
Цены, обьемы, sl и tp нужно нормализовывать.
Это через NormalizeDouble да?
Sergey Molotkov
394
Sergey Molotkov 2011.05.11 00:07  
coolon:
Это через NormalizeDouble да?
да, еще рекомендую статью почитать на четвертом форуме про double переменные.
coolon
13
coolon 2011.05.11 00:27  
molotkovsm:
да, еще рекомендую статью почитать на четвертом форуме про double переменные.
А ссылку можно? Да еще вопрос как мне получить High и Low с 7.00 до 8.00 и потом проверять на пробитие.
Sergey Molotkov
394
Sergey Molotkov 2011.05.11 00:47  
coolon:
А ссылку можно? Да еще вопрос как мне получить High и Low с 7.00 до 8.00 и потом проверять на пробитие.

http://articles.mql4.com/ru/762

я бы с часового графика взял: сначала выбрать подходящий (по времени открытия) сформировавшийся бар, запомнить его high и low, и проверять, каждый тик.

Особенности работы с числами типа double в MQL4 - Статьи по MQL4
  • www.mql5.com
Особенности работы с числами типа double в MQL4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий