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

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

Удалено Робот по параболик сар

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

Phyton

Участник
Регистрация
08.01.2016
Сообщения
16
Реакции
0
опять в ступоре.:mad:
идея такова.
написать робота в который открывает позиции по показаниям индикатора parabolic sar.
если параболик больше аск то открыть ордер на продажу, если параболик меньше бид, то закрыть имеющуюся позицию и открыть ордер на покупку. и наоборот. если была отрыта продажа и настали условия для покупки, то продажу закрыть и открыть покупку.
стоп и профит пока что не ставятся. все открывается и закрывается только по параболику.
лот задается вручную.


пока что не понимаю почему по моим условиям всегда открывает только покупку
вот условия открытия и закрытия
Код:
 Торговые критерии: продажа если параболик больше аск, покупка если параболик меньше бид.
   if((nul && one) < Bid)    // покупка
     {
      pok=true; //(покупка)
      zprod=true; //(закрытие продажи)
     }
   if((nul && one) > Ask)   //продажа
     {
      prod=true; //(продажа)
      zpok=true; //(закрытие покупки)
     }
 
  • Панель управления
  • #2
Admin

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 238
Реакции
518
опять в ступоре.:mad:
идея такова.
написать робота в который открывает позиции по показаниям индикатора parabolic sar.
если параболик больше аск то открыть ордер на продажу, если параболик меньше бид, то закрыть имеющуюся позицию и открыть ордер на покупку. и наоборот. если была отрыта продажа и настали условия для покупки, то продажу закрыть и открыть покупку.
стоп и профит пока что не ставятся. все открывается и закрывается только по параболику.
лот задается вручную.


пока что не понимаю почему по моим условиям всегда открывает только покупку
вот условия открытия и закрытия
Код:
 Торговые критерии: продажа если параболик больше аск, покупка если параболик меньше бид.
   if((nul && one) < Bid)    // покупка
     {
      pok=true; //(покупка)
      zprod=true; //(закрытие продажи)
     }
   if((nul && one) > Ask)   //продажа
     {
      prod=true; //(продажа)
      zpok=true; //(закрытие покупки)
     }
Приложите Весь код пожалуйста..
 
P

Phyton

Участник
Регистрация
08.01.2016
Сообщения
16
Реакции
0
вот


Код:
//+------------------------------------------------------------------+
//|                                                       159847.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016 Phyton"
#property link      "http://vk.com/evilheadbanger"
#property version   "1.00"
#property strict
extern int stop=200;
extern int profit=200;
extern double lot = 0.01;
string Symb="EURUSD";
bool Work = true;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void start()
  {
double nul = iSAR(NULL,0,0.02,0.2,0);
double one = iSAR(NULL,0,0.02,0.2,1);
bool pok = false; //продажа
bool prod = false; //покупка
bool zpok = false; //закрытие покупки 
bool zprod = false; //закрытие продажи
bool Ans = false;
double SL;
double TP;
int Ticket;
int tip = OrderType();
//--------------------------------------------------------------- 3 --
//--------------------------------------------------------------------
// Торговые критерии: продажа если параболик больше аск, покупка если параболик меньше бид.
   if((nul && one) < Bid)    // покупка
     {
      pok=true;
      zprod=true;
     }
   if((nul && one) > Ask)   //продажа
     {
      prod=true;
      zpok=true;
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Открытие ордеров
   if(Fun_New_Bar()==true)
     {
      if(OrdersTotal()<1 && pok ==true)
        {
         RefreshRates();
         SL=Bid-New_Stop(stop)*Point;     
         TP=Bid+New_Stop(profit)*Point;                     
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,lot,Ask,2,SL,TP);  
         if(Ticket>0) // Получилось :)
            Alert("Открыт ордер Buy ",Ticket);
        }
      if(OrdersTotal()<1 && prod ==true) 
        {
         RefreshRates();
         SL=Ask+New_Stop(stop)*Point;     
         TP=Ask-New_Stop(profit)*Point;                      
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,lot,Bid,2,SL,TP);
         if(Ticket>0) 
            Alert("Открыт ордер Sell ",Ticket);
        }
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Закрытие ордеров

if (tip == 0 && zpok == true)
     {                                     
     Alert("Попытка закрыть Buy ", Ticket ,"Ожидание ответа..");
     RefreshRates();                        // Обновление данных
     Ans=OrderClose(Ticket,lot,Bid,2);      // Закрытие Buy
     if (Ans==true)                         // Получилось :)
         {
          Alert ("Закрыт ордер Buy ",Ticket);
         }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
         return;                                // Выход из start()
     }
if (tip == 1 && zprod == true)
     {                                     
     Alert("Попытка закрыть Sell ", Ticket ,"Ожидание ответа..");
     RefreshRates();                        // Обновление данных
     Ans=OrderClose(Ticket,lot,Ask,2);      // Закрытие Buy
     if (Ans==true)                         // Получилось :)
         {
          Alert ("Закрыт ордер Sell ",Ticket);
         }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
         return;                                // Выход из start()
     }
   
   
   
 }



//-------------------------------------------------------------- 11 --
int New_Stop(int Parametr) // Проверка стоп-прик.
  {
   int Min_Dist=(int)MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if(Parametr<Min_Dist) // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Увеличена дистанция стоп-приказа.");
     }
   return(Parametr);                            // Возврат значения
  }
//+------------------------------------------------------------------+

//-------------------------------------------------------------- 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("Старая версия терминала.");
         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);                             // Выход из функции
     }
  }
 
  • Панель управления
  • #4
Admin

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 238
Реакции
518
Честно скажу советник не проверял в тестере поправил и внес изменения с комментариями
Код:
//+------------------------------------------------------------------+
//|                                                       159847.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016 Phyton"
#property link      "http://vk.com/evilheadbanger"
#property version   "1.00"
#property strict
extern int stop=200;
extern int profit=200;
extern double lot= 0.01;
string Symb="EURUSD";
bool Work=true;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Ticket=-1; // Переменная должна быть статичная то есть меняет значение только при условиях
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void start()
  {
   double nul = iSAR(NULL,0,0.02,0.2,0);
   double one = iSAR(NULL,0,0.02,0.2,1);
   bool BUY  = false; //покупка
   bool SELL = false; //продажа
   bool zpok = false; //закрытие покупки 
   bool zprod= false; //закрытие продажи
   bool Ans=false;
   double SL;
   double TP;
// int Ticket;  // На каждом новом тике в переменную попадает хлам или 0

// int tip=OrderType(); // Так нельзя, OrderType() можно вызвать только после вызова OrderSelect(........)
//--------------------------------------------------------------- 3 --
//--------------------------------------------------------------------
// Торговые критерии: продажа если параболик больше аск, покупка если параболик меньше бид.
// Вы проводите булевскую операцию nul && one которая значит если nul больше нуля и one больше нуля и меньше Бид
// Результат булевских операций только 0 или 1 других значений быть не может
// По этому условие нужно писать иначе
   if(nul!=EMPTY_VALUE && one!=EMPTY_VALUE) // Проверка индикаторных буфферов на значение обратите внимание что если буфер пустой one==EMPTY_VALUE то он имеет значение 2147483647 
     {                                      // Это число 2147483647 в буфере означает что буфер пустой )))) Посмотрите справку EMPTY_VALUE Пустое значение в индикаторном буфере 2147483647 (0x7FFFFFFF)
      if(Bid>nul && Bid>one) // покупка
        {
         BUY  = true;
         SELL = false;
        }
      if(Ask<nul && Ask<one) //продажа
        {
         SELL = true;
         BUY  = false;
        }
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Открытие ордеров
   if(Fun_New_Bar()==true)
     {
      if(Ticket==-1) // Ордеров нет тиккет обнулен после закрытия ордера или на старте программы
        {
         if(OrdersTotal()<1 && BUY==true)
           {
            RefreshRates();
            SL=Bid-New_Stop(stop)*Point;
            TP=Bid+New_Stop(profit)*Point;
            Alert("Попытка открыть Buy. Ожидание ответа..");
            Ticket=OrderSend(Symb,OP_BUY,lot,Ask,2,SL,TP);
            if(Ticket>0) // Получилось :)
               Alert("Открыт ордер Buy ",Ticket);
           }
         if(OrdersTotal()<1 && SELL==true)
           {
            RefreshRates();
            SL=Ask+New_Stop(stop)*Point;
            TP=Ask-New_Stop(profit)*Point;
            Alert("Попытка открыть Sell. Ожидание ответа..");
            Ticket=OrderSend(Symb,OP_SELL,lot,Bid,2,SL,TP);
            if(Ticket>0)
               Alert("Открыт ордер Sell ",Ticket);
           }
        }
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Закрытие ордеров

   if(BUY==false && Ticket!=-1)
     {
      Alert("Попытка закрыть Buy ",Ticket,"Ожидание ответа..");
      RefreshRates();                        // Обновление данных
      Ans=OrderClose(Ticket,lot,Bid,2);      // Закрытие Buy
      if(Ans==true) // Получилось :)
        {
         Ticket=-1;// закрыли ордер обнуляем тиккет
         Alert("Закрыт ордер Buy ",Ticket);
        }
      else
      if(Fun_Error(GetLastError())==1)       // Обработка ошибок
      return;                                // Выход из start()
     }
   if(SELL==false && Ticket!=-1)
     {
      Alert("Попытка закрыть Sell ",Ticket,"Ожидание ответа..");
      RefreshRates();                        // Обновление данных
      Ans=OrderClose(Ticket,lot,Ask,2);      // Закрытие Buy
      if(Ans==true) // Получилось :)
        {
         Ticket=-1;// закрыли ордер обнуляем тиккет
         Alert("Закрыт ордер Sell ",Ticket);
        }
      else
      if(Fun_Error(GetLastError())==1) // Обработка ошибок
      return;                                // Выход из start()
     }

  }
//-------------------------------------------------------------- 11 --
int New_Stop(int Parametr) // Проверка стоп-прик.
  {
   int Min_Dist=(int)MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if(Parametr<Min_Dist) // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Увеличена дистанция стоп-приказа.");
     }
   return(Parametr);                            // Возврат значения
  }
//+------------------------------------------------------------------+

//-------------------------------------------------------------- 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("Старая версия терминала.");
      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);                             // Выход из функции
     }
  }
//+------------------------------------------------------------------+
 
P

Phyton

Участник
Регистрация
08.01.2016
Сообщения
16
Реакции
0
он открывает ордер на каждой свече, и после одного тика его закрывает
минуя условие
OrdersTotal()<1
 
  • Панель управления
  • #6
Admin

Admin

Команда форума
Администратор
Регистрация
03.01.2013
Сообщения
2 238
Реакции
518
он открывает ордер на каждой свече, и после одного тика его закрывает
минуя условие
OrdersTotal()<1
Я в каждом видео все обьясню детально, про сбор информации про то как правильно работать и программировать, так же я в каждом видео говорю что работа с тиккетами не самая лучшая и простая идея.. Посмтрите на моем канале плей лист уроки программирования ... ;)
Код:
//+------------------------------------------------------------------+
//|                                                       159847.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016 Phyton"
#property link      "http://vk.com/evilheadbanger"
#property version   "1.00"
#property strict
extern int stop=200;
extern int profit=200;
extern double lot= 0.01;
string Symb="EURUSD";
bool Work=true;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Ticket=-1; // Переменная должна быть статичная то есть меняет значение только при условиях
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void start()
  {
   double nul = NormalizeDouble(iSAR(NULL,0,0.02,0.2,0),Digits());
   double one = NormalizeDouble(iSAR(NULL,0,0.02,0.2,1),Digits());
   static bool BUY  = false; //покупка
   static bool SELL = false; //продажа
                             //  bool zpok = false; //закрытие покупки 
//  bool zprod= false; //закрытие продажи
   bool Ans=false;
   double SL;
   double TP;

   int b=0,s=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS))
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)b++;
            if(OrderType()==OP_SELL)s++;
           }
