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

 
alexey1979621:

Почитал Учебник по этой штуке

string DoubleToStr( double value, int digits)
Преобразование числового значения в текстовую строку, содержащую символьное представление числа в указанном формате точности.
Параметры:
value - Величина с плавающей точкой.
digits - Формат точности, число цифр после десятичной точки (0-8).
Пример:


Однако, так и не понял, куда ее прикрутить в нашем случае. Опять спасай шеф.

Тут не к чему привернуть её.

Вот сюда можно:

Print("А ведь цена-то Ask ("+DoubleToStr(Ask,Digits)+") у меня однако с точностью Digits");
Она для вывода в строковом формате, а не для расчётов.
 
artmedia70:

Тут не к чему привернуть её.

Вот сюда можно:

Она для вывода в строковом формате, а не для расчётов.
Сделал хитро из int init() удалил нафиг все. По тексту советника все нормализовано. Теперь все нормально работает. artmedia70 спасибо.
[Deleted]  
Советник выставляет отложки на некотором заданном расстоянии от текущей цены, а спустя заданное время их модифицирует. Все идет нормально, но иногда терминал модифицировать не дает. Тогда, немодифицированный ордер должен быть удален. Как это сделать?
 
artmedia70:

Господа!!! Вы чего тут народ путаете?

iFractals() возвращает цену, а не номер бара фрактала.


да уж, и на старуху бывает проруха)) а вроде и не пятница))
[Deleted]  
Здравствуйте, очень прошу о помощи, есть задание :Определить эффективность применения технического индикатора Commodity Channel Index на статистических данных таймфрема D1 обыкновенной акции ОАО «Роснефть», не могу сформулировать как правильно записать данный индикатор на открытие и закрытие длинной и короткой позиции, вроде делаю но советник отказывается компилировать, выдает ошибку . Помогите пожалуйста, данный индикатор нужно применить в данном листинге, представляю без свои х изменений .
#property copyright "Copyright © 2010, E-Commerce"
#property link      "http://e-commerce.psati.ru"
 
extern double StopLoss=3000  ;          // SL для открываемого ордера
extern double TakeProfit=3000;           // ТР для открываемого ордера
extern int TrailingStop=100; 
extern double Lots      =0.1;          // Жестко заданное колич. лотов
double Prots     =0.07;         // Процент свободных средств
extern int SignalLine  =5;           // Период расчётной МА
extern int SignalLine1  =10;           // Период расчётной МА
extern int N1 =5;  
extern int N2  =10; 
int Bars_V       =34;           // Колич.баров для расчёта скор
int Aver_Bars    =0;            // Колич. баров для сглаживания
double Level     =0.001;

bool   Work=true;                      // Эксперт будет работать.
string Symb;                           // Название финанс. инструмента

int start()
  {
   int
   Period_MA=SignalLine1,
   Period_MA_1=SignalLine,
   Total,                              // Количество ордеров в окне 
   Tip=-1,
   coef,                             // Тип выбран. ордера (B=0,S=1)
   Ticket;                             // Номер ордера
   double
   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
   int BBars=10000000;
   if(Bars < Period_MA_1)                       // Недостаточно баров
     {
      Alert("Недостаточно баров в окне. Эксперт не работает.");
      return;                                   // Выход из start()
     }
   if(Work==false)                              // Критическая ошибка
     {
      Alert("Критическая ошибка. Эксперт не работает.");
      return;                                   // Выход из start()
     }
     
   // Учёт ордеров
   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();                    // Количество лотов
        }
     }

   // Торговые критерии
   int P= Period_MA_1;            // Период расчётной МА
   int B= Bars_V;                 // Колич.баров для расчёта скорост
   int A= Aver_Bars;              // Колич. баров для сглаживания
   int Z= Period_MA;
   //double L_1=iCustom(NULL,0,"IPM",H,P,B,A,0,0);
   //double L_5=iCustom(NULL,0,"IPM",H,P,B,A,1,0);
   double Ma2_Previus,Ma3_Previus, Ma2_Current, Ma3_CurrentPrice, CurrentLine, PreviousLine, Line15,Current, Line30;
   //Ma3_Previus=iCustom(NULL,0,"444",H,P,B,A,1,1);
   //Ma2_Previus=iCustom(NULL,0,"www",P,Z,N1,N2,0,2);
  
   //Ma3_Current=iCustom(NULL,0,"444",H,P,B,A,1,2);
  // Ma2_Current=iCustom(NULL,0,"www",P,Z,N1,N2,0,1);

//ПАРАМЕТРЫ ОТКРЫТИЯ ДЛИННОЙ ПОЗИЦИИ

if(iCCI(Symbol(),0,12,PRICE_TYPICAL,0)>=100)
{
if((NumberOfBarOpenLastPos()>0||NumberOfBarOpenLastPos()==-1)&&(NumberOfBarCloseLastPos()>0||NumberOfBarCloseLastPos()==-1))
{ 
Opn_B=true;
//Cls_S=true;
}
}
 //ПАРАМЕТРЫ ОТКРЫТИЯ короткой ПОЗИЦИИ    
if (iCCI(Symbol(),0,20,PRICE_TYPICAL,0)<=100)
{
if((NumberOfBarOpenLastPos()>0||NumberOfBarOpenLastPos()==-1)&&(NumberOfBarCloseLastPos()>0||NumberOfBarCloseLastPos()==-1))
{
Opn_S=true; 
//Cls_B=true;   
}  
}


if(Tip==0){
           if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(SL<Bid-Point*TrailingStop)
                    {
                     OrderModify(Ticket,OrderOpenPrice(),Bid-Point*TrailingStop,TP,0,Green);
                     //return(0);
                    }
                 }
              }
}

if(Tip==1){
           if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if(SL>Ask+Point*TrailingStop)
                    {
                     OrderModify(Ticket,OrderOpenPrice(),Ask+Point*TrailingStop,TP,0,Red);
                    // return(0);
                    }
                 }
              }
}


   // Закрытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
//длинной
if(iCCI(Symbol(),0,12,PRICE_TYPICAL,0)<=100){
      if (Tip==0)                // Открыт ордер 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 (Close[i]<0)
if(iCCI(Symbol(),0,20,PRICE_TYPICAL,0)>=100){
      if (Tip==1)                // Открыт ордер 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
     }



// Стоимость ордеров
   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()
     }
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Total==0 && Opn_B==true)              // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();          
         SL=Bid - New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие 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();        
         SL=Ask + New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Ask - New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Открытие Sel
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Sell ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      break;                                    // Выход из while
     }
   return;                                      // Выход из start()
  }
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);                             // Выход из функции
     }
  }
int New_Stop(int Parametr)                      // Проверка стоп-прик.
  {
   int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if (Parametr<Min_Dist)                       // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Увеличена дистанция стоп-приказа.");
     }
   return(Parametr);                            // Возврат значения
  }
 
 int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int i, k=OrdersTotal();

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
  if (OrderSymbol()==sy) {
  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
  if (op<0 || OrderType()==op) {
  if (mn<0 || OrderMagicNumber()==mn) {
  if (t<OrderOpenTime()) t=OrderOpenTime();
  }
  }
  }
  }
  }
  }
  return(iBarShift(sy, tf, t, True));
}
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal();

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) t=OrderCloseTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sy, tf, t, True));
}
 
niformalka:
Здравствуйте, очень прошу о помощи, есть задание :Определить эффективность применения технического индикатора Commodity Channel Index на статистических данных таймфрема D1 обыкновенной акции ОАО «Роснефть», не могу сформулировать как правильно записать данный индикатор на открытие и закрытие длинной и короткой позиции, вроде делаю но советник отказывается компилировать, выдает ошибку . Помогите пожалуйста, данный индикатор нужно применить в данном листинге, представляю без свои х изменений .
Дык это у Вас советник, а не индикатор...Компиляция без ошибок проходит....Сейчас поиграюсь с Вашим кодом.....потестю....
[Deleted]  
Sepulca:
Дык это у Вас советник, а не индикатор...Компиляция без ошибок проходит....Сейчас поиграюсь с Вашим кодом.....потестю....


там нужно в советнике применить именно нужный мне индикатор, а именно icc, так то исходный текст компилирует
 
alsu:

да уж, и на старуху бывает проруха)) а вроде и не пятница))

А что не так-то?

//+------------------------------------------------------------------+
//|                                                  TestFractal.mq4 |
//|                               Copyright 2013, Artyom A. Trishkin |
//|                       https://www.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, Artyom A. Trishkin"
#property link      "https://www.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   for(int i=3; i<300; i++) {
      double fu=iFractals(Symbol(),Period(),MODE_UPPER,i);
      double fd=iFractals(Symbol(),Period(),MODE_LOWER,i);
      if(fu>0) Print("Значение UP на баре "+(string)i+" = "+DoubleToStr(fu,Digits));
      if(fd>0) Print("Значение DN на баре "+(string)i+" = "+DoubleToStr(fd,Digits));
      }
  }
//+------------------------------------------------------------------+

Цену возвращает...

 

Начнем с главного, не совсем грамотно перебирать ордера с нулевого. Лучше с последнего

for(int i=OrderTotal-1; i>=0; i--)          // Цикл перебора ордер
Чтобы не возникало ситуации, когда нулевой по счету закрыли/удалили а там ещё ордера есть. всё переколбасилось. Когда действуете с последним по счёту ничего страшного не происходит.
[Deleted]  
Sepulca:

Начнем с главного, не совсем грамотно перебирать ордера с нулевого. Лучше с последнего

Чтобы не возникало ситуации, когда нулевой по счету закрыли/удалили а там ещё ордера есть. всё переколбасилось. Когда действуете с последним по счёту ничего страшного не происходит.


преподаватель доказывает что в коде ничего менять не нужно, кроме как строки с открытием и закрытием короткой и длинной позиции, примерно я делала вот так но у меня не компилируется
if ((iCCI(Symbol,0,14,PRICE_TYPICAL,0)<100)&&(iCCI(Symbol,0,14,PRICE_TYPICAL,0)<-100))