[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 409

 
La solicitud del gráfico es similar a CopyRates ArrayCopySeries, no a RefreshRates. CopyRates es la única función no comercial que mueve el servidor.
 
Zhunko:
Cuando se abre y actualiza el gráfico, se envía una solicitud de nuevos datos al servidor. Algunas empresas de corretaje codiciosas prefieren gastar su dinero en sus propios bolsillos en lugar de en servidores más potentes y un canal más amplio. Tienen que limitar el número de peticiones del terminal para que un servidor débil no se "cuelgue". El MRC sólo tiene 2.000 solicitudes al día. Es 10 veces menos que el número de sus instrumentos multiplicado por el número de TFs, sin contar las solicitudes de operaciones.
Hay que evitar esas cocinas. Es la primera vez que oigo cosas negativas sobre MRC. Queda por ver si el terminal es el único o si las funciones (excepto el comercio) también se refieren al servidor. Hice esta pregunta a soporte (escribí sobre ello más arriba, aún no hay respuesta). Si no sólo, entonces todo cae en su lugar, y si sólo el terminal, entonces todo sale absurdo que el tipo de terminal se ejecuta y se pondrá en contacto con el servidor para actualizar las cotizaciones, superar el límite sin el comercio. Creo que es inadecuado, y sin embargo las funciones, como dijo Viktor, excepto el comercio, no acceden al servidor.

Zhunko:

Las incrustaciones en MQL4 ayudan a racionalizar el código. Por ejemplo, así es como se ve un indicador para 3000 líneas en mi código.

La cosa es que he visto bibliotecas, y se menciona en la documentación, que los inludes se suelen colocar en la parte superior del código, donde se declaran las variables globales. Si hay funciones en los inludes, parece extraño pensar que en un lugar donde se declaran variables globales habrá de hecho una función en ese lugar, y alternativamente, algún tipo de variables. No es así como está escrito el código. Si las variables utilizadas en el Asesor Experto y las variables externas personalizadas se declaran en la parte superior, ¡nadie pone funciones al lado! Pero colocan inludes con funciones, y se considera normal, según tengo entendido. Esto es lo que más me confunde aquí.

No parece lógico...

Por otro lado, si se coloca un inline, en algún lugar. en lugar de varias funciones, que se encargan de obtener, digamos, una señal de comercio para algún atributo, sería algo lógico y legible.

Zhunko:

Lamentablemente, el compilador no permite que una inclusión se utilice más de una vez en un módulo. Suele ser una forma de ahorrar en código repetitivo.

Esto es algo pequeño. Después de todo, lo principal es poner las funciones y fragmentos de código engorrosos fuera del código principal, y llamarlos a través del inline. Y entonces puedes llamar a la función, que has inlineado, por el nombre de la función... Y no tendrá que preocuparse por esta restricción.
 

Buenas tardes a todos.

Estudio de las funciones MarketInfo ( ) y Print( )

He aquí un código sencillo que utiliza estas funciones

Probador, TF 60 min.

double T ;
int start()
{
 T = MarketInfo("EURUSD",MODE_HIGH); // в глобальную переменную Т запоминаем максимум дневной свечи,который должна возвращать  MarketInfo ( )
Print (" corresponds to ", T );           //
if ( T > iHigh( Symbol (), 0,10))  // если максимум текущей дневной свечи > High свечи N10(ТФ60 мин)
OrderSend(Symbol(),OP_SELL,0.1,Bid,1,0,0,"jfh",123 ); открыть ордер
}                                                                                                                       
return;

ПРОБЛЕМА 1.Ордер не открывается 2.Print() постоянно возвращает 0 ПРИМЕЧАНИЕ. Для открытия ордера - мне нужной сравнивать параметры свечей разных ТФ(60 мин и 1440 мин.) Подскажите пожалуйста как это можно сделать. Спасибо.

 
Integer:
La solicitud del gráfico parece la solicitud de CopyRates ArrayCopySeries y no la de RefreshRates. CopyRates es la única función no comercial que mueve el servidor.

Comprobado RefreshRates(). Si este Asesor Experto se ejecuta, por ejemplo, en EURUSD, y se inserta en la configuración otra herramienta cuya ventana no se ha abierto durante mucho tiempo (para que el historial no esté allí), el historial aparece.

extern string Tool           = "AUDNZD"; // Имя инструмента.
extern bool   IsRefreshRates = true;     // Флаг включения обновления таймсерий.
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
 {
  string sTool = Tool; // Имя инструмента.
  if (Tool == "") sTool = Symbol();
  while (!IsStopped())
   {
    if (IsRefreshRates) RefreshRates();
    string sComment = StringConcatenate("MarketInfo()\n",
                                        TimeToStr(MarketInfo(sTool, MODE_TIME), TIME_DATE|TIME_MINUTES|TIME_SECONDS), "\n",
                                        DoubleToStr(MarketInfo(sTool, MODE_BID), Digits), "  ", DoubleToStr(MarketInfo(sTool, MODE_ASK), Digits),
                                        "\n\nПредопределенные переменные\n",
                                        TimeToStr(Time[0], TIME_DATE|TIME_MINUTES|TIME_SECONDS), "\n",
                                        DoubleToStr(Bid, Digits), "  ", DoubleToStr(Ask, Digits),
                                        "\n\nМассивы-таймсерии\n");
    for (int i = 0; i < 10; i++)
     {
      sComment = sComment + StringConcatenate(TimeToStr(iTime(sTool, 0, i), TIME_DATE|TIME_MINUTES|TIME_SECONDS), "  ",
                                              DoubleToStr(iOpen(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iLow(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iHigh(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iClose(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iVolume(sTool, 0, i), 0), "\n");
     }
    Comment(sComment);
    Sleep(300);
   }
 }

Así, RefreshRates() se refiere al servidor y descarga el historial. En consecuencia, es necesario controlar la llegada de la historia.

El soporte dice que ninguna de las funciones se refiere directamente al servidor. Todo se realiza a través del terminal :-).

 
TarasBY:
Si utiliza GetProfitFromDateInCurrency() (original - esto es IMPORTANTE: no sé lo que puede tener ahí en su versión), entonces la función debe ser llamada así:

y la función devolverá los beneficios de las órdenes cerradas desde el inicio del día actual.

Y puedes atrapar todas las estupideces del código usando Print().


no funciona. Muestra todos los beneficios disponibles en las operaciones de todo el historial.

Aquí está la función original y no he cambiado nada en ella, por supuesto

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  int    i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

aquí está su llamada e impresión

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_D1, 0));  
Print(   GetProfitFromDateInCurrency () );
 
Zhunko:

Comprobado RefreshRates(). Si este Asesor Experto se ejecuta, por ejemplo, en EURUSD, y se inserta en la configuración otra herramienta cuya ventana no se ha abierto durante mucho tiempo (para que el historial no esté allí), el historial aparece.

Por lo tanto, todavía RefreshRates() se refiere al servidor y llena el historial. En consecuencia, es necesario controlar la llegada de la historia.

El soporte dice que ninguna de las funciones se refiere directamente al servidor. Así que todo se hace a través del terminal :-)


Vadim, he ejecutado tu script en un terminal en el que nunca he abierto ningún instrumento aparte de los mayores y los cruces con el yen. De todos modos, aquí hay una captura de pantalla:

No se bombea nada porque la matriz de datos del mercado está vacía, a juzgar por los comentarios...

 
hoz:


Vadim, he ejecutado tu script en un terminal en el que nunca he abierto ningún instrumento aparte de los mayores y los cruces con el yen. De todos modos, aquí hay una captura de pantalla:

No se está bombeando nada, ya que el conjunto de datos del mercado está vacío, a juzgar por los comentarios...


Sí. Tampoco se dio cuenta de que tiene MarketInfo() en su Asesor Experto y no sólo RefreshRates().
 
Zhunko:

Comprobado RefreshRates(). Si este Asesor Experto se ejecuta, por ejemplo, en EURUSD, y se inserta en la configuración otra herramienta cuya ventana no ha estado abierta durante mucho tiempo (para que el historial no esté allí), el historial aparece.

Por lo tanto, todavía RefreshRates() se refiere al servidor y llena el historial. En consecuencia, es necesario controlar la llegada de la historia.

El soporte dice que ninguna de las funciones se refiere directamente al servidor. Así que todo se hace a través del terminal :-)


