[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 935

 
gheka:

чё то не пашет, возможно мне надо что менять здесь или ставить после старта.

я ваш код пытался перевести на бумаге на русский мне понятный язык, но не доходит,

слишком уж сложно,особенно когда условия в каждом последующим,и одно условии из восьми условий

конечно я не спорю тот кто создал такой код просто чудо,но для меня это полное извращение(в хорошем смысле)

кому не лень дописать коментарии к каждой операции и условии,кроме станд.функции.


Небольшая избыточность в коде присутствует, но код вполне читаемый

 

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

 
вопрос по поводу смены периода в программе ... например есть определенная последовательность операторов которую нужно применить к разным периодам .. как понимаю проще это сделать в форме цикала ... меняя период ... в жокументации нахожу функцию которая возвращает значение периода.. но функции чтоб его изменить не нахожу ... что я неправильно понимаю ?
 

Не пашет что-то у вас, а никак не этот код... :)

bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {// Объявление функции. Передаваемые параметры: sy = символ, op - тип, mn - магик
  datetime t;                                                  // Переменная содержит время закрытия ордера
  double   ocp, osl;                                           // ocp - цена закрытия позиции, osl - цена СтопЛосс закрытой позиции
  int      dg, i, j=-1, k=OrdersHistoryTotal();                // k содержит общее количество ордеров в истории

  if (sy=="0") sy=Symbol();                                 // Если в ф-цию передан sy равный 0 или NULL, то использовать символ графика
  for (i=0; i<k; i++) {                                     // Цикл по массиву закрытых ордеров
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {      // Если выбран ордер из массива закрытых ордеров, ...
      if (OrderSymbol()==sy || sy=="") {                    // ... если его символ совпадает с нашим, ...
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {  // ... если его тип Бай или Селл, ...
          if (op<0 || OrderType()==op) {                // ... если тип ордера равен или -1 (имеется ввиду любой) или равен переданному в ф-цию, ...
            if (mn<0 || OrderMagicNumber()==mn) {       // ... если его магик или любой (-1) или равен переданному в ф-цию (магику советника), ...
              if (t<OrderCloseTime()) {    // ... если переменная t содержит время закрытия меньше, чем время закрытия выбранного ордера, то ...
                t=OrderCloseTime();        // ... то присвоим переменной t время закрытия выбранного ордера (этот ордер закрыт позже предыдущего)
                j=i;                                        // Запишем в переменную j индекс найденного ордера с максимальным временем закрытия
              }
            }
          }
        }
      }
    }
  }                                                       // По окончании цикла в переменной j находится индекс последнего закрытого ордера
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {      // Выберем его по индексу
    dg=MarketInfo(sy, MODE_DIGITS);                       // Количество цифр после десятичного точки в цене инструмента, заданного переменной sy
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2; // Честно... точно не скажу, но вижу, что корректировка под йену
    ocp=NormalizeDouble(OrderClosePrice(), dg);           // Нормализуем цену закрытия ордера для дальнейшего сравнения с ценой СтопЛосс
    osl=NormalizeDouble(OrderStopLoss(), dg);             // Нормализуем цену СтопЛосс ордера для сравнения с ценой закрытия
    if (ocp==osl) return(True);                           // Если эти цены равны, значит поза закрыта по стопу, возвращаем значение "Истина"
  }
  return(False);                                          // Возвращаем "Ложь"
}

Вот и вся логика... Правильно Виктор сказал - избыточно, зато максимально просто... :)

 
Skopcheny:
вопрос по поводу смены периода в программе ... например есть определенная последовательность операторов которую нужно применить к разным периодам .. как понимаю проще это сделать в форме цикала ... меняя период ... в жокументации нахожу функцию которая возвращает значение периода.. но функции чтоб его изменить не нахожу ... что я неправильно понимаю ?

Период графика может быть любым из следующих величин:

Константа Значение Описание
PERIOD_M1 1 1 минута
PERIOD_M5 5 5 минут
PERIOD_M15 15 15 минут
PERIOD_M30 30 30 минут
PERIOD_H1 60 1 час
PERIOD_H4 240 4 часа
PERIOD_D1 1440 1 день
PERIOD_W1 10080 1 неделя
PERIOD_MN1 43200 1 месяц
0 (ноль) 0 Период текущего графика
 
спасибо большое  просто мне нужно пояснение ... для того чтоб группа операторов работала по определенному периоду достаточно просто перед ними указать один из периодов в том виде в котором они представленны в данной таблице?
 
Skopcheny:
спасибо большое просто мне нужно пояснение ... для того чтоб группа операторов работала по определенному периоду достаточно просто перед ними указать один из периодов в том виде в котором они представленны в данной таблице?
Для того, чтобы верно ответить на ваш вопрос, нужно увидеть хотя бы пример кода, где вам нужно конкретно задать период...
 
artmedia70:
Для того, чтобы верно ответить на ваш вопрос, нужно увидеть хотя бы пример кода, где вам нужно конкретно задать период...


string trend()
{int count,count_change;
double bar_centr;
string trend;
bool clear;
for (int i=10;i!=0;i--)
{
bar_centr = (High[i]-Low[i])/2+Low[i];
if (bar_centr>((High[i+1]-Low[i+1])/2+Low[i+1]))
count++;

if (bar_centr<((High[i+1]-Low[i+1])/2+Low[i+1]))
count--;
}

Print (count,"период ",Period());


if (count>3) trend="покупка";
if (count<-3) trend="продажа";
if (count<3||count>-3) trend="неопределенность";





return(trend);}

 

 

 

данную функцию надо применить последовательно к разным периодам ... работает если присоеденить советник к окнам в терминале с разными периодами ... впорос в том возможно ли чтоб сам советник обрабатывал несколько разных периодов ...  

 
Skopcheny:


данную функцию надо применить последовательно к разным периодам ... работает если присоеденить советник к окнам в терминале с разными периодами ... впорос в том возможно ли чтоб сам советник обрабатывал несколько разных периодов ...

Я так понял, вам нужно чтобы ф-ция работала не только с текущим графиком и периодом, но с любым, переданным в неё...

string trend(string sy="", int tf=0)
{
   int count,count_change;
   double bar_centr;
   string trend;
   bool clear;

   if (sy=="" || sy=="0") sy=Symbol();      
   if (tf==0) tf=Period();
   
   for (int i=10; i>0; i--)
      {
         bar_centr = (iHigh(sy,tf,i)-iLow(sy,tf,i))/2+iLow(sy,tf,i);
         if (bar_centr>((iHigh(sy,tf,i+1)-iLow(sy,tf,i+1))/2+iLow(sy,tf,i+1)))
            count++;
         if (bar_centr<((iHigh(sy,tf,i+1)-iLow(sy,tf,i+1))/2+iLow(sy,tfi+1)))
            count--;
      }

   Print (count,"период ",tf);

   if (count>3) trend="покупка";
   if (count<-3) trend="продажа";
   if (count<3||count>-3) trend="неопределенность";

   return(trend);
}

Вызывайте вашу функцию теперь так:

trend(Symbol(), Period()); // Вернёт значения для того графика и периода, в окне которого висит советник...

trend(USDJPY, PERIOD_D1); // Вернёт значения для символа USDJPY и периода "1 день"

Вместо PERIOD_D1 можно ввести 1440 - будет то же самое...

Если её вызвать без параметров, то ф-ция вернёт значения для текущего символа и периода (они заданы по-умолчанию)

 
artmedia70:

Я так понял, вам нужно чтобы ф-ция работала не только с текущим графиком и периодом, но с любым, переданным в неё...

Вызывайте вашу функцию теперь так:

trend(Symbol(), Period()); // Вернёт значения для того графика и периода, в окне которого висит советник...

trend(USDJPY, PERIOD_D1); // Вернёт значения для символа USDJPY и периода "1 день"

Вместо PERIOD_D1 можно ввести 1440 - будет то же самое...




исчерпывающий ответ... спасибо большое ...
Причина обращения: