paladin80: Cuál es el mejor lugar para declarar un tipo de variable (int, double, etc.) en términos de reducir el consumo de recursos de la ejecución del programa. Por ejemplo, int i puede declararse globalmente o en int start() ... for (int i=OrdersTotal()-1; i>=0; i--) ... Tengo la sensación de que declarar en cada tic es más costoso que declarar una vez a nivel global, justo después de los parámetros externos. ¿O la diferencia en la intensidad de recursos es la misma?
Todas las variables (ubicaciones de memoria) se crean una vez al inicio del programa y luego deben ser inicializadas en el lugar donde aparecen en el texto(declaración de la variable), pero esto no siempre ocurre, así que si quieres que todo funcione correctamente, no olvides inicializarlas explícitamente al declararlas.
He corregido el código para que coincida con el tuyo. Al hacer la prueba, cuatro órdenes se cerraron en orden de ajuste en el primer tick, la quinta se cerró en el siguiente tick. Probablemente algo más está mal aquí como he probado repetidamente. Te proporciono el código del programa y los registros del probador. Sinceramente. Shurkin
Está claro. Sustituir
for(i=0, int k=0; i<OrdersTotal();i++,k++)//
a .
int total=OrdersTotal();
for(i=0, int k=0; i<total;i++,k++)//
Hola, ¿podríais decirme cómo calcular la suma de los valores del indicador en cada bloque del histograma por separado? He escrito un indicador, pero sólo empieza a funcionar cuando se pone en marcha. En las barras anteriores, ¡nada! ¡No consigo ciclar "mientras"! Ayuda, profesionales.
//+-------------------------------------------------------------------------------------+//| Блок поиска своих объектов |//+-------------------------------------------------------------------------------------+bool IsObjectFound()
{
for (int obj=0; obj<=ObjectsTotal()-1; obj++)
{
objName = ObjectName(obj);
isObj = ObjectFind(objName);
objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
objPriceCurr = ObjectGetValueByShift(objName,0);
}
Print("objPriceCurr = ", objPriceCurr);
if (isObj != -1) // Если объект найден, значит выходим из функцииreturn (true);
return (false); // Объект не найден!
}
//+-------------------------------------------------------------------------------------+//| Функция start |//+-------------------------------------------------------------------------------------+int start()
{
int signal = GetSignal();
if (IsObjectFound() == false)
{
Print("В окне отсуствуют объекты, поиск продолжается...");
return (0);
}
He mostrado un trozo de código en el que hay un malentendido. Todas las variables se declaran globales. En la funciónIsObjectFound() obtengo los valores del primer y segundo punto de precio del objeto, el nombre y el valor del precio del objeto en la barra actual. Si se encuentra el objeto debe salir la función en modo verdadero, en caso contrario enfalso .
En el inicio, prescribí una condición que si el objeto no se encuentra, entonces salgo de la función:
Lo ejecuto en el probador, no he dibujado ningún objeto, no hay nada - un gráfico desnudo. Sin embargo, la función no sale y no se imprime en consecuencia:
Las variables globales son búsquedas globales. ¿Qué se puede decir del algoritmo sin ver el modelo de datos?
Yo rastrearía exactamente los datos. Y isObj realmente booleano, y todo eso ...
//+-------------------------------------------------------------------------------------+//| TradingByLine.mq4 |//| hoz |//| |//+-------------------------------------------------------------------------------------+#property copyright "hoz"#property link ""externstring ___H0 = "Параметры отклонений зоны сигнала";
externdouble dernovich = 40,
faustUs = 40;
/*extern double limitOverLine = 3,
limitUnderLine = 20;*/string objName; // Имя объектаint isObj; // Возвращает окно, которому принадлежит// ..наденнный объект, либо -1double objPrice1, // Первая координата цены луча
objPrice2, // Вторая координата цены луча
objPriceCurr; // Цена объекта на заданном бареint pt;
#define SIGNAL_BUY 0// Сигнал на покупку#define SIGNAL_SELL 1// Сигнал на продажу#define SIGNAL_NO -1// Сигнала нет//+-------------------------------------------------------------------------------------+//| Функция иницилизации |//+-------------------------------------------------------------------------------------+int init()
{
if(Digits == 2 || Digits == 4)
pt = Point;
if(Digits == 1 || Digits == 3 || Digits == 5)
pt = Point*10;
if(Digits == 6)
pt = Point*100;
if(Digits == 7)
pt = Point*1000;
return (0);
}
//+-------------------------------------------------------------------------------------+//| Функция деиницилизации |//+-------------------------------------------------------------------------------------+int deinit()
{
//----//----return (0);
}
//+-------------------------------------------------------------------------------------+//| Сигнализатор касания о луч |//+-------------------------------------------------------------------------------------+bool AlertByTouching(int signal)
{
double priceDevBefore,
priceDevAfter;
if (signal == SIGNAL_SELL)
{
priceDevAfter = objPriceCurr + faustUs * pt;
priceDevBefore = objPriceCurr - dernovich * pt;
if (Bid <= priceDevAfter && Bid >= priceDevBefore)
{
Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
return (true);
}
}
if (signal == SIGNAL_BUY)
{
priceDevAfter = objPriceCurr - faustUs * pt;
priceDevBefore = objPriceCurr + dernovich * pt;
Print("priceDevAfter = ", objPriceCurr - faustUs * pt);
Print("priceDevBefore = ", objPriceCurr - faustUs * pt);
Print("Ask >= priceDevAfter && Ask >= priceDevBefore ", Ask ," >= ", priceDevAfter ," && ", Ask ," >= ", priceDevBefore);
if (Ask >= priceDevAfter && Ask >= priceDevBefore)
{
Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
return (true);
}
}
return (false);
}
//+-------------------------------------------------------------------------------------+//| Блок поиска своих объектов |//+-------------------------------------------------------------------------------------+bool GetSignal()
{
if (!IsObjectFound())
return (SIGNAL_NO);
if (objPrice1 > objPrice2)
return (SIGNAL_BUY);
if (objPrice1 < objPrice2)
return (SIGNAL_SELL);
}
//+-------------------------------------------------------------------------------------+//| Блок поиска своих объектов |//+-------------------------------------------------------------------------------------+bool IsObjectFound()
{
for (int obj=0; obj<=ObjectsTotal()-1; obj++)
{
objName = ObjectName(obj);
isObj = ObjectFind(objName);
objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
objPriceCurr = ObjectGetValueByShift(objName,0);
}
Print("objPriceCurr = ", objPriceCurr);
if (isObj != -1) // Если объект найден, значит выходим из функцииreturn (true);
return (false); // Объект не найден
}
//+-------------------------------------------------------------------------------------+//| Функция start |//+-------------------------------------------------------------------------------------+int start()
{
int signal = GetSignal();
if (IsObjectFound() == false)
{
Print("В окне отсуствуют объекты, поиск продолжается...");
return (0);
}
if (signal != SIGNAL_NO)
if (!AlertByTouching(signal))
return (0);
Print("objPrice1 = ", objPrice1, ", objPrice2 = ", objPrice2);
// Print("objPriceCurr = ", objPriceCurr);return (0);
}
isObj es un int. Devuelve la ventana que tiene el objeto en ella, si hay una. Si no existe, entiendo que devolverá -1. Según el documento, la ventana principal comienza en 0 y luego las subventanas... Hasta aquí, esto es un esquema para un Asesor Experto en comercio, puramente de señal. Pero emite mensajes cuando quiere.
Cuál es el mejor lugar para declarar un tipo de variable (int, double, etc.) en términos de reducir el consumo de recursos de la ejecución del programa. Por ejemplo, int i puede declararse globalmente o en int start() ... for (int i=OrdersTotal()-1; i>=0; i--) ... Tengo la sensación de que declarar en cada tic es más costoso que declarar una vez a nivel global, justo después de los parámetros externos. ¿O la diferencia en la intensidad de recursos es la misma?
Todas las variables (ubicaciones de memoria) se crean una vez al inicio del programa y luego deben ser inicializadas en el lugar donde aparecen en el texto(declaración de la variable), pero esto no siempre ocurre, así que si quieres que todo funcione correctamente, no olvides inicializarlas explícitamente al declararlas.
He corregido el código para que coincida con el tuyo.
Al hacer la prueba, cuatro órdenes se cerraron en orden de ajuste en el primer tick, la quinta se cerró en el siguiente tick. Probablemente algo más está mal aquí como he probado repetidamente.
Te proporciono el código del programa y los registros del probador.
Sinceramente. Shurkin
Está claro. Sustituir
a .
Se da la siguiente situación:
He mostrado un trozo de código en el que hay un malentendido. Todas las variables se declaran globales. En la funciónIsObjectFound() obtengo los valores del primer y segundo punto de precio del objeto, el nombre y el valor del precio del objeto en la barra actual. Si se encuentra el objeto debe salir la función en modo verdadero, en caso contrario enfalso .
En el inicio, prescribí una condición que si el objeto no se encuentra, entonces salgo de la función:
Lo ejecuto en el probador, no he dibujado ningún objeto, no hay nada - un gráfico desnudo. Sin embargo, la función no sale y no se imprime en consecuencia:
La función de arranque sigue y sigue. ¿De qué se trata todo esto?
Lasvariables globales son búsquedas globales. ¿Qué se puede decir del algoritmo sin ver el modelo de datos?
Yo rastrearía exactamente los datos. Y isObj realmente booleano, y todo eso ...
Las variables globales son búsquedas globales. ¿Qué se puede decir del algoritmo sin ver el modelo de datos?
Yo rastrearía exactamente los datos. Y isObj realmente booleano, y todo eso ...
isObj es un int. Devuelve la ventana que tiene el objeto en ella, si hay una. Si no existe, entiendo que devolverá -1. Según el documento, la ventana principal comienza en 0 y luego las subventanas... Hasta aquí, esto es un esquema para un Asesor Experto en comercio, puramente de señal. Pero emite mensajes cuando quiere.