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

 

Tuve este problema, resuelto buscando un ordenador en la red. No en el entorno de la red, aparece a través de la búsqueda... Un error de algún tipo.

P.D. O el problema de las manos torcidas. ))) Comprueba el trazador y el ping donde van los paquetes.

 
stater:

Buenos días! Si tienes un minuto, mira lo que pasa aquí, todo va bien en las pruebas, lo pongo en un gráfico real, me siento y espero, pero no pone órdenes pendientes! De nuevo empiezo a probar, compra... Error 130



ERR_INVALID_STOPS130Paradas incorrectas
 
moskitman:

Sí, yo también lo pensé... Pero el hecho es que 64 ve a todo el mundo en la red, 32 sólo ve a 32. ¿WTF?

sub: ¿Podría estar relacionado con el hecho de que sólo el escritorio (32) está en esta red a través del cable RG45, y todos los demás a través de la red inalámbrica?

aproximadamente:


Andrei, tienes que invitar a mi hijo, él vendrá a ti y lo preparará todo.

ZS. Lo digo en serio, la política es configurar el enrutamiento correctamente también. Pero, en mi opinión, hay que hacerlo a nivel local, ¿no hay estudiantes cerca?

 
moskitman:

Sí, yo también lo pensé... Pero el hecho es que 64 ve a todo el mundo en la red, 32 sólo ve a 32. ¿WTF?

sub: ¿Podría estar relacionado con el hecho de que sólo el escritorio (32) está en esta red a través del cable RG45, y todos los demás a través de la red inalámbrica?

Más o menos:

Tuve un problema similar. Resuelto. Era un módulo Wi-Fi mal configurado. Existe una función de seguridad en los sistemas superiores a XP.
 
Vinin:

ERR_INVALID_STOPS130Paradas incorrectas
Gracias, he puesto RefreshRates(); ha funcionado, pero sólo en el ordenador que he copiado en otro terminal, los datos son totalmente diferentes... y para mal, ¿puede ser?
 

¿Cómo puedo extraer el volumen de las órdenes de compra y venta abiertas, o mejor aún, su valor?

 
Elektronik:

¿Cómo puedo extraer el volumen de las órdenes de compra y venta abiertas, o mejor aún, su valor?


¿Cómo quiere calcular el volumen de las órdenes abiertas de venta o de compra?

OrderLot() quiere resumir?

¿O conseguir un precio de equilibrio?

 
sergeev:


Estos datos son necesarios para calcular la diferencia entre las órdenes de compra y de venta.

Supongamos que se abrieron una orden de compra con un volumen de 0,09 lotes y dos órdenes de venta con un volumen total de 0,11 lotes, la diferencia entre ellas será 0,09-0,11=-0,02, o si es posible la diferencia entre sus valores.

 

Buenas tardes. Mi pregunta es la siguiente. En el libro de MQL4 que se encuentra en MQL4.community, en la sección "Funciones estándar" de la sección "Funciones de cadena y funciones de conversión de datos", se da el siguiente ejemplo del Asesor Experto strings.mq4 (dado en su totalidad del libro)

//--------------------------------------------------------------------
// strings.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
extern int Quant_Bars=100;             // Количество баров
datetime   Time_On;
string     Prefix    ="Paint_";
//--------------------------------------------------------------- 2 --
int init()                             // Спец. функция init()
  {
   int Ind_Bar;                        // Индекс бара
   Time_On=Time [Quant_Bars];          // Время первого раскрашенного
   for(Ind_Bar=Quant_Bars-1; Ind_Bar>=0; Ind_Bar--)// Цикл по барам
     {
      Create(Ind_Bar,1);               // Нарисуем тонкую линию
      Create(Ind_Bar,2);               // Нарисуем толстую линию
     }
   WindowRedraw();                     // Перерисовка изображения 
   return;                             // Выход из init()
  }
//--------------------------------------------------------------- 3 --
int start()                            // Спец. функция start
  {
   datetime T1, T2;                    // 1 и 2 координаты времени
   int Error,Ind_Bar;                  // Код ошибки и индекс бара
   double P1, P2;                      // 1 и 2 координата цены
   color Col;                          // Цвет созданного объекта
//--------------------------------------------------------------- 4 --
   for(int Line=1; Line<=2; Line++)    // Цикл по видам линий
     {
      string Nom_Lin =Line + "_";      // Строка с номером линии
      //    string Nom_Lin  = DoubleToStr(Line,0)+"_";// Можно и так
      for(Ind_Bar=0; ;Ind_Bar++)       // Цикл по барам
        {
//--------------------------------------------------------------- 5 --
         datetime T_Bar= Time[Ind_Bar];// Время открытия бара
         if (T_Bar < Time_On) break;   // Заграничные не раскрашиваем
         string Str_Time=TimeToStr(T_Bar);       // Строка со временем
         string His_Name=Prefix+Nom_Lin+Str_Time;// Имя объекта
//--------------------------------------------------------------- 6 --
         T1=ObjectGet(His_Name,OBJPROP_TIME1);// Запрос коорд. t1
         Error=GetLastError();         // Получение кода ошибки
         if (Error==4202)              // Если объекта нет :(
           {
            Create(Ind_Bar,Line);      // Вызов ф-ии создания объекта
            continue;                  // На следующую итерацию
           }
//--------------------------------------------------------------- 7 --
         T2 =ObjectGet(His_Name,OBJPROP_TIME2); // Запрос коорд. t2
         P1 =ObjectGet(His_Name,OBJPROP_PRICE1);// Запрос коорд. p1
         P2 =ObjectGet(His_Name,OBJPROP_PRICE2);// Запрос коорд. p1
         Col=ObjectGet(His_Name,OBJPROP_COLOR); // Запрос цвета
         if(T1!=T_Bar || T2!=T_Bar || // Не те координаты или цвет:
            (Line==1 && (P1!=High[Ind_Bar] || P2!=  Low[Ind_Bar])) ||
            (Line==2 && (P1!=Open[Ind_Bar] || P2!=Close[Ind_Bar])) ||
            (Open[Ind_Bar] Close[Ind_Bar] && Col!=Red)  ||
            (Open[Ind_Bar]==Close[Ind_Bar] && Col!=Green)  )
           {
            ObjectDelete(His_Name);    // Удаляем объект
            Create(Ind_Bar,Line);      // Создаём правильный объект
           }
//--------------------------------------------------------------- 8 --
        }
     }
   WindowRedraw();                     // Перерисовка изображения 
   return;                             // Выход из start()
  }
//--------------------------------------------------------------- 9 --
int deinit()                           // Спец. функция deinit()
  {
   string Name_Del[1];                 // Объявление массива
   int Quant_Del=0;                    // Количество удаляемых объектов
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   ArrayResize(Name_Del,Quant_Objects);// Необходимый размер массива
   for(int k=0; k<=Quant_Del; i++)     // Удаляем объекты с именами,.. 
      ObjectDelete(Name_Del[i]);       // .. имеющимися в массиве
   return;                             // Выход из deinit()
  }
//-------------------------------------------------------------- 10 --
int Create(int Ind_Bar, int Line)      // Пользовательская функция..
  {                                    // ..создания объекта
   color Color;                        // Цвет объекта
   datetime T_Bar=Time [Ind_Bar];      // Время открытия бара
   double   O_Bar=Open [Ind_Bar];      // Цена открытия бара
   double   C_Bar=Close[Ind_Bar];      // Цена закрытия бара
   double   H_Bar=High [Ind_Bar];      // Максимальная цена бара
   double   L_Bar=Low  [Ind_Bar];      // Минимальная цена бара
 
   string Nom_Lin =Line + "_";         // Строка - номер линии
   // string Nom_Lin  = DoubleToStr(Line,0)+"_";// Можно и так
   string Str_Time=TimeToStr(T_Bar);   // Строка - время откр.     
   string His_Name=Prefix+Nom_Lin+Str_Time;// Имя созаваемого объект
   if (O_Bar < C_Bar) Color=Blue;      // Выбор цвета в зависимости..
   if (O_Bar >C_Bar) Color=Red;        // .. от характеристик бара
   if (O_Bar ==C_Bar) Color=Green;
 
   switch(Line)                        // Тонкая или толстая линия
     {
      case 1:                          // Тонкая линия
         ObjectCreate(His_Name,OBJ_TREND,0,T_Bar,H_Bar,T_Bar,L_Bar);
         break;                        // Выход из switch
      case 2:                          // Толстая линия
         ObjectCreate(His_Name,OBJ_TREND,0,T_Bar,O_Bar,T_Bar,C_Bar);
         ObjectSet(   His_Name, OBJPROP_WIDTH, 3);// Стиль     
     }
   ObjectSet(    His_Name, OBJPROP_COLOR, Color); // Цвет
   ObjectSet(    His_Name, OBJPROP_RAY,   false); // Луч
   ObjectSetText(His_Name,"Объект создан экспертом",10);// Описание
   return;                             // Выход из польз. ф-ии
  }
