Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1003

 
 

Подскажите пожалуйста как реализовать след:

На графике нанесены пользовательские линии, пусть их будет "n" количество. Как получить  значение цены при приближении цены к одной из линии?

Заранее спасибо!

 

Привет всем ) прошу помочь - Цель такая (если цена будет выше ""линии"" на (100 пунктов ) ""то покупаем"" )  как это выразить ( цена выше на 100 пунктов от какого либо значения ) и еще вот такой вопрос  как узнать цену скользящей средней в данный момент??? 

Заранее спасибо )  

 
Tema97:

Привет всем ) прошу помочь - Цель такая (если цена будет выше ""линии"" на (100 пунктов ) ""то покупаем"" )  как это выразить ( цена выше на 100 пунктов от какого либо значения ) и еще вот такой вопрос  как узнать цену скользящей средней в данный момент??? 

Заранее спасибо )  

Tema, читай документацию, там и iMa описывается и графические объекты. Получить цену линии есть функция ObjectGetDouble(с соответствующими параметрами)
 

Подскажите, пожалуйста, новичку, как избежать повторного открытия ордера, после его закрытия, при сохранении торговых условий для открытия.

Например:если стохастик пересекает уровень 50 вверх, открыть  Buy. Закрывает при развороте стохастика или при достижении им уровня 80 или по тейкпрофиту. Но при этом торговые условия для открытия сохраняются! Т.е. стохастик остается больше 50, и Buy открывается вновь! 

double S_1=iStochastic(NULL,0,K,D,slowing,MODE_SMA,price_field,MODE_MAIN,0);

 double S_2=iStochastic(NULL,0,K,D,slowing,MODE_SMA,price_field,MODE_MAIN,1);

 if(S_1>50)

{

 Opn_B=true;

 }

 if(S_1<S_2||S_1>80)

 {

 Cls_B=true;  

 }

Торговые критерии вставляю в схему простого советника, представленного в учебнике по MQL. Подскажите, пожалуйста, какую функцию нужно использовать, чтобы избежать этой проблемы. Спасибо! 

 
if(S_1 > 50 && S_2 < 50)

Это условие пересечения уровня 50 снизу вверх.

 
AlexeyVik:

Это условие пересечения уровня 50 снизу вверх.

Огромное спасибо! Сейчас попробую. 
 
Как "отсоединить" от графика "присоединенный к нему" индикатор (или советника), не закрывая этот график?
 
Можно ли поставить на график Индикатор AccountEquity(), работающий в реал.времени ? Где его взять?
 

Здравствуйте! Подскажите пожалуйста. В эксперте, представленном в учебнике по MQL4 меняю торговые критерии. При любых критериях, при попытке установить стоп-лосс, на Buy программа выдает ошибку 130: неправильные стопы. Объясните, пожалуйста, почему? 

                            // Численные значения для М15

extern double StopLoss   =0;     // SL для открываемого ордера

extern double TakeProfit =0;      // ТР для открываемого ордера

extern int K             = 5;

extern int D             = 3;

extern int slowing       = 3;

extern int price_field   = 0;


extern int Level_1       = 80;     // Уровень стохастика

extern int Level_2       = 20;

extern int    Period_MA_2=31;      // Период МА 2

extern double Rastvor    =28.0;    // Расстояние между МА 

extern double Lots       =0.01;     // Жестко заданное колич. лотов

extern double Prots      =0.07;    // Процент свободных средств

 

bool Work=true;                    // Эксперт будет работать.

string Symb;                       // Название финанс. инструмента

//--------------------------------------------------------------- 2 --

int start()

  {

   int 

   K_level,

   Total,                           // Количество ордеров в окне 

   Tip=-1,                          // Тип выбран. ордера (B=0,S=1)

   Ticket;                          // Номер ордера

   double S_1,

   S_2,

   MA_1_t,                          // Значен. МА_1 текущее

   MA_2_t,                          // Значен. МА_2 текущее 

   Lot,                             // Колич. лотов в выбран.ордере

   Lts,                             // Колич. лотов в открыв.ордере

   Min_Lot,                         // Минимальное количество лотов

   Step,                            // Шаг изменения размера лота

   Free,                            // Текущие свободные средства

   One_Lot,                         // Стоимость одного лота

   Price,                           // Цена выбранного ордера

   SL,                              // SL выбранного ордера 

   TP;                              // TP выбранного ордера

   bool

   Ans  =false,                     // Ответ сервера после закрытия

   Cls_B=false,                     // Критерий для закрытия  Buy

   Cls_S=false,                     // Критерий для закрытия  Sell

   Opn_B=false,                     // Критерий для открытия  Buy

   Opn_S=false;                     // Критерий для открытия  Sell

//--------------------------------------------------------------- 3 --

   // Предварит.обработка

   if(Bars < Period_MA_2)                       // Недостаточно баров

     {

      Alert("Недостаточно баров в окне. Эксперт не работает.");

      return;                                   // Выход из start()

     }

   if(Work==false)                              // Критическая ошибка

     {

      Alert("Критическая ошибка. Эксперт не работает.");

      return;                                   // Выход из start()

     }

//--------------------------------------------------------------- 4 --

   // Учёт ордеров

   Symb=Symbol();                               // Название фин.инстр.

   Total=0;                                     // Количество ордеров

   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер

     {

      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

        {                                       // Анализ ордеров:

         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм

         if (OrderType()>1)                     // Попался отложенный

           {

            Alert("Обнаружен отложенный ордер. Эксперт не работает.");

            return;                             // Выход из start()

           }

         Total++;                               // Счётчик рыночн. орд

         if (Total>1)                           // Не более одного орд

           {

            Alert("Несколько рыночных ордеров. Эксперт не работает.");

            return;                             // Выход из start()

           }

         Ticket=OrderTicket();                  // Номер выбранн. орд.

         Tip   =OrderType();                    // Тип выбранного орд.

         Price =OrderOpenPrice();               // Цена выбранн. орд.

         SL    =OrderStopLoss();                // SL выбранного орд.

         TP    =OrderTakeProfit();              // TP выбранного орд.

         Lot   =OrderLots();                    // Количество лотов

        }

     }

//--------------------------------------------------------------- 5 --

      // Торговые критерии

   S_1=iStochastic(NULL,0,K,D,slowing,MODE_SMA,price_field,MODE_MAIN,0);


   S_2=iStochastic(NULL,0,K,D,slowing,MODE_SMA,price_field,MODE_MAIN,1);


 if(S_1 > 50 && S_2 < 50)


{


 Opn_B=true;


 }


 if(S_1<S_2||(S_1 < 80 && S_2 > 80))


 {


 Cls_B=true;  


 }

if(S_1 < 50 && S_2 > 50)


{


 Opn_S=true; 


 }


 if(S_1>S_2||(S_1 > 20 && S_2 < 20))


 {


Cls_S=true;   


 }

//--------------------------------------------------------------- 6 --

   // Закрытие ордеров

   while(true)                                  // Цикл закрытия орд.

     {

      if (Tip==0 && Cls_B==true)                // Открыт ордер Buy..

        {                                       //и есть критерий закр

         Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");

         RefreshRates();                        // Обновление данных

         Ans=OrderClose(Ticket,Lot,Bid,2);      // Закрытие Buy

         if (Ans==true)                         // Получилось :)

           {

            Alert ("Закрыт ордер Buy ",Ticket);

            break;                              // Выход из цикла закр

           }

         if (Fun_Error(GetLastError())==1)      // Обработка ошибок

            continue;                           // Повторная попытка

         return;                                // Выход из start()

        }

 

      if (Tip==1 && Cls_S==true)                // Открыт ордер Sell..

        {                                       // и есть критерий закр

         Alert("Попытка закрыть Sell ",Ticket,". Ожидание ответа..");

         RefreshRates();                        // Обновление данных

         Ans=OrderClose(Ticket,Lot,Ask,2);      // Закрытие Sell

         if (Ans==true)                         // Получилось :)

           {

            Alert ("Закрыт ордер Sell ",Ticket);

            break;                              // Выход из цикла закр

           }

         if (Fun_Error(GetLastError())==1)      // Обработка ошибок

            continue;                           // Повторная попытка

         return;                                // Выход из start()

        }

      break;                                    // Выход из while

     }

//--------------------------------------------------------------- 7 --

   // Стоимость ордеров

   RefreshRates();                              // Обновление данных

   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 

   Free   =AccountFreeMargin();                 // Свободн средства

   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота

   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера

 

   if (Lots > 0)                                // Если заданы лоты,то 

      Lts =Lots;                                // с ними и работаем 

   else                                         // % свободных средств

      Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия

 

   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн

   if (Lts*One_Lot > Free)                      // Лот дороже свободн.

     {

      Alert(" Не хватает денег на ", Lts," лотов");

      return;                                   // Выход из start()

     }

//--------------------------------------------------------------- 8 --

   // Открытие ордеров

   while(true)                                  // Цикл закрытия орд.

     {

      if (Total==0 && Opn_B==true)              // Открытых орд. нет +

        {                                       // критерий откр. Buy

         RefreshRates();                        // Обновление данных

        

         Alert("Попытка открыть Buy. Ожидание ответа..");

         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,StopLoss,TakeProfit);//Открытие Buy

         if (Ticket > 0)                        // Получилось :)

           {

            Alert ("Открыт ордер Buy ",Ticket);

            return;                             // Выход из start()

           }

         if (Fun_Error(GetLastError())==1)      // Обработка ошибок

            continue;                           // Повторная попытка

         return;                                // Выход из start()

        }

      if (Total==0 && Opn_S==true)              // Открытых орд. нет +

        {                                       // критерий откр. Sell

         RefreshRates();                        // Обновление данных

         

         Alert("Попытка открыть Sell. Ожидание ответа..");

         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,StopLoss,TakeProfit);//Открытие Sel

         if (Ticket > 0)                        // Получилось :)

           {

            Alert ("Открыт ордер Sell ",Ticket);

            return;                             // Выход из start()

           }

         if (Fun_Error(GetLastError())==1)      // Обработка ошибок

            continue;                           // Повторная попытка

         return;                                // Выход из start()

        }

      break;                                    // Выход из while

     }

//--------------------------------------------------------------- 9 --

   return;                                      // Выход из start()

  }


//-------------------------------------------------------------- 10 --

int Fun_Error(int Error)                        // Ф-ия обработ ошибок

  {

   switch(Error)

     {                                          // Преодолимые ошибки            

      case  4: Alert("Торговый сервер занят. Пробуем ещё раз..");

         Sleep(3000);                           // Простое решение

         return(1);                             // Выход из функции

      case 135:Alert("Цена изменилась. Пробуем ещё раз..");

         RefreshRates();                        // Обновим данные

         return(1);                             // Выход из функции

      case 136:Alert("Нет цен. Ждём новый тик..");

         while(RefreshRates()==false)           // До нового тика

            Sleep(1);                           // Задержка в цикле

         return(1);                             // Выход из функции

      case 137:Alert("Брокер занят. Пробуем ещё раз..");

         Sleep(3000);                           // Простое решение

         return(1);                             // Выход из функции

      case 146:Alert("Подсистема торговли занята. Пробуем ещё..");

         Sleep(500);                            // Простое решение

         return(1);                             // Выход из функции

         // Критические ошибки

      case  2: Alert("Общая ошибка.");

         return(0);                             // Выход из функции

      case  5: Alert("Старая версия терминала.");

         Work=false;                            // Больше не работать

         return(0);                             // Выход из функции

      case 64: Alert("Счет заблокирован.");

         Work=false;                            // Больше не работать

         return(0);                             // Выход из функции

      case 133:Alert("Торговля запрещена.");

         return(0);                             // Выход из функции

      case 134:Alert("Недостаточно денег для совершения операции.");

         return(0);                             // Выход из функции

      default: Alert("Возникла ошибка ",Error); // Другие варианты   

         return(0);                             // Выход из функции

     }

  }

//-------------------------------------------------------------- 11 --

int New_Stop(int Parametr)                      // Проверка стоп-прик.

  {

   int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция

   if (Parametr < Min_Dist)                     // Если меньше допуст.

     {

      Parametr=Min_Dist;                        // Установим допуст.

      Alert("Увеличена дистанция стоп-приказа.");

     }

   return(Parametr);                            // Возврат значения

  }