Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 569

 
Hola! Al estudiar el MQL4 me ha surgido una pequeña duda. El problema está publicado en el tutorial de este sitio. Esta es la condición: Tarea 25. Crear un programa, en el que se realicen las siguientes condiciones: si el tipo de cambio ha subido por encima del nivel especificado, entonces dar un mensaje, en el que las palabras indiquen que el tipo supera el nivel (hasta 100 puntos); en otros casos, informar de que el tipo no supera el nivel especificado.
Y aquí está la solución propuesta:
//--------------------------------------------------------------------
extern double Level=1.3200;                     // Заданный уровень 
string Text[101];                               // Объявление массива
//--------------------------------------------------------------------
int init()                                      // Спец. ф-ия init()
  {                                             // Присвоение значений
   Text[1]="один ";            Text[15]="пятнадцать ";
   Text[2]="два ";             Text[16]="шестнадцать ";
   Text[3]="три ";             Text[17]="семнадцать ";
   Text[4]="четыре ";          Text[18]="восемнадцать ";
   Text[5]="пять ";            Text[19]="девятнадцать ";
   Text[6]="шесть ";           Text[20]="двадцать ";
   Text[7]="семь ";            Text[30]="тридцать ";
   Text[8]="восемь ";          Text[40]="сорок ";
   Text[9]="девять ";          Text[50]="пятьдесят ";
   Text[10]="десять ";         Text[60]="шестьдесят";
   Text[11]="одиннадцать ";    Text[70]="семьдесят ";
   Text[12]="двенадцать ";     Text[80]="восемьдесят ";
   Text[13]="тринадцать ";     Text[90]="девяносто";
   Text[14]="четырнадцать ";   Text[100]= "сто";
   // Вычисление значений
   for(int i=20; i<=90; i=i+10)                // Цикл по десяткам
     {
      for(int j=1; j<=9; j++)                  // Цикл по единицам
         Text[i+j]=Text[i] + Text[j];          // Вычисление значения   
     }
   return;                                     // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. ф-ия start()
  {
   int Delta=NormalizeDouble((Bid-Level)/Point,0);// Превышение 
//--------------------------------------------------------------------
   if (Delta>=0)                                // Цена не выше уровня
     {
      Alert("Цена ниже уровня");                // Сообщение
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------------
   if (Delta<100)                               // Цена более 100
     {
      Alert("Более ста пунктов");               // Сообщение
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------------
   Alert("Плюс ",Text[Delta],"pt.");            // Вывод на экран
   return;                                      // Выход из start()
  }
//---------------------------------------------------------------------
По-моему в условных операторах неправильно проставлены знаки сравнения. Они должны быть с точностью до наоборот. Скажите прав ли я? И если нет, то почему так?  
 
Step:
Hola, tengo una pequeña pregunta mientras estudio MQL4. El problema se encuentra en el tutorial de este sitio. Esta es la condición: Problema 25. Cree un programa, en el que se realicen las siguientes condiciones: si la tasa supera el nivel especificado, emitirá un mensaje, en el que las palabras indicarán que la tasa supera el nivel (hasta 100 puntos); en otros casos, el mensaje informará de que la tasa no supera el nivel especificado.
Y aquí está la solución propuesta:


Muestra posibles soluciones. Útil para la formación.

Hay otras opciones. Hay otros errores.

Confía más en ti mismo. Experimento.

 
Step:
Hola! Al estudiar MQL4, tengo una pequeña pregunta. La tarea se encuentra en el tutorial de este sitio. Esta es la condición: Problema 25. Cree un programa que realice las siguientes condiciones: si la tasa supera el nivel especificado, emitirá un mensaje diciendo que la tasa supera el nivel (hasta 100 puntos); en los demás casos, el mensaje diciendo que la tasa no supera el nivel especificado.
Y aquí está la solución propuesta:


P.D.

En concreto, la utilidad de este ejemplo para tratar un array,

la posible representación de los datos en palabras,

el uso de la función NormalizeDouble y la variable Point predefinida.

Posibilidad de elegir una afición más fácil.

 

Aparentemente, no hay forma de declarar directamente variables externas en la clase. Entonces, ¿cuáles son las opciones? Si no quiero declarar en el propio Asesor Experto o en otro lugar estas variables externas específicas, que son necesarias sólo cuando se utiliza esta clase. Creo que la única opción es hacer un inluder, que declare estas variables externas. Y entonces la clase debería estar incluida en ella, ¿no?

Entonces, para llamar a la clase, es necesario incluir la propia clase. ¿Es así? ¿O puede haber otras variantes?

Simplemente no me parece bien. Un montón de archivos de inclusión anidados para crear... Por eso tengo esa pregunta.

¿O sigue siendo posible, como en una biblioteca habitual, declarar las variables externas e importar las bibliotecas necesarias antes de declarar la clase? Me refiero a algo así:

// Объявляем внешние переменные
extern type Var1;
extern type Var2;
extern type Var3;

// Подключаем требуемые библиотеки
//#include <LBase.mqh>
//+---
//#include <Logging.mqh>
#import "user32.dll"
     int GetAncestor;
     int PostMessageA;
#import
//
class CLogging
{
   protected:
 // защищенные данные
   public:
 // открытые данные
};
Nunca he visto eso antes. Así que me pregunto si estoy yendo en la dirección correcta...
 
Al transferir el código del indicador al Asesor Experto, se produce un error. Los he emitido como variables globales en la pantalla del terminal a través de Comment.

if(BullBear!="")
{
retXB=(zz[A4]-zz[B4])/(zz[A4]-zz[X4]+0.000001);
retAC=(zz[C4]-zz[B4])/(zz[A4]-zz[B4]+0.000001);



Los envía como variables globales a la pantalla del terminal a través de Comment. No había ceros, sólo números negativos. Entonces cambié

//---- indicator buffers
double zz[1500];
a

//---- indicator buffers
double zz[300];
todo cayó en su lugar, lo puso en su sitio. No hay error. ¿Cuál fue la razón? También he desconectado Internet.
 
semargl988:

Al transferir el código del indicador al Asesor Experto, se produce un error. División a cero en la parte del código

...

Las salidas con variables globales a la pantalla del terminal a través de Comment. No había ceros, sólo números negativos. Entonces cambié

...

a .

...

todo cayó en su lugar, lo puso en su sitio. No hay ningún error. ¿Cuál fue la causa? Apagué un poco más el internet.

También obtuve el error "dividir por cero" donde no se pudo pasar el cero en el denominador de la fracción. Ahora, antes de dividir, hago una comprobación formal como:

if(znamenatel==0)
{
 какое-то действие;
}

Y el error desapareció. Es decir, se debe indicar al compilador qué hacer si el denominador=0 aunque el programador esté 100% seguro de que no hay ningún 0 allí.

 

Hola, ¿puede ayudarme con el código? Necesito que el EA haga lo elemental - abrir posiciones al acercarse a la línea vertical (es decir, estrictamente el tiempo, no el precio), a saber, para un intervalo de shi especificado, que tengo aquí 120 es decir, como entiendo - 2 minutos. El color de la línea debería determinar si es de compra o de venta. Busqué en Internet y lo reescribí y obtuve lo siguiente:

void OnTick()
{
int AllObject = ObjectsTotal();
for ( int i = 0; i < AllObject; i++)
{

string NameObj = ObjectName(i);
Colorrr = ObjectGet(NameObj, OBJPROP_COLOR);
Vremyaaa = (ObjectGet(NameObj, OBJPROP_TIME) - shi);
if(Vremyaaa == TimeLocal())
break;
}

int kolpos = 0;

if((Colorrr == Green)||(Colorrr == Aqua)){operacia = "OP_BUY";}
if((Colorrr == Red)||(Colorrr == Purple)){operacia = "OP_SELL";}
for (int pos = 0; pos < OrdersTotal(); pos++)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
kolpos++;
}
}
}
if(kolpos == 0)
{
if (iTime(NULL,0,1) == Vremyaaa)
{
int ticket = OrderSend(Symbol(), operacia, Lot, Bid, 10, 0, 0, "5", Magic, 0, col);
}

}

}

Por alguna razón no se negocia. No escribe ningún error en el registro...
 
dmitriyriy666:

Hola, ¿puede ayudarme con el código? Necesito que el EA haga lo elemental - abrir posiciones al acercarse a la línea vertical (es decir, estrictamente el tiempo, no el precio), a saber, para un intervalo de shi especificado, que tengo aquí 120 es decir, como entiendo - 2 minutos. El color de la línea debería determinar si es de compra o de venta. Busqué en Internet y lo reescribí:

void OnTick()
{
int AllObject = ObjectsTotal();
for ( int i = 0; i < AllObject; i++)
{

string NameObj = ObjectName(i);
Colorrr = ObjectGet(NameObj, OBJPROP_COLOR);
Vremyaaa = (ObjectGet(NameObj, OBJPROP_TIME) - shi);
if(Vremyaaa == TimeLocal())
break;
}

int kolpos = 0;

if((Colorrr == Green)||(Colorrr == Aqua)){operacia = "OP_BUY";}
if((Colorrr == Red)||(Colorrr == Purple)){operacia = "OP_SELL";}
for (int pos = 0; pos < OrdersTotal(); pos++)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
kolpos++;
}
}
}
if(kolpos == 0)
{
if (iTime(NULL,0,1) == Vremyaaa)
{
int ticket = OrderSend(Symbol(), operacia, Lot, Bid, 10, 0, 0, "5", Magic, 0, col);
}

}

}

El código no se negocia por alguna razón. No registra ningún error...

Si su hora coincide con la de la terminal, puede utilizar TimeLocal(), pero TimeCurrent() es más fiable .

Cambiar el tipo de variable de operacia a int y eliminar las comillas OP_BUY y OP_SELL

 
AlexeyVik:

Si tiene la misma hora que la del terminal, puede utilizar TimeLocal(), pero TimeCurrent() es más fiable .

Cambiar el tipo de variable de operacia a int y eliminar las comillas OP_BUY y OP_SELL



Gracias. Sobre TimeCurrent es cierto, mi hora no coincide con la del servidor. Lo he arreglado, pero sigue sin funcionar... No escribe ningún error en el registro.


P.D. En mi post anterior, el código sin espacios fue insertado de alguna manera. Pero creo que he puesto todas las llaves correctamente.

 

MT4 - 625, mensaje del probador al intentar probar los búhos con la biblioteca:

2014.03.29 18:38:48.753 'C:\N-Archivos de programaAdmiral1\MQL4\Libraries\ingLib094.mq4' no es una versión de 32 bits

Antes de que ese búho compilara sin problemas, y la biblioteca tampoco tenía una sola palabra. De hecho, no lo entiendo en absoluto.

Mi sistema (me refiero a Windows) es de 32 bits, nunca he tenido otro. Séptima.

La biblioteca es mi nativa, todo el camino con ella. Va bien en tiempo real en la nueva construcción. Incluso con otros búhos. Y en tester en versiones anteriores sin problemas.

Pero no quiere abrirse en el probador, y la razón se la chupan hasta los dedos.

Y no hay ni una palabra sobre los casos de 32 bits en todos los manuales.