// int Ticket;  // На каждом новом тике в переменную попадает хлам или 0

// int tip=OrderType(); // Так нельзя, OrderType() можно вызвать только после вызова OrderSelect(........)
//--------------------------------------------------------------- 3 --
//--------------------------------------------------------------------
// Торговые критерии: продажа если параболик больше аск, покупка если параболик меньше бид.
// Вы проводите булевскую операцию nul && one которая значит если nul больше нуля и one больше нуля и меньше Бид
// Результат булевских операций только 0 или 1 других значений быть не может
// По этому условие нужно писать иначе
   if(nul!=EMPTY_VALUE && one!=EMPTY_VALUE) // Проверка индикаторных буфферов на значение обратите внимание что если буфер пустой one==EMPTY_VALUE то он имеет значение 2147483647 
     {                                      // Это число 2147483647 в буфере означает что буфер пустой )))) Посмотрите справку EMPTY_VALUE Пустое значение в индикаторном буфере 2147483647 (0x7FFFFFFF)
      if(Bid>nul && Bid>one) // покупка
        {
         BUY  = true;
         SELL = false;
        }
      if(Ask<nul && Ask<one) //продажа
        {
         SELL = true;
         BUY  = false;
        }

     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Открытие ордеров
   if(Fun_New_Bar()==true)
     {
      if(BUY==true && b==0)
        {
         RefreshRates();
         SL=Bid-New_Stop(stop)*Point;
         TP=Bid+New_Stop(profit)*Point;
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,lot,Ask,2,SL,TP);
         if(Ticket>0) // Получилось :)
            Alert("Открыт ордер Buy ",Ticket);
        }
      if(SELL==true && s==0)
        {
         RefreshRates();
         SL=Ask+New_Stop(stop)*Point;
         TP=Ask-New_Stop(profit)*Point;
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,lot,Bid,2,SL,TP);
         if(Ticket>0)
            Alert("Открыт ордер Sell ",Ticket);
        }
     }
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Закрытие ордеров

   if(BUY==false && b>0)
     {
      Alert("Попытка закрыть Buy ",Ticket,"Ожидание ответа..");
      RefreshRates();                        // Обновление данных
      Ans=OrderClose(Ticket,lot,Bid,2);      // Закрытие Buy
      if(Ans==true) // Получилось :)
        {
         Ticket=-1;// закрыли ордер обнуляем тиккет
         Alert("Закрыт ордер Buy ",Ticket);
        }
      else
      if(Fun_Error(GetLastError())==1)       // Обработка ошибок
      return;                                // Выход из start()
     }
   if(SELL==false && s>0)
     {
      Alert("Попытка закрыть Sell ",Ticket,"Ожидание ответа..");
      RefreshRates();                        // Обновление данных
      Ans=OrderClose(Ticket,lot,Ask,2);      // Закрытие Buy
      if(Ans==true) // Получилось :)
        {
         Ticket=-1;// закрыли ордер обнуляем тиккет
         Alert("Закрыт ордер Sell ",Ticket);
        }
      else
      if(Fun_Error(GetLastError())==1) // Обработка ошибок
      return;                                // Выход из start()
     }

  }
//-------------------------------------------------------------- 11 --
int New_Stop(int Parametr) // Проверка стоп-прик.
  {
   int Min_Dist=(int)MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if(Parametr<Min_Dist) // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Увеличена дистанция стоп-приказа.");
     }
   return(Parametr);                            // Возврат значения
  }
//+------------------------------------------------------------------+

//-------------------------------------------------------------- 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("Старая версия терминала.");
      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);                             // Выход из функции
     }
  }
//+------------------------------------------------------------------+
 
P

Phyton

Участник
Регистрация
08.01.2016
Сообщения
16
Реакции
0
я вас понял
сейчас же займусь этим)
 
Теги Нет
Верх