Автор Тема: Встречное открытие ордеров, при открытом ордере MQL4.  (Прочитано 2101 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

08 Январь 2016, 13:06:43
Прочитано 2101 раз

Phyton

  • Новичок

  • Оффлайн
  • *

  • 16
  • Репутация:
    5
добрый день!
программирую около месяца.
данного советника содрал с учебника по mql4 и немного модернизировал под свою логику.
как задать условие открытия ордера во время действия уже отправленного ордера?
проблема в том что во время наступления торговых условий, при уже открытом ордере, ордер в ту же сторону не открывается. (например пришло условие продавать, но в это время уже открыт ордер на продажу, ордер несмотря на условия открыт не будет)
менял код.
того что надо не получилось. либо открывает ордер на каждом тике, либо открывает ордера только при условии что открытых ордеров нет.
в этой версии открывает ордера на каждом тике после того как пришли условия?
в чем может быть проблема? и как ее исправить?!
вот код

extern int per = 150;
extern int stop = 50;
extern int profit = 100;
extern int risk = 5;
extern int total_orders = 5;
string Symb;

void start ()
{
double H1= iHigh("EURUSD",PERIOD_H1,1);
double L1= iLow("EURUSD",PERIOD_H1,1);
double H2= iHigh("EURUSD",PERIOD_H1,2);
double L2= iLow("EURUSD",PERIOD_H1,2);
double O1= iOpen("EURUSD",PERIOD_H1,1);
double C1= iClose("EURUSD",PERIOD_H1,1);
double O2= iOpen("EURUSD",PERIOD_H1,2);
double C2= iClose("EURUSD",PERIOD_H1,2);
bool buovb = false;
bool beovb = false;
double ma;
double lot;
double free;
double summariska;
double riskorder;
double SL;
double TP;
int total;
int Ticket;

//--------------------------------------------------------------- 3 --
   // Предварит.обработка
     if(Bars < per)                     
     {
      Alert("Недостаточно баров в окне. Эксперт не работает.");
      return;                                 
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
  // Торговые критерии
  ma=iMA(NULL,0,per,0,MODE_EMA,PRICE_CLOSE,1);
      if (H1 > H2 && L1 < L2 && O1 > C1 && (ma > Bid))
     {
     beovb = true;
     }
   if (H1 > H2 && L1 < L2 && O1 < C2 && (ma < Ask))
     {
     buovb = true;
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
 // Стоимость ордеров
   RefreshRates();
     total_orders=OrdersTotal();                              // Обновление данных
     free = AccountFreeMargin();
     summariska = (free*risk)/100;
     riskorder = summariska/total_orders;
     lot = riskorder/stop;
//--------------------------------------------------------------------
//--------------------------------------------------------------------

  // Открытие ордеров
   for(total=0; OrdersTotal()<5; total++)                                 
     {
      if (total<5 && buovb == true)             
        {                                       // критерий откр. Buy
         RefreshRates();   
         SL=Bid - New_Stop(stop)*Point;     // Вычисление SL откр.
         TP=Bid + New_Stop(profit)*Point;                     // Обновление данных
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,lot,Ask,2,SL,TP);   //Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                         // Повторная попытка
         return;                                // Выход из start()
        }
      if (total<5 && beovb == true )              // критерий откр. Sell
        {                                       
         RefreshRates();
         SL=Ask + New_Stop(stop)*Point;     // Вычисление SL откр.
         TP=Ask - New_Stop(profit)*Point;                       // Обновление данных
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,lot,Bid,2,SL,TP);//Открытие Sel
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Sell ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                    // Повторная попытка
         return;                                // Выход из start()
        }
      break;                                    // Выход из while
     }
     
     
     
}

//-------------------------------------------------------------- 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("Старая версия терминала.");
                                // Больше не работать
         return(0);                             // Выход из функции
      case 64: Alert("Счет заблокирован.");
                                    // Больше не работать
         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);                            // Возврат значения
  }

08 Январь 2016, 13:54:07
Ответ #1

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Я сделал правки привел код слегка в порядок, мне не понятно что конкретно Вы хотите сделать, какую стратегию реализовать..
//+------------------------------------------------------------------+
//|                                                       159847.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern int per=150;
extern int stop=50;
extern int profit=100;
extern int risk=5;
extern int total_orders=5;
string Symb="EURUSD";
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void start()
  {
   double H1= iHigh(Symb,PERIOD_H1,1);
   double L1= iLow(Symb,PERIOD_H1,1);
   double H2= iHigh(Symb,PERIOD_H1,2);
   double L2= iLow(Symb,PERIOD_H1,2);
   double O1= iOpen(Symb,PERIOD_H1,1);
   double C1= iClose(Symb,PERIOD_H1,1);
   double O2= iOpen(Symb,PERIOD_H1,2);
   double C2= iClose(Symb,PERIOD_H1,2);
   bool buovb = false;
   bool beovb = false;
   double ma;
   double lot;
   double free;
   double summariska;
   double riskorder;
   double SL;
   double TP;
   int Ticket;

//--------------------------------------------------------------- 3 --
// Предварит.обработка
   if(Bars<per)
     {
      Alert("Недостаточно баров в окне. Эксперт не работает.");
      return;
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Торговые критерии
   ma=iMA(NULL,0,per,0,MODE_EMA,PRICE_CLOSE,1);
   if(H1>H2 && L1<L2 && O1>C1 && (ma>Bid))
     {
      beovb=true;
     }
   if(H1>H2 && L1<L2 && O1<C2 && (ma<Ask))
     {
      buovb=true;
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Стоимость ордеров
   RefreshRates();
   total_orders=OrdersTotal();                              // Обновление данных
   free=AccountFreeMargin();
   summariska=(free*risk)/100;
   riskorder = summariska/total_orders;
   lot=riskorder/stop;
//--------------------------------------------------------------------
//--------------------------------------------------------------------

// Открытие ордеров
//   for(total=0; OrdersTotal()<5; total++) // Условие  OrdersTotal()<5; не верно так  OrdersTotal()возвращает общее колличчество ордеров открытых на счете все и отложенные и рыночные
//   
//      if(total<5 && buovb==true)
//        {                                       // критерий откр. Buy
//         RefreshRates();
//         SL=Bid-New_Stop(stop)*Point;     // Вычисление SL откр.
//         TP=Bid+New_Stop(profit)*Point;                     // Обновление данных
//         Alert("Попытка открыть Buy. Ожидание ответа..");
//         Ticket=OrderSend(Symb,OP_BUY,lot,Ask,2,SL,TP);   //Открытие Buy
//         if(Ticket>0) // Получилось :)
//           {
//            Alert("Открыт ордер Buy ",Ticket);
//            return;                             // Выход из start()
//           }
//         if(Fun_Error(GetLastError())==1) // Обработка ошибок
//            continue;                         // Повторная попытка
//         return;                                // Выход из start()
//        }
//   if(total<5 && beovb==true) // критерий откр. Sell
//     {
//      RefreshRates();
//      SL=Ask+New_Stop(stop)*Point;     // Вычисление SL откр.
//      TP=Ask-New_Stop(profit)*Point;                       // Обновление данных
//      Alert("Попытка открыть Sell. Ожидание ответа..");
//      Ticket=OrderSend(Symb,OP_SELL,lot,Bid,2,SL,TP);//Открытие Sel
//      if(Ticket>0) // Получилось :)
//        {
//         Alert("Открыт ордер Sell ",Ticket);
//         return;                             // Выход из start()
//        }
//      if(Fun_Error(GetLastError())==1) // Обработка ошибок
//         continue;                    // Повторная попытка
//      return;                                // Выход из start()
//     }

   int b=0,//количество бай ордеров
   s=0; // количество селл ордеров
   for(int i=OrdersTotal()-1; i<=0; i--)
      if(OrderSelect(i,SELECT_BY_POS))
         if(OrderSymbol()==Symb)
           {
            if(OrderType()==OP_BUY)b++;
            if(OrderType()==OP_SELL)s++;
           }

   if(b==0 && buovb==true)
     {
      RefreshRates();
      SL=Bid-New_Stop(stop)*Point;     // Вычисление SL откр.
      TP=Bid+New_Stop(profit)*Point;                     // Обновление данных
      Alert("Попытка открыть Buy. Ожидание ответа..");
      Ticket=OrderSend(Symb,OP_BUY,lot,Ask,2,SL,TP);   //Открытие Buy
      if(Ticket>0) // Получилось :)
        {
         Alert("Открыт ордер Buy ",Ticket);
         return;                             // Выход из start()
        }
     }
   if(s==0 && beovb==true) // критерий откр. Sell
     {
      RefreshRates();
      SL=Ask+New_Stop(stop)*Point;     // Вычисление SL откр.
      TP=Ask-New_Stop(profit)*Point;                       // Обновление данных
      Alert("Попытка открыть Sell. Ожидание ответа..");
      Ticket=OrderSend(Symb,OP_SELL,lot,Bid,2,SL,TP);//Открытие Sel
      if(Ticket>0) // Получилось :)
        {
         Alert("Открыт ордер Sell ",Ticket);
         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("Старая версия терминала.");
      // Больше не работать
      return(0);                             // Выход из функции
      case 64: Alert("Счет заблокирован.");
      // Больше не работать
      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=(int)MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if(Parametr<Min_Dist) // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Увеличена дистанция стоп-приказа.");
     }
   return(Parametr);                            // Возврат значения
  }
//+------------------------------------------------------------------+

ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

08 Январь 2016, 14:25:45
Ответ #2

Phyton

  • Новичок

  • Оффлайн
  • *

  • 16
  • Репутация:
    5
Я сделал правки привел код слегка в порядок, мне не понятно что конкретно Вы хотите сделать, какую стратегию реализовать..
Спасибо за подсказку. Но с таким вариантом кода в журнале тестера стратегий выдает critical error. И торговля не ведется вовсе.

стратегия на сегодняшний день проста.
внешний бар.
покупка если 150EMA ниже цены.
продажа если 150EMA выше цены.
как только это осилю, будут добавляться еще сетапы прайсэкшн. потом расчет условий (тренд консолидация). соответственно все это с динамическими лотами, траллом позиций, и еще кучей интересностей.
уже второй день сижу а этой проблемой. не могу решить никак.

08 Январь 2016, 14:42:02
Ответ #3

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Я сделал правки привел код слегка в порядок, мне не понятно что конкретно Вы хотите сделать, какую стратегию реализовать..
Спасибо за подсказку. Но с таким вариантом кода в журнале тестера стратегий выдает critical error. И торговля не ведется вовсе.

стратегия на сегодняшний день проста.
внешний бар.
покупка если 150EMA ниже цены.
продажа если 150EMA выше цены.
как только это осилю, будут добавляться еще сетапы прайсэкшн. потом расчет условий (тренд консолидация). соответственно все это с динамическими лотами, траллом позиций, и еще кучей интересностей.
уже второй день сижу а этой проблемой. не могу решить никак.
На срине видно что в строке 66 в позиции 27 происходит деление на 0.  Этого нельзя делать.
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

08 Январь 2016, 14:47:06
Ответ #4

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

08 Январь 2016, 15:27:36
Ответ #5

Phyton

  • Новичок

  • Оффлайн
  • *

  • 16
  • Репутация:
    5
Цитировать
Вот

исправил вот в такой вид (потом разберусь с вычислением размера лота, сейчас важнее другое)
// Стоимость ордеров
   RefreshRates();                             // Обновление данных
   free=AccountFreeMargin();
   summariska=(free*risk)/100;
   riskorder = summariska/total_orders;
   lot=riskorder/stop;
//--------------------------------------------------------------------


ошибок нет. но возникают  предупреждения о том что параметры не оптимизированы. и просчет тика занимает очень много времени, словом на просчет 5 тиков ушло 10 минут. я немного запутался. что это может означать? в справке к мт4 ничего толком не нашел.

08 Январь 2016, 15:51:28
Ответ #6

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Цитировать
Вот

исправил вот в такой вид (потом разберусь с вычислением размера лота, сейчас важнее другое)
// Стоимость ордеров
   RefreshRates();                             // Обновление данных
   free=AccountFreeMargin();
   summariska=(free*risk)/100;
   riskorder = summariska/total_orders;
   lot=riskorder/stop;
//--------------------------------------------------------------------


ошибок нет. но возникают  предупреждения о том что параметры не оптимизированы. и просчет тика занимает очень много времени, словом на просчет 5 тиков ушло 10 минут. я немного запутался. что это может означать? в справке к мт4 ничего толком не нашел.

Что то не так в коде,
riskorder = summariska/total_orders;   что находится в переменной total_orders ???
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

08 Январь 2016, 16:02:05
Ответ #7

Phyton

  • Новичок

  • Оффлайн
  • *

  • 16
  • Репутация:
    5
riskorder = summariska/total_orders;   что находится в переменной total_orders ???
в переменной total_orders находится значение максимального количества открытых ордеров (переменная объявлена глобально с extern)
то есть логика блока:
обновить данные
узнать свободные средства
узнаем количество средств доступных для торговли ( пять процентов от депо),другими словами сумму риска
узнаем сумму риска на 1 ордер (из пяти)
узнает рамер лота исходя из суммы риска на 1 ордер делённый на стоп в пунктах.

мб это потому что я пункты на double значения поделил?



08 Январь 2016, 16:06:03
Ответ #8

Phyton

  • Новичок

  • Оффлайн
  • *

  • 16
  • Репутация:
    5
riskorder = summariska/total_orders;   что находится в переменной total_orders ???
в переменной total_orders находится значение максимального количества открытых ордеров (переменная объявлена глобально с extern)
то есть логика блока:
обновить данные
узнать свободные средства
узнаем количество средств доступных для торговли ( пять процентов от депо),другими словами сумму риска
узнаем сумму риска на 1 ордер (из пяти)
узнает рамер лота исходя из суммы риска на 1 ордер делённый на стоп в пунктах.

мб это потому что я пункты на double значения поделил?


точнее double на int

08 Январь 2016, 16:24:42
Ответ #9

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
riskorder = summariska/total_orders;   что находится в переменной total_orders ???
в переменной total_orders находится значение максимального количества открытых ордеров (переменная объявлена глобально с extern)
то есть логика блока:
обновить данные
узнать свободные средства
узнаем количество средств доступных для торговли ( пять процентов от депо),другими словами сумму риска
узнаем сумму риска на 1 ордер (из пяти)
узнает рамер лота исходя из суммы риска на 1 ордер делённый на стоп в пунктах.

мб это потому что я пункты на double значения поделил?


точнее double на int
Я коде допустил ошибку, вот поправил
//+------------------------------------------------------------------+
//|                                                       159847.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern int per=150;
extern int stop=50;
extern int profit=100;
extern int risk=5;
extern int total_orders=5;
string Symb="EURUSD";
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void start()
  {
   double H1= iHigh(Symb,PERIOD_H1,1);
   double L1= iLow(Symb,PERIOD_H1,1);
   double H2= iHigh(Symb,PERIOD_H1,2);
   double L2= iLow(Symb,PERIOD_H1,2);
   double O1= iOpen(Symb,PERIOD_H1,1);
   double C1= iClose(Symb,PERIOD_H1,1);
   double O2= iOpen(Symb,PERIOD_H1,2);
   double C2= iClose(Symb,PERIOD_H1,2);
   bool buovb = false;
   bool beovb = false;
   double ma;
   double lot;
   double free;
   double summariska;
   double riskorder;
   double SL;
   double TP;
   int Ticket;

//--------------------------------------------------------------- 3 --
// Предварит.обработка
   if(Bars<per)
     {
      Alert("Недостаточно баров в окне. Эксперт не работает.");
      return;
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Торговые критерии
   ma=iMA(NULL,0,per,0,MODE_EMA,PRICE_CLOSE,1);
   if(H1>H2 && L1<L2 && O1>C1 && (ma>Bid))
     {
      beovb=true;
     }
   if(H1>H2 && L1<L2 && O1<C2 && (ma<Ask))
     {
      buovb=true;
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Стоимость ордеров
   RefreshRates();
 //  total_orders=OrdersTotal(); // Если нет ордеров значит присвоить 0
   free=AccountFreeMargin();
   summariska=(free*risk)/100;
   riskorder = summariska/total_orders; // Делить на количество ордеров если ордеров нет то делить на 0, это критическая ошибка, на 0 делить не льзя.
   lot=riskorder/stop;
//--------------------------------------------------------------------
//--------------------------------------------------------------------

// Открытие ордеров
//   for(total=0; OrdersTotal()<5; total++) // Условие  OrdersTotal()<5; не верно так  OrdersTotal()возвращает общее колличчество ордеров открытых на счете все и отложенные и рыночные
//   
//      if(total<5 && buovb==true)
//        {                                       // критерий откр. Buy
//         RefreshRates();
//         SL=Bid-New_Stop(stop)*Point;     // Вычисление SL откр.
//         TP=Bid+New_Stop(profit)*Point;                     // Обновление данных
//         Alert("Попытка открыть Buy. Ожидание ответа..");
//         Ticket=OrderSend(Symb,OP_BUY,lot,Ask,2,SL,TP);   //Открытие Buy
//         if(Ticket>0) // Получилось :)
//           {
//            Alert("Открыт ордер Buy ",Ticket);
//            return;                             // Выход из start()
//           }
//         if(Fun_Error(GetLastError())==1) // Обработка ошибок
//            continue;                         // Повторная попытка
//         return;                                // Выход из start()
//        }
//   if(total<5 && beovb==true) // критерий откр. Sell
//     {
//      RefreshRates();
//      SL=Ask+New_Stop(stop)*Point;     // Вычисление SL откр.
//      TP=Ask-New_Stop(profit)*Point;                       // Обновление данных
//      Alert("Попытка открыть Sell. Ожидание ответа..");
//      Ticket=OrderSend(Symb,OP_SELL,lot,Bid,2,SL,TP);//Открытие Sel
//      if(Ticket>0) // Получилось :)
//        {
//         Alert("Открыт ордер Sell ",Ticket);
//         return;                             // Выход из start()
//        }
//      if(Fun_Error(GetLastError())==1) // Обработка ошибок
//         continue;                    // Повторная попытка
//      return;                                // Выход из start()
//     }

   int b=0,//количество бай ордеров
   s=0; // количество селл ордеров
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS))
         if(OrderSymbol()==Symb)
           {
            if(OrderType()==OP_BUY)b++;
            if(OrderType()==OP_SELL)s++;
           }

   if(b==0 && buovb==true)
     {
      RefreshRates();
      SL=Bid-New_Stop(stop)*Point;     // Вычисление SL откр.
      TP=Bid+New_Stop(profit)*Point;                     // Обновление данных
      Alert("Попытка открыть Buy. Ожидание ответа..");
      Ticket=OrderSend(Symb,OP_BUY,lot,Ask,2,SL,TP);   //Открытие Buy
      if(Ticket>0) // Получилось :)
         Alert("Открыт ордер Buy ",Ticket);
     }
   if(s==0 && beovb==true) // критерий откр. Sell
     {
      RefreshRates();
      SL=Ask+New_Stop(stop)*Point;     // Вычисление SL откр.
      TP=Ask-New_Stop(profit)*Point;                       // Обновление данных
      Alert("Попытка открыть Sell. Ожидание ответа..");
      Ticket=OrderSend(Symb,OP_SELL,lot,Bid,2,SL,TP);//Открытие Sel
      if(Ticket>0) // Получилось :)
         Alert("Открыт ордер Sell ",Ticket);
     }
  }
//-------------------------------------------------------------- 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("Старая версия терминала.");
      // Больше не работать
      return(0);                             // Выход из функции
      case 64: Alert("Счет заблокирован.");
      // Больше не работать
      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=(int)MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if(Parametr<Min_Dist) // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Увеличена дистанция стоп-приказа.");
     }
   return(Parametr);                            // Возврат значения
  }
//+------------------------------------------------------------------+
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

08 Январь 2016, 16:45:25
Ответ #10

Phyton

  • Новичок

  • Оффлайн
  • *

  • 16
  • Репутация:
    5
ошибка
Спасибо вам огромное за помощь!) Но проблема из за которой мы с вами начали разбор полетов не решена)
сделки по прежнему не совершаются если уже открыт ордер)

08 Январь 2016, 17:39:33
Ответ #11

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
ошибка
Спасибо вам огромное за помощь!) Но проблема из за которой мы с вами начали разбор полетов не решена)
сделки по прежнему не совершаются если уже открыт ордер)
Да я понимаю, по этому проблемы решаем по пути и делаем все грамотно.
Давайте определимся почему она там должна быть открыта и как сделать так что бы она открывалась именно там ?

Из своего опыта вижу что нам подсчет ордеров тут не нужен, но если мы не будем считать ордера то сделки будут открываться на каждом тике.
Тогда лучше входить по новому бару.
Если не сможете придумать или найти как определитьновый бар я Вам подскажу.

Хочу заметить что Ваш код для начинающего очень хороший...
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

09 Январь 2016, 10:25:32
Ответ #12

Phyton

  • Новичок

  • Оффлайн
  • *

  • 16
  • Репутация:
    5
спасибо)
сделка должна быть открыта несмотря на то что уже имеется открытый ордер. должна она быть открыта так как вновь наступили условия, (появился внешний бар)
а как без подсчета сделок ограничить максимальное количество открытых ордеров?
прописывать тоже в условие? (стратегия предполагает работу только в одном терминале и на одном счете торговля будет вестить только в автоматическом режиме, поэтому лишних ордеров открыто не будет (или выставлено если отложенный)
что то вроде
если
внешний бар=правде && новый бар=правда && orderstotal<5 
то открыть ордер?

вот нашел на форуме понятную для меня функцию которая определяет новый бар.
bool Fun_New_Bar()                              // Ф-ия обнаружения ..
  {                                             // .. нового бара
   static datetime Prev_Time=0;                  // Время текущего бара
   if (Prev_Time==0)
     {
        Prev_Time=Time[0];
        return(false);
     }
   if(Prev_Time!=Time[0])                        // Сравниваем время
     {
      Prev_Time=Time[0];                         // Теперь время такое
      return(true);                             // Поймался новый бар
     }
  return(false);
}

09 Январь 2016, 11:34:22
Ответ #13

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
спасибо)
сделка должна быть открыта несмотря на то что уже имеется открытый ордер. должна она быть открыта так как вновь наступили условия, (появился внешний бар)
а как без подсчета сделок ограничить максимальное количество открытых ордеров?
прописывать тоже в условие? (стратегия предполагает работу только в одном терминале и на одном счете торговля будет вестить только в автоматическом режиме, поэтому лишних ордеров открыто не будет (или выставлено если отложенный)
что то вроде
если
внешний бар=правде && новый бар=правда && orderstotal<5 
то открыть ордер?

вот нашел на форуме понятную для меня функцию которая определяет новый бар.
bool Fun_New_Bar()                              // Ф-ия обнаружения ..
  {                                             // .. нового бара
   static datetime Prev_Time=0;                  // Время текущего бара
   if (Prev_Time==0)
     {
        Prev_Time=Time[0];
        return(false);
     }
   if(Prev_Time!=Time[0])                        // Сравниваем время
     {
      Prev_Time=Time[0];                         // Теперь время такое
      return(true);                             // Поймался новый бар
     }
  return(false);
}

Вот
//+------------------------------------------------------------------+
//|                                                       159847.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern int per=150;
extern int stop=50;
extern int profit=100;
extern int risk=5;
extern int total_orders=5;
string Symb="EURUSD";
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void start()
  {
   double H1= iHigh(Symb,PERIOD_H1,1);
   double L1= iLow(Symb,PERIOD_H1,1);
   double H2= iHigh(Symb,PERIOD_H1,2);
   double L2= iLow(Symb,PERIOD_H1,2);
   double O1= iOpen(Symb,PERIOD_H1,1);
   double C1= iClose(Symb,PERIOD_H1,1);
   double O2= iOpen(Symb,PERIOD_H1,2);
   double C2= iClose(Symb,PERIOD_H1,2);
   bool buovb = false;
   bool beovb = false;
   double ma;
   double lot;
   double free;
   double summariska;
   double riskorder;
   double SL;
   double TP;
   int Ticket;

//--------------------------------------------------------------- 3 --
// Предварит.обработка
   if(Bars<per)
     {
      Alert("Недостаточно баров в окне. Эксперт не работает.");
      return;
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Торговые критерии
   ma=iMA(NULL,0,per,0,MODE_EMA,PRICE_CLOSE,1);
   if(H1>H2 && L1<L2 && O1>C1 && (ma>Bid))
     {
      beovb=true;
     }
   if(H1>H2 && L1<L2 && O1<C2 && (ma<Ask))
     {
      buovb=true;
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Стоимость ордеров
   RefreshRates();
//  total_orders=OrdersTotal(); // Если нет ордеров значит присвоить 0
   free=AccountFreeMargin();
   summariska=(free*risk)/100;
   riskorder=summariska/total_orders; // Делить на количество ордеров если ордеров нет то делить на 0, это критическая ошибка, на 0 делить не льзя.
   lot=riskorder/stop;
//--------------------------------------------------------------------
//--------------------------------------------------------------------

// Открытие ордеров
//   for(total=0; OrdersTotal()<5; total++) // Условие  OrdersTotal()<5; не верно так  OrdersTotal()возвращает общее колличчество ордеров открытых на счете все и отложенные и рыночные
//   
//      if(total<5 && buovb==true)
//        {                                       // критерий откр. Buy
//         RefreshRates();
//         SL=Bid-New_Stop(stop)*Point;     // Вычисление SL откр.
//         TP=Bid+New_Stop(profit)*Point;                     // Обновление данных
//         Alert("Попытка открыть Buy. Ожидание ответа..");
//         Ticket=OrderSend(Symb,OP_BUY,lot,Ask,2,SL,TP);   //Открытие Buy
//         if(Ticket>0) // Получилось :)
//           {
//            Alert("Открыт ордер Buy ",Ticket);
//            return;                             // Выход из start()
//           }
//         if(Fun_Error(GetLastError())==1) // Обработка ошибок
//            continue;                         // Повторная попытка
//         return;                                // Выход из start()
//        }
//   if(total<5 && beovb==true) // критерий откр. Sell
//     {
//      RefreshRates();
//      SL=Ask+New_Stop(stop)*Point;     // Вычисление SL откр.
//      TP=Ask-New_Stop(profit)*Point;                       // Обновление данных
//      Alert("Попытка открыть Sell. Ожидание ответа..");
//      Ticket=OrderSend(Symb,OP_SELL,lot,Bid,2,SL,TP);//Открытие Sel
//      if(Ticket>0) // Получилось :)
//        {
//         Alert("Открыт ордер Sell ",Ticket);
//         return;                             // Выход из start()
//        }
//      if(Fun_Error(GetLastError())==1) // Обработка ошибок
//         continue;                    // Повторная попытка
//      return;                                // Выход из start()
//     }

   int b=0,//количество бай ордеров
   s=0; // количество селл ордеров
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS))
         if(OrderSymbol()==Symb)
           {
            if(OrderType()==OP_BUY)b++;
            if(OrderType()==OP_SELL)s++;
           }
   if(Fun_New_Bar()==true)
     {
      if((b+s)<total_orders && buovb==true)
        {
         RefreshRates();
         SL=Bid-New_Stop(stop)*Point;     // Вычисление SL откр.
         TP=Bid+New_Stop(profit)*Point;                     // Обновление данных
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,lot,Ask,2,SL,TP);   //Открытие Buy
         if(Ticket>0) // Получилось :)
            Alert("Открыт ордер Buy ",Ticket);
        }
      if((b+s)<total_orders && beovb==true) // критерий откр. Sell
        {
         RefreshRates();
         SL=Ask+New_Stop(stop)*Point;     // Вычисление SL откр.
         TP=Ask-New_Stop(profit)*Point;                       // Обновление данных
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,lot,Bid,2,SL,TP);//Открытие Sel
         if(Ticket>0) // Получилось :)
            Alert("Открыт ордер Sell ",Ticket);
        }
     }
  }
