• Уважаемый гость! Чтобы просмотреть скрытую часть информации Вам нужно зарегистрироваться.

    Быстрая регистрация!

Удалено Встречное открытие ордеров, при открытом ордере MQL4.

  • Автор темы Phyton
  • Дата начала
P

Phyton

Участник
Регистрация
08.01.2016
Сообщения
16
Реакции
0
добрый день!
программирую около месяца.
данного советника содрал с учебника по 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);                            // Возврат значения
  }
 
  • Панель управления
  • #2
Admin

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 147
Реакции
509
Я сделал правки привел код слегка в порядок, мне не понятно что конкретно Вы хотите сделать, какую стратегию реализовать..
Код:
//+------------------------------------------------------------------+
//|                                                       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);                            // Возврат значения
  }
//+------------------------------------------------------------------+
 
P

Phyton

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

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

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 147
Реакции
509
Я сделал правки привел код слегка в порядок, мне не понятно что конкретно Вы хотите сделать, какую стратегию реализовать..
Спасибо за подсказку. Но с таким вариантом кода в журнале тестера стратегий выдает critical error. И торговля не ведется вовсе.

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

Phyton

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

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

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 147
Реакции
509
исправил вот в такой вид (потом разберусь с вычислением размера лота, сейчас важнее другое)
Код:
// Стоимость ордеров
   RefreshRates();                             // Обновление данных
   free=AccountFreeMargin();
   summariska=(free*risk)/100;
   riskorder = summariska/total_orders;
   lot=riskorder/stop;
//--------------------------------------------------------------------

ошибок нет. но возникают предупреждения о том что параметры не оптимизированы. и просчет тика занимает очень много времени, словом на просчет 5 тиков ушло 10 минут. я немного запутался. что это может означать? в справке к мт4 ничего толком не нашел.
Что то не так в коде,
riskorder = summariska/total_orders; что находится в переменной total_orders ???
 
P

Phyton

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

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

Phyton

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

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

точнее double на int
 
  • Панель управления
  • #10
Admin

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 147
Реакции
509
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);                            // Возврат значения
  }
//+------------------------------------------------------------------+
 
P

Phyton

Участник
Регистрация
08.01.2016
Сообщения
16
Реакции
0
Спасибо вам огромное за помощь!) Но проблема из за которой мы с вами начали разбор полетов не решена)
сделки по прежнему не совершаются если уже открыт ордер)
 
  • Панель управления
  • #12
Admin

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 147
Реакции
509
Спасибо вам огромное за помощь!) Но проблема из за которой мы с вами начали разбор полетов не решена)
сделки по прежнему не совершаются если уже открыт ордер)
Да я понимаю, по этому проблемы решаем по пути и делаем все грамотно.
Давайте определимся почему она там должна быть открыта и как сделать так что бы она открывалась именно там ?

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

Хочу заметить что Ваш код для начинающего очень хороший...
 
Теги Нет
Верх