[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 228

 
//записать

void SaveArray(string File, double &a[])
{
    int h = FileOpen(File, FILE_BIN|FILE_WRITE);
    if(h>0)
    {
      int sz = ArraySize(a); 
      FileWriteArray(h,a,0,sz);
      FileClose(h);
    }
}

//прочитать

void OpenArray(string File, double &a[], int sz)
{
    int h = FileOpen(File, FILE_BIN|FILE_READ);
    if(h>0)
    {
      ArrayResize(a,sz);
      FileReadArray(h,a,0,sz);
      FileClose(h);
    }
}
 
Este es el anuncio
int Buy[];int Sell[];       string FileBuy="FileBuy.csv",FileSell="FileSell.csv";
 
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.
 
Shurkin:

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.

	          
 

Se da la siguiente situación:

//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
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:

if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }

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:

 Print("В окне отсуствуют объекты, поиск продолжается...");

La función de arranque sigue y sigue. ¿De qué se trata todo esto?

 
No es nada bueno.
 
¿Qué pasa?
 

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 ...

 
tara:

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      ""

extern string ___H0 = "Параметры отклонений зоны сигнала";
extern double dernovich = 40,
              faustUs = 40;
/*extern double limitOverLine = 3,
              limitUnderLine = 20;*/

string objName;                                  // Имя объекта
int isObj;                                       // Возвращает окно, которому принадлежит
                                                 // ..наденнный объект, либо -1
double 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.