//-------------------------------------------------------------- 10 --
bool Fun_New_Bar()                              // Ф-ия обнаружения ..
  {                                             // .. нового бара
   static datetime Prev_Time=0;                  // Время текущего бара
   if(Prev_Time==0)
     {
      Prev_Time=Time[0];
      return(false);
     }
   if(Prev_Time!=Time[0]) // Сравниваем время
     {
      Prev_Time=Time[0];                         // Теперь время такое
      return(true);                             // Поймался новый бар
     }
   return(false);
  }
//-------------------------------------------------------------- 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("Старая версия терминала.");
      // Больше не работать
      return(0);                             // Выход из функции
      case 64: Alert("Счет заблокирован.");
      // Больше не работать
      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=(int)MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if(Parametr<Min_Dist) // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Увеличена дистанция стоп-приказа.");
     }
   return(Parametr);                            // Возврат значения
  }
//+------------------------------------------------------------------+

ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

09 Январь 2016, 11:49:13
Ответ #14

Phyton

  • Новичок

  • Оффлайн
  • *

  • 16
  • Репутация:
    5
вау!
спасибо! все как надо работает!
не могли бы вы немного пояснить логику вот этого блока? а то немного недопонимаю...
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS))
         if(OrderSymbol()==Symb)
           {
            if(OrderType()==OP_BUY)b++;
            if(OrderType()==OP_SELL)s++;
           }