El nivel de imaginación es impresionante. ¿Por qué los datos aparecen sólo para algunos símbolos (que no se han abierto), y no para todos ellos en la revisión del mercado? ¿Cómo sabe la función RefreshRates() que algunos símbolos deben actualizarse y otros no?

Junko, deja de divagar.

 
lottamer:


no funciona. Muestra todos los beneficios disponibles en las operaciones de todo el historial.

Aquí está la función original y no he cambiado nada en ella, por supuesto

aquí está su llamada e impresión

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_D1, 0));  
Print(   GetProfitFromDateInCurrency () );

Así que todo es correcto. Lees la función línea por línea y entiendes cómo funciona, si estás demasiado aburrido para escribirla tú mismo, y todo encaja...

Tienes un parámetro de la función:

iTime (NULL, PERIOD_D1, 0)

es lahora deapertura de la última barra del día, es decir, se calcularán y sumarán todas las posiciones cerradas antes de la apertura de la barra del día actual. ¿Tiene sentido? Así que pon otro listón, el que se requiere o el que sea. Pero depende de ti ver.

 
Integer:

Sí. Tampoco se dio cuenta de que tiene MarketInfo() en su Asesor Experto, no sólo RefreshRates().


Todas las demás funciones:


DoubleToStr(iOpen(sTool, 0, i), Digits), ",
DoubleToStr(iLow(sTool, 0, i), Digits), ",
DoubleToStr(iHigh(sTool, 0, i), Digits), " ",
DoubleToStr(iClose(sTool, 0, i), Digits), ",
DoubleToStr(iVolume(sTool, 0, i), 0), "\n");

Naturalmente, los datos se actualizarán.