[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 935

 

Hola, estoy interesado en esta pregunta. ¿Proporciona alpari un servidor en el que pueda subir su asesor para que funcione las 24 horas del día? ¿Sería tan amable de responder en persona?

 
gheka:

No funciona, quizás tenga que cambiar algo aquí o ponerlo después del inicio.

He intentado traducir tu código en papel al ruso que entiendo, pero no funciona,

es demasiado complicado, especialmente cuando las condiciones de cada condición se suceden, y una condición de las ocho condiciones.

Por supuesto que no discuto que quien creó este código sea un milagro, pero para mí es una completa perversión (en el buen sentido)

No me da pereza añadir comentarios a cada operación y condición, excepto a la función estándar.


Hay algo de redundancia en el código, pero el código es bastante legible

 
pregunta sobre el cambio de periodo en el programa ... por ejemplo hay una determinada secuencia de operadores que hay que aplicar a los diferentes periodos ... según tengo entendido es más fácil hacerlo en forma de ciclo ... cambiando el periodo... encuentro una función en la documentación que devuelve un valor de periodo... pero no encuentro una función para cambiarlo... ¿qué estoy haciendo mal?
 

Algo no te funciona, no este código... :)

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);                                          // Возвращаем "Ложь"
}

Esa es toda la lógica... Viktor tenía razón: es redundante, pero lo más sencillo posible... :)

 
Skopcheny:
pregunta sobre el cambio del periodo en el programa ... por ejemplo hay una determinada secuencia de operadores que deben aplicarse a los diferentes períodos ... según tengo entendido es más fácil hacerlo en forma de línea de tiempo ... cambiando el periodo... Encuentro una función en la documentación que devuelve un valor de periodo... pero no encuentro una función para cambiarlo... ¿en qué me equivoco?

El periodo del gráfico puede ser cualquiera de los siguientes valores:

Constante Valor Descripción
PERIODISTA_M1 1 1 minuto
PERIODISTA_M5 5 5 minutos
PERIODISTA_M15 15 15 minutos
PERIODISTA_M30 30 30 minutos
PERIOD_H1 60 1 hora
PERIOD_H4 240 4 horas
PERIOD_D1 1440 1 día
PERIODO_W1 10080 1 semana
PERIOD_MN1 43200 1 mes
0 (cero) 0 Período del gráfico actual
 
Muchas gracias, sólo necesito una aclaración... para que un grupo de operadores trabaje en un determinado periodo, ¿basta con especificar uno de los periodos que se presentan en esta tabla?
 
Skopcheny:
Muchas gracias, sólo necesito una aclaración... para que un grupo de operadores trabaje en un determinado periodo, ¿es suficiente con especificar uno de los periodos delante de ellos tal y como se presentan en esta tabla?
Para responder correctamente a su pregunta, es necesario ver al menos un ejemplo de código en el que se necesite especificar un periodo concreto...
 
artmedia70:
Para dar la respuesta correcta a su pregunta, es necesario ver al menos un código de ejemplo donde se necesita específicamente para establecer el período...


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

si (bar_centr<((Alto[i+1]-Bajo[i+1])/2+Bajo[i+1])
count--;
}

Print (count, "period ",Period());


si (count>3) trend="comprar";
si (count<-3) trend="vender";
si (count<3||count>-3) trend="incierto";





return(trend);}

esta función debe aplicarse de forma coherente a los distintos periodos ... Funciona si lo conecto a windows en la terminal con diferentes plazos... La pregunta es si es posible que EA maneje varios periodos diferentes...

 
Skopcheny:


esta función debe aplicarse sucesivamente a diferentes períodos... Funciona si conecto el EA a windows en el terminal con diferentes periodos ... La pregunta es si es posible que EA maneje varios periodos diferentes...

Entiendo que quiere que su función trabaje no sólo con el gráfico y el periodo actuales, sino con cualquiera de los periodos que se le pasen...

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);
}

Ahora, llame a su función así

trend(Symbol(), Period()); // Devolverá los valores del gráfico y del periodo en el que el EA está rondando...

trend(USDJPY, PERIOD_D1); // Devuelve valores para el símbolo USDJPY y el periodo de "1 día"

En lugar de PERIOD_D1 puede introducir 1440 - dará el mismo resultado...

Si se llama sin parámetros, la función devuelve los valores del símbolo y del período actuales (están fijados por defecto)

 
artmedia70:

Entiendo que quieres que la función trabaje no sólo con el gráfico y el periodo actuales, sino también con cualquier gráfico que se le pase...

Ahora llama a tu función así:

trend(Symbol(), Period()); // Devolverá los valores del gráfico y del periodo en el que el EA está rondando...

trend(USDJPY, PERIOD_D1); // Devuelve valores para el símbolo USDJPY y el periodo de "1 día"

En lugar de PERIOD_D1 puedes introducir 1440 - es lo mismo...




respuesta completa... Muchas gracias...