Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 70

 
Hola, ¿Podría ayudarme con la escritura de una función en MT4. Conozco el saldo de mi cuenta, sé cuántas operaciones se abrirán (por ejemplo, 9), conozco el riesgo (por ejemplo, 3% del AccountBalance), necesito calcular un lote para la primera operación, si cada lote siguiente se duplicará y todas las operaciones se solaparán entre sí.
//Функция расчета торгового лота
double GetLots()
{
 double clots = 0.0;
 double cl = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2); 
 double L2 = NormalizeDouble(cl * Multipler,2);
 double L3 = NormalizeDouble(L2 * Multipler,2);
 double L4 = NormalizeDouble(L3 * Multipler,2);
 double L5 = NormalizeDouble(L4 * Multipler,2);
 double L6 = NormalizeDouble(L5 * Multipler,2);
 double L7 = NormalizeDouble(L6 * Multipler,2);
 double L8 = NormalizeDouble(L7 * Multipler,2);
 double L9 = NormalizeDouble(L8 * Multipler,2);
 
 for(cl = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2);AccountFreeMarginCheck(Symbol(),OP_BUY,L9) <= (AccountBalance()/100)*Risk;cl--)
 {
  if(!IsStopped()) 
  {
   clots = NormalizeDouble(cl,2);
  }
 } 
 return(clots);
}

Esto es lo que tengo. Por favor, dime qué pasa. Gracias de antemano.

 

¡Hola!

Escribo aquí ya que parece que no hay nadie en mq4.

¿Puede decirme qué estoy haciendo mal? La opción 2 no funciona.

double A[][10];
int renge_A_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][10];
int renge_B_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B=0;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize(B, count_B);
         for(int j=0; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if(A[i][3]>0)
             {
              count_B++;
              ArrayResize(B, count_B);
              for(int j=0; j<renge_A_two; j++)                        // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two
 
Arseniy Barudkin:
Hola, Por favor, ayúdame con la escritura de una función en MT4. Conozco el saldo de mi cuenta, sé cuántas operaciones se abrirán (por ejemplo, 9), conozco el riesgo (por ejemplo, 3% del AccountBalance), necesito calcular un lote para la primera operación, si cada lote siguiente se duplicará y todas las operaciones se solaparán entre sí.

Esto es lo que tengo. Por favor, dime qué pasa. Gracias de antemano.

Primaria. El error es la funciónGetLots(). Toda la función.
 
Leo59:

¡Hola!

Escribo aquí, porque parece que no hay nadie en mq4.

¿Puede decirme qué estoy haciendo mal? La opción 2 no funciona.

double A[][10];
int renge_A_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][10];
int renge_B_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B=0;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize(B, count_B);
         for(int j=0; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if(A[i][3]>0)
             {
              count_B++;
              ArrayResize(B, count_B);
              for(int j=0; j<renge_A_two; j++)                        // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two

Resaltado: debería haber una asignación - "=" y tienes una comparación - "==".

 

Hola a todos.
Estoy aprendiendo a escribir robots en mt4, he decidido empezar con las opciones binarias . Estoy escribiendo un EA sencillo, pero el compilador genera muchas advertencias, no puedo entenderlo (
Ayuda: "Oh MQL4 Guru" =))))))
Gracias de antemano)

Aquí está el código para el EA.

//+------------------------------------------------------------------+
//|Bolinger_Bands_traider.mq4 |
//|Copyright 2017, Penrov Nikolay |
//|vk.com/buzamonolit |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Petrov Nikolay"
#enlace de propiedad "vk.com/buzamonolit"
#versión de la propiedad "1.00"
#propiedad estricta
//+------------------------------------------------------------------+
//| función de inicialización de expertos|
//+------------------------------------------------------------------+
extern int Bolinger_Bands = 20; // Periodo de la Banda Bollinger
extern double Delta = 0.0003; // A qué distancia abrir la orden

string Symb; // Nombre del instrumento financiero.
int Total; // Número de pedidos

//+------------------------------------------------------------------+
//| función de inicialización de expertos|
//+------------------------------------------------------------------+
int init()
{
//----
Initialize_Objects(0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta|
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto|
//+------------------------------------------------------------------+
int inicio()
{
//----
doble precio = Oferta;
double CurrBol_High = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_UPPER, 0);
double CurrBol_Low = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_LOWER, 0);
double PrecioBol_Alto = precio - CurrBol_Alto;
double PrecioBol_Bajo = precio - CurrBol_Bajo;
datetime NextClose = Time[0] + Period()*60*2;
int MinutesToNextClose = (NextClose - TimeCurrent())/60 + 1;
int err;

// Recuento de pedidos
Symb=Símbolo();// Nombre de la aleta.símbolo(); // símbolo(); // símbolo(); // icono de pedido(); // símbolo().
Total=0;// Número de pedidos
for(int i=1; i<=TotalPedidos(); i++) // Bucle de pedidos
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Si hay un siguiente
{// Análisis de pedidos:
if (OrderSymbol()!=Symb)continue; // No es nuestro instrumento financiero
si (OrderType()>1)// Tenemos una orden pendiente
{
Alert("Orden pendiente detectada. El Asesor Experto no está funcionando;)
return(0);// Exit()
}
Total++;// Mercado de contadores. pedir
si (Total>1)// No más de un pedido
{
Alert("Varias órdenes de mercado. El Asesor Experto no funciona");
return(0);// Exit()
}
}
}

ObjectSetText("Obj_Label", "TF" + Period() + ", " + DoubleToStr(price, 5) + ", tick " + TimeToStr(TimeCurrent(), TIME_SECONDS) + ", O@" + TimeToStr(Time[0], TIME_MINUTES) + ", NC@" + TimeToStr(NextClose, TIME_MINUTES) + " (" + MinutesToNextClose + " min)", 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label2", "Órdenes:" + Total + ", delta " + DoubleToStr(Delta,5) + ", distancia a MA:" + DoubleToStr(PriceBol_High, 5), 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label3", "Pedidos: " + Total + ", Delta " + DoubleToStr(Delta,5) + ", distancia a MA:" + DoubleToStr(PriceBol_Low, 5), 10, "Arial", DarkGreen );


// análisis de precios y apertura de órdenes

if ((MathAbs(PriceBol_Low) < Delta) && (price > CurrBol_Low) && (Open[0] > CurrBol_Low+Delta) && (Total<1))
{
if (OrderSend(Symbol(), OP_BUY, 1.00,Bid , 3, 0, 0, "BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Green) >0) Print ("Opened OK");
si no
{
err=GetLastError();
Print("error(",err,"));
return(0);

}
Print ("CALL @ " + precio + " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp en " + MinutesToNextClose);

}

if ((MathAbs(PriceBol_High) < Delta) && (price < CurrBol_High) && (Open[0] < CurrBol_High-Delta) && (Total<1))
{
if (OrderSend(Symbol(), OP_SELL, 1.00,Bid , 3, 0, 0, "BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Red) > 0) Print ("Opened OK");
si no
{
err=GetLastError();
Print("error(",err,"));
return(0);

}
Print ("PUT @ " + precio + " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp en " + MinutesToNextClose);

}

//----
return(0);
}
//+------------------------------------------------------------------+

int Inicializar_Objetos(int Ganar) // Fie de usuario
{// .creación de objetos
ObjectCreate("Obj_Label",OBJ_LABEL, Win, 0,0); // creación del objeto
ObjectSet("Obj_Label", OBJPROP_CORNER, 0); // Vincular a una esquina
ObjectSet("Obj_Label", OBJPROP_XDISTANCE, 13); // Coordenada X
si (Win==0)
ObjectSet("Obj_Label",OBJPROP_YDISTANCE, 15);//Coordenada Y
si no
ObjectSet("Obj_Label",OBJPROP_YDISTANCE,15);//Coordenada Y

ObjectCreate("Obj_Label2",OBJ_LABEL,Win, 0,0); // Creación del objeto
ObjectSet("Obj_Label2",OBJPROP_CORNER, 0); // Vinculación a una esquina
ObjectSet("Obj_Label2", OBJPROP_XDISTANCE, 13); // Coordenada X
si (Win==0)
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//Coordenada Y
si no
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//Coordenada Y

ObjectCreate("Obj_Label3",OBJ_LABEL, Win, 0,0); // Crear objeto
ObjectSet("Obj_Label3",OBJPROP_CORNER, 0); // Vinculación a una esquina
ObjectSet("Obj_Label3", OBJPROP_XDISTANCE, 13); // Coordenada X
si (Win==0)
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//Coordenada Y
si no
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//Coordenada Y

return(0);// Salida del usuario.función
}

 

Aquí están las advertencias. No puedo entender qué es lo que no le gusta(


posible pérdida de datos debido a la conversión de tipo Bolinger_Bands_traider.mq4 51 24
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 76 35
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 76 227
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 77 43
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 78 43
conversión implícita de 'cadena' a 'número' Bolinger_Bands_traider.mq4 85 71
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 93 23
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 93 91
conversión implícita de 'cadena' a 'número' Bolinger_Bands_traider.mq4 99 72
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 107 23
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 107 91
0 error(es), 11 advertencia(s), tiempo de compilación: 204 mseg 1 12

 
Vitalie Postolache:
Primaria. El error es la funciónGetLots(). Toda la función.

Tal vez puedas decirme cómo escribirlo correctamente. Quería calcular usando el bucle por fuerza bruta desde el lote máximo.
 
Arseniy Barudkin:

Tal vez puedas decirme cómo escribirlo correctamente. Quería calcular mediante un bucle probando desde el lote máximo.


¿Dónde está la lógica? Se fija el lote máximo permitido para la primera orden y se aumenta para cada orden sucesiva. ¿No te parece, por decirlo suavemente, poco sensato?

Además, disminuye el lote de la primera orden en el bucle utilizando algún método totalmente incomprensible, mientras que los lotes de las otras órdenes que se "calcularon" antes permanecen sin cambios, y estos valores no van más allá de los límites de esta función. ¿Qué hacen entonces?

Por no hablar de que el bucle de incremento no puede ser un número real, tiene que ser un contador, un entero. Pero se establece el valor del lote como un contador y se le resta uno en cada iteración. Esto es un error importante, muy grave.

Aclara primero la lógica en tu mente y luego intenta implementarla en tu código.

 
bog_v_nas:

Pero aquí están las advertencias. No puedo entender lo que no le gusta(


posible pérdida de datos debido a la conversión de tipo Bolinger_Bands_traider.mq4 51 24
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 76 35
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 76 227
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 77 43
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 78 43
conversión implícita de 'cadena' a 'número' Bolinger_Bands_traider.mq4 85 71
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 93 23
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 93 91
conversión implícita de 'cadena' a 'número' Bolinger_Bands_traider.mq4 99 72
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 107 23
conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 107 91
0 error(es), 11 advertencia(s), tiempo de compilación: 204 mseg 1 12

Sale una línea con el número 51, ya que no hay cuenta aquí para entender el error"posible pérdida de datos debido a la conversión de tipo Bolinger_Bands_traider.mq4 51 24"

El resto: "conversión implícita de 'número' a 'cadena' Bolinger_Bands_traider.mq4 107 91

traducir los valores numéricos en una cadena de texto donde creamos el objeto - una cadena de texto, por ejemplo

período()

debe ser

DoubleToString(Period(),0)

 
Renat Akhtyamov:

traducir los valores numéricos a una cadena de texto donde creamos un objeto de cadena de texto, por ejemplo

período()

debe ser

DoubleToString(Period(),0)


¿Desde cuándo el punto es un tipo Doble?