//-------------------------------------------------------------- 11 –
 

... continúa...

Al final de la subsección StringSubstr Function entre paréntesis se encuentra la siguiente frase: "por separado debemos notar que en el primer bucle for (mi nota: debe ser deinit() ya que no hay otra forma de borrar objetos) no podemos borrar objetos ya que después de cada borrado el número de objetos y su numeración cambiará y algunos nombres de objetos serán saltados". Pero en el citado EA no hay ningún segundo bucle for . Además, la variable Quant_Del definida en la función deinit() antes del bucle for se inicializa con cero, mientras que la variable i no estaba definida en ninguna parte antes del bucle for.

   for(int k=0; k<=Quant_Del; i++)     // Удаляем объекты с именами,.. 
         ObjectDelete(Name_Del[i]);       // .. имеющимися в массиве

Resulta que el código anterior omite trivialmente varias líneas del programa.

Así que la primera pregunta es la siguiente: ¿fue realmente una omisión trivial de varias líneas o es un programa tan complicado que un novato no puede entender su significado sin ayuda externa?

Además... En el mismo capítulo de la misma sección, hay un enlace al mismo Asesor Experto (en el archivo adjunto) antes del texto citado que, al hacer clic, abre el mismo Asesor Experto en MetaElitor. Pero el texto de este Asesor Experto es diferente: la función deinit()tiene este aspecto

//--------------------------------------------------------------- 9 --
int deinit()                           // Спец. функция deinit()
  {
   string Name_Del[1];                 // Объявление массива
   int Quant_Del=0;                    // Количество удаляемых объекто
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   ArrayResize(Name_Del,Quant_Objects);// Необходимый размер массива
   for(int k=0; k<Quant_Objects; k++)  // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Найден объект, ..
        {                              // .. начинающийся с Paint_
         Quant_Del=Quant_Del+1;        // Колич имён к удалению
         Name_Del[Quant_Del-1]=Obj_Name;//Запоминаем имя удаляемого
        }
     }
   for(int i=0; i<=Quant_Del; i++)     // Удаляем объекты с именами,.. 
      ObjectDelete(Name_Del[i]);       // .. имеющимися в массиве
   return;                             // Выход из deinit()
  }
//-------------------------------------------------------------- 10 --

Entonces, si "combinar" la frase "Por separado, tenga en cuenta que no puede eliminar objetos en el primer bucle for, porque en este caso el número total de objetos y su numeración cambiarán después de cada eliminación, y algunos nombres de objetos se omitirán como resultado" Y texto función deinit() de la última variante, tengo la segunda pregunta:

Pregunta. ¿Por qué no puedo eliminar objetos en el primer bucle for colocando la función ObjectDelete(Nombre_Objeto) dentro de la sentencia if? Algo así como:

int deinit()                           // Спец. функция deinit()
  {
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   for(int k=0; k<Quant_Objects; k++)  // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Если найден объект, …
        {                              // ... начинающийся с Paint_,
         ObjectDelete(Obj_Name);       // … то его и удаляем
        }                              //конец if
     }                                 //конец for
   return;                             // Выход из deinit()
  }                                    //конец deinit
//-------------------------------------------------------------- 10 --

Por qué después de cada borrado "... El número total de objetos cambiará"... Porque en este caso, la variable Quant_Objects, que determina el número total de objetos, adquiere su valor igual a ObjectsTotal(), ¿FORWARD el bucle for?

P.S. Gracias de antemano por la respuesta, para no ensuciar el foro.

Archivos adjuntos:
strings_1.mq4  7 kb
Razón de la queja: