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

 
Anatoliy Ryzhakov:

La orden de venta se cierra al precio de venta

Estoy un poco confundido. ¡¡¡Señala con el dedo dónde está el error en el código!!!(el registro dice ORDER CLOSE ERROR 4108)¡Gracias de antemano!

 

¡Buenas tardes Conocedores! ¿Ha agotado el día más difícil del año? ¿Podemos ir al grano? ;=).

Dibujé un EA, todo es bueno, pero MQL como yo lo entiendo funciona en el entorno MT4. Quiero que funcione con un software que trabaje directamente con la bolsa. ¿Existen otros compiladores de MQL? Si no es así, ¿qué lenguaje debo utilizar para reescribir MQL?

 
STARIJ:

Tienes un descanso y necesitas continuar.

No tengo descanso. ¿Cuál es la razón por la que el EA puede no "ver" sus órdenes? Tengo diferentes tiempos del servidor y del ordenador, ¿tal vez por esto?

 
Anatoliy Ryzhakov: No tengo descanso. ¿Cuál es la razón por la que el EA no puede "ver" sus órdenes? La hora de mi servidor y la de mi ordenador son diferentes.

El tiempo de cada uno es diferente. Empieza sin prisas desde lejos. 1. Comprueba lo que te da la función OrdersTotal. Su valor depende de la configuración del historial: Hoy, últimos 3 días, última semana, ... Ajústelo como prefiera. 2. A continuación, cree un ciclo y emita todas las órdenes con Alerta. Esto se llama depuración y es una parte muy importante del trabajo de un programador. Más importante que escribir código.

 
Por favor, aconseje cómo solucionar el error de cantidad de lotes no válidos para la función FreeMarginCheck en el EA, cuando accidentalmente se establece un valor negativo de volumen (lote). Tener un mensaje sobre el lote equivocado, sin mensaje de error, en el probador .

 
STARIJ:

El tiempo de cada uno es diferente. Empieza sin prisas desde lejos. 1. Comprueba lo que te da la función OrdersTotal. Su valor depende de la configuración del historial: Hoy, últimos 3 días, última semana, ... Ajústelo como desee. 2. A continuación, cree un ciclo y dé salida a todas las órdenes mediante Alerta. Esto se llama depuración y es una parte muy importante del trabajo de un programador. Más importante que escribir código.

Gracias.

 

¿Pueden decirme cómo escribir en el código del Asesor Experto para abrir 3 operaciones a la vez con la capacidad de establecer SL?

Esta es mi condición

if(MA_1>MA_2)
ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);

Me aconsejaron utilizar la función (OrdersTotal()), pero no se ajusta a mi caso. Lo tengo así

void OnTick()
  {
//---
   double MA_1;
   MA_1=iMA(_Symbol,0,1,0,1,0,0);
   double MA_2;
   MA_2=iMA(_Symbol,0,6,0,1,0,0);
   int ticket=0;
   if(OrdersTotal()<=3)
     {
      if(MA_1>MA_2)
         ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
      if(MA_1<MA_2)
         ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);
     }
//---
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

Compila bien, sin errores, pero no es apropiado para mi caso.

He encontrado el siguiente código

#property copyright "Влад Сергеев для mmgp" 
#property version   "1.00" 
#property strict 
#property script_show_inputs 

input int      orders = 4;      //всего ордеров в серии 
input bool     buy = true;      //флаг разрешающий/запрещающий покупки 
input bool     sell = false;    //флаг разрешающий/запрещающий продажи 
input int      magic = 100500;  //уникальный номер для ордеров, открываемых этим скриптом 
input double   lot = 0.01;      //объем каждого ордера серии 
input int      tp = 100;        //тейк профит, в пунктах 
input int      sl = 100;        //стоп лосс, в пунктах 
input int      slip = 2;        //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i=0;  // для чего эта переменная
   int ticket=0;
   if(buy) 
     {
      while(i<orders) // здесь эта переменная используется чтобы сравнивать ордера или для чего
        {
         RefreshRates(); // если убрать эту функцию коду хуже не становится
         ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slip,0,0,"",magic,0,clrBlue); //здесь понятно
         if(ticket!=-1) // эта строчка тоже не понятна
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  // функция для выбора ордера это логично но тоже не понятно как ей пользоваться
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl*Point,Digits),NormalizeDouble(OrderOpenPrice()+tp*Point,Digits),0,clrBlue);
               // эту строчку тоже хотел бы чтобы объяснили
              }
           }
         i++; // что увеличивается на оду единицу это относится к магическому номеру ордера чтобы программа понимала что у неё есть ордера
        }
     }
   i=0;
   if(sell) // прошлая запись была для покупак эта для продаж 
     {
      while(i<orders) 
        {
         RefreshRates();
         ticket=OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slip,0,0,"",magic,0,clrRed);
         if(ticket!=-1) 
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl*Point,Digits),NormalizeDouble(OrderOpenPrice()-tp*Point,Digits),0,clrRed);
              }
           }
         i++;
        }
     }
  }  
//+------------------------------------------------------------------+

Tal vez se pueda utilizar, pero no entiendo el significado de las cuerdas. ¿Se puede utilizar este código cuando se reescribe para adaptarse a mi condición?

 
Seric29:

¿Pueden decirme cómo escribir en el código del Asesor Experto para abrir 3 operaciones a la vez con la capacidad de establecer SL?

Esta es mi condición

Me aconsejaron utilizar la función (OrdersTotal()), pero no se ajusta a mi caso. Lo tengo así

Compila bien, sin errores, pero no es apropiado para mi caso.

He encontrado el siguiente código

Tal vez se pueda utilizar, pero no entiendo el significado de las cuerdas. ¿Puedo utilizar este código si lo reescribo para adaptarlo a mi condición?

Inténtelo de esta manera

pos=0; /contador de órdenes

for(int i=OrdersTotal()-1;i>=0;i--) //leer las órdenes de mercado

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;//selección de las órdenes de mercado

{

if (OrderSymbol()!=Symbol()&&OrderMagicNumber()!=Magic) continue;//selecciona sólo las órdenes del EA (si hay Magic y opera en cualquier par de divisas)

pos++; //si hemos seleccionado, entonces aumenta pos en uno

}

}

 if(MA_1>MA_2&&pos<3)
 OrderSend(_Symbol(),OP_BUY,Lots,Ask,0,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,clrGreen);
 if(MA_1<MA_2&&pos<3)
 OrderSend(_Symbol(),OP_SELL,Lots,Bid,0,Bid+SL*Point,Bid-TP*Point,NULL,Magic,0,clrRed);

 
Un foro muy interesante. ¡Un montón de cosas esclarecedoras!)
 
Seric29:

¿Podéis decirme cómo escribir en el código del EA para abrir 3 operaciones a la vez con la posibilidad de fijar el SL?

if(MA_1>MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-(i==0?SL_1:i==1?SL_2:SL_3)*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+(i==0?SL_1:i==1?SL_2:SL_3)*Point,Ask-TP*Point,NULL,0,0,clrRed);
Razón de